| /* |
| * Copyright (C) 2006 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #ifndef SkXMLParser_DEFINED |
| #define SkXMLParser_DEFINED |
| |
| #include "SkMath.h" |
| #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); |
| }; |
| |
| 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 |