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