180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/* 380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Copyright 2006 The Android Open Source Project 480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * 580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Use of this source code is governed by a BSD-style license that can be 680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * found in the LICENSE file. 780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#ifndef SkXMLParser_DEFINED 1180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#define SkXMLParser_DEFINED 1280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkString.h" 1480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass SkStream; 1680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass SkDOM; 1880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustruct SkDOMNode; 1980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 2080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass SkXMLParserError { 2180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic: 2280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru enum ErrorCode { 2380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru kNoError, 2480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru kEmptyFile, 2580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru kUnknownElement, 2680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru kUnknownAttributeName, 2780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru kErrorInAttributeValue, 2880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru kDuplicateIDs, 2980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru kUnknownError 3080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru }; 3180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 3280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkXMLParserError(); 3380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru virtual ~SkXMLParserError(); 3480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru ErrorCode getErrorCode() const { return fCode; } 3580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru virtual void getErrorString(SkString* str) const; 3680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru int getLineNumber() const { return fLineNumber; } 3780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru int getNativeCode() const { return fNativeCode; } 3880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru bool hasError() const { return fCode != kNoError || fNativeCode != -1; } 3980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru bool hasNoun() const { return fNoun.size() > 0; } 4080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru void reset(); 4180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru void setCode(ErrorCode code) { fCode = code; } 4280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru void setNoun(const SkString& str) { fNoun.set(str); } 4380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru void setNoun(const char* ch) { fNoun.set(ch); } 4480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru void setNoun(const char* ch, size_t len) { fNoun.set(ch, len); } 4580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprotected: 4680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru ErrorCode fCode; 4780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprivate: 4880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru int fLineNumber; 4980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru int fNativeCode; 5080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkString fNoun; 5180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru friend class SkXMLParser; 5280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}; 5380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 5480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass SkXMLParser { 5580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic: 5680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkXMLParser(SkXMLParserError* parserError = NULL); 5780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru virtual ~SkXMLParser(); 5880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 5980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** Returns true for success 6080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 6180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru bool parse(const char doc[], size_t len); 6280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru bool parse(SkStream& docStream); 6380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru bool parse(const SkDOM&, const SkDOMNode*); 6480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 6580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru static void GetNativeErrorString(int nativeErrorCode, SkString* str); 6680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 6780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprotected: 6880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // override in subclasses; return true to stop parsing 6980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru virtual bool onStartElement(const char elem[]); 7080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru virtual bool onAddAttribute(const char name[], const char value[]); 7180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru virtual bool onEndElement(const char elem[]); 7280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru virtual bool onText(const char text[], int len); 7380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 7480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic: 7580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // public for ported implementation, not meant for clients to call 7680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru virtual bool startElement(const char elem[]); 7780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru virtual bool addAttribute(const char name[], const char value[]); 7880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru virtual bool endElement(const char elem[]); 7980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru virtual bool text(const char text[], int len); 8080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru void* fParser; 8180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprotected: 8280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkXMLParserError* fError; 8380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprivate: 8480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru void reportError(void* parser); 8580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}; 8680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 8780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#if 0 8880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass SkXMLPullParser { 8980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic: 9080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkXMLPullParser(); 9180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru explicit SkXMLPullParser(SkStream*); 9280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru virtual ~SkXMLPullParser(); 9380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 9480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkStream* getStream() const { return fStream; } 9580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkStream* setStream(SkStream* stream); 9680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 9780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru enum EventType { 9880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru ERROR = -1, 9980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru START_DOCUMENT, 10080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru END_DOCUMENT, 10180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru START_TAG, 10280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru END_TAG, 10380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru TEXT, 10480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru CDSECT, 10580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru ENTITY_REF, 10680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru IGNORABLE_WHITESPACE, 10780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru PROCESSING_INSTRUCTION, 10880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru COMMENT, 10980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru DOCDECL 11080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru }; 11180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 11280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru EventType nextToken(); 11380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru EventType getEventType() const { return fCurr.fEventType; } 11480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 11580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru struct AttrInfo { 11680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru const char* fName; 11780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru const char* fValue; 11880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru }; 11980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 12080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru int getDepth() const { return fDepth; } 12180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru const char* getName(); 12280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru int getAttributeCount(); 12380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru void getAttributeInfo(int, AttrInfo*); 12480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru const char* getText(); 12580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru bool isWhitespace(); 12680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 12780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprotected: 12880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru virtual bool onEntityReplacement(const char name[], 12980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkString* replacement); 13080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 13180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic: 13280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru struct Curr { 13380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru EventType fEventType; 13480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru const char* fName; 13580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru AttrInfo* fAttrInfos; 13680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru int fAttrInfoCount; 13780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru bool fIsWhitespace; 13880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru }; 13980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 14080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprivate: 14180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // implemented in the porting layer 14280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru bool onInit(); // return false on failure 14380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru EventType onNextToken(); 14480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru void onExit(); 14580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 14680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkStream* fStream; 14780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru Curr fCurr; 14880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru int fDepth; 14980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 15080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru struct Impl; 15180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru Impl* fImpl; 15280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}; 15380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif 15480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 15580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif 156