• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #include "SkXMLParser.h"
2 #include "SkStream.h"
3 
reset(SkXMLPullParser::Curr * curr)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 
SkXMLPullParser()12 SkXMLPullParser::SkXMLPullParser() : fStream(NULL)
13 {
14     fCurr.fEventType = ERROR;
15     fDepth = -1;
16 }
17 
SkXMLPullParser(SkStream * stream)18 SkXMLPullParser::SkXMLPullParser(SkStream* stream) : fStream(NULL)
19 {
20     fCurr.fEventType = ERROR;
21     fDepth = 0;
22 
23     this->setStream(stream);
24 }
25 
~SkXMLPullParser()26 SkXMLPullParser::~SkXMLPullParser()
27 {
28     this->setStream(NULL);
29 }
30 
setStream(SkStream * stream)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 
nextToken()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 
getName()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 
getText()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 
isWhitespace()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 
getAttributeCount()113 int SkXMLPullParser::getAttributeCount()
114 {
115     return fCurr.fAttrInfoCount;
116 }
117 
getAttributeInfo(int index,AttrInfo * info)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 
onEntityReplacement(const char name[],SkString * replacement)126 bool SkXMLPullParser::onEntityReplacement(const char name[],
127                                           SkString* replacement)
128 {
129     // TODO: std 5 entities here
130     return false;
131 }
132 
133