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.
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
7 #ifndef _FXCRT_XML_INT_
8 #define _FXCRT_XML_INT_
9 class CXML_DataBufAcc : public IFX_BufferRead, public CFX_Object
12 CXML_DataBufAcc(FX_LPCBYTE pBuffer, size_t size)
18 virtual ~CXML_DataBufAcc() {}
19 virtual void Release()
23 virtual FX_BOOL IsEOF()
25 return m_dwCurPos >= m_dwSize;
27 virtual FX_FILESIZE GetPosition()
29 return (FX_FILESIZE)m_dwCurPos;
31 virtual size_t ReadBlock(void* buffer, size_t size)
35 virtual FX_BOOL ReadNextBlock(FX_BOOL bRestart = FALSE)
40 if (m_dwCurPos < m_dwSize) {
41 m_dwCurPos = m_dwSize;
46 virtual FX_LPCBYTE GetBlockBuffer()
50 virtual size_t GetBlockSize()
54 virtual FX_FILESIZE GetBlockOffset()
63 #define FX_XMLDATASTREAM_BufferSize (32 * 1024)
64 class CXML_DataStmAcc : public IFX_BufferRead, public CFX_Object
67 CXML_DataStmAcc(IFX_FileRead *pFileRead)
68 : m_pFileRead(pFileRead)
73 FXSYS_assert(m_pFileRead != NULL);
75 virtual ~CXML_DataStmAcc()
81 virtual void Release()
85 virtual FX_BOOL IsEOF()
87 return m_nStart + (FX_FILESIZE)m_dwSize >= m_pFileRead->GetSize();
89 virtual FX_FILESIZE GetPosition()
91 return m_nStart + (FX_FILESIZE)m_dwSize;
93 virtual size_t ReadBlock(void* buffer, size_t size)
97 virtual FX_BOOL ReadNextBlock(FX_BOOL bRestart = FALSE)
102 FX_FILESIZE nLength = m_pFileRead->GetSize();
103 m_nStart += (FX_FILESIZE)m_dwSize;
104 if (m_nStart >= nLength) {
107 m_dwSize = (size_t)FX_MIN(FX_XMLDATASTREAM_BufferSize, nLength - m_nStart);
109 m_pBuffer = FX_Alloc(FX_BYTE, m_dwSize);
114 return m_pFileRead->ReadBlock(m_pBuffer, m_nStart, m_dwSize);
116 virtual FX_LPCBYTE GetBlockBuffer()
118 return (FX_LPCBYTE)m_pBuffer;
120 virtual size_t GetBlockSize()
124 virtual FX_FILESIZE GetBlockOffset()
129 IFX_FileRead *m_pFileRead;
131 FX_FILESIZE m_nStart;
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;
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();
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);
163 void FX_XML_SplitQualifiedName(FX_BSTR bsFullName, CFX_ByteStringC &bsSpace, CFX_ByteStringC &bsName);