1/*
2 * Copyright (C) 2006 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef SkXMLWriter_DEFINED
18#define SkXMLWriter_DEFINED
19
20#include "SkTDArray.h"
21#include "SkString.h"
22#include "SkDOM.h"
23
24class SkWStream;
25class SkXMLParser;
26
27class SkXMLWriter {
28public:
29            SkXMLWriter(bool doEscapeMarkup = true);
30    virtual ~SkXMLWriter();
31
32    void    addS32Attribute(const char name[], int32_t value);
33    void    addAttribute(const char name[], const char value[]);
34    void    addAttributeLen(const char name[], const char value[], size_t length);
35    void    addHexAttribute(const char name[], uint32_t value, int minDigits = 0);
36    void    addScalarAttribute(const char name[], SkScalar value);
37    void    endElement() { this->onEndElement(); }
38    void    startElement(const char elem[]);
39    void    startElementLen(const char elem[], size_t length);
40    void    writeDOM(const SkDOM&, const SkDOM::Node*, bool skipRoot);
41    void    flush();
42    virtual void writeHeader();
43
44protected:
45    virtual void onStartElementLen(const char elem[], size_t length) = 0;
46    virtual void onAddAttributeLen(const char name[], const char value[], size_t length) = 0;
47    virtual void onEndElement() = 0;
48
49    struct Elem {
50        SkString    fName;
51        bool        fHasChildren;
52    };
53    void doEnd(Elem* elem);
54    bool doStart(const char name[], size_t length);
55    Elem* getEnd();
56    const char* getHeader();
57    SkTDArray<Elem*> fElems;
58
59private:
60    bool fDoEscapeMarkup;
61    // illegal
62    SkXMLWriter& operator=(const SkXMLWriter&);
63};
64
65class SkXMLStreamWriter : public SkXMLWriter {
66public:
67    SkXMLStreamWriter(SkWStream*);
68    virtual ~SkXMLStreamWriter();
69    virtual void    writeHeader();
70    SkDEBUGCODE(static void UnitTest();)
71protected:
72    virtual void onStartElementLen(const char elem[], size_t length);
73    virtual void onEndElement();
74    virtual void onAddAttributeLen(const char name[], const char value[], size_t length);
75private:
76    SkWStream&      fStream;
77};
78
79class SkXMLParserWriter : public SkXMLWriter {
80public:
81    SkXMLParserWriter(SkXMLParser*);
82    virtual ~SkXMLParserWriter();
83protected:
84    virtual void onStartElementLen(const char elem[], size_t length);
85    virtual void onEndElement();
86    virtual void onAddAttributeLen(const char name[], const char value[], size_t length);
87private:
88    SkXMLParser&        fParser;
89};
90
91
92#endif
93
94