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