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