| /* | |
| * Copyright 2011 Google Inc. | |
| * | |
| * Use of this source code is governed by a BSD-style license that can be | |
| * found in the LICENSE file. | |
| */ | |
| #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; | |
| } |