|
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(); |
|
34 ErrorCode getErrorCode() const { return fCode; } |
|
35 virtual void getErrorString(SkString* str) const; |
|
36 int getLineNumber() const { return fLineNumber; } |
|
37 int getNativeCode() const { return fNativeCode; } |
|
38 bool hasError() const { return fCode != kNoError || fNativeCode != -1; } |
|
39 bool hasNoun() const { return fNoun.size() > 0; } |
|
40 void reset(); |
|
41 void setCode(ErrorCode code) { fCode = code; } |
|
42 void setNoun(const SkString& str) { fNoun.set(str); } |
|
43 void setNoun(const char* ch) { fNoun.set(ch); } |
|
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 |