Home | History | Annotate | Download | only in xml
      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 
     15 class SkStream;
     16 
     17 class SkDOM;
     18 struct SkDOMNode;
     19 
     20 class SkXMLParserError {
     21 public:
     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); }
     45 protected:
     46     ErrorCode fCode;
     47 private:
     48     int fLineNumber;
     49     int fNativeCode;
     50     SkString fNoun;
     51     friend class SkXMLParser;
     52 };
     53 
     54 class SkXMLParser {
     55 public:
     56     SkXMLParser(SkXMLParserError* parserError = nullptr);
     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 
     67 protected:
     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 
     74 public:
     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;
     81 protected:
     82     SkXMLParserError* fError;
     83 private:
     84     void reportError(void* parser);
     85 };
     86 
     87 #endif
     88