michael@0: michael@0: /* michael@0: * Copyright 2006 The Android Open Source Project 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: michael@0: michael@0: #ifndef SkXMLParser_DEFINED michael@0: #define SkXMLParser_DEFINED michael@0: michael@0: #include "SkString.h" michael@0: michael@0: class SkStream; michael@0: michael@0: class SkDOM; michael@0: struct SkDOMNode; michael@0: michael@0: class SkXMLParserError { michael@0: public: michael@0: enum ErrorCode { michael@0: kNoError, michael@0: kEmptyFile, michael@0: kUnknownElement, michael@0: kUnknownAttributeName, michael@0: kErrorInAttributeValue, michael@0: kDuplicateIDs, michael@0: kUnknownError michael@0: }; michael@0: michael@0: SkXMLParserError(); michael@0: virtual ~SkXMLParserError(); michael@0: ErrorCode getErrorCode() const { return fCode; } michael@0: virtual void getErrorString(SkString* str) const; michael@0: int getLineNumber() const { return fLineNumber; } michael@0: int getNativeCode() const { return fNativeCode; } michael@0: bool hasError() const { return fCode != kNoError || fNativeCode != -1; } michael@0: bool hasNoun() const { return fNoun.size() > 0; } michael@0: void reset(); michael@0: void setCode(ErrorCode code) { fCode = code; } michael@0: void setNoun(const SkString& str) { fNoun.set(str); } michael@0: void setNoun(const char* ch) { fNoun.set(ch); } michael@0: void setNoun(const char* ch, size_t len) { fNoun.set(ch, len); } michael@0: protected: michael@0: ErrorCode fCode; michael@0: private: michael@0: int fLineNumber; michael@0: int fNativeCode; michael@0: SkString fNoun; michael@0: friend class SkXMLParser; michael@0: }; michael@0: michael@0: class SkXMLParser { michael@0: public: michael@0: SkXMLParser(SkXMLParserError* parserError = NULL); michael@0: virtual ~SkXMLParser(); michael@0: michael@0: /** Returns true for success michael@0: */ michael@0: bool parse(const char doc[], size_t len); michael@0: bool parse(SkStream& docStream); michael@0: bool parse(const SkDOM&, const SkDOMNode*); michael@0: michael@0: static void GetNativeErrorString(int nativeErrorCode, SkString* str); michael@0: michael@0: protected: michael@0: // override in subclasses; return true to stop parsing michael@0: virtual bool onStartElement(const char elem[]); michael@0: virtual bool onAddAttribute(const char name[], const char value[]); michael@0: virtual bool onEndElement(const char elem[]); michael@0: virtual bool onText(const char text[], int len); michael@0: michael@0: public: michael@0: // public for ported implementation, not meant for clients to call michael@0: virtual bool startElement(const char elem[]); michael@0: virtual bool addAttribute(const char name[], const char value[]); michael@0: virtual bool endElement(const char elem[]); michael@0: virtual bool text(const char text[], int len); michael@0: void* fParser; michael@0: protected: michael@0: SkXMLParserError* fError; michael@0: private: michael@0: void reportError(void* parser); michael@0: }; michael@0: michael@0: #if 0 michael@0: class SkXMLPullParser { michael@0: public: michael@0: SkXMLPullParser(); michael@0: explicit SkXMLPullParser(SkStream*); michael@0: virtual ~SkXMLPullParser(); michael@0: michael@0: SkStream* getStream() const { return fStream; } michael@0: SkStream* setStream(SkStream* stream); michael@0: michael@0: enum EventType { michael@0: ERROR = -1, michael@0: START_DOCUMENT, michael@0: END_DOCUMENT, michael@0: START_TAG, michael@0: END_TAG, michael@0: TEXT, michael@0: CDSECT, michael@0: ENTITY_REF, michael@0: IGNORABLE_WHITESPACE, michael@0: PROCESSING_INSTRUCTION, michael@0: COMMENT, michael@0: DOCDECL michael@0: }; michael@0: michael@0: EventType nextToken(); michael@0: EventType getEventType() const { return fCurr.fEventType; } michael@0: michael@0: struct AttrInfo { michael@0: const char* fName; michael@0: const char* fValue; michael@0: }; michael@0: michael@0: int getDepth() const { return fDepth; } michael@0: const char* getName(); michael@0: int getAttributeCount(); michael@0: void getAttributeInfo(int, AttrInfo*); michael@0: const char* getText(); michael@0: bool isWhitespace(); michael@0: michael@0: protected: michael@0: virtual bool onEntityReplacement(const char name[], michael@0: SkString* replacement); michael@0: michael@0: public: michael@0: struct Curr { michael@0: EventType fEventType; michael@0: const char* fName; michael@0: AttrInfo* fAttrInfos; michael@0: int fAttrInfoCount; michael@0: bool fIsWhitespace; michael@0: }; michael@0: michael@0: private: michael@0: // implemented in the porting layer michael@0: bool onInit(); // return false on failure michael@0: EventType onNextToken(); michael@0: void onExit(); michael@0: michael@0: SkStream* fStream; michael@0: Curr fCurr; michael@0: int fDepth; michael@0: michael@0: struct Impl; michael@0: Impl* fImpl; michael@0: }; michael@0: #endif michael@0: michael@0: #endif