diff options
Diffstat (limited to 'xfa/fgas/crt')
-rw-r--r-- | xfa/fgas/crt/ifgas_stream.cpp | 281 | ||||
-rw-r--r-- | xfa/fgas/crt/ifgas_stream.h | 7 |
2 files changed, 67 insertions, 221 deletions
diff --git a/xfa/fgas/crt/ifgas_stream.cpp b/xfa/fgas/crt/ifgas_stream.cpp index fa9b8db02d..712243d701 100644 --- a/xfa/fgas/crt/ifgas_stream.cpp +++ b/xfa/fgas/crt/ifgas_stream.cpp @@ -40,11 +40,6 @@ class IFGAS_StreamImp { protected: IFGAS_StreamImp(); - - uint32_t GetAccessModes() const { return m_dwAccess; } - - private: - uint32_t m_dwAccess; }; class CFGAS_FileReadStreamImp : public IFGAS_StreamImp { @@ -81,8 +76,7 @@ class CFGAS_FileWriteStreamImp : public IFGAS_StreamImp { CFGAS_FileWriteStreamImp(); ~CFGAS_FileWriteStreamImp() override {} - bool LoadFileWrite(const CFX_RetainPtr<IFX_SeekableWriteStream>& pFileWrite, - uint32_t dwAccess); + bool LoadFileWrite(const CFX_RetainPtr<IFX_SeekableWriteStream>& pFileWrite); // IFGAS_StreamImp: int32_t GetLength() const override; @@ -103,42 +97,12 @@ class CFGAS_FileWriteStreamImp : public IFGAS_StreamImp { int32_t m_iPosition; }; -class CFGAS_Stream : public IFGAS_Stream { - public: - template <typename T, typename... Args> - friend CFX_RetainPtr<T> pdfium::MakeRetain(Args&&... args); - - // IFGAS_Stream - uint32_t GetAccessModes() const override; - int32_t GetLength() const override; - int32_t Seek(FX_STREAMSEEK eSeek, int32_t iOffset) override; - int32_t GetPosition() override; - bool IsEOF() const override; - int32_t ReadData(uint8_t* pBuffer, int32_t iBufferSize) override; - int32_t ReadString(wchar_t* pStr, int32_t iMaxLength, bool& bEOS) override; - int32_t WriteData(const uint8_t* pBuffer, int32_t iBufferSize) override; - int32_t WriteString(const wchar_t* pStr, int32_t iLength) override; - void Flush() override; - bool SetLength(int32_t iLength) override; - int32_t GetBOM(uint8_t bom[4]) const override; - uint16_t GetCodePage() const override; - uint16_t SetCodePage(uint16_t wCodePage) override; - - private: - CFGAS_Stream(std::unique_ptr<IFGAS_StreamImp> imp, uint32_t dwAccess); - ~CFGAS_Stream() override; - - std::unique_ptr<IFGAS_StreamImp> m_pStreamImp; - uint32_t m_dwAccess; -}; - class CFGAS_TextStream : public IFGAS_Stream { public: template <typename T, typename... Args> friend CFX_RetainPtr<T> pdfium::MakeRetain(Args&&... args); // IFGAS_Stream - uint32_t GetAccessModes() const override; int32_t GetLength() const override; int32_t Seek(FX_STREAMSEEK eSeek, int32_t iOffset) override; int32_t GetPosition() override; @@ -149,20 +113,20 @@ class CFGAS_TextStream : public IFGAS_Stream { int32_t WriteString(const wchar_t* pStr, int32_t iLength) override; void Flush() override; bool SetLength(int32_t iLength) override; - int32_t GetBOM(uint8_t bom[4]) const override; + int32_t GetBOMLength() const override; uint16_t GetCodePage() const override; uint16_t SetCodePage(uint16_t wCodePage) override; private: - explicit CFGAS_TextStream(const CFX_RetainPtr<IFGAS_Stream>& pStream); + CFGAS_TextStream(std::unique_ptr<IFGAS_StreamImp> imp, bool isWriteSteam); ~CFGAS_TextStream() override; void InitStream(); uint16_t m_wCodePage; int32_t m_wBOMLength; - uint32_t m_dwBOM; - CFX_RetainPtr<IFGAS_Stream> m_pStreamImp; + bool m_IsWriteStream; + std::unique_ptr<IFGAS_StreamImp> m_pStreamImp; }; class CFGAS_WideStringReadStream : public IFGAS_Stream { @@ -171,7 +135,6 @@ class CFGAS_WideStringReadStream : public IFGAS_Stream { friend CFX_RetainPtr<T> pdfium::MakeRetain(Args&&... args); // IFGAS_Stream - uint32_t GetAccessModes() const override; int32_t GetLength() const override; int32_t Seek(FX_STREAMSEEK eSeek, int32_t iOffset) override; int32_t GetPosition() override; @@ -182,7 +145,7 @@ class CFGAS_WideStringReadStream : public IFGAS_Stream { int32_t WriteString(const wchar_t* pStr, int32_t iLength) override; void Flush() override {} bool SetLength(int32_t iLength) override; - int32_t GetBOM(uint8_t bom[4]) const override; + int32_t GetBOMLength() const override; uint16_t GetCodePage() const override; uint16_t SetCodePage(uint16_t wCodePage) override; @@ -194,7 +157,7 @@ class CFGAS_WideStringReadStream : public IFGAS_Stream { int32_t m_iPosition; }; -IFGAS_StreamImp::IFGAS_StreamImp() : m_dwAccess(0) {} +IFGAS_StreamImp::IFGAS_StreamImp() {} CFGAS_FileReadStreamImp::CFGAS_FileReadStreamImp() : m_pFileRead(nullptr), m_iPosition(0), m_iLength(0) {} @@ -269,8 +232,7 @@ CFGAS_FileWriteStreamImp::CFGAS_FileWriteStreamImp() : m_pFileWrite(nullptr), m_iPosition(0) {} bool CFGAS_FileWriteStreamImp::LoadFileWrite( - const CFX_RetainPtr<IFX_SeekableWriteStream>& pFileWrite, - uint32_t dwAccess) { + const CFX_RetainPtr<IFX_SeekableWriteStream>& pFileWrite) { ASSERT(!m_pFileWrite && pFileWrite); m_iPosition = pFileWrite->GetSize(); @@ -327,65 +289,58 @@ void CFGAS_FileWriteStreamImp::Flush() { } } -CFGAS_TextStream::CFGAS_TextStream(const CFX_RetainPtr<IFGAS_Stream>& pStream) +CFGAS_TextStream::CFGAS_TextStream(std::unique_ptr<IFGAS_StreamImp> imp, + bool isWriteStream) : m_wCodePage(FX_CODEPAGE_DefANSI), m_wBOMLength(0), - m_dwBOM(0), - m_pStreamImp(pStream) { + m_IsWriteStream(isWriteStream), + m_pStreamImp(std::move(imp)) { ASSERT(m_pStreamImp); InitStream(); } CFGAS_TextStream::~CFGAS_TextStream() {} +#if _FX_ENDIAN_ == _FX_LITTLE_ENDIAN_ +#define BOM_MASK 0x00FFFFFF +#define BOM_UTF8 0x00BFBBEF +#define BOM_UTF16_MASK 0x0000FFFF +#define BOM_UTF16_BE 0x0000FFFE +#define BOM_UTF16_LE 0x0000FEFF +#else +#define BOM_MASK 0xFFFFFF00 +#define BOM_UTF8 0xEFBBBF00 +#define BOM_UTF16_MASK 0xFFFF0000 +#define BOM_UTF16_BE 0xFEFF0000 +#define BOM_UTF16_LE 0xFFFE0000 +#endif // _FX_ENDIAN_ == _FX_LITTLE_ENDIAN_ + void CFGAS_TextStream::InitStream() { int32_t iPosition = m_pStreamImp->GetPosition(); m_pStreamImp->Seek(FX_STREAMSEEK_Begin, 0); - m_pStreamImp->ReadData((uint8_t*)&m_dwBOM, 3); -#if _FX_ENDIAN_ == _FX_LITTLE_ENDIAN_ - m_dwBOM &= 0x00FFFFFF; - if (m_dwBOM == 0x00BFBBEF) { - m_wBOMLength = 3; - m_wCodePage = FX_CODEPAGE_UTF8; - } else { - m_dwBOM &= 0x0000FFFF; - if (m_dwBOM == 0x0000FFFE) { - m_wBOMLength = 2; - m_wCodePage = FX_CODEPAGE_UTF16BE; - } else if (m_dwBOM == 0x0000FEFF) { - m_wBOMLength = 2; - m_wCodePage = FX_CODEPAGE_UTF16LE; - } else { - m_wBOMLength = 0; - m_dwBOM = 0; - m_wCodePage = FXSYS_GetACP(); - } - } -#else - m_dwBOM &= 0xFFFFFF00; - if (m_dwBOM == 0xEFBBBF00) { + + uint32_t bom; + m_pStreamImp->ReadData(reinterpret_cast<uint8_t*>(&bom), 3); + + bom &= BOM_MASK; + if (bom == BOM_UTF8) { m_wBOMLength = 3; m_wCodePage = FX_CODEPAGE_UTF8; } else { - m_dwBOM &= 0xFFFF0000; - if (m_dwBOM == 0xFEFF0000) { + bom &= BOM_UTF16_MASK; + if (bom == BOM_UTF16_BE) { m_wBOMLength = 2; m_wCodePage = FX_CODEPAGE_UTF16BE; - } else if (m_dwBOM == 0xFFFE0000) { + } else if (bom == BOM_UTF16_LE) { m_wBOMLength = 2; m_wCodePage = FX_CODEPAGE_UTF16LE; } else { m_wBOMLength = 0; - m_dwBOM = 0; m_wCodePage = FXSYS_GetACP(); } } -#endif - m_pStreamImp->Seek(FX_STREAMSEEK_Begin, std::max(m_wBOMLength, iPosition)); -} -uint32_t CFGAS_TextStream::GetAccessModes() const { - return m_pStreamImp->GetAccessModes(); + m_pStreamImp->Seek(FX_STREAMSEEK_Begin, std::max(m_wBOMLength, iPosition)); } int32_t CFGAS_TextStream::GetLength() const { @@ -405,34 +360,50 @@ bool CFGAS_TextStream::IsEOF() const { } int32_t CFGAS_TextStream::ReadData(uint8_t* pBuffer, int32_t iBufferSize) { - return m_pStreamImp->ReadData(pBuffer, iBufferSize); + ASSERT(pBuffer && iBufferSize > 0); + + if (m_IsWriteStream) + return -1; + + int32_t iLen = std::min( + m_pStreamImp->GetLength() - m_pStreamImp->GetPosition(), iBufferSize); + if (iLen <= 0) + return 0; + + return m_pStreamImp->ReadData(pBuffer, iLen); } int32_t CFGAS_TextStream::WriteData(const uint8_t* pBuffer, int32_t iBufferSize) { + ASSERT(pBuffer && iBufferSize > 0); + + if (!m_IsWriteStream) + return -1; return m_pStreamImp->WriteData(pBuffer, iBufferSize); } void CFGAS_TextStream::Flush() { + if (!m_IsWriteStream) + return; m_pStreamImp->Flush(); } bool CFGAS_TextStream::SetLength(int32_t iLength) { + if (!m_IsWriteStream) + return false; return m_pStreamImp->SetLength(iLength); } -uint16_t CFGAS_TextStream::GetCodePage() const { - return m_wCodePage; -} - -int32_t CFGAS_TextStream::GetBOM(uint8_t bom[4]) const { +int32_t CFGAS_TextStream::GetBOMLength() const { if (m_wBOMLength < 1) return 0; - - *(uint32_t*)bom = m_dwBOM; return m_wBOMLength; } +uint16_t CFGAS_TextStream::GetCodePage() const { + return m_wCodePage; +} + uint16_t CFGAS_TextStream::SetCodePage(uint16_t wCodePage) { if (m_wBOMLength > 0) return m_wCodePage; @@ -446,7 +417,7 @@ int32_t CFGAS_TextStream::ReadString(wchar_t* pStr, int32_t iMaxLength, bool& bEOS) { ASSERT(pStr && iMaxLength > 0); - if (!m_pStreamImp) + if (m_IsWriteStream) return -1; if (m_wCodePage == FX_CODEPAGE_UTF16LE || @@ -489,7 +460,7 @@ int32_t CFGAS_TextStream::ReadString(wchar_t* pStr, int32_t CFGAS_TextStream::WriteString(const wchar_t* pStr, int32_t iLength) { ASSERT(pStr && iLength > 0); - if ((m_pStreamImp->GetAccessModes() & FX_STREAMACCESS_Write) == 0) + if (!m_IsWriteStream) return -1; if (m_wCodePage == FX_CODEPAGE_UTF8) { @@ -505,129 +476,12 @@ int32_t CFGAS_TextStream::WriteString(const wchar_t* pStr, int32_t iLength) { return iLength; } -CFGAS_Stream::CFGAS_Stream(std::unique_ptr<IFGAS_StreamImp> imp, - uint32_t dwAccess) - : m_pStreamImp(std::move(imp)), m_dwAccess(dwAccess) {} - -CFGAS_Stream::~CFGAS_Stream() {} - -uint32_t CFGAS_Stream::GetAccessModes() const { - return m_dwAccess; -} - -int32_t CFGAS_Stream::GetLength() const { - return m_pStreamImp ? m_pStreamImp->GetLength() : -1; -} - -int32_t CFGAS_Stream::Seek(FX_STREAMSEEK eSeek, int32_t iOffset) { - if (!m_pStreamImp) - return -1; - return m_pStreamImp->Seek(eSeek, iOffset); -} - -int32_t CFGAS_Stream::GetPosition() { - if (!m_pStreamImp) - return -1; - return m_pStreamImp->GetPosition(); -} - -bool CFGAS_Stream::IsEOF() const { - return m_pStreamImp ? m_pStreamImp->IsEOF() : true; -} - -int32_t CFGAS_Stream::ReadData(uint8_t* pBuffer, int32_t iBufferSize) { - ASSERT(pBuffer && iBufferSize > 0); - if (!m_pStreamImp) - return -1; - - int32_t iLen = std::min( - m_pStreamImp->GetLength() - m_pStreamImp->GetPosition(), iBufferSize); - if (iLen <= 0) - return 0; - - return m_pStreamImp->ReadData(pBuffer, iLen); -} - -int32_t CFGAS_Stream::ReadString(wchar_t* pStr, - int32_t iMaxLength, - bool& bEOS) { - ASSERT(pStr && iMaxLength > 0); - if (!m_pStreamImp) - return -1; - - int32_t iLen = - std::min((m_pStreamImp->GetLength() - m_pStreamImp->GetPosition()) / 2, - iMaxLength); - if (iLen <= 0) - return 0; - return m_pStreamImp->ReadString(pStr, iLen, bEOS); -} - -int32_t CFGAS_Stream::WriteData(const uint8_t* pBuffer, int32_t iBufferSize) { - ASSERT(pBuffer && iBufferSize > 0); - if (!m_pStreamImp) - return -1; - if ((m_dwAccess & FX_STREAMACCESS_Write) == 0) - return -1; - return m_pStreamImp->WriteData(pBuffer, iBufferSize); -} - -int32_t CFGAS_Stream::WriteString(const wchar_t* pStr, int32_t iLength) { - ASSERT(pStr && iLength > 0); - if (!m_pStreamImp) - return -1; - if ((m_dwAccess & FX_STREAMACCESS_Write) == 0) - return -1; - return m_pStreamImp->WriteString(pStr, iLength); -} - -void CFGAS_Stream::Flush() { - if (!m_pStreamImp) - return; - if ((m_dwAccess & FX_STREAMACCESS_Write) == 0) - return; - m_pStreamImp->Flush(); -} - -bool CFGAS_Stream::SetLength(int32_t iLength) { - if (!m_pStreamImp) - return false; - if ((m_dwAccess & FX_STREAMACCESS_Write) == 0) - return false; - return m_pStreamImp->SetLength(iLength); -} - -int32_t CFGAS_Stream::GetBOM(uint8_t bom[4]) const { - if (!m_pStreamImp) - return -1; - return 0; -} - -uint16_t CFGAS_Stream::GetCodePage() const { -#if _FX_ENDIAN_ == _FX_LITTLE_ENDIAN_ - return FX_CODEPAGE_UTF16LE; -#else - return FX_CODEPAGE_UTF16BE; -#endif -} -uint16_t CFGAS_Stream::SetCodePage(uint16_t wCodePage) { -#if _FX_ENDIAN_ == _FX_LITTLE_ENDIAN_ - return FX_CODEPAGE_UTF16LE; -#else - return FX_CODEPAGE_UTF16BE; -#endif -} - CFGAS_WideStringReadStream::CFGAS_WideStringReadStream( const CFX_WideString& wsBuffer) : m_wsBuffer(wsBuffer), m_iPosition(0) {} CFGAS_WideStringReadStream::~CFGAS_WideStringReadStream() {} -uint32_t CFGAS_WideStringReadStream::GetAccessModes() const { - return 0; -} - int32_t CFGAS_WideStringReadStream::GetLength() const { return m_wsBuffer.GetLength() * sizeof(wchar_t); } @@ -688,7 +542,7 @@ bool CFGAS_WideStringReadStream::SetLength(int32_t iLength) { return false; } -int32_t CFGAS_WideStringReadStream::GetBOM(uint8_t bom[4]) const { +int32_t CFGAS_WideStringReadStream::GetBOMLength() const { return 0; } @@ -714,8 +568,7 @@ CFX_RetainPtr<IFGAS_Stream> IFGAS_Stream::CreateReadStream( ->LoadFileRead(pFileRead)) { return nullptr; } - return pdfium::MakeRetain<CFGAS_TextStream>( - pdfium::MakeRetain<CFGAS_Stream>(std::move(pImp), 0)); + return pdfium::MakeRetain<CFGAS_TextStream>(std::move(pImp), false); } // static @@ -727,12 +580,10 @@ CFX_RetainPtr<IFGAS_Stream> IFGAS_Stream::CreateWriteStream( std::unique_ptr<IFGAS_StreamImp> pImp = pdfium::MakeUnique<CFGAS_FileWriteStreamImp>(); if (!static_cast<CFGAS_FileWriteStreamImp*>(pImp.get()) - ->LoadFileWrite(pFileWrite, FX_STREAMACCESS_Write)) { + ->LoadFileWrite(pFileWrite)) { return nullptr; } - - return pdfium::MakeRetain<CFGAS_TextStream>( - pdfium::MakeRetain<CFGAS_Stream>(std::move(pImp), FX_STREAMACCESS_Write)); + return pdfium::MakeRetain<CFGAS_TextStream>(std::move(pImp), true); } // static diff --git a/xfa/fgas/crt/ifgas_stream.h b/xfa/fgas/crt/ifgas_stream.h index df9d93afa3..b3f8a928d8 100644 --- a/xfa/fgas/crt/ifgas_stream.h +++ b/xfa/fgas/crt/ifgas_stream.h @@ -11,10 +11,6 @@ #include "core/fxcrt/fx_stream.h" #include "core/fxcrt/fx_system.h" -enum FX_STREAMACCESS { - FX_STREAMACCESS_Write = 0x04, -}; - enum FX_STREAMSEEK { FX_STREAMSEEK_Begin = 0, FX_STREAMSEEK_Current, @@ -30,7 +26,6 @@ class IFGAS_Stream : public CFX_Retainable { static CFX_RetainPtr<IFGAS_Stream> CreateWideStringReadStream( const CFX_WideString& buffer); - virtual uint32_t GetAccessModes() const = 0; virtual int32_t GetLength() const = 0; virtual int32_t Seek(FX_STREAMSEEK eSeek, int32_t iOffset) = 0; virtual int32_t GetPosition() = 0; @@ -41,7 +36,7 @@ class IFGAS_Stream : public CFX_Retainable { virtual int32_t WriteString(const wchar_t* pStr, int32_t iLength) = 0; virtual void Flush() = 0; virtual bool SetLength(int32_t iLength) = 0; - virtual int32_t GetBOM(uint8_t bom[4]) const = 0; + virtual int32_t GetBOMLength() const = 0; virtual uint16_t GetCodePage() const = 0; virtual uint16_t SetCodePage(uint16_t wCodePage) = 0; }; |