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