michael@0: michael@0: /* michael@0: * Copyright 2011 Google Inc. michael@0: * michael@0: * Use of this source code is governed by a BSD-style license that can be michael@0: * found in the LICENSE file. michael@0: */ michael@0: #include "SkXMLParser.h" michael@0: #include "SkStream.h" michael@0: michael@0: static void reset(SkXMLPullParser::Curr* curr) michael@0: { michael@0: curr->fEventType = SkXMLPullParser::ERROR; michael@0: curr->fName = ""; michael@0: curr->fAttrInfoCount = 0; michael@0: curr->fIsWhitespace = false; michael@0: } michael@0: michael@0: SkXMLPullParser::SkXMLPullParser() : fStream(NULL) michael@0: { michael@0: fCurr.fEventType = ERROR; michael@0: fDepth = -1; michael@0: } michael@0: michael@0: SkXMLPullParser::SkXMLPullParser(SkStream* stream) : fStream(NULL) michael@0: { michael@0: fCurr.fEventType = ERROR; michael@0: fDepth = 0; michael@0: michael@0: this->setStream(stream); michael@0: } michael@0: michael@0: SkXMLPullParser::~SkXMLPullParser() michael@0: { michael@0: this->setStream(NULL); michael@0: } michael@0: michael@0: SkStream* SkXMLPullParser::setStream(SkStream* stream) michael@0: { michael@0: if (fStream && !stream) michael@0: this->onExit(); michael@0: michael@0: SkRefCnt_SafeAssign(fStream, stream); michael@0: michael@0: if (fStream) michael@0: { michael@0: fCurr.fEventType = START_DOCUMENT; michael@0: this->onInit(); michael@0: } michael@0: else michael@0: { michael@0: fCurr.fEventType = ERROR; michael@0: } michael@0: fDepth = 0; michael@0: michael@0: return fStream; michael@0: } michael@0: michael@0: SkXMLPullParser::EventType SkXMLPullParser::nextToken() michael@0: { michael@0: switch (fCurr.fEventType) { michael@0: case ERROR: michael@0: case END_DOCUMENT: michael@0: break; michael@0: case END_TAG: michael@0: fDepth -= 1; michael@0: // fall through michael@0: default: michael@0: reset(&fCurr); michael@0: fCurr.fEventType = this->onNextToken(); michael@0: break; michael@0: } michael@0: michael@0: switch (fCurr.fEventType) { michael@0: case START_TAG: michael@0: fDepth += 1; michael@0: break; michael@0: default: michael@0: break; michael@0: } michael@0: michael@0: return fCurr.fEventType; michael@0: } michael@0: michael@0: const char* SkXMLPullParser::getName() michael@0: { michael@0: switch (fCurr.fEventType) { michael@0: case START_TAG: michael@0: case END_TAG: michael@0: return fCurr.fName; michael@0: default: michael@0: return NULL; michael@0: } michael@0: } michael@0: michael@0: const char* SkXMLPullParser::getText() michael@0: { michael@0: switch (fCurr.fEventType) { michael@0: case TEXT: michael@0: case IGNORABLE_WHITESPACE: michael@0: return fCurr.fName; michael@0: default: michael@0: return NULL; michael@0: } michael@0: } michael@0: michael@0: bool SkXMLPullParser::isWhitespace() michael@0: { michael@0: switch (fCurr.fEventType) { michael@0: case IGNORABLE_WHITESPACE: michael@0: return true; michael@0: case TEXT: michael@0: case CDSECT: michael@0: return fCurr.fIsWhitespace; michael@0: default: michael@0: return false; // unknown/illegal michael@0: } michael@0: } michael@0: michael@0: int SkXMLPullParser::getAttributeCount() michael@0: { michael@0: return fCurr.fAttrInfoCount; michael@0: } michael@0: michael@0: void SkXMLPullParser::getAttributeInfo(int index, AttrInfo* info) michael@0: { michael@0: SkASSERT((unsigned)index < (unsigned)fCurr.fAttrInfoCount); michael@0: michael@0: if (info) michael@0: *info = fCurr.fAttrInfos[index]; michael@0: } michael@0: michael@0: bool SkXMLPullParser::onEntityReplacement(const char name[], michael@0: SkString* replacement) michael@0: { michael@0: // TODO: std 5 entities here michael@0: return false; michael@0: }