Initial commit.
[pdfium.git] / core / src / fxcrt / xml_int.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 _FXCRT_XML_INT_\r
8 #define _FXCRT_XML_INT_\r
9 class CXML_DataBufAcc : public IFX_BufferRead, public CFX_Object\r
10 {\r
11 public:\r
12     CXML_DataBufAcc(FX_LPCBYTE pBuffer, size_t size, IFX_Allocator* pAllocator = NULL)\r
13         : m_pAllocator(pAllocator)\r
14         , m_pBuffer(pBuffer)\r
15         , m_dwSize(size)\r
16         , m_dwCurPos(0)\r
17     {\r
18     }\r
19     virtual ~CXML_DataBufAcc() {}\r
20     virtual void                        Release()\r
21     {\r
22         if (m_pAllocator) {\r
23             FX_DeleteAtAllocator(this, m_pAllocator, CXML_DataBufAcc);\r
24         } else {\r
25             delete this;\r
26         }\r
27     }\r
28     virtual FX_BOOL                     IsEOF()\r
29     {\r
30         return m_dwCurPos >= m_dwSize;\r
31     }\r
32     virtual FX_FILESIZE         GetPosition()\r
33     {\r
34         return (FX_FILESIZE)m_dwCurPos;\r
35     }\r
36     virtual size_t                      ReadBlock(void* buffer, size_t size)\r
37     {\r
38         return 0;\r
39     }\r
40     virtual FX_BOOL                     ReadNextBlock(FX_BOOL bRestart = FALSE)\r
41     {\r
42         if (bRestart) {\r
43             m_dwCurPos = 0;\r
44         }\r
45         if (m_dwCurPos < m_dwSize) {\r
46             m_dwCurPos = m_dwSize;\r
47             return TRUE;\r
48         }\r
49         return FALSE;\r
50     }\r
51     virtual FX_LPCBYTE          GetBlockBuffer()\r
52     {\r
53         return m_pBuffer;\r
54     }\r
55     virtual size_t                      GetBlockSize()\r
56     {\r
57         return m_dwSize;\r
58     }\r
59     virtual FX_FILESIZE         GetBlockOffset()\r
60     {\r
61         return 0;\r
62     }\r
63 protected:\r
64     IFX_Allocator*      m_pAllocator;\r
65     FX_LPCBYTE          m_pBuffer;\r
66     size_t                      m_dwSize;\r
67     size_t                      m_dwCurPos;\r
68 };\r
69 #define FX_XMLDATASTREAM_BufferSize             (32 * 1024)\r
70 class CXML_DataStmAcc : public IFX_BufferRead, public CFX_Object\r
71 {\r
72 public:\r
73     CXML_DataStmAcc(IFX_FileRead *pFileRead, IFX_Allocator* pAllocator = NULL)\r
74         : m_pAllocator(pAllocator)\r
75         , m_pFileRead(pFileRead)\r
76         , m_pBuffer(NULL)\r
77         , m_nStart(0)\r
78         , m_dwSize(0)\r
79     {\r
80         FXSYS_assert(m_pFileRead != NULL);\r
81     }\r
82     virtual ~CXML_DataStmAcc()\r
83     {\r
84         if (m_pBuffer) {\r
85             FX_Allocator_Free(m_pAllocator, m_pBuffer);\r
86         }\r
87     }\r
88     virtual void                        Release()\r
89     {\r
90         if (m_pAllocator) {\r
91             FX_DeleteAtAllocator(this, m_pAllocator, CXML_DataStmAcc);\r
92         } else {\r
93             delete this;\r
94         }\r
95     }\r
96     virtual FX_BOOL                     IsEOF()\r
97     {\r
98         return m_nStart + (FX_FILESIZE)m_dwSize >= m_pFileRead->GetSize();\r
99     }\r
100     virtual FX_FILESIZE         GetPosition()\r
101     {\r
102         return m_nStart + (FX_FILESIZE)m_dwSize;\r
103     }\r
104     virtual size_t                      ReadBlock(void* buffer, size_t size)\r
105     {\r
106         return 0;\r
107     }\r
108     virtual FX_BOOL                     ReadNextBlock(FX_BOOL bRestart = FALSE)\r
109     {\r
110         if (bRestart) {\r
111             m_nStart = 0;\r
112         }\r
113         FX_FILESIZE nLength = m_pFileRead->GetSize();\r
114         m_nStart += (FX_FILESIZE)m_dwSize;\r
115         if (m_nStart >= nLength) {\r
116             return FALSE;\r
117         }\r
118         m_dwSize = (size_t)FX_MIN(FX_XMLDATASTREAM_BufferSize, nLength - m_nStart);\r
119         if (!m_pBuffer) {\r
120             m_pBuffer = FX_Allocator_Alloc(m_pAllocator, FX_BYTE, m_dwSize);\r
121             if (!m_pBuffer) {\r
122                 return FALSE;\r
123             }\r
124         }\r
125         return m_pFileRead->ReadBlock(m_pBuffer, m_nStart, m_dwSize);\r
126     }\r
127     virtual FX_LPCBYTE          GetBlockBuffer()\r
128     {\r
129         return (FX_LPCBYTE)m_pBuffer;\r
130     }\r
131     virtual size_t                      GetBlockSize()\r
132     {\r
133         return m_dwSize;\r
134     }\r
135     virtual FX_FILESIZE         GetBlockOffset()\r
136     {\r
137         return m_nStart;\r
138     }\r
139 protected:\r
140     IFX_Allocator*      m_pAllocator;\r
141     IFX_FileRead        *m_pFileRead;\r
142     FX_LPBYTE           m_pBuffer;\r
143     FX_FILESIZE         m_nStart;\r
144     size_t                      m_dwSize;\r
145 };\r
146 class CXML_Parser\r
147 {\r
148 public:\r
149     CXML_Parser(IFX_Allocator* pAllocator = NULL) : m_pAllocator(pAllocator) {}\r
150     ~CXML_Parser();\r
151     IFX_Allocator*      m_pAllocator;\r
152     IFX_BufferRead*     m_pDataAcc;\r
153     FX_BOOL                     m_bOwnedStream;\r
154     FX_FILESIZE         m_nOffset;\r
155     FX_BOOL                     m_bSaveSpaceChars;\r
156     FX_LPCBYTE          m_pBuffer;\r
157     size_t                      m_dwBufferSize;\r
158     FX_FILESIZE         m_nBufferOffset;\r
159     size_t                      m_dwIndex;\r
160     FX_BOOL                     Init(FX_LPBYTE pBuffer, size_t size);\r
161     FX_BOOL                     Init(IFX_FileRead *pFileRead);\r
162     FX_BOOL                     Init(IFX_BufferRead *pBuffer);\r
163     FX_BOOL                     Init(FX_BOOL bOwndedStream);\r
164     FX_BOOL                     ReadNextBlock();\r
165     FX_BOOL                     IsEOF();\r
166     FX_BOOL                     HaveAvailData();\r
167     void                        SkipWhiteSpaces();\r
168     void                        GetName(CFX_ByteStringL &space, CFX_ByteStringL &name);\r
169     void                        GetAttrValue(CFX_WideStringL &value);\r
170     FX_DWORD            GetCharRef();\r
171     void                        GetTagName(CFX_ByteStringL &space, CFX_ByteStringL &name, FX_BOOL &bEndTag, FX_BOOL bStartTag = FALSE);\r
172     void                        SkipLiterals(FX_BSTR str);\r
173     CXML_Element*       ParseElement(CXML_Element* pParent, FX_BOOL bStartTag = FALSE);\r
174     void                        InsertContentSegment(FX_BOOL bCDATA, FX_WSTR content, CXML_Element* pElement);\r
175     void                        InsertCDATASegment(CFX_UTF8Decoder& decoder, CXML_Element* pElement);\r
176 };\r
177 void FX_XML_SplitQualifiedName(FX_BSTR bsFullName, CFX_ByteStringC &bsSpace, CFX_ByteStringC &bsName);\r
178 #endif\r