SEGV in CFX_BaseSegmentedArray::Iterate() when CS has malformed dictionary.
[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             if (!m_pBuffer) {
111                 return FALSE;
112             }
113         }
114         return m_pFileRead->ReadBlock(m_pBuffer, m_nStart, m_dwSize);
115     }
116     virtual FX_LPCBYTE          GetBlockBuffer()
117     {
118         return (FX_LPCBYTE)m_pBuffer;
119     }
120     virtual size_t                      GetBlockSize()
121     {
122         return m_dwSize;
123     }
124     virtual FX_FILESIZE         GetBlockOffset()
125     {
126         return m_nStart;
127     }
128 protected:
129     IFX_FileRead        *m_pFileRead;
130     FX_LPBYTE           m_pBuffer;
131     FX_FILESIZE         m_nStart;
132     size_t                      m_dwSize;
133 };
134 class CXML_Parser
135 {
136 public:
137     ~CXML_Parser();
138     IFX_BufferRead*     m_pDataAcc;
139     FX_BOOL                     m_bOwnedStream;
140     FX_FILESIZE         m_nOffset;
141     FX_BOOL                     m_bSaveSpaceChars;
142     FX_LPCBYTE          m_pBuffer;
143     size_t                      m_dwBufferSize;
144     FX_FILESIZE         m_nBufferOffset;
145     size_t                      m_dwIndex;
146     FX_BOOL                     Init(FX_LPBYTE pBuffer, size_t size);
147     FX_BOOL                     Init(IFX_FileRead *pFileRead);
148     FX_BOOL                     Init(IFX_BufferRead *pBuffer);
149     FX_BOOL                     Init(FX_BOOL bOwndedStream);
150     FX_BOOL                     ReadNextBlock();
151     FX_BOOL                     IsEOF();
152     FX_BOOL                     HaveAvailData();
153     void                        SkipWhiteSpaces();
154     void                        GetName(CFX_ByteString& space, CFX_ByteString& name);
155     void                        GetAttrValue(CFX_WideString &value);
156     FX_DWORD            GetCharRef();
157     void                        GetTagName(CFX_ByteString &space, CFX_ByteString &name, FX_BOOL &bEndTag, FX_BOOL bStartTag = FALSE);
158     void                        SkipLiterals(FX_BSTR str);
159     CXML_Element*       ParseElement(CXML_Element* pParent, FX_BOOL bStartTag = FALSE);
160     void                        InsertContentSegment(FX_BOOL bCDATA, FX_WSTR content, CXML_Element* pElement);
161     void                        InsertCDATASegment(CFX_UTF8Decoder& decoder, CXML_Element* pElement);
162 };
163 void FX_XML_SplitQualifiedName(FX_BSTR bsFullName, CFX_ByteStringC &bsSpace, CFX_ByteStringC &bsName);
164 #endif