| 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 |