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