1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/gfx/skia/trunk/src/xml/SkXMLPullParser.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,138 @@ 1.4 + 1.5 +/* 1.6 + * Copyright 2011 Google Inc. 1.7 + * 1.8 + * Use of this source code is governed by a BSD-style license that can be 1.9 + * found in the LICENSE file. 1.10 + */ 1.11 +#include "SkXMLParser.h" 1.12 +#include "SkStream.h" 1.13 + 1.14 +static void reset(SkXMLPullParser::Curr* curr) 1.15 +{ 1.16 + curr->fEventType = SkXMLPullParser::ERROR; 1.17 + curr->fName = ""; 1.18 + curr->fAttrInfoCount = 0; 1.19 + curr->fIsWhitespace = false; 1.20 +} 1.21 + 1.22 +SkXMLPullParser::SkXMLPullParser() : fStream(NULL) 1.23 +{ 1.24 + fCurr.fEventType = ERROR; 1.25 + fDepth = -1; 1.26 +} 1.27 + 1.28 +SkXMLPullParser::SkXMLPullParser(SkStream* stream) : fStream(NULL) 1.29 +{ 1.30 + fCurr.fEventType = ERROR; 1.31 + fDepth = 0; 1.32 + 1.33 + this->setStream(stream); 1.34 +} 1.35 + 1.36 +SkXMLPullParser::~SkXMLPullParser() 1.37 +{ 1.38 + this->setStream(NULL); 1.39 +} 1.40 + 1.41 +SkStream* SkXMLPullParser::setStream(SkStream* stream) 1.42 +{ 1.43 + if (fStream && !stream) 1.44 + this->onExit(); 1.45 + 1.46 + SkRefCnt_SafeAssign(fStream, stream); 1.47 + 1.48 + if (fStream) 1.49 + { 1.50 + fCurr.fEventType = START_DOCUMENT; 1.51 + this->onInit(); 1.52 + } 1.53 + else 1.54 + { 1.55 + fCurr.fEventType = ERROR; 1.56 + } 1.57 + fDepth = 0; 1.58 + 1.59 + return fStream; 1.60 +} 1.61 + 1.62 +SkXMLPullParser::EventType SkXMLPullParser::nextToken() 1.63 +{ 1.64 + switch (fCurr.fEventType) { 1.65 + case ERROR: 1.66 + case END_DOCUMENT: 1.67 + break; 1.68 + case END_TAG: 1.69 + fDepth -= 1; 1.70 + // fall through 1.71 + default: 1.72 + reset(&fCurr); 1.73 + fCurr.fEventType = this->onNextToken(); 1.74 + break; 1.75 + } 1.76 + 1.77 + switch (fCurr.fEventType) { 1.78 + case START_TAG: 1.79 + fDepth += 1; 1.80 + break; 1.81 + default: 1.82 + break; 1.83 + } 1.84 + 1.85 + return fCurr.fEventType; 1.86 +} 1.87 + 1.88 +const char* SkXMLPullParser::getName() 1.89 +{ 1.90 + switch (fCurr.fEventType) { 1.91 + case START_TAG: 1.92 + case END_TAG: 1.93 + return fCurr.fName; 1.94 + default: 1.95 + return NULL; 1.96 + } 1.97 +} 1.98 + 1.99 +const char* SkXMLPullParser::getText() 1.100 +{ 1.101 + switch (fCurr.fEventType) { 1.102 + case TEXT: 1.103 + case IGNORABLE_WHITESPACE: 1.104 + return fCurr.fName; 1.105 + default: 1.106 + return NULL; 1.107 + } 1.108 +} 1.109 + 1.110 +bool SkXMLPullParser::isWhitespace() 1.111 +{ 1.112 + switch (fCurr.fEventType) { 1.113 + case IGNORABLE_WHITESPACE: 1.114 + return true; 1.115 + case TEXT: 1.116 + case CDSECT: 1.117 + return fCurr.fIsWhitespace; 1.118 + default: 1.119 + return false; // unknown/illegal 1.120 + } 1.121 +} 1.122 + 1.123 +int SkXMLPullParser::getAttributeCount() 1.124 +{ 1.125 + return fCurr.fAttrInfoCount; 1.126 +} 1.127 + 1.128 +void SkXMLPullParser::getAttributeInfo(int index, AttrInfo* info) 1.129 +{ 1.130 + SkASSERT((unsigned)index < (unsigned)fCurr.fAttrInfoCount); 1.131 + 1.132 + if (info) 1.133 + *info = fCurr.fAttrInfos[index]; 1.134 +} 1.135 + 1.136 +bool SkXMLPullParser::onEntityReplacement(const char name[], 1.137 + SkString* replacement) 1.138 +{ 1.139 + // TODO: std 5 entities here 1.140 + return false; 1.141 +}