blob: a20c7631e1a65c518902a5b85c998e29bacbc666 [file] [log] [blame]
epoger@google.comec3ed6a2011-07-28 14:26:00 +00001
reed@android.com8a1c16f2008-12-17 15:59:43 +00002/*
epoger@google.comec3ed6a2011-07-28 14:26:00 +00003 * Copyright 2006 The Android Open Source Project
reed@android.com8a1c16f2008-12-17 15:59:43 +00004 *
epoger@google.comec3ed6a2011-07-28 14:26:00 +00005 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
reed@android.com8a1c16f2008-12-17 15:59:43 +00007 */
8
epoger@google.comec3ed6a2011-07-28 14:26:00 +00009
reed@android.com8a1c16f2008-12-17 15:59:43 +000010#ifndef SkXMLParser_DEFINED
11#define SkXMLParser_DEFINED
12
reed@android.com8a1c16f2008-12-17 15:59:43 +000013#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:
Ben Wagnera93a14a2017-08-28 10:34:05 -040056 SkXMLParser(SkXMLParserError* parserError = nullptr);
reed@android.com8a1c16f2008-12-17 15:59:43 +000057 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
fmalita6ceef3d2016-07-26 18:46:34 -070076 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);
reed@android.com8a1c16f2008-12-17 15:59:43 +000080 void* fParser;
81protected:
82 SkXMLParserError* fError;
83private:
84 void reportError(void* parser);
85};
86
reed@android.com8a1c16f2008-12-17 15:59:43 +000087#endif