| |
| /* |
| * 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; |
| } |
| |