1#include "SkXMLParser.h" 2#include "SkStream.h" 3 4static void reset(SkXMLPullParser::Curr* curr) 5{ 6 curr->fEventType = SkXMLPullParser::ERROR; 7 curr->fName = ""; 8 curr->fAttrInfoCount = 0; 9 curr->fIsWhitespace = false; 10} 11 12SkXMLPullParser::SkXMLPullParser() : fStream(NULL) 13{ 14 fCurr.fEventType = ERROR; 15 fDepth = -1; 16} 17 18SkXMLPullParser::SkXMLPullParser(SkStream* stream) : fStream(NULL) 19{ 20 fCurr.fEventType = ERROR; 21 fDepth = 0; 22 23 this->setStream(stream); 24} 25 26SkXMLPullParser::~SkXMLPullParser() 27{ 28 this->setStream(NULL); 29} 30 31SkStream* 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 52SkXMLPullParser::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 78const 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 89const 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 100bool 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 113int SkXMLPullParser::getAttributeCount() 114{ 115 return fCurr.fAttrInfoCount; 116} 117 118void 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 126bool SkXMLPullParser::onEntityReplacement(const char name[], 127 SkString* replacement) 128{ 129 // TODO: std 5 entities here 130 return false; 131} 132 133