diff -r 000000000000 -r 6474c204b198 gfx/skia/trunk/include/xml/SkXMLParser.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gfx/skia/trunk/include/xml/SkXMLParser.h Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,155 @@ + +/* + * Copyright 2006 The Android Open Source Project + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + + +#ifndef SkXMLParser_DEFINED +#define SkXMLParser_DEFINED + +#include "SkString.h" + +class SkStream; + +class SkDOM; +struct SkDOMNode; + +class SkXMLParserError { +public: + enum ErrorCode { + kNoError, + kEmptyFile, + kUnknownElement, + kUnknownAttributeName, + kErrorInAttributeValue, + kDuplicateIDs, + kUnknownError + }; + + SkXMLParserError(); + virtual ~SkXMLParserError(); + ErrorCode getErrorCode() const { return fCode; } + virtual void getErrorString(SkString* str) const; + int getLineNumber() const { return fLineNumber; } + int getNativeCode() const { return fNativeCode; } + bool hasError() const { return fCode != kNoError || fNativeCode != -1; } + bool hasNoun() const { return fNoun.size() > 0; } + void reset(); + void setCode(ErrorCode code) { fCode = code; } + void setNoun(const SkString& str) { fNoun.set(str); } + void setNoun(const char* ch) { fNoun.set(ch); } + void setNoun(const char* ch, size_t len) { fNoun.set(ch, len); } +protected: + ErrorCode fCode; +private: + int fLineNumber; + int fNativeCode; + SkString fNoun; + friend class SkXMLParser; +}; + +class SkXMLParser { +public: + SkXMLParser(SkXMLParserError* parserError = NULL); + virtual ~SkXMLParser(); + + /** Returns true for success + */ + bool parse(const char doc[], size_t len); + bool parse(SkStream& docStream); + bool parse(const SkDOM&, const SkDOMNode*); + + static void GetNativeErrorString(int nativeErrorCode, SkString* str); + +protected: + // override in subclasses; return true to stop parsing + virtual bool onStartElement(const char elem[]); + virtual bool onAddAttribute(const char name[], const char value[]); + virtual bool onEndElement(const char elem[]); + virtual bool onText(const char text[], int len); + +public: + // public for ported implementation, not meant for clients to call + virtual bool startElement(const char elem[]); + virtual bool addAttribute(const char name[], const char value[]); + virtual bool endElement(const char elem[]); + virtual bool text(const char text[], int len); + void* fParser; +protected: + SkXMLParserError* fError; +private: + void reportError(void* parser); +}; + +#if 0 +class SkXMLPullParser { +public: + SkXMLPullParser(); + explicit SkXMLPullParser(SkStream*); + virtual ~SkXMLPullParser(); + + SkStream* getStream() const { return fStream; } + SkStream* setStream(SkStream* stream); + + enum EventType { + ERROR = -1, + START_DOCUMENT, + END_DOCUMENT, + START_TAG, + END_TAG, + TEXT, + CDSECT, + ENTITY_REF, + IGNORABLE_WHITESPACE, + PROCESSING_INSTRUCTION, + COMMENT, + DOCDECL + }; + + EventType nextToken(); + EventType getEventType() const { return fCurr.fEventType; } + + struct AttrInfo { + const char* fName; + const char* fValue; + }; + + int getDepth() const { return fDepth; } + const char* getName(); + int getAttributeCount(); + void getAttributeInfo(int, AttrInfo*); + const char* getText(); + bool isWhitespace(); + +protected: + virtual bool onEntityReplacement(const char name[], + SkString* replacement); + +public: + struct Curr { + EventType fEventType; + const char* fName; + AttrInfo* fAttrInfos; + int fAttrInfoCount; + bool fIsWhitespace; + }; + +private: + // implemented in the porting layer + bool onInit(); // return false on failure + EventType onNextToken(); + void onExit(); + + SkStream* fStream; + Curr fCurr; + int fDepth; + + struct Impl; + Impl* fImpl; +}; +#endif + +#endif