1cb93a386Sopenharmony_ci
2cb93a386Sopenharmony_ci/*
3cb93a386Sopenharmony_ci * Copyright 2006 The Android Open Source Project
4cb93a386Sopenharmony_ci *
5cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be
6cb93a386Sopenharmony_ci * found in the LICENSE file.
7cb93a386Sopenharmony_ci */
8cb93a386Sopenharmony_ci
9cb93a386Sopenharmony_ci
10cb93a386Sopenharmony_ci#ifndef SkXMLParser_DEFINED
11cb93a386Sopenharmony_ci#define SkXMLParser_DEFINED
12cb93a386Sopenharmony_ci
13cb93a386Sopenharmony_ci#include "include/core/SkString.h"
14cb93a386Sopenharmony_ci
15cb93a386Sopenharmony_ciclass SkStream;
16cb93a386Sopenharmony_ci
17cb93a386Sopenharmony_ciclass SkDOM;
18cb93a386Sopenharmony_cistruct SkDOMNode;
19cb93a386Sopenharmony_ci
20cb93a386Sopenharmony_ciclass SkXMLParserError {
21cb93a386Sopenharmony_cipublic:
22cb93a386Sopenharmony_ci    enum ErrorCode {
23cb93a386Sopenharmony_ci        kNoError,
24cb93a386Sopenharmony_ci        kEmptyFile,
25cb93a386Sopenharmony_ci        kUnknownElement,
26cb93a386Sopenharmony_ci        kUnknownAttributeName,
27cb93a386Sopenharmony_ci        kErrorInAttributeValue,
28cb93a386Sopenharmony_ci        kDuplicateIDs,
29cb93a386Sopenharmony_ci        kUnknownError
30cb93a386Sopenharmony_ci    };
31cb93a386Sopenharmony_ci
32cb93a386Sopenharmony_ci    SkXMLParserError();
33cb93a386Sopenharmony_ci    virtual ~SkXMLParserError();
34cb93a386Sopenharmony_ci    ErrorCode getErrorCode() const { return fCode; }
35cb93a386Sopenharmony_ci    virtual void getErrorString(SkString* str) const;
36cb93a386Sopenharmony_ci    int getLineNumber() const { return fLineNumber; }
37cb93a386Sopenharmony_ci    int getNativeCode() const { return fNativeCode; }
38cb93a386Sopenharmony_ci    bool hasError() const { return fCode != kNoError || fNativeCode != -1; }
39cb93a386Sopenharmony_ci    bool hasNoun() const { return fNoun.size() > 0; }
40cb93a386Sopenharmony_ci    void reset();
41cb93a386Sopenharmony_ci    void setCode(ErrorCode code) { fCode = code; }
42cb93a386Sopenharmony_ci    void setNoun(const SkString& str) { fNoun.set(str); }
43cb93a386Sopenharmony_ci    void setNoun(const char* ch)  { fNoun.set(ch); }
44cb93a386Sopenharmony_ci    void setNoun(const char* ch, size_t len) { fNoun.set(ch, len); }
45cb93a386Sopenharmony_ciprotected:
46cb93a386Sopenharmony_ci    ErrorCode fCode;
47cb93a386Sopenharmony_ciprivate:
48cb93a386Sopenharmony_ci    int fLineNumber;
49cb93a386Sopenharmony_ci    int fNativeCode;
50cb93a386Sopenharmony_ci    SkString fNoun;
51cb93a386Sopenharmony_ci    friend class SkXMLParser;
52cb93a386Sopenharmony_ci};
53cb93a386Sopenharmony_ci
54cb93a386Sopenharmony_ciclass SkXMLParser {
55cb93a386Sopenharmony_cipublic:
56cb93a386Sopenharmony_ci    SkXMLParser(SkXMLParserError* parserError = nullptr);
57cb93a386Sopenharmony_ci    virtual ~SkXMLParser();
58cb93a386Sopenharmony_ci
59cb93a386Sopenharmony_ci    /** Returns true for success
60cb93a386Sopenharmony_ci    */
61cb93a386Sopenharmony_ci    bool parse(const char doc[], size_t len);
62cb93a386Sopenharmony_ci    bool parse(SkStream& docStream);
63cb93a386Sopenharmony_ci    bool parse(const SkDOM&, const SkDOMNode*);
64cb93a386Sopenharmony_ci
65cb93a386Sopenharmony_ci    static void GetNativeErrorString(int nativeErrorCode, SkString* str);
66cb93a386Sopenharmony_ci
67cb93a386Sopenharmony_ciprotected:
68cb93a386Sopenharmony_ci    // override in subclasses; return true to stop parsing
69cb93a386Sopenharmony_ci    virtual bool onStartElement(const char elem[]);
70cb93a386Sopenharmony_ci    virtual bool onAddAttribute(const char name[], const char value[]);
71cb93a386Sopenharmony_ci    virtual bool onEndElement(const char elem[]);
72cb93a386Sopenharmony_ci    virtual bool onText(const char text[], int len);
73cb93a386Sopenharmony_ci
74cb93a386Sopenharmony_cipublic:
75cb93a386Sopenharmony_ci    // public for ported implementation, not meant for clients to call
76cb93a386Sopenharmony_ci    bool startElement(const char elem[]);
77cb93a386Sopenharmony_ci    bool addAttribute(const char name[], const char value[]);
78cb93a386Sopenharmony_ci    bool endElement(const char elem[]);
79cb93a386Sopenharmony_ci    bool text(const char text[], int len);
80cb93a386Sopenharmony_ci    void* fParser;
81cb93a386Sopenharmony_ciprotected:
82cb93a386Sopenharmony_ci    SkXMLParserError* fError;
83cb93a386Sopenharmony_ciprivate:
84cb93a386Sopenharmony_ci    void reportError(void* parser);
85cb93a386Sopenharmony_ci};
86cb93a386Sopenharmony_ci
87cb93a386Sopenharmony_ci#endif
88