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