/src/skia/src/xml/SkXMLWriter.h
Line | Count | Source |
1 | | /* |
2 | | * Copyright 2006 The Android Open Source Project |
3 | | * |
4 | | * Use of this source code is governed by a BSD-style license that can be |
5 | | * found in the LICENSE file. |
6 | | */ |
7 | | |
8 | | #ifndef SkXMLWriter_DEFINED |
9 | | #define SkXMLWriter_DEFINED |
10 | | |
11 | | #include "include/core/SkString.h" |
12 | | #include "include/private/base/SkTDArray.h" |
13 | | #include "src/xml/SkDOM.h" |
14 | | |
15 | | class SkWStream; |
16 | | class SkXMLParser; |
17 | | |
18 | | class SkXMLWriter { |
19 | | public: |
20 | | SkXMLWriter(bool doEscapeMarkup = true); |
21 | | virtual ~SkXMLWriter(); |
22 | | |
23 | | void addS32Attribute(const char name[], int32_t value); |
24 | | void addAttribute(const char name[], const char value[]); |
25 | | void addAttributeLen(const char name[], const char value[], size_t length); |
26 | | void addHexAttribute(const char name[], uint32_t value, int minDigits = 0); |
27 | | void addScalarAttribute(const char name[], SkScalar value); |
28 | | void addText(const char text[], size_t length); |
29 | 16.6k | void endElement() { this->onEndElement(); } |
30 | | void startElement(const char elem[]); |
31 | | void startElementLen(const char elem[], size_t length); |
32 | | void writeDOM(const SkDOM&, const SkDOM::Node*, bool skipRoot); |
33 | | void flush(); |
34 | | virtual void writeHeader(); |
35 | | |
36 | | protected: |
37 | | virtual void onStartElementLen(const char elem[], size_t length) = 0; |
38 | | virtual void onAddAttributeLen(const char name[], const char value[], size_t length) = 0; |
39 | | virtual void onAddText(const char text[], size_t length) = 0; |
40 | | virtual void onEndElement() = 0; |
41 | | |
42 | | struct Elem { |
43 | | Elem(const char name[], size_t len) |
44 | | : fName(name, len) |
45 | | , fHasChildren(false) |
46 | 16.6k | , fHasText(false) {} |
47 | | |
48 | | SkString fName; |
49 | | bool fHasChildren; |
50 | | bool fHasText; |
51 | | }; |
52 | | void doEnd(Elem* elem); |
53 | | bool doStart(const char name[], size_t length); |
54 | | Elem* getEnd(); |
55 | | const char* getHeader(); |
56 | | SkTDArray<Elem*> fElems; |
57 | | |
58 | | private: |
59 | | bool fDoEscapeMarkup; |
60 | | // illegal |
61 | | SkXMLWriter& operator=(const SkXMLWriter&); |
62 | | }; |
63 | | |
64 | | class SkXMLStreamWriter : public SkXMLWriter { |
65 | | public: |
66 | | enum : uint32_t { |
67 | | kNoPretty_Flag = 0x01, |
68 | | }; |
69 | | |
70 | | SkXMLStreamWriter(SkWStream*, uint32_t flags = 0); |
71 | | ~SkXMLStreamWriter() override; |
72 | | void writeHeader() override; |
73 | | |
74 | | protected: |
75 | | void onStartElementLen(const char elem[], size_t length) override; |
76 | | void onEndElement() override; |
77 | | void onAddAttributeLen(const char name[], const char value[], size_t length) override; |
78 | | void onAddText(const char text[], size_t length) override; |
79 | | |
80 | | private: |
81 | | void newline(); |
82 | | void tab(int lvl); |
83 | | |
84 | | SkWStream& fStream; |
85 | | const uint32_t fFlags; |
86 | | }; |
87 | | |
88 | | class SkXMLParserWriter : public SkXMLWriter { |
89 | | public: |
90 | | SkXMLParserWriter(SkXMLParser*); |
91 | | ~SkXMLParserWriter() override; |
92 | | protected: |
93 | | void onStartElementLen(const char elem[], size_t length) override; |
94 | | void onEndElement() override; |
95 | | void onAddAttributeLen(const char name[], const char value[], size_t length) override; |
96 | | void onAddText(const char text[], size_t length) override; |
97 | | private: |
98 | | SkXMLParser& fParser; |
99 | | }; |
100 | | |
101 | | |
102 | | #endif |