| /* | |
| * Copyright 2006 The Android Open Source Project | |
| * | |
| * Use of this source code is governed by a BSD-style license that can be | |
| * found in the LICENSE file. | |
| */ | |
| #ifndef SkXMLParser_DEFINED | |
| #define SkXMLParser_DEFINED | |
| #include "SkString.h" | |
| class SkStream; | |
| class SkDOM; | |
| struct SkDOMNode; | |
| class SkXMLParserError { | |
| public: | |
| enum ErrorCode { | |
| kNoError, | |
| kEmptyFile, | |
| kUnknownElement, | |
| kUnknownAttributeName, | |
| kErrorInAttributeValue, | |
| kDuplicateIDs, | |
| kUnknownError | |
| }; | |
| SkXMLParserError(); | |
| virtual ~SkXMLParserError(); | |
| ErrorCode getErrorCode() const { return fCode; } | |
| virtual void getErrorString(SkString* str) const; | |
| int getLineNumber() const { return fLineNumber; } | |
| int getNativeCode() const { return fNativeCode; } | |
| bool hasError() const { return fCode != kNoError || fNativeCode != -1; } | |
| bool hasNoun() const { return fNoun.size() > 0; } | |
| void reset(); | |
| void setCode(ErrorCode code) { fCode = code; } | |
| void setNoun(const SkString& str) { fNoun.set(str); } | |
| void setNoun(const char* ch) { fNoun.set(ch); } | |
| void setNoun(const char* ch, size_t len) { fNoun.set(ch, len); } | |
| protected: | |
| ErrorCode fCode; | |
| private: | |
| int fLineNumber; | |
| int fNativeCode; | |
| SkString fNoun; | |
| friend class SkXMLParser; | |
| }; | |
| class SkXMLParser { | |
| public: | |
| SkXMLParser(SkXMLParserError* parserError = NULL); | |
| virtual ~SkXMLParser(); | |
| /** Returns true for success | |
| */ | |
| bool parse(const char doc[], size_t len); | |
| bool parse(SkStream& docStream); | |
| bool parse(const SkDOM&, const SkDOMNode*); | |
| static void GetNativeErrorString(int nativeErrorCode, SkString* str); | |
| protected: | |
| // override in subclasses; return true to stop parsing | |
| virtual bool onStartElement(const char elem[]); | |
| virtual bool onAddAttribute(const char name[], const char value[]); | |
| virtual bool onEndElement(const char elem[]); | |
| virtual bool onText(const char text[], int len); | |
| public: | |
| // public for ported implementation, not meant for clients to call | |
| virtual bool startElement(const char elem[]); | |
| virtual bool addAttribute(const char name[], const char value[]); | |
| virtual bool endElement(const char elem[]); | |
| virtual bool text(const char text[], int len); | |
| void* fParser; | |
| protected: | |
| SkXMLParserError* fError; | |
| private: | |
| void reportError(void* parser); | |
| }; | |
| #if 0 | |
| class SkXMLPullParser { | |
| public: | |
| SkXMLPullParser(); | |
| explicit SkXMLPullParser(SkStream*); | |
| virtual ~SkXMLPullParser(); | |
| SkStream* getStream() const { return fStream; } | |
| SkStream* setStream(SkStream* stream); | |
| enum EventType { | |
| ERROR = -1, | |
| START_DOCUMENT, | |
| END_DOCUMENT, | |
| START_TAG, | |
| END_TAG, | |
| TEXT, | |
| CDSECT, | |
| ENTITY_REF, | |
| IGNORABLE_WHITESPACE, | |
| PROCESSING_INSTRUCTION, | |
| COMMENT, | |
| DOCDECL | |
| }; | |
| EventType nextToken(); | |
| EventType getEventType() const { return fCurr.fEventType; } | |
| struct AttrInfo { | |
| const char* fName; | |
| const char* fValue; | |
| }; | |
| int getDepth() const { return fDepth; } | |
| const char* getName(); | |
| int getAttributeCount(); | |
| void getAttributeInfo(int, AttrInfo*); | |
| const char* getText(); | |
| bool isWhitespace(); | |
| protected: | |
| virtual bool onEntityReplacement(const char name[], | |
| SkString* replacement); | |
| public: | |
| struct Curr { | |
| EventType fEventType; | |
| const char* fName; | |
| AttrInfo* fAttrInfos; | |
| int fAttrInfoCount; | |
| bool fIsWhitespace; | |
| }; | |
| private: | |
| // implemented in the porting layer | |
| bool onInit(); // return false on failure | |
| EventType onNextToken(); | |
| void onExit(); | |
| SkStream* fStream; | |
| Curr fCurr; | |
| int fDepth; | |
| struct Impl; | |
| Impl* fImpl; | |
| }; | |
| #endif | |
| #endif |