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 210