blob: 4e0eda1e6f82667610d10e51ab09cd502380424f [file] [log] [blame]
epoger@google.comec3ed6a2011-07-28 14:26:00 +00001
reed@android.com8a1c16f2008-12-17 15:59:43 +00002/*
epoger@google.comec3ed6a2011-07-28 14:26:00 +00003 * Copyright 2006 The Android Open Source Project
reed@android.com8a1c16f2008-12-17 15:59:43 +00004 *
epoger@google.comec3ed6a2011-07-28 14:26:00 +00005 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
reed@android.com8a1c16f2008-12-17 15:59:43 +00007 */
8
epoger@google.comec3ed6a2011-07-28 14:26:00 +00009
reed@android.com8a1c16f2008-12-17 15:59:43 +000010#ifndef SkXMLWriter_DEFINED
11#define SkXMLWriter_DEFINED
12
13#include "SkTDArray.h"
14#include "SkString.h"
15#include "SkDOM.h"
16
17class SkWStream;
18class SkXMLParser;
19
20class SkXMLWriter {
21public:
22 SkXMLWriter(bool doEscapeMarkup = true);
23 virtual ~SkXMLWriter();
24
25 void addS32Attribute(const char name[], int32_t value);
26 void addAttribute(const char name[], const char value[]);
27 void addAttributeLen(const char name[], const char value[], size_t length);
28 void addHexAttribute(const char name[], uint32_t value, int minDigits = 0);
29 void addScalarAttribute(const char name[], SkScalar value);
30 void endElement() { this->onEndElement(); }
31 void startElement(const char elem[]);
32 void startElementLen(const char elem[], size_t length);
33 void writeDOM(const SkDOM&, const SkDOM::Node*, bool skipRoot);
34 void flush();
35 virtual void writeHeader();
36
37protected:
38 virtual void onStartElementLen(const char elem[], size_t length) = 0;
39 virtual void onAddAttributeLen(const char name[], const char value[], size_t length) = 0;
40 virtual void onEndElement() = 0;
41
42 struct Elem {
43 SkString fName;
44 bool fHasChildren;
45 };
46 void doEnd(Elem* elem);
47 bool doStart(const char name[], size_t length);
48 Elem* getEnd();
49 const char* getHeader();
50 SkTDArray<Elem*> fElems;
51
52private:
53 bool fDoEscapeMarkup;
54 // illegal
55 SkXMLWriter& operator=(const SkXMLWriter&);
56};
57
58class SkXMLStreamWriter : public SkXMLWriter {
59public:
60 SkXMLStreamWriter(SkWStream*);
61 virtual ~SkXMLStreamWriter();
62 virtual void writeHeader();
63 SkDEBUGCODE(static void UnitTest();)
64protected:
65 virtual void onStartElementLen(const char elem[], size_t length);
66 virtual void onEndElement();
67 virtual void onAddAttributeLen(const char name[], const char value[], size_t length);
68private:
69 SkWStream& fStream;
70};
71
72class SkXMLParserWriter : public SkXMLWriter {
73public:
74 SkXMLParserWriter(SkXMLParser*);
75 virtual ~SkXMLParserWriter();
76protected:
77 virtual void onStartElementLen(const char elem[], size_t length);
78 virtual void onEndElement();
79 virtual void onAddAttributeLen(const char name[], const char value[], size_t length);
80private:
81 SkXMLParser& fParser;
82};
83
84
85#endif
86