diff options
Diffstat (limited to 'src/xml/SkXMLPullParser.cpp')
-rw-r--r-- | src/xml/SkXMLPullParser.cpp | 132 |
1 files changed, 132 insertions, 0 deletions
diff --git a/src/xml/SkXMLPullParser.cpp b/src/xml/SkXMLPullParser.cpp new file mode 100644 index 0000000000..5df75b7765 --- /dev/null +++ b/src/xml/SkXMLPullParser.cpp @@ -0,0 +1,132 @@ +#include "SkXMLParser.h" +#include "SkStream.h" + +static void reset(SkXMLPullParser::Curr* curr) +{ + curr->fEventType = SkXMLPullParser::ERROR; + curr->fName = ""; + curr->fAttrInfoCount = 0; + curr->fIsWhitespace = false; +} + +SkXMLPullParser::SkXMLPullParser() : fStream(NULL) +{ + fCurr.fEventType = ERROR; + fDepth = -1; +} + +SkXMLPullParser::SkXMLPullParser(SkStream* stream) : fStream(NULL) +{ + fCurr.fEventType = ERROR; + fDepth = 0; + + this->setStream(stream); +} + +SkXMLPullParser::~SkXMLPullParser() +{ + this->setStream(NULL); +} + +SkStream* SkXMLPullParser::setStream(SkStream* stream) +{ + if (fStream && !stream) + this->onExit(); + + SkRefCnt_SafeAssign(fStream, stream); + + if (fStream) + { + fCurr.fEventType = START_DOCUMENT; + this->onInit(); + } + else + { + fCurr.fEventType = ERROR; + } + fDepth = 0; + + return fStream; +} + +SkXMLPullParser::EventType SkXMLPullParser::nextToken() +{ + switch (fCurr.fEventType) { + case ERROR: + case END_DOCUMENT: + break; + case END_TAG: + fDepth -= 1; + // fall through + default: + reset(&fCurr); + fCurr.fEventType = this->onNextToken(); + break; + } + + switch (fCurr.fEventType) { + case START_TAG: + fDepth += 1; + break; + default: + break; + } + + return fCurr.fEventType; +} + +const char* SkXMLPullParser::getName() +{ + switch (fCurr.fEventType) { + case START_TAG: + case END_TAG: + return fCurr.fName; + default: + return NULL; + } +} + +const char* SkXMLPullParser::getText() +{ + switch (fCurr.fEventType) { + case TEXT: + case IGNORABLE_WHITESPACE: + return fCurr.fName; + default: + return NULL; + } +} + +bool SkXMLPullParser::isWhitespace() +{ + switch (fCurr.fEventType) { + case IGNORABLE_WHITESPACE: + return true; + case TEXT: + case CDSECT: + return fCurr.fIsWhitespace; + default: + return false; // unknown/illegal + } +} + +int SkXMLPullParser::getAttributeCount() +{ + return fCurr.fAttrInfoCount; +} + +void SkXMLPullParser::getAttributeInfo(int index, AttrInfo* info) +{ + SkASSERT((unsigned)index < (unsigned)fCurr.fAttrInfoCount); + + if (info) + *info = fCurr.fAttrInfos[index]; +} + +bool SkXMLPullParser::onEntityReplacement(const char name[], + SkString* replacement) +{ + // TODO: std 5 entities here + return false; +} + |