OLD | NEW |
| (Empty) |
1 #include "SkXMLParser.h" | |
2 #include "SkStream.h" | |
3 | |
4 static void reset(SkXMLPullParser::Curr* curr) | |
5 { | |
6 curr->fEventType = SkXMLPullParser::ERROR; | |
7 curr->fName = ""; | |
8 curr->fAttrInfoCount = 0; | |
9 curr->fIsWhitespace = false; | |
10 } | |
11 | |
12 SkXMLPullParser::SkXMLPullParser() : fStream(NULL) | |
13 { | |
14 fCurr.fEventType = ERROR; | |
15 fDepth = -1; | |
16 } | |
17 | |
18 SkXMLPullParser::SkXMLPullParser(SkStream* stream) : fStream(NULL) | |
19 { | |
20 fCurr.fEventType = ERROR; | |
21 fDepth = 0; | |
22 | |
23 this->setStream(stream); | |
24 } | |
25 | |
26 SkXMLPullParser::~SkXMLPullParser() | |
27 { | |
28 this->setStream(NULL); | |
29 } | |
30 | |
31 SkStream* SkXMLPullParser::setStream(SkStream* stream) | |
32 { | |
33 if (fStream && !stream) | |
34 this->onExit(); | |
35 | |
36 SkRefCnt_SafeAssign(fStream, stream); | |
37 | |
38 if (fStream) | |
39 { | |
40 fCurr.fEventType = START_DOCUMENT; | |
41 this->onInit(); | |
42 } | |
43 else | |
44 { | |
45 fCurr.fEventType = ERROR; | |
46 } | |
47 fDepth = 0; | |
48 | |
49 return fStream; | |
50 } | |
51 | |
52 SkXMLPullParser::EventType SkXMLPullParser::nextToken() | |
53 { | |
54 switch (fCurr.fEventType) { | |
55 case ERROR: | |
56 case END_DOCUMENT: | |
57 break; | |
58 case END_TAG: | |
59 fDepth -= 1; | |
60 // fall through | |
61 default: | |
62 reset(&fCurr); | |
63 fCurr.fEventType = this->onNextToken(); | |
64 break; | |
65 } | |
66 | |
67 switch (fCurr.fEventType) { | |
68 case START_TAG: | |
69 fDepth += 1; | |
70 break; | |
71 default: | |
72 break; | |
73 } | |
74 | |
75 return fCurr.fEventType; | |
76 } | |
77 | |
78 const char* SkXMLPullParser::getName() | |
79 { | |
80 switch (fCurr.fEventType) { | |
81 case START_TAG: | |
82 case END_TAG: | |
83 return fCurr.fName; | |
84 default: | |
85 return NULL; | |
86 } | |
87 } | |
88 | |
89 const char* SkXMLPullParser::getText() | |
90 { | |
91 switch (fCurr.fEventType) { | |
92 case TEXT: | |
93 case IGNORABLE_WHITESPACE: | |
94 return fCurr.fName; | |
95 default: | |
96 return NULL; | |
97 } | |
98 } | |
99 | |
100 bool SkXMLPullParser::isWhitespace() | |
101 { | |
102 switch (fCurr.fEventType) { | |
103 case IGNORABLE_WHITESPACE: | |
104 return true; | |
105 case TEXT: | |
106 case CDSECT: | |
107 return fCurr.fIsWhitespace; | |
108 default: | |
109 return false; // unknown/illegal | |
110 } | |
111 } | |
112 | |
113 int SkXMLPullParser::getAttributeCount() | |
114 { | |
115 return fCurr.fAttrInfoCount; | |
116 } | |
117 | |
118 void SkXMLPullParser::getAttributeInfo(int index, AttrInfo* info) | |
119 { | |
120 SkASSERT((unsigned)index < (unsigned)fCurr.fAttrInfoCount); | |
121 | |
122 if (info) | |
123 *info = fCurr.fAttrInfos[index]; | |
124 } | |
125 | |
126 bool SkXMLPullParser::onEntityReplacement(const char name[], | |
127 SkString* replacement) | |
128 { | |
129 // TODO: std 5 entities here | |
130 return false; | |
131 } | |
132 | |
OLD | NEW |