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