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