xref: /aosp_15_r20/external/skia/src/xml/SkXMLParser.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
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