OLD | NEW |
1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 PDFium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
6 | 6 |
7 #ifndef CORE_FXCRT_XML_INT_H_ | 7 #ifndef CORE_FXCRT_XML_INT_H_ |
8 #define CORE_FXCRT_XML_INT_H_ | 8 #define CORE_FXCRT_XML_INT_H_ |
9 | 9 |
10 #include <algorithm> | 10 #include <algorithm> |
11 | 11 |
12 #include "core/fxcrt/include/fx_stream.h" | 12 #include "core/fxcrt/include/fx_stream.h" |
13 | 13 |
14 class CFX_UTF8Decoder; | 14 class CFX_UTF8Decoder; |
15 class CXML_Element; | 15 class CXML_Element; |
16 | 16 |
17 class CXML_DataBufAcc : public IFX_BufferRead { | 17 class CXML_DataBufAcc : public IFX_BufferRead { |
18 public: | 18 public: |
19 CXML_DataBufAcc(const uint8_t* pBuffer, size_t size) | 19 CXML_DataBufAcc(const uint8_t* pBuffer, size_t size); |
20 : m_pBuffer(pBuffer), m_dwSize(size), m_dwCurPos(0) {} | 20 ~CXML_DataBufAcc() override; |
21 ~CXML_DataBufAcc() override {} | |
22 | 21 |
23 // IFX_BufferRead | 22 // IFX_BufferRead |
24 void Release() override { delete this; } | 23 void Release() override; |
25 FX_BOOL IsEOF() override { return m_dwCurPos >= m_dwSize; } | 24 FX_BOOL IsEOF() override; |
26 FX_FILESIZE GetPosition() override { return (FX_FILESIZE)m_dwCurPos; } | 25 FX_FILESIZE GetPosition() override; |
27 size_t ReadBlock(void* buffer, size_t size) override { return 0; } | 26 size_t ReadBlock(void* buffer, size_t size) override; |
28 FX_BOOL ReadNextBlock(FX_BOOL bRestart = FALSE) override { | 27 FX_BOOL ReadNextBlock(FX_BOOL bRestart = FALSE) override; |
29 if (bRestart) { | 28 const uint8_t* GetBlockBuffer() override; |
30 m_dwCurPos = 0; | 29 size_t GetBlockSize() override; |
31 } | 30 FX_FILESIZE GetBlockOffset() override; |
32 if (m_dwCurPos < m_dwSize) { | |
33 m_dwCurPos = m_dwSize; | |
34 return TRUE; | |
35 } | |
36 return FALSE; | |
37 } | |
38 const uint8_t* GetBlockBuffer() override { return m_pBuffer; } | |
39 size_t GetBlockSize() override { return m_dwSize; } | |
40 FX_FILESIZE GetBlockOffset() override { return 0; } | |
41 | 31 |
42 protected: | 32 protected: |
43 const uint8_t* m_pBuffer; | 33 const uint8_t* m_pBuffer; |
44 size_t m_dwSize; | 34 size_t m_dwSize; |
45 size_t m_dwCurPos; | 35 size_t m_dwCurPos; |
46 }; | 36 }; |
47 | 37 |
48 class CXML_DataStmAcc : public IFX_BufferRead { | 38 class CXML_DataStmAcc : public IFX_BufferRead { |
49 public: | 39 public: |
50 explicit CXML_DataStmAcc(IFX_FileRead* pFileRead) | 40 explicit CXML_DataStmAcc(IFX_FileRead* pFileRead); |
51 : m_pFileRead(pFileRead), m_pBuffer(nullptr), m_nStart(0), m_dwSize(0) { | 41 ~CXML_DataStmAcc() override; |
52 ASSERT(m_pFileRead); | |
53 } | |
54 ~CXML_DataStmAcc() override { FX_Free(m_pBuffer); } | |
55 | 42 |
56 void Release() override { delete this; } | 43 // IFX_BufferRead |
57 FX_BOOL IsEOF() override { | 44 void Release() override; |
58 return m_nStart + (FX_FILESIZE)m_dwSize >= m_pFileRead->GetSize(); | 45 FX_BOOL IsEOF() override; |
59 } | 46 FX_FILESIZE GetPosition() override; |
60 FX_FILESIZE GetPosition() override { | 47 size_t ReadBlock(void* buffer, size_t size) override; |
61 return m_nStart + (FX_FILESIZE)m_dwSize; | 48 FX_BOOL ReadNextBlock(FX_BOOL bRestart = FALSE) override; |
62 } | 49 const uint8_t* GetBlockBuffer() override; |
63 size_t ReadBlock(void* buffer, size_t size) override { return 0; } | 50 size_t GetBlockSize() override; |
64 FX_BOOL ReadNextBlock(FX_BOOL bRestart = FALSE) override { | 51 FX_FILESIZE GetBlockOffset() override; |
65 if (bRestart) { | |
66 m_nStart = 0; | |
67 } | |
68 FX_FILESIZE nLength = m_pFileRead->GetSize(); | |
69 m_nStart += (FX_FILESIZE)m_dwSize; | |
70 if (m_nStart >= nLength) { | |
71 return FALSE; | |
72 } | |
73 static const FX_FILESIZE FX_XMLDATASTREAM_BufferSize = 32 * 1024; | |
74 m_dwSize = static_cast<size_t>( | |
75 std::min(FX_XMLDATASTREAM_BufferSize, nLength - m_nStart)); | |
76 if (!m_pBuffer) { | |
77 m_pBuffer = FX_Alloc(uint8_t, m_dwSize); | |
78 } | |
79 return m_pFileRead->ReadBlock(m_pBuffer, m_nStart, m_dwSize); | |
80 } | |
81 const uint8_t* GetBlockBuffer() override { return (const uint8_t*)m_pBuffer; } | |
82 size_t GetBlockSize() override { return m_dwSize; } | |
83 FX_FILESIZE GetBlockOffset() override { return m_nStart; } | |
84 | 52 |
85 protected: | 53 protected: |
86 IFX_FileRead* m_pFileRead; | 54 IFX_FileRead* m_pFileRead; |
87 uint8_t* m_pBuffer; | 55 uint8_t* m_pBuffer; |
88 FX_FILESIZE m_nStart; | 56 FX_FILESIZE m_nStart; |
89 size_t m_dwSize; | 57 size_t m_dwSize; |
90 }; | 58 }; |
91 | 59 |
92 class CXML_Parser { | 60 class CXML_Parser { |
93 public: | 61 public: |
| 62 CXML_Parser(); |
94 ~CXML_Parser(); | 63 ~CXML_Parser(); |
95 IFX_BufferRead* m_pDataAcc; | 64 |
96 FX_BOOL m_bOwnedStream; | |
97 FX_FILESIZE m_nOffset; | |
98 FX_BOOL m_bSaveSpaceChars; | |
99 const uint8_t* m_pBuffer; | |
100 size_t m_dwBufferSize; | |
101 FX_FILESIZE m_nBufferOffset; | |
102 size_t m_dwIndex; | |
103 FX_BOOL Init(uint8_t* pBuffer, size_t size); | 65 FX_BOOL Init(uint8_t* pBuffer, size_t size); |
104 FX_BOOL Init(IFX_FileRead* pFileRead); | 66 FX_BOOL Init(IFX_FileRead* pFileRead); |
105 FX_BOOL Init(IFX_BufferRead* pBuffer); | 67 FX_BOOL Init(IFX_BufferRead* pBuffer); |
106 FX_BOOL Init(FX_BOOL bOwndedStream); | 68 FX_BOOL Init(FX_BOOL bOwndedStream); |
107 FX_BOOL ReadNextBlock(); | 69 FX_BOOL ReadNextBlock(); |
108 FX_BOOL IsEOF(); | 70 FX_BOOL IsEOF(); |
109 FX_BOOL HaveAvailData(); | 71 FX_BOOL HaveAvailData(); |
110 void SkipWhiteSpaces(); | 72 void SkipWhiteSpaces(); |
111 void GetName(CFX_ByteString& space, CFX_ByteString& name); | 73 void GetName(CFX_ByteString& space, CFX_ByteString& name); |
112 void GetAttrValue(CFX_WideString& value); | 74 void GetAttrValue(CFX_WideString& value); |
113 uint32_t GetCharRef(); | 75 uint32_t GetCharRef(); |
114 void GetTagName(CFX_ByteString& space, | 76 void GetTagName(CFX_ByteString& space, |
115 CFX_ByteString& name, | 77 CFX_ByteString& name, |
116 FX_BOOL& bEndTag, | 78 FX_BOOL& bEndTag, |
117 FX_BOOL bStartTag = FALSE); | 79 FX_BOOL bStartTag = FALSE); |
118 void SkipLiterals(const CFX_ByteStringC& str); | 80 void SkipLiterals(const CFX_ByteStringC& str); |
119 CXML_Element* ParseElement(CXML_Element* pParent, FX_BOOL bStartTag = FALSE); | 81 CXML_Element* ParseElement(CXML_Element* pParent, FX_BOOL bStartTag = FALSE); |
120 void InsertContentSegment(FX_BOOL bCDATA, | 82 void InsertContentSegment(FX_BOOL bCDATA, |
121 const CFX_WideStringC& content, | 83 const CFX_WideStringC& content, |
122 CXML_Element* pElement); | 84 CXML_Element* pElement); |
123 void InsertCDATASegment(CFX_UTF8Decoder& decoder, CXML_Element* pElement); | 85 void InsertCDATASegment(CFX_UTF8Decoder& decoder, CXML_Element* pElement); |
| 86 |
| 87 IFX_BufferRead* m_pDataAcc; |
| 88 FX_BOOL m_bOwnedStream; |
| 89 FX_FILESIZE m_nOffset; |
| 90 FX_BOOL m_bSaveSpaceChars; |
| 91 const uint8_t* m_pBuffer; |
| 92 size_t m_dwBufferSize; |
| 93 FX_FILESIZE m_nBufferOffset; |
| 94 size_t m_dwIndex; |
124 }; | 95 }; |
125 | 96 |
126 void FX_XML_SplitQualifiedName(const CFX_ByteStringC& bsFullName, | 97 void FX_XML_SplitQualifiedName(const CFX_ByteStringC& bsFullName, |
127 CFX_ByteStringC& bsSpace, | 98 CFX_ByteStringC& bsSpace, |
128 CFX_ByteStringC& bsName); | 99 CFX_ByteStringC& bsName); |
129 | 100 |
130 #endif // CORE_FXCRT_XML_INT_H_ | 101 #endif // CORE_FXCRT_XML_INT_H_ |
OLD | NEW |