1*c8dee2aaSAndroid Build Coastguard Worker 2*c8dee2aaSAndroid Build Coastguard Worker /* 3*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2006 The Android Open Source Project 4*c8dee2aaSAndroid Build Coastguard Worker * 5*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 6*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 7*c8dee2aaSAndroid Build Coastguard Worker */ 8*c8dee2aaSAndroid Build Coastguard Worker 9*c8dee2aaSAndroid Build Coastguard Worker 10*c8dee2aaSAndroid Build Coastguard Worker #ifndef SkXMLParser_DEFINED 11*c8dee2aaSAndroid Build Coastguard Worker #define SkXMLParser_DEFINED 12*c8dee2aaSAndroid Build Coastguard Worker 13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkString.h" 14*c8dee2aaSAndroid Build Coastguard Worker 15*c8dee2aaSAndroid Build Coastguard Worker class SkStream; 16*c8dee2aaSAndroid Build Coastguard Worker 17*c8dee2aaSAndroid Build Coastguard Worker class SkDOM; 18*c8dee2aaSAndroid Build Coastguard Worker struct SkDOMNode; 19*c8dee2aaSAndroid Build Coastguard Worker 20*c8dee2aaSAndroid Build Coastguard Worker class SkXMLParserError { 21*c8dee2aaSAndroid Build Coastguard Worker public: 22*c8dee2aaSAndroid Build Coastguard Worker enum ErrorCode { 23*c8dee2aaSAndroid Build Coastguard Worker kNoError, 24*c8dee2aaSAndroid Build Coastguard Worker kEmptyFile, 25*c8dee2aaSAndroid Build Coastguard Worker kUnknownElement, 26*c8dee2aaSAndroid Build Coastguard Worker kUnknownAttributeName, 27*c8dee2aaSAndroid Build Coastguard Worker kErrorInAttributeValue, 28*c8dee2aaSAndroid Build Coastguard Worker kDuplicateIDs, 29*c8dee2aaSAndroid Build Coastguard Worker kUnknownError 30*c8dee2aaSAndroid Build Coastguard Worker }; 31*c8dee2aaSAndroid Build Coastguard Worker 32*c8dee2aaSAndroid Build Coastguard Worker SkXMLParserError(); 33*c8dee2aaSAndroid Build Coastguard Worker virtual ~SkXMLParserError(); getErrorCode()34*c8dee2aaSAndroid Build Coastguard Worker ErrorCode getErrorCode() const { return fCode; } 35*c8dee2aaSAndroid Build Coastguard Worker virtual void getErrorString(SkString* str) const; getLineNumber()36*c8dee2aaSAndroid Build Coastguard Worker int getLineNumber() const { return fLineNumber; } getNativeCode()37*c8dee2aaSAndroid Build Coastguard Worker int getNativeCode() const { return fNativeCode; } hasError()38*c8dee2aaSAndroid Build Coastguard Worker bool hasError() const { return fCode != kNoError || fNativeCode != -1; } hasNoun()39*c8dee2aaSAndroid Build Coastguard Worker bool hasNoun() const { return fNoun.size() > 0; } 40*c8dee2aaSAndroid Build Coastguard Worker void reset(); setCode(ErrorCode code)41*c8dee2aaSAndroid Build Coastguard Worker void setCode(ErrorCode code) { fCode = code; } setNoun(const SkString & str)42*c8dee2aaSAndroid Build Coastguard Worker void setNoun(const SkString& str) { fNoun.set(str); } setNoun(const char * ch)43*c8dee2aaSAndroid Build Coastguard Worker void setNoun(const char* ch) { fNoun.set(ch); } setNoun(const char * ch,size_t len)44*c8dee2aaSAndroid Build Coastguard Worker void setNoun(const char* ch, size_t len) { fNoun.set(ch, len); } 45*c8dee2aaSAndroid Build Coastguard Worker protected: 46*c8dee2aaSAndroid Build Coastguard Worker ErrorCode fCode; 47*c8dee2aaSAndroid Build Coastguard Worker private: 48*c8dee2aaSAndroid Build Coastguard Worker int fLineNumber; 49*c8dee2aaSAndroid Build Coastguard Worker int fNativeCode; 50*c8dee2aaSAndroid Build Coastguard Worker SkString fNoun; 51*c8dee2aaSAndroid Build Coastguard Worker friend class SkXMLParser; 52*c8dee2aaSAndroid Build Coastguard Worker }; 53*c8dee2aaSAndroid Build Coastguard Worker 54*c8dee2aaSAndroid Build Coastguard Worker class SkXMLParser { 55*c8dee2aaSAndroid Build Coastguard Worker public: 56*c8dee2aaSAndroid Build Coastguard Worker SkXMLParser(SkXMLParserError* parserError = nullptr); 57*c8dee2aaSAndroid Build Coastguard Worker virtual ~SkXMLParser(); 58*c8dee2aaSAndroid Build Coastguard Worker 59*c8dee2aaSAndroid Build Coastguard Worker /** Returns true for success 60*c8dee2aaSAndroid Build Coastguard Worker */ 61*c8dee2aaSAndroid Build Coastguard Worker bool parse(const char doc[], size_t len); 62*c8dee2aaSAndroid Build Coastguard Worker bool parse(SkStream& docStream); 63*c8dee2aaSAndroid Build Coastguard Worker bool parse(const SkDOM&, const SkDOMNode*); 64*c8dee2aaSAndroid Build Coastguard Worker 65*c8dee2aaSAndroid Build Coastguard Worker static void GetNativeErrorString(int nativeErrorCode, SkString* str); 66*c8dee2aaSAndroid Build Coastguard Worker 67*c8dee2aaSAndroid Build Coastguard Worker protected: 68*c8dee2aaSAndroid Build Coastguard Worker // override in subclasses; return true to stop parsing 69*c8dee2aaSAndroid Build Coastguard Worker virtual bool onStartElement(const char elem[]); 70*c8dee2aaSAndroid Build Coastguard Worker virtual bool onAddAttribute(const char name[], const char value[]); 71*c8dee2aaSAndroid Build Coastguard Worker virtual bool onEndElement(const char elem[]); 72*c8dee2aaSAndroid Build Coastguard Worker virtual bool onText(const char text[], int len); 73*c8dee2aaSAndroid Build Coastguard Worker 74*c8dee2aaSAndroid Build Coastguard Worker public: 75*c8dee2aaSAndroid Build Coastguard Worker // public for ported implementation, not meant for clients to call 76*c8dee2aaSAndroid Build Coastguard Worker bool startElement(const char elem[]); 77*c8dee2aaSAndroid Build Coastguard Worker bool addAttribute(const char name[], const char value[]); 78*c8dee2aaSAndroid Build Coastguard Worker bool endElement(const char elem[]); 79*c8dee2aaSAndroid Build Coastguard Worker bool text(const char text[], int len); 80*c8dee2aaSAndroid Build Coastguard Worker void* fParser; 81*c8dee2aaSAndroid Build Coastguard Worker protected: 82*c8dee2aaSAndroid Build Coastguard Worker SkXMLParserError* fError; 83*c8dee2aaSAndroid Build Coastguard Worker private: 84*c8dee2aaSAndroid Build Coastguard Worker void reportError(void* parser); 85*c8dee2aaSAndroid Build Coastguard Worker }; 86*c8dee2aaSAndroid Build Coastguard Worker 87*c8dee2aaSAndroid Build Coastguard Worker #endif 88