• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 "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 = NULL);
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      virtual bool startElement(const char elem[]);
77      virtual bool addAttribute(const char name[], const char value[]);
78      virtual bool endElement(const char elem[]);
79      virtual 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  #if 0
88  class SkXMLPullParser {
89  public:
90              SkXMLPullParser();
91      explicit SkXMLPullParser(SkStream*);
92      virtual ~SkXMLPullParser();
93  
94      SkStream*   getStream() const { return fStream; }
95      SkStream*   setStream(SkStream* stream);
96  
97      enum EventType {
98          ERROR = -1,
99          START_DOCUMENT,
100          END_DOCUMENT,
101          START_TAG,
102          END_TAG,
103          TEXT,
104          CDSECT,
105          ENTITY_REF,
106          IGNORABLE_WHITESPACE,
107          PROCESSING_INSTRUCTION,
108          COMMENT,
109          DOCDECL
110      };
111  
112      EventType   nextToken();
113      EventType   getEventType() const { return fCurr.fEventType; }
114  
115      struct AttrInfo {
116          const char* fName;
117          const char* fValue;
118      };
119  
120      int         getDepth() const { return fDepth; }
121      const char* getName();
122      int         getAttributeCount();
123      void        getAttributeInfo(int, AttrInfo*);
124      const char* getText();
125      bool        isWhitespace();
126  
127  protected:
128      virtual bool onEntityReplacement(const char name[],
129                                       SkString* replacement);
130  
131  public:
132      struct Curr {
133          EventType   fEventType;
134          const char* fName;
135          AttrInfo*   fAttrInfos;
136          int         fAttrInfoCount;
137          bool        fIsWhitespace;
138      };
139  
140  private:
141      // implemented in the porting layer
142      bool        onInit();   // return false on failure
143      EventType   onNextToken();
144      void        onExit();
145  
146      SkStream*   fStream;
147      Curr        fCurr;
148      int         fDepth;
149  
150      struct Impl;
151      Impl*   fImpl;
152  };
153  #endif
154  
155  #endif
156