diff options
Diffstat (limited to 'src/uscxml/Interpreter.h')
-rw-r--r-- | src/uscxml/Interpreter.h | 655 |
1 files changed, 343 insertions, 312 deletions
diff --git a/src/uscxml/Interpreter.h b/src/uscxml/Interpreter.h index 6890baf..58b2a51 100644 --- a/src/uscxml/Interpreter.h +++ b/src/uscxml/Interpreter.h @@ -25,320 +25,351 @@ namespace uscxml { - class Interpreter { - public: - enum Binding { - EARLY = 0, - LATE = 1 - }; - - virtual ~Interpreter(); - - static Interpreter* fromDOM(const Arabica::DOM::Node<std::string>& node); - static Interpreter* fromXML(const std::string& xml); - static Interpreter* fromURI(const std::string& uri); - static Interpreter* fromInputSource(Arabica::SAX::InputSource<std::string>& source); - - void start(); - static void run(void*); - void join() { if (_thread != NULL) _thread->join(); }; - - void interpret(); - bool validate(); - - void setBaseURI(std::string baseURI) { _baseURI = Arabica::io::URI(baseURI); } - Arabica::io::URI getBaseURI() { return _baseURI; } - bool makeAbsolute(Arabica::io::URI& uri); - - DataModel* getDataModel() { return _dataModel; } - Invoker* getInvoker() { return _invoker; } - void setInvoker(Invoker* invoker) { _invoker = invoker; } - std::string getNSPrefix() { return _nsPrefix; } - Arabica::XPath::XPath<std::string>& getXPath() { return _xpath; } - - void waitForStabilization(); - - void receive(Event& event) { _externalQueue.push(event); } - void receiveInternal(Event& event) { _internalQueue.push_back(event); } - Arabica::XPath::NodeSet<std::string> getConfiguration() { return _configuration; } - Arabica::DOM::Node<std::string> getState(const std::string& stateId); - Arabica::DOM::Document<std::string>& getDocument() { return _doc; } - - const std::string& getName() { return _name; } - const std::string& getSessionId() { return _sessionId; } - - static bool isMember(const Arabica::DOM::Node<std::string>& node, const Arabica::XPath::NodeSet<std::string>& set); - - void dump(); - static void dump(const Arabica::DOM::Node<std::string>& node, int lvl = 0); - - static bool isState(const Arabica::DOM::Node<std::string>& state); - static bool isPseudoState(const Arabica::DOM::Node<std::string>& state); - static bool isTransitionTarget(const Arabica::DOM::Node<std::string>& elem); - static bool isTargetless(const Arabica::DOM::Node<std::string>& transition); - static bool isAtomic(const Arabica::DOM::Node<std::string>& state); - static bool isFinal(const Arabica::DOM::Node<std::string>& state); - static bool isHistory(const Arabica::DOM::Node<std::string>& state); - static bool isParallel(const Arabica::DOM::Node<std::string>& state); - static bool isCompound(const Arabica::DOM::Node<std::string>& state); - static bool isDescendant(const Arabica::DOM::Node<std::string>& s1, const Arabica::DOM::Node<std::string>& s2); - - bool isInitial(const Arabica::DOM::Node<std::string>& state); - Arabica::DOM::Node<std::string> getInitialState(Arabica::DOM::Node<std::string> state = Arabica::DOM::Node<std::string>()); - static Arabica::XPath::NodeSet<std::string> getChildStates(const Arabica::DOM::Node<std::string>& state); - Arabica::XPath::NodeSet<std::string> getTargetStates(const Arabica::DOM::Node<std::string>& transition); - - protected: - Interpreter(); - void init(); - - void normalize(const Arabica::DOM::Document<std::string>& node); - void setupIOProcessors(); - - void mainEventLoop(); - - bool _stable; - tthread::thread* _thread; - tthread::mutex _mutex; - tthread::condition_variable _stabilized; - - Arabica::io::URI _baseURI; - Arabica::DOM::Document<std::string> _doc; - Arabica::DOM::Element<std::string> _scxml; - Arabica::XPath::XPath<std::string> _xpath; - Arabica::XPath::StandardNamespaceContext<std::string> _nsContext; - std::string _nsPrefix; - - bool _running; - Binding _binding; - Arabica::XPath::NodeSet<std::string> _configuration; - Arabica::XPath::NodeSet<std::string> _statesToInvoke; - - DataModel* _dataModel; - std::map<std::string, Arabica::XPath::NodeSet<std::string> > _historyValue; - - std::list<Event > _internalQueue; - uscxml::concurrency::BlockingQueue<Event> _externalQueue; - DelayedEventQueue* _sendQueue; - Invoker* _invoker; - - static Arabica::io::URI toBaseURI(const Arabica::io::URI& uri); - - void microstep(const Arabica::XPath::NodeSet<std::string>& enabledTransitions); - void exitStates(const Arabica::XPath::NodeSet<std::string>& enabledTransitions); - void enterStates(const Arabica::XPath::NodeSet<std::string>& enabledTransitions); - void executeTransitionContent(const Arabica::XPath::NodeSet<std::string>& enabledTransitions); - void executeContent(const Arabica::DOM::Node<std::string>& content); - void executeContent(const Arabica::DOM::NodeList<std::string>& content); - void initializeData(const Arabica::DOM::Node<std::string>& data); - void exitInterpreter(); - - void addStatesToEnter(const Arabica::DOM::Node<std::string>& state, - Arabica::XPath::NodeSet<std::string>& statesToEnter, - Arabica::XPath::NodeSet<std::string>& statesForDefaultEntry); - - Arabica::XPath::NodeSet<std::string> selectEventlessTransitions(); - Arabica::XPath::NodeSet<std::string> selectTransitions(const std::string& event); - Arabica::DOM::Node<std::string> getSourceState(const Arabica::DOM::Node<std::string>& transition); - Arabica::DOM::Node<std::string> findLCCA(const Arabica::XPath::NodeSet<std::string>& states); - static Arabica::XPath::NodeSet<std::string> getProperAncestors(const Arabica::DOM::Node<std::string>& s1, const Arabica::DOM::Node<std::string>& s2); - - - void send(const Arabica::DOM::Node<std::string>& element); - void invoke(const Arabica::DOM::Node<std::string>& element); - void cancelInvoke(const Arabica::DOM::Node<std::string>& element); - void returnDoneEvent(const Arabica::DOM::Node<std::string>& state); - void internalDoneSend(const Arabica::DOM::Node<std::string>& state); - static void delayedSend(void* userdata, std::string eventName); - - static bool nameMatch(const std::string& transitionEvent, const std::string& event); - Arabica::XPath::NodeSet<std::string> filterPreempted(const Arabica::XPath::NodeSet<std::string>& enabledTransitions); - bool hasConditionMatch(const Arabica::DOM::Node<std::string>& conditional); - bool isPreemptingTransition(const Arabica::DOM::Node<std::string>& t1, const Arabica::DOM::Node<std::string>& t2); - bool isInFinalState(const Arabica::DOM::Node<std::string>& state); - bool isWithinSameChild(const Arabica::DOM::Node<std::string>& transition); - bool parentIsScxmlState(Arabica::DOM::Node<std::string> state); - - static std::vector<std::string> tokenizeIdRefs(const std::string& idRefs); - - static boost::uuids::random_generator uuidGen; - static const std::string getUUID(); - - std::string _name; - std::string _sessionId; - - IOProcessor* getIOProcessor(const std::string& type); +class Interpreter { +public: + enum Binding { + EARLY = 0, + LATE = 1 + }; + + virtual ~Interpreter(); + + static Interpreter* fromDOM(const Arabica::DOM::Node<std::string>& node); + static Interpreter* fromXML(const std::string& xml); + static Interpreter* fromURI(const std::string& uri); + static Interpreter* fromInputSource(Arabica::SAX::InputSource<std::string>& source); + + void start(); + static void run(void*); + void join() { + if (_thread != NULL) _thread->join(); + }; + + void interpret(); + bool validate(); + + void setBaseURI(std::string baseURI) { + _baseURI = Arabica::io::URI(baseURI); + } + Arabica::io::URI getBaseURI() { + return _baseURI; + } + bool makeAbsolute(Arabica::io::URI& uri); + + DataModel* getDataModel() { + return _dataModel; + } + Invoker* getInvoker() { + return _invoker; + } + void setInvoker(Invoker* invoker) { + _invoker = invoker; + } + std::string getNSPrefix() { + return _nsPrefix; + } + Arabica::XPath::XPath<std::string>& getXPath() { + return _xpath; + } + + void waitForStabilization(); + + void receive(Event& event) { + _externalQueue.push(event); + } + void receiveInternal(Event& event) { + _internalQueue.push_back(event); + } + Arabica::XPath::NodeSet<std::string> getConfiguration() { + return _configuration; + } + Arabica::DOM::Node<std::string> getState(const std::string& stateId); + Arabica::DOM::Document<std::string>& getDocument() { + return _doc; + } + + const std::string& getName() { + return _name; + } + const std::string& getSessionId() { + return _sessionId; + } + + static bool isMember(const Arabica::DOM::Node<std::string>& node, const Arabica::XPath::NodeSet<std::string>& set); + + void dump(); + static void dump(const Arabica::DOM::Node<std::string>& node, int lvl = 0); + + static bool isState(const Arabica::DOM::Node<std::string>& state); + static bool isPseudoState(const Arabica::DOM::Node<std::string>& state); + static bool isTransitionTarget(const Arabica::DOM::Node<std::string>& elem); + static bool isTargetless(const Arabica::DOM::Node<std::string>& transition); + static bool isAtomic(const Arabica::DOM::Node<std::string>& state); + static bool isFinal(const Arabica::DOM::Node<std::string>& state); + static bool isHistory(const Arabica::DOM::Node<std::string>& state); + static bool isParallel(const Arabica::DOM::Node<std::string>& state); + static bool isCompound(const Arabica::DOM::Node<std::string>& state); + static bool isDescendant(const Arabica::DOM::Node<std::string>& s1, const Arabica::DOM::Node<std::string>& s2); + + bool isInitial(const Arabica::DOM::Node<std::string>& state); + Arabica::DOM::Node<std::string> getInitialState(Arabica::DOM::Node<std::string> state = Arabica::DOM::Node<std::string>()); + static Arabica::XPath::NodeSet<std::string> getChildStates(const Arabica::DOM::Node<std::string>& state); + Arabica::XPath::NodeSet<std::string> getTargetStates(const Arabica::DOM::Node<std::string>& transition); + +protected: + Interpreter(); + void init(); + + void normalize(const Arabica::DOM::Document<std::string>& node); + void setupIOProcessors(); + + void mainEventLoop(); + + bool _stable; + tthread::thread* _thread; + tthread::mutex _mutex; + tthread::condition_variable _stabilized; + + Arabica::io::URI _baseURI; + Arabica::DOM::Document<std::string> _doc; + Arabica::DOM::Element<std::string> _scxml; + Arabica::XPath::XPath<std::string> _xpath; + Arabica::XPath::StandardNamespaceContext<std::string> _nsContext; + std::string _nsPrefix; + + bool _running; + Binding _binding; + Arabica::XPath::NodeSet<std::string> _configuration; + Arabica::XPath::NodeSet<std::string> _statesToInvoke; + + DataModel* _dataModel; + std::map<std::string, Arabica::XPath::NodeSet<std::string> > _historyValue; + + std::list<Event > _internalQueue; + uscxml::concurrency::BlockingQueue<Event> _externalQueue; + DelayedEventQueue* _sendQueue; + Invoker* _invoker; + + static Arabica::io::URI toBaseURI(const Arabica::io::URI& uri); + + void microstep(const Arabica::XPath::NodeSet<std::string>& enabledTransitions); + void exitStates(const Arabica::XPath::NodeSet<std::string>& enabledTransitions); + void enterStates(const Arabica::XPath::NodeSet<std::string>& enabledTransitions); + void executeTransitionContent(const Arabica::XPath::NodeSet<std::string>& enabledTransitions); + void executeContent(const Arabica::DOM::Node<std::string>& content); + void executeContent(const Arabica::DOM::NodeList<std::string>& content); + void initializeData(const Arabica::DOM::Node<std::string>& data); + void exitInterpreter(); + + void addStatesToEnter(const Arabica::DOM::Node<std::string>& state, + Arabica::XPath::NodeSet<std::string>& statesToEnter, + Arabica::XPath::NodeSet<std::string>& statesForDefaultEntry); + + Arabica::XPath::NodeSet<std::string> selectEventlessTransitions(); + Arabica::XPath::NodeSet<std::string> selectTransitions(const std::string& event); + Arabica::DOM::Node<std::string> getSourceState(const Arabica::DOM::Node<std::string>& transition); + Arabica::DOM::Node<std::string> findLCCA(const Arabica::XPath::NodeSet<std::string>& states); + static Arabica::XPath::NodeSet<std::string> getProperAncestors(const Arabica::DOM::Node<std::string>& s1, const Arabica::DOM::Node<std::string>& s2); + + + void send(const Arabica::DOM::Node<std::string>& element); + void invoke(const Arabica::DOM::Node<std::string>& element); + void cancelInvoke(const Arabica::DOM::Node<std::string>& element); + void returnDoneEvent(const Arabica::DOM::Node<std::string>& state); + void internalDoneSend(const Arabica::DOM::Node<std::string>& state); + static void delayedSend(void* userdata, std::string eventName); + + static bool nameMatch(const std::string& transitionEvent, const std::string& event); + Arabica::XPath::NodeSet<std::string> filterPreempted(const Arabica::XPath::NodeSet<std::string>& enabledTransitions); + bool hasConditionMatch(const Arabica::DOM::Node<std::string>& conditional); + bool isPreemptingTransition(const Arabica::DOM::Node<std::string>& t1, const Arabica::DOM::Node<std::string>& t2); + bool isInFinalState(const Arabica::DOM::Node<std::string>& state); + bool isWithinSameChild(const Arabica::DOM::Node<std::string>& transition); + bool parentIsScxmlState(Arabica::DOM::Node<std::string> state); + + static std::vector<std::string> tokenizeIdRefs(const std::string& idRefs); + + static boost::uuids::random_generator uuidGen; + static const std::string getUUID(); + + std::string _name; + std::string _sessionId; + + IOProcessor* getIOProcessor(const std::string& type); // IOProcessor* getIOProcessorForId(const std::string& sendId); - - std::map<std::string, IOProcessor*> _ioProcessors; - std::map<std::string, std::pair<Interpreter*, SendRequest> > _sendIds; - std::map<std::string, Invoker*> _invokerIds; - std::map<std::string, Invoker*> _invokers; - - }; - + + std::map<std::string, IOProcessor*> _ioProcessors; + std::map<std::string, std::pair<Interpreter*, SendRequest> > _sendIds; + std::map<std::string, Invoker*> _invokerIds; + std::map<std::string, Invoker*> _invokers; + +}; + #if 0 - class SCXMLParseHandler : - public Arabica::SAX::EntityResolver<std::string>, - public Arabica::SAX::DTDHandler<std::string>, - public Arabica::SAX::ContentHandler<std::string>, - public Arabica::SAX::CatchErrorHandler<std::string>, - public Arabica::SAX::LexicalHandler<std::string>, - public Arabica::SAX::DeclHandler<std::string> - { - public: - SCXMLParseHandler() { } - virtual ~SCXMLParseHandler() { } - - // EntityResolver - virtual InputSourceT resolveEntity(const std::string& publicId , const std::string& systemId) { - return InputSourceT(); - } - - // DTDHandler - virtual void notationDecl(const std::string& name, - const std::string& publicId, - const std::string& systemId) { - std::cout << "notationDecl" << std::endl; - std::cout << " name:" << name << std::endl; - std::cout << " publicId:" << publicId << std::endl; - std::cout << " systemId:" << systemId << std::endl; - } - virtual void unparsedEntityDecl(const std::string& name, - const std::string& publicId, - const std::string& systemId, - const std::string& notationName) { - std::cout << "unparsedEntityDecl" << std::endl; - std::cout << " name:" << name << std::endl; - std::cout << " publicId:" << publicId << std::endl; - std::cout << " systemId:" << systemId << std::endl; - std::cout << " notationName:" << notationName << std::endl; - } - - // ContentHandler - virtual void setDocumentLocator(const LocatorT& locator) { - std::cout << "setDocumentLocator" << std::endl; - } - virtual void startDocument() { - std::cout << "startDocument" << std::endl; - } - virtual void endDocument() { - std::cout << "endDocument" << std::endl; - } - virtual void startPrefixMapping(const std::string& prefix, const std::string& uri) { - std::cout << "startPrefixMapping" << std::endl; - std::cout << " prefix:" << prefix << std::endl; - std::cout << " uri:" << uri << std::endl; - } - virtual void endPrefixMapping(const std::string& prefix) { - std::cout << "endPrefixMapping" << std::endl; - std::cout << " prefix:" << prefix << std::endl; - } - virtual void startElement(const std::string& namespaceURI, const std::string& localName, - const std::string& qName, const AttributesT& atts) { - std::cout << "startElement" << std::endl; - std::cout << " namespaceURI:" << namespaceURI << std::endl; - std::cout << " localName:" << localName << std::endl; - std::cout << " qName:" << qName << std::endl; - std::cout << " atts:" << atts.getLength() << std::endl; - } - virtual void endElement(const std::string& namespaceURI, const std::string& localName, - const std::string& qName) { - std::cout << "endElement" << std::endl; - std::cout << " namespaceURI:" << namespaceURI << std::endl; - std::cout << " localName:" << localName << std::endl; - std::cout << " qName:" << qName << std::endl; - } - virtual void characters(const std::string& ch) { - std::cout << "characters" << std::endl; - std::cout << " ch:" << ch << std::endl; - } - virtual void ignorableWhitespace(const std::string& ch) { - std::cout << "ignorableWhitespace" << std::endl; - std::cout << " ch:" << ch << std::endl; - } - virtual void processingInstruction(const std::string& target, const std::string& data) { - std::cout << "processingInstruction" << std::endl; - std::cout << " target:" << target << std::endl; - std::cout << " data:" << data << std::endl; - } - virtual void skippedEntity(const std::string& name) { - std::cout << "skippedEntity" << std::endl; - std::cout << " name:" << name << std::endl; - } - - // ErrorHandler - virtual void warning(const SAXParseExceptionT& e) { Arabica::SAX::CatchErrorHandler<std::string>::warning(e); } - virtual void error(const SAXParseExceptionT& e) { Arabica::SAX::CatchErrorHandler<std::string>::error(e); } - virtual void fatalError(const SAXParseExceptionT& e) { - Arabica::SAX::CatchErrorHandler<std::string>::fatalError(e); - } - - // LexicalHandler - virtual void startDTD(const std::string& name, - const std::string& publicId, - const std::string& systemId) { - std::cout << "startDTD" << std::endl; - std::cout << " name:" << name << std::endl; - std::cout << " publicId:" << publicId << std::endl; - std::cout << " systemId:" << systemId << std::endl; - } - - virtual void endDTD() { - std::cout << "endDTD" << std::endl; - } - virtual void startEntity(const std::string& name) { - std::cout << "startEntity" << std::endl; - std::cout << " name:" << name << std::endl; - } - virtual void endEntity(const std::string& name) { - std::cout << "endEntity" << std::endl; - std::cout << " name:" << name << std::endl; - } - virtual void startCDATA() { - std::cout << "startCDATA" << std::endl; - } - virtual void endCDATA() { - std::cout << "endCDATA" << std::endl; - } - virtual void comment(const std::string& text) { - std::cout << "comment" << std::endl; - std::cout << " text:" << text << std::endl; - } - - // DeclHandler - virtual void elementDecl(const std::string& name, const std::string& model) { - std::cout << "elementDecl" << std::endl; - std::cout << " name:" << name << std::endl; - std::cout << " model:" << model << std::endl; - } - virtual void attributeDecl(const std::string& elementName, - const std::string& attributeName, - const std::string& type, - const std::string& valueDefault, - const std::string& value) { - std::cout << "attributeDecl" << std::endl; - std::cout << " elementName:" << elementName << std::endl; - std::cout << " attributeName:" << attributeName << std::endl; - std::cout << " type:" << type << std::endl; - std::cout << " valueDefault:" << valueDefault << std::endl; - std::cout << " value:" << value << std::endl; - } - virtual void internalEntityDecl(const std::string& name, const std::string& value) { - std::cout << "internalEntityDecl" << std::endl; - std::cout << " name:" << name << std::endl; - std::cout << " value:" << value << std::endl; - } - virtual void externalEntityDecl(const std::string& name, - const std::string& publicId, - const std::string& systemId) { - std::cout << "externalEntityDecl" << std::endl; - std::cout << " name:" << name << std::endl; - std::cout << " publicId:" << publicId << std::endl; - std::cout << " systemId:" << systemId << std::endl; - } - - }; +class SCXMLParseHandler : + public Arabica::SAX::EntityResolver<std::string>, + public Arabica::SAX::DTDHandler<std::string>, + public Arabica::SAX::ContentHandler<std::string>, + public Arabica::SAX::CatchErrorHandler<std::string>, + public Arabica::SAX::LexicalHandler<std::string>, + public Arabica::SAX::DeclHandler<std::string> { +public: + SCXMLParseHandler() { } + virtual ~SCXMLParseHandler() { } + + // EntityResolver + virtual InputSourceT resolveEntity(const std::string& publicId , const std::string& systemId) { + return InputSourceT(); + } + + // DTDHandler + virtual void notationDecl(const std::string& name, + const std::string& publicId, + const std::string& systemId) { + std::cout << "notationDecl" << std::endl; + std::cout << " name:" << name << std::endl; + std::cout << " publicId:" << publicId << std::endl; + std::cout << " systemId:" << systemId << std::endl; + } + virtual void unparsedEntityDecl(const std::string& name, + const std::string& publicId, + const std::string& systemId, + const std::string& notationName) { + std::cout << "unparsedEntityDecl" << std::endl; + std::cout << " name:" << name << std::endl; + std::cout << " publicId:" << publicId << std::endl; + std::cout << " systemId:" << systemId << std::endl; + std::cout << " notationName:" << notationName << std::endl; + } + + // ContentHandler + virtual void setDocumentLocator(const LocatorT& locator) { + std::cout << "setDocumentLocator" << std::endl; + } + virtual void startDocument() { + std::cout << "startDocument" << std::endl; + } + virtual void endDocument() { + std::cout << "endDocument" << std::endl; + } + virtual void startPrefixMapping(const std::string& prefix, const std::string& uri) { + std::cout << "startPrefixMapping" << std::endl; + std::cout << " prefix:" << prefix << std::endl; + std::cout << " uri:" << uri << std::endl; + } + virtual void endPrefixMapping(const std::string& prefix) { + std::cout << "endPrefixMapping" << std::endl; + std::cout << " prefix:" << prefix << std::endl; + } + virtual void startElement(const std::string& namespaceURI, const std::string& localName, + const std::string& qName, const AttributesT& atts) { + std::cout << "startElement" << std::endl; + std::cout << " namespaceURI:" << namespaceURI << std::endl; + std::cout << " localName:" << localName << std::endl; + std::cout << " qName:" << qName << std::endl; + std::cout << " atts:" << atts.getLength() << std::endl; + } + virtual void endElement(const std::string& namespaceURI, const std::string& localName, + const std::string& qName) { + std::cout << "endElement" << std::endl; + std::cout << " namespaceURI:" << namespaceURI << std::endl; + std::cout << " localName:" << localName << std::endl; + std::cout << " qName:" << qName << std::endl; + } + virtual void characters(const std::string& ch) { + std::cout << "characters" << std::endl; + std::cout << " ch:" << ch << std::endl; + } + virtual void ignorableWhitespace(const std::string& ch) { + std::cout << "ignorableWhitespace" << std::endl; + std::cout << " ch:" << ch << std::endl; + } + virtual void processingInstruction(const std::string& target, const std::string& data) { + std::cout << "processingInstruction" << std::endl; + std::cout << " target:" << target << std::endl; + std::cout << " data:" << data << std::endl; + } + virtual void skippedEntity(const std::string& name) { + std::cout << "skippedEntity" << std::endl; + std::cout << " name:" << name << std::endl; + } + + // ErrorHandler + virtual void warning(const SAXParseExceptionT& e) { + Arabica::SAX::CatchErrorHandler<std::string>::warning(e); + } + virtual void error(const SAXParseExceptionT& e) { + Arabica::SAX::CatchErrorHandler<std::string>::error(e); + } + virtual void fatalError(const SAXParseExceptionT& e) { + Arabica::SAX::CatchErrorHandler<std::string>::fatalError(e); + } + + // LexicalHandler + virtual void startDTD(const std::string& name, + const std::string& publicId, + const std::string& systemId) { + std::cout << "startDTD" << std::endl; + std::cout << " name:" << name << std::endl; + std::cout << " publicId:" << publicId << std::endl; + std::cout << " systemId:" << systemId << std::endl; + } + + virtual void endDTD() { + std::cout << "endDTD" << std::endl; + } + virtual void startEntity(const std::string& name) { + std::cout << "startEntity" << std::endl; + std::cout << " name:" << name << std::endl; + } + virtual void endEntity(const std::string& name) { + std::cout << "endEntity" << std::endl; + std::cout << " name:" << name << std::endl; + } + virtual void startCDATA() { + std::cout << "startCDATA" << std::endl; + } + virtual void endCDATA() { + std::cout << "endCDATA" << std::endl; + } + virtual void comment(const std::string& text) { + std::cout << "comment" << std::endl; + std::cout << " text:" << text << std::endl; + } + + // DeclHandler + virtual void elementDecl(const std::string& name, const std::string& model) { + std::cout << "elementDecl" << std::endl; + std::cout << " name:" << name << std::endl; + std::cout << " model:" << model << std::endl; + } + virtual void attributeDecl(const std::string& elementName, + const std::string& attributeName, + const std::string& type, + const std::string& valueDefault, + const std::string& value) { + std::cout << "attributeDecl" << std::endl; + std::cout << " elementName:" << elementName << std::endl; + std::cout << " attributeName:" << attributeName << std::endl; + std::cout << " type:" << type << std::endl; + std::cout << " valueDefault:" << valueDefault << std::endl; + std::cout << " value:" << value << std::endl; + } + virtual void internalEntityDecl(const std::string& name, const std::string& value) { + std::cout << "internalEntityDecl" << std::endl; + std::cout << " name:" << name << std::endl; + std::cout << " value:" << value << std::endl; + } + virtual void externalEntityDecl(const std::string& name, + const std::string& publicId, + const std::string& systemId) { + std::cout << "externalEntityDecl" << std::endl; + std::cout << " name:" << name << std::endl; + std::cout << " publicId:" << publicId << std::endl; + std::cout << " systemId:" << systemId << std::endl; + } + +}; #endif } |