Initial commit.
[pdfium.git] / core / include / fxcrt / fx_xml.h
1 // Copyright 2014 PDFium Authors. All rights reserved.\r
2 // Use of this source code is governed by a BSD-style license that can be\r
3 // found in the LICENSE file.\r
4  \r
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\r
6 \r
7 #ifndef _FX_XML_H_\r
8 #define _FX_XML_H_\r
9 #ifndef _FX_BASIC_H_\r
10 #include "fx_basic.h"\r
11 #endif\r
12 class CXML_AttrItem : public CFX_Object\r
13 {\r
14 public:\r
15     CFX_ByteStringL     m_QSpaceName;\r
16     CFX_ByteStringL     m_AttrName;\r
17     CFX_WideStringL     m_Value;\r
18 \r
19     void        Empty(IFX_Allocator* pAllocator = NULL)\r
20     {\r
21         m_QSpaceName.Empty(pAllocator);\r
22         m_AttrName.Empty(pAllocator);\r
23         m_Value.Empty(pAllocator);\r
24     }\r
25 };\r
26 class CXML_AttrMap : public CFX_Object\r
27 {\r
28 public:\r
29     CXML_AttrMap()\r
30     {\r
31         m_pMap = NULL;\r
32     }\r
33     ~CXML_AttrMap()\r
34     {\r
35         RemoveAll(NULL);\r
36     }\r
37     const CFX_WideStringL*      Lookup(FX_BSTR space, FX_BSTR name) const;\r
38     void                                        SetAt(FX_BSTR space, FX_BSTR name, FX_WSTR value, IFX_Allocator* pAllocator = NULL);\r
39     void                                        RemoveAt(FX_BSTR space, FX_BSTR name, IFX_Allocator* pAllocator = NULL);\r
40     void                                        RemoveAll(IFX_Allocator* pAllocator = NULL);\r
41     int                                         GetSize() const;\r
42     CXML_AttrItem&                      GetAt(int index) const;\r
43     CFX_ObjectArray<CXML_AttrItem>*     m_pMap;\r
44 };\r
45 class CXML_Content : public CFX_Object\r
46 {\r
47 public:\r
48     CXML_Content() : m_bCDATA(FALSE), m_Content() {}\r
49     ~CXML_Content()\r
50     {\r
51         Empty(NULL);\r
52     }\r
53     void        Empty(IFX_Allocator* pAllocator = NULL)\r
54     {\r
55         m_Content.Empty(pAllocator);\r
56     }\r
57     void        Set(FX_BOOL bCDATA, FX_WSTR content, IFX_Allocator* pAllocator = NULL)\r
58     {\r
59         m_bCDATA = bCDATA;\r
60         m_Content.Set(content, pAllocator);\r
61     }\r
62     FX_BOOL                     m_bCDATA;\r
63     CFX_WideStringL     m_Content;\r
64 };\r
65 class CXML_Element : public CFX_Object\r
66 {\r
67 public:\r
68 \r
69     static CXML_Element*        Parse(const void* pBuffer, size_t size, FX_BOOL bSaveSpaceChars = FALSE, FX_FILESIZE* pParsedSize = NULL, IFX_Allocator* pAllocator = NULL);\r
70 \r
71     static CXML_Element*        Parse(IFX_FileRead *pFile, FX_BOOL bSaveSpaceChars = FALSE, FX_FILESIZE* pParsedSize = NULL, IFX_Allocator* pAllocator = NULL);\r
72 \r
73     static CXML_Element*        Parse(IFX_BufferRead *pBuffer, FX_BOOL bSaveSpaceChars = FALSE, FX_FILESIZE* pParsedSize = NULL, IFX_Allocator* pAllocator = NULL);\r
74 \r
75     CXML_Element(FX_BSTR qSpace, FX_BSTR tagName, IFX_Allocator* pAllocator = NULL);\r
76 \r
77     CXML_Element(FX_BSTR qTagName, IFX_Allocator* pAllocator = NULL);\r
78 \r
79     CXML_Element(IFX_Allocator* pAllocator = NULL);\r
80 \r
81     ~CXML_Element();\r
82 \r
83     void        Empty();\r
84 \r
85 \r
86 \r
87     CFX_ByteString                      GetTagName(FX_BOOL bQualified = FALSE) const;\r
88     void                                        GetTagName(CFX_ByteStringL &tagName, FX_BOOL bQualified = FALSE) const;\r
89 \r
90     CFX_ByteString                      GetNamespace(FX_BOOL bQualified = FALSE) const;\r
91     void                                        GetNamespace(CFX_ByteStringL &nameSpace, FX_BOOL bQualified = FALSE) const;\r
92 \r
93     CFX_ByteString                      GetNamespaceURI(FX_BSTR qName) const;\r
94     void                                        GetNamespaceURI(FX_BSTR qName, CFX_ByteStringL &uri) const;\r
95 \r
96     CXML_Element*                       GetParent() const\r
97     {\r
98         return m_pParent;\r
99     }\r
100 \r
101     FX_DWORD                            CountAttrs() const\r
102     {\r
103         return m_AttrMap.GetSize();\r
104     }\r
105 \r
106     void                                        GetAttrByIndex(int index, CFX_ByteString &space, CFX_ByteString &name, CFX_WideString &value) const;\r
107     void                                        GetAttrByIndex(int index, CFX_ByteStringL &space, CFX_ByteStringL &name, CFX_WideStringL &value) const;\r
108 \r
109     FX_BOOL                                     HasAttr(FX_BSTR qName) const;\r
110 \r
111     FX_BOOL                                     GetAttrValue(FX_BSTR name, CFX_WideString& attribute) const;\r
112     CFX_WideString                      GetAttrValue(FX_BSTR name) const\r
113     {\r
114         CFX_WideString attr;\r
115         GetAttrValue(name, attr);\r
116         return attr;\r
117     }\r
118     const CFX_WideStringL*      GetAttrValuePtr(FX_BSTR name) const;\r
119 \r
120     FX_BOOL                                     GetAttrValue(FX_BSTR space, FX_BSTR name, CFX_WideString& attribute) const;\r
121     CFX_WideString                      GetAttrValue(FX_BSTR space, FX_BSTR name) const\r
122     {\r
123         CFX_WideString attr;\r
124         GetAttrValue(space, name, attr);\r
125         return attr;\r
126     }\r
127     const CFX_WideStringL*      GetAttrValuePtr(FX_BSTR space, FX_BSTR name) const;\r
128 \r
129     FX_BOOL                                     GetAttrInteger(FX_BSTR name, int& attribute) const;\r
130     int                                         GetAttrInteger(FX_BSTR name) const\r
131     {\r
132         int attr = 0;\r
133         GetAttrInteger(name, attr);\r
134         return attr;\r
135     }\r
136 \r
137     FX_BOOL                                     GetAttrInteger(FX_BSTR space, FX_BSTR name, int& attribute) const;\r
138     int                                         GetAttrInteger(FX_BSTR space, FX_BSTR name) const\r
139     {\r
140         int attr = 0;\r
141         GetAttrInteger(space, name, attr);\r
142         return attr;\r
143     }\r
144 \r
145     FX_BOOL                                     GetAttrFloat(FX_BSTR name, FX_FLOAT& attribute) const;\r
146     FX_FLOAT                            GetAttrFloat(FX_BSTR name) const\r
147     {\r
148         FX_FLOAT attr = 0;\r
149         GetAttrFloat(name, attr);\r
150         return attr;\r
151     }\r
152 \r
153     FX_BOOL                                     GetAttrFloat(FX_BSTR space, FX_BSTR name, FX_FLOAT& attribute) const;\r
154     FX_FLOAT                            GetAttrFloat(FX_BSTR space, FX_BSTR name) const\r
155     {\r
156         FX_FLOAT attr = 0;\r
157         GetAttrFloat(space, name, attr);\r
158         return attr;\r
159     }\r
160 \r
161     FX_DWORD                            CountChildren() const;\r
162 \r
163     enum ChildType { Invalid, Element, Content};\r
164 \r
165     ChildType                           GetChildType(FX_DWORD index) const;\r
166 \r
167     CFX_WideString                      GetContent(FX_DWORD index) const;\r
168     const CFX_WideStringL*      GetContentPtr(FX_DWORD index) const;\r
169 \r
170     CXML_Element*                       GetElement(FX_DWORD index) const;\r
171 \r
172     CXML_Element*                       GetElement(FX_BSTR space, FX_BSTR tag) const\r
173     {\r
174         return GetElement(space, tag, 0);\r
175     }\r
176 \r
177     FX_DWORD                            CountElements(FX_BSTR space, FX_BSTR tag) const;\r
178 \r
179     CXML_Element*                       GetElement(FX_BSTR space, FX_BSTR tag, int index) const;\r
180 \r
181     FX_DWORD                            FindElement(CXML_Element *pChild) const;\r
182 \r
183 \r
184 \r
185 \r
186     void                                        SetTag(FX_BSTR qSpace, FX_BSTR tagname);\r
187 \r
188     void                                        SetTag(FX_BSTR qTagName);\r
189 \r
190     void                                        RemoveChildren();\r
191 \r
192     void                                        RemoveChild(FX_DWORD index);\r
193 \r
194 \r
195 protected:\r
196 \r
197     CXML_Element*                       m_pParent;\r
198 \r
199     CFX_ByteStringL                     m_QSpaceName;\r
200 \r
201     CFX_ByteStringL                     m_TagName;\r
202 \r
203     CXML_AttrMap                        m_AttrMap;\r
204 \r
205     CFX_PtrArray                        m_Children;\r
206     friend class CXML_Parser;\r
207     friend class CXML_Composer;\r
208 };\r
209 #endif\r