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
15class SkStream;
16
17class SkDOM;
18struct SkDOMNode;
19
20class SkXMLParserError {
21public:
22    enum ErrorCode {
23        kNoError,
24        kEmptyFile,
25        kUnknownElement,
26        kUnknownAttributeName,
27        kErrorInAttributeValue,
28        kDuplicateIDs,
29        kUnknownError
30    };
31
32    SkXMLParserError();
33    virtual ~SkXMLParserError();
34    ErrorCode getErrorCode() const { return fCode; }
35    virtual void getErrorString(SkString* str) const;
36    int getLineNumber() const { return fLineNumber; }
37    int getNativeCode() const { return fNativeCode; }
38    bool hasError() const { return fCode != kNoError || fNativeCode != -1; }
39    bool hasNoun() const { return fNoun.size() > 0; }
40    void reset();
41    void setCode(ErrorCode code) { fCode = code; }
42    void setNoun(const SkString& str) { fNoun.set(str); }
43    void setNoun(const char* ch)  { fNoun.set(ch); }
44    void setNoun(const char* ch, size_t len) { fNoun.set(ch, len); }
45protected:
46    ErrorCode fCode;
47private:
48    int fLineNumber;
49    int fNativeCode;
50    SkString fNoun;
51    friend class SkXMLParser;
52};
53
54class SkXMLParser {
55public:
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
67protected:
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
74public:
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;
81protected:
82    SkXMLParserError* fError;
83private:
84    void reportError(void* parser);
85};
86
87#endif
88