1 2 /* 3 * Copyright 2006 The Android Open Source Project 4 * 5 * Use of this source code is governed by a BSD-style license that can be 6 * found in the LICENSE file. 7 */ 8 9 10 #ifndef SkXMLParser_DEFINED 11 #define SkXMLParser_DEFINED 12 13 #include "SkString.h" 14 15 class SkStream; 16 17 class SkDOM; 18 struct SkDOMNode; 19 20 class SkXMLParserError { 21 public: 22 enum ErrorCode { 23 kNoError, 24 kEmptyFile, 25 kUnknownElement, 26 kUnknownAttributeName, 27 kErrorInAttributeValue, 28 kDuplicateIDs, 29 kUnknownError 30 }; 31 32 SkXMLParserError(); 33 virtual ~SkXMLParserError(); getErrorCode()34 ErrorCode getErrorCode() const { return fCode; } 35 virtual void getErrorString(SkString* str) const; getLineNumber()36 int getLineNumber() const { return fLineNumber; } getNativeCode()37 int getNativeCode() const { return fNativeCode; } hasError()38 bool hasError() const { return fCode != kNoError || fNativeCode != -1; } hasNoun()39 bool hasNoun() const { return fNoun.size() > 0; } 40 void reset(); setCode(ErrorCode code)41 void setCode(ErrorCode code) { fCode = code; } setNoun(const SkString & str)42 void setNoun(const SkString& str) { fNoun.set(str); } setNoun(const char * ch)43 void setNoun(const char* ch) { fNoun.set(ch); } setNoun(const char * ch,size_t len)44 void setNoun(const char* ch, size_t len) { fNoun.set(ch, len); } 45 protected: 46 ErrorCode fCode; 47 private: 48 int fLineNumber; 49 int fNativeCode; 50 SkString fNoun; 51 friend class SkXMLParser; 52 }; 53 54 class SkXMLParser { 55 public: 56 SkXMLParser(SkXMLParserError* parserError = NULL); 57 virtual ~SkXMLParser(); 58 59 /** Returns true for success 60 */ 61 bool parse(const char doc[], size_t len); 62 bool parse(SkStream& docStream); 63 bool parse(const SkDOM&, const SkDOMNode*); 64 65 static void GetNativeErrorString(int nativeErrorCode, SkString* str); 66 67 protected: 68 // override in subclasses; return true to stop parsing 69 virtual bool onStartElement(const char elem[]); 70 virtual bool onAddAttribute(const char name[], const char value[]); 71 virtual bool onEndElement(const char elem[]); 72 virtual bool onText(const char text[], int len); 73 74 public: 75 // public for ported implementation, not meant for clients to call 76 virtual bool startElement(const char elem[]); 77 virtual bool addAttribute(const char name[], const char value[]); 78 virtual bool endElement(const char elem[]); 79 virtual bool text(const char text[], int len); 80 void* fParser; 81 protected: 82 SkXMLParserError* fError; 83 private: 84 void reportError(void* parser); 85 }; 86 87 #if 0 88 class SkXMLPullParser { 89 public: 90 SkXMLPullParser(); 91 explicit SkXMLPullParser(SkStream*); 92 virtual ~SkXMLPullParser(); 93 94 SkStream* getStream() const { return fStream; } 95 SkStream* setStream(SkStream* stream); 96 97 enum EventType { 98 ERROR = -1, 99 START_DOCUMENT, 100 END_DOCUMENT, 101 START_TAG, 102 END_TAG, 103 TEXT, 104 CDSECT, 105 ENTITY_REF, 106 IGNORABLE_WHITESPACE, 107 PROCESSING_INSTRUCTION, 108 COMMENT, 109 DOCDECL 110 }; 111 112 EventType nextToken(); 113 EventType getEventType() const { return fCurr.fEventType; } 114 115 struct AttrInfo { 116 const char* fName; 117 const char* fValue; 118 }; 119 120 int getDepth() const { return fDepth; } 121 const char* getName(); 122 int getAttributeCount(); 123 void getAttributeInfo(int, AttrInfo*); 124 const char* getText(); 125 bool isWhitespace(); 126 127 protected: 128 virtual bool onEntityReplacement(const char name[], 129 SkString* replacement); 130 131 public: 132 struct Curr { 133 EventType fEventType; 134 const char* fName; 135 AttrInfo* fAttrInfos; 136 int fAttrInfoCount; 137 bool fIsWhitespace; 138 }; 139 140 private: 141 // implemented in the porting layer 142 bool onInit(); // return false on failure 143 EventType onNextToken(); 144 void onExit(); 145 146 SkStream* fStream; 147 Curr fCurr; 148 int fDepth; 149 150 struct Impl; 151 Impl* fImpl; 152 }; 153 #endif 154 155 #endif 156