1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
|
/*
* 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
|