11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 20910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/* 31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2006 The Android Open Source Project 40910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * 51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be 61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file. 70910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 80910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 91cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifndef SkXMLParser_DEFINED 110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkXMLParser_DEFINED 120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkString.h" 140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkStream; 160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkDOM; 180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectstruct SkDOMNode; 190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkXMLParserError { 210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic: 220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project enum ErrorCode { 230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project kNoError, 240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project kEmptyFile, 250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project kUnknownElement, 260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project kUnknownAttributeName, 270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project kErrorInAttributeValue, 280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project kDuplicateIDs, 290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project kUnknownError 300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project }; 310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkXMLParserError(); 330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project virtual ~SkXMLParserError(); 340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project ErrorCode getErrorCode() const { return fCode; } 350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project virtual void getErrorString(SkString* str) const; 360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project int getLineNumber() const { return fLineNumber; } 370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project int getNativeCode() const { return fNativeCode; } 380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project bool hasError() const { return fCode != kNoError || fNativeCode != -1; } 390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project bool hasNoun() const { return fNoun.size() > 0; } 400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void reset(); 410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void setCode(ErrorCode code) { fCode = code; } 420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void setNoun(const SkString& str) { fNoun.set(str); } 430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void setNoun(const char* ch) { fNoun.set(ch); } 440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void setNoun(const char* ch, size_t len) { fNoun.set(ch, len); } 450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprotected: 460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project ErrorCode fCode; 470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprivate: 480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project int fLineNumber; 490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project int fNativeCode; 500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkString fNoun; 510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project friend class SkXMLParser; 520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}; 530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkXMLParser { 550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic: 560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkXMLParser(SkXMLParserError* parserError = NULL); 570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project virtual ~SkXMLParser(); 580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Returns true for success 600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project bool parse(const char doc[], size_t len); 620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project bool parse(SkStream& docStream); 630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project bool parse(const SkDOM&, const SkDOMNode*); 640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project static void GetNativeErrorString(int nativeErrorCode, SkString* str); 660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprotected: 680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project // override in subclasses; return true to stop parsing 690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project virtual bool onStartElement(const char elem[]); 700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project virtual bool onAddAttribute(const char name[], const char value[]); 710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project virtual bool onEndElement(const char elem[]); 720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project virtual bool onText(const char text[], int len); 730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic: 750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project // public for ported implementation, not meant for clients to call 760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project virtual bool startElement(const char elem[]); 770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project virtual bool addAttribute(const char name[], const char value[]); 780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project virtual bool endElement(const char elem[]); 790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project virtual bool text(const char text[], int len); 800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void* fParser; 810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprotected: 820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkXMLParserError* fError; 830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprivate: 840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void reportError(void* parser); 850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}; 860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 872c497e64d20a73267eb92ae88fdc51ba2a356b55Mike Reed#if 0 880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkXMLPullParser { 890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic: 900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkXMLPullParser(); 910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project explicit SkXMLPullParser(SkStream*); 920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project virtual ~SkXMLPullParser(); 930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkStream* getStream() const { return fStream; } 950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkStream* setStream(SkStream* stream); 960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project enum EventType { 980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project ERROR = -1, 990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project START_DOCUMENT, 1000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project END_DOCUMENT, 1010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project START_TAG, 1020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project END_TAG, 1030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project TEXT, 1040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project CDSECT, 1050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project ENTITY_REF, 1060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project IGNORABLE_WHITESPACE, 1070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project PROCESSING_INSTRUCTION, 1080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project COMMENT, 1090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project DOCDECL 1100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project }; 1110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project EventType nextToken(); 1130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project EventType getEventType() const { return fCurr.fEventType; } 1140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project struct AttrInfo { 1160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const char* fName; 1170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const char* fValue; 1180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project }; 1190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project int getDepth() const { return fDepth; } 1210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const char* getName(); 1220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project int getAttributeCount(); 1230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void getAttributeInfo(int, AttrInfo*); 1240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const char* getText(); 1250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project bool isWhitespace(); 1260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprotected: 1280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project virtual bool onEntityReplacement(const char name[], 1290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkString* replacement); 1300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic: 1320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project struct Curr { 1330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project EventType fEventType; 1340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const char* fName; 1350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project AttrInfo* fAttrInfos; 1360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project int fAttrInfoCount; 1370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project bool fIsWhitespace; 1380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project }; 1390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprivate: 1410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project // implemented in the porting layer 1420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project bool onInit(); // return false on failure 1430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project EventType onNextToken(); 1440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void onExit(); 1450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkStream* fStream; 1470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project Curr fCurr; 1480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project int fDepth; 1490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project struct Impl; 1510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project Impl* fImpl; 1520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}; 1532c497e64d20a73267eb92ae88fdc51ba2a356b55Mike Reed#endif 1540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif 156