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