Home | History | Annotate | Download | only in fxcrt
      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 CORE_INCLUDE_FXCRT_FX_XML_H_
      8 #define CORE_INCLUDE_FXCRT_FX_XML_H_
      9 
     10 #include "fx_basic.h"
     11 
     12 class CXML_AttrItem {
     13  public:
     14   CFX_ByteString m_QSpaceName;
     15   CFX_ByteString m_AttrName;
     16   CFX_WideString m_Value;
     17 };
     18 class CXML_AttrMap {
     19  public:
     20   CXML_AttrMap() { m_pMap = NULL; }
     21   ~CXML_AttrMap() { RemoveAll(); }
     22   const CFX_WideString* Lookup(const CFX_ByteStringC& space,
     23                                const CFX_ByteStringC& name) const;
     24   void SetAt(const CFX_ByteStringC& space,
     25              const CFX_ByteStringC& name,
     26              const CFX_WideStringC& value);
     27   void RemoveAt(const CFX_ByteStringC& space, const CFX_ByteStringC& name);
     28   void RemoveAll();
     29   int GetSize() const;
     30   CXML_AttrItem& GetAt(int index) const;
     31   CFX_ObjectArray<CXML_AttrItem>* m_pMap;
     32 };
     33 class CXML_Content {
     34  public:
     35   CXML_Content() : m_bCDATA(FALSE), m_Content() {}
     36   void Set(FX_BOOL bCDATA, const CFX_WideStringC& content) {
     37     m_bCDATA = bCDATA;
     38     m_Content = content;
     39   }
     40   FX_BOOL m_bCDATA;
     41   CFX_WideString m_Content;
     42 };
     43 class CXML_Element {
     44  public:
     45   static CXML_Element* Parse(const void* pBuffer,
     46                              size_t size,
     47                              FX_BOOL bSaveSpaceChars = FALSE,
     48                              FX_FILESIZE* pParsedSize = NULL);
     49   static CXML_Element* Parse(IFX_FileRead* pFile,
     50                              FX_BOOL bSaveSpaceChars = FALSE,
     51                              FX_FILESIZE* pParsedSize = NULL);
     52   static CXML_Element* Parse(IFX_BufferRead* pBuffer,
     53                              FX_BOOL bSaveSpaceChars = FALSE,
     54                              FX_FILESIZE* pParsedSize = NULL);
     55   CXML_Element(const CFX_ByteStringC& qSpace, const CFX_ByteStringC& tagName);
     56   CXML_Element(const CFX_ByteStringC& qTagName);
     57   CXML_Element();
     58 
     59   ~CXML_Element();
     60 
     61   void Empty();
     62 
     63   CFX_ByteString GetTagName(FX_BOOL bQualified = FALSE) const;
     64 
     65   CFX_ByteString GetNamespace(FX_BOOL bQualified = FALSE) const;
     66 
     67   CFX_ByteString GetNamespaceURI(const CFX_ByteStringC& qName) const;
     68 
     69   CXML_Element* GetParent() const { return m_pParent; }
     70 
     71   FX_DWORD CountAttrs() const { return m_AttrMap.GetSize(); }
     72 
     73   void GetAttrByIndex(int index,
     74                       CFX_ByteString& space,
     75                       CFX_ByteString& name,
     76                       CFX_WideString& value) const;
     77 
     78   FX_BOOL HasAttr(const CFX_ByteStringC& qName) const;
     79 
     80   FX_BOOL GetAttrValue(const CFX_ByteStringC& name,
     81                        CFX_WideString& attribute) const;
     82   CFX_WideString GetAttrValue(const CFX_ByteStringC& name) const {
     83     CFX_WideString attr;
     84     GetAttrValue(name, attr);
     85     return attr;
     86   }
     87 
     88   FX_BOOL GetAttrValue(const CFX_ByteStringC& space,
     89                        const CFX_ByteStringC& name,
     90                        CFX_WideString& attribute) const;
     91   CFX_WideString GetAttrValue(const CFX_ByteStringC& space,
     92                               const CFX_ByteStringC& name) const {
     93     CFX_WideString attr;
     94     GetAttrValue(space, name, attr);
     95     return attr;
     96   }
     97 
     98   FX_BOOL GetAttrInteger(const CFX_ByteStringC& name, int& attribute) const;
     99   int GetAttrInteger(const CFX_ByteStringC& name) const {
    100     int attr = 0;
    101     GetAttrInteger(name, attr);
    102     return attr;
    103   }
    104 
    105   FX_BOOL GetAttrInteger(const CFX_ByteStringC& space,
    106                          const CFX_ByteStringC& name,
    107                          int& attribute) const;
    108   int GetAttrInteger(const CFX_ByteStringC& space,
    109                      const CFX_ByteStringC& name) const {
    110     int attr = 0;
    111     GetAttrInteger(space, name, attr);
    112     return attr;
    113   }
    114 
    115   FX_BOOL GetAttrFloat(const CFX_ByteStringC& name, FX_FLOAT& attribute) const;
    116   FX_FLOAT GetAttrFloat(const CFX_ByteStringC& name) const {
    117     FX_FLOAT attr = 0;
    118     GetAttrFloat(name, attr);
    119     return attr;
    120   }
    121 
    122   FX_BOOL GetAttrFloat(const CFX_ByteStringC& space,
    123                        const CFX_ByteStringC& name,
    124                        FX_FLOAT& attribute) const;
    125   FX_FLOAT GetAttrFloat(const CFX_ByteStringC& space,
    126                         const CFX_ByteStringC& name) const {
    127     FX_FLOAT attr = 0;
    128     GetAttrFloat(space, name, attr);
    129     return attr;
    130   }
    131 
    132   FX_DWORD CountChildren() const;
    133 
    134   enum ChildType { Invalid, Element, Content };
    135 
    136   ChildType GetChildType(FX_DWORD index) const;
    137 
    138   CFX_WideString GetContent(FX_DWORD index) const;
    139 
    140   CXML_Element* GetElement(FX_DWORD index) const;
    141 
    142   CXML_Element* GetElement(const CFX_ByteStringC& space,
    143                            const CFX_ByteStringC& tag) const {
    144     return GetElement(space, tag, 0);
    145   }
    146 
    147   FX_DWORD CountElements(const CFX_ByteStringC& space,
    148                          const CFX_ByteStringC& tag) const;
    149 
    150   CXML_Element* GetElement(const CFX_ByteStringC& space,
    151                            const CFX_ByteStringC& tag,
    152                            int index) const;
    153 
    154   FX_DWORD FindElement(CXML_Element* pChild) const;
    155 
    156   void SetTag(const CFX_ByteStringC& qSpace, const CFX_ByteStringC& tagname);
    157 
    158   void SetTag(const CFX_ByteStringC& qTagName);
    159 
    160   void RemoveChildren();
    161 
    162   void RemoveChild(FX_DWORD index);
    163 
    164  protected:
    165   CXML_Element* m_pParent;
    166   CFX_ByteString m_QSpaceName;
    167   CFX_ByteString m_TagName;
    168 
    169   CXML_AttrMap m_AttrMap;
    170 
    171   CFX_PtrArray m_Children;
    172   friend class CXML_Parser;
    173   friend class CXML_Composer;
    174 };
    175 
    176 #endif  // CORE_INCLUDE_FXCRT_FX_XML_H_
    177