diff options
-rw-r--r-- | xfa/fde/cfde_txtedtengine.cpp | 2 | ||||
-rw-r--r-- | xfa/fde/css/cfde_csstextbuf.cpp | 2 | ||||
-rw-r--r-- | xfa/fde/xml/cfde_xmlsyntaxparser.cpp | 8 | ||||
-rw-r--r-- | xfa/fde/xml/cfde_xmlsyntaxparser.h | 2 | ||||
-rw-r--r-- | xfa/fgas/crt/fgas_codepage.cpp | 124 | ||||
-rw-r--r-- | xfa/fgas/crt/fgas_codepage.h | 13 | ||||
-rw-r--r-- | xfa/fgas/crt/ifgas_stream.cpp | 557 | ||||
-rw-r--r-- | xfa/fgas/crt/ifgas_stream.h | 30 |
8 files changed, 323 insertions, 415 deletions
diff --git a/xfa/fde/cfde_txtedtengine.cpp b/xfa/fde/cfde_txtedtengine.cpp index b6471766db..86a501559f 100644 --- a/xfa/fde/cfde_txtedtengine.cpp +++ b/xfa/fde/cfde_txtedtengine.cpp @@ -123,7 +123,7 @@ void CFDE_TxtEdtEngine::SetTextByStream( wchar_t* lpwstr = FX_Alloc(wchar_t, nPlateSize); bool bEos = false; while (!bEos) { - int32_t nRead = pStream->ReadString(lpwstr, nPlateSize, bEos); + int32_t nRead = pStream->ReadString(lpwstr, nPlateSize, &bEos); bPreIsCR = ReplaceParagEnd(lpwstr, nRead, bPreIsCR); m_pTxtBuf->Insert(nIndex, lpwstr, nRead); nIndex += nRead; diff --git a/xfa/fde/css/cfde_csstextbuf.cpp b/xfa/fde/css/cfde_csstextbuf.cpp index b8d8b197ae..149ed31e98 100644 --- a/xfa/fde/css/cfde_csstextbuf.cpp +++ b/xfa/fde/css/cfde_csstextbuf.cpp @@ -55,7 +55,7 @@ int32_t CFDE_CSSTextBuf::LoadFromStream( if (pTxtStream->GetPosition() != iStreamOffset) pTxtStream->Seek(FX_STREAMSEEK_Begin, iStreamOffset); - m_iDatLen = pTxtStream->ReadString(m_pBuffer, iMaxChars, bEOS); + m_iDatLen = pTxtStream->ReadString(m_pBuffer, iMaxChars, &bEOS); return m_iDatLen; } diff --git a/xfa/fde/xml/cfde_xmlsyntaxparser.cpp b/xfa/fde/xml/cfde_xmlsyntaxparser.cpp index 51507526c2..78382058ec 100644 --- a/xfa/fde/xml/cfde_xmlsyntaxparser.cpp +++ b/xfa/fde/xml/cfde_xmlsyntaxparser.cpp @@ -105,10 +105,12 @@ CFDE_XMLSyntaxParser::CFDE_XMLSyntaxParser( m_CurNode.iNodeNum = -1; m_CurNode.eNodeType = FDE_XMLNODE_Unknown; - m_iXMLPlaneSize = std::min(m_iXMLPlaneSize, m_pStream->GetLength()); + m_iXMLPlaneSize = + std::min(m_iXMLPlaneSize, + pdfium::base::checked_cast<FX_STRSIZE>(m_pStream->GetLength())); m_iCurrentPos = m_pStream->GetBOMLength(); - FX_SAFE_INT32 alloc_size_safe = m_iXMLPlaneSize; + FX_SAFE_STRSIZE alloc_size_safe = m_iXMLPlaneSize; alloc_size_safe += 1; // For NUL. if (!alloc_size_safe.IsValid() || alloc_size_safe.ValueOrDie() <= 0) { m_syntaxParserResult = FDE_XmlSyntaxResult::Error; @@ -146,7 +148,7 @@ FDE_XmlSyntaxResult CFDE_XMLSyntaxParser::DoSyntaxParse() { m_pStream->Seek(FX_STREAMSEEK_Begin, m_iCurrentPos); } m_iBufferChars = - m_pStream->ReadString(m_Buffer.data(), m_iXMLPlaneSize, m_bEOS); + m_pStream->ReadString(m_Buffer.data(), m_iXMLPlaneSize, &m_bEOS); iPos = m_pStream->GetPosition(); if (m_iBufferChars < 1) { m_iCurrentPos = iStreamLength; diff --git a/xfa/fde/xml/cfde_xmlsyntaxparser.h b/xfa/fde/xml/cfde_xmlsyntaxparser.h index 9f1274fa83..f229cc02b1 100644 --- a/xfa/fde/xml/cfde_xmlsyntaxparser.h +++ b/xfa/fde/xml/cfde_xmlsyntaxparser.h @@ -98,7 +98,7 @@ class CFDE_XMLSyntaxParser { void ParseTextChar(wchar_t ch); CFX_RetainPtr<IFGAS_Stream> m_pStream; - int32_t m_iXMLPlaneSize; + FX_STRSIZE m_iXMLPlaneSize; int32_t m_iCurrentPos; int32_t m_iCurrentNodeNum; int32_t m_iLastNodeNum; diff --git a/xfa/fgas/crt/fgas_codepage.cpp b/xfa/fgas/crt/fgas_codepage.cpp index cae2dd7234..c1a4322883 100644 --- a/xfa/fgas/crt/fgas_codepage.cpp +++ b/xfa/fgas/crt/fgas_codepage.cpp @@ -68,127 +68,3 @@ uint16_t FX_GetCodePageFromCharset(uint8_t charset) { } while (iStart <= iEnd); return 0xFFFF; } - -void FX_SwapByteOrder(wchar_t* pStr, int32_t iLength) { - ASSERT(pStr); - - if (iLength < 0) - iLength = FXSYS_wcslen(pStr); - - uint16_t wch; - if (sizeof(wchar_t) > 2) { - while (iLength-- > 0) { - wch = (uint16_t)*pStr; - wch = (wch >> 8) | (wch << 8); - wch &= 0x00FF; - *pStr++ = wch; - } - return; - } - - while (iLength-- > 0) { - wch = (uint16_t)*pStr; - wch = (wch >> 8) | (wch << 8); - *pStr++ = wch; - } -} - -void FX_UTF16ToWChar(void* pBuffer, int32_t iLength) { - ASSERT(pBuffer && iLength > 0); - if (sizeof(wchar_t) == 2) - return; - - uint16_t* pSrc = static_cast<uint16_t*>(pBuffer); - wchar_t* pDst = static_cast<wchar_t*>(pBuffer); - while (--iLength >= 0) - pDst[iLength] = static_cast<wchar_t>(pSrc[iLength]); -} - -int32_t FX_DecodeString(uint16_t wCodePage, - const char* pSrc, - int32_t* pSrcLen, - wchar_t* pDst, - int32_t* pDstLen, - bool bErrBreak) { - if (wCodePage == FX_CODEPAGE_UTF8) - return FX_UTF8Decode(pSrc, pSrcLen, pDst, pDstLen); - return -1; -} - -int32_t FX_UTF8Decode(const char* pSrc, - int32_t* pSrcLen, - wchar_t* pDst, - int32_t* pDstLen) { - if (!pSrcLen || !pDstLen) - return -1; - - int32_t iSrcLen = *pSrcLen; - if (iSrcLen < 1) { - *pSrcLen = *pDstLen = 0; - return 1; - } - - int32_t iDstLen = *pDstLen; - bool bValidDst = (pDst && iDstLen > 0); - uint32_t dwCode = 0; - int32_t iPending = 0; - int32_t iSrcNum = 0; - int32_t iDstNum = 0; - int32_t iIndex = 0; - int32_t k = 1; - while (iIndex < iSrcLen) { - uint8_t byte = static_cast<uint8_t>(*(pSrc + iIndex)); - if (byte < 0x80) { - iPending = 0; - k = 1; - iDstNum++; - iSrcNum += k; - if (bValidDst) { - *pDst++ = byte; - if (iDstNum >= iDstLen) - break; - } - } else if (byte < 0xc0) { - if (iPending < 1) - break; - - iPending--; - dwCode |= (byte & 0x3f) << (iPending * 6); - if (iPending == 0) { - iDstNum++; - iSrcNum += k; - if (bValidDst) { - *pDst++ = dwCode; - if (iDstNum >= iDstLen) - break; - } - } - } else if (byte < 0xe0) { - iPending = 1; - k = 2; - dwCode = (byte & 0x1f) << 6; - } else if (byte < 0xf0) { - iPending = 2; - k = 3; - dwCode = (byte & 0x0f) << 12; - } else if (byte < 0xf8) { - iPending = 3; - k = 4; - dwCode = (byte & 0x07) << 18; - } else if (byte < 0xfc) { - iPending = 4; - k = 5; - dwCode = (byte & 0x03) << 24; - } else if (byte < 0xfe) { - iPending = 5; - k = 6; - dwCode = (byte & 0x01) << 30; - } else { - break; - } - iIndex++; - } - *pSrcLen = iSrcNum; - *pDstLen = iDstNum; - return 1; -} diff --git a/xfa/fgas/crt/fgas_codepage.h b/xfa/fgas/crt/fgas_codepage.h index 3dfabe600e..8e29736149 100644 --- a/xfa/fgas/crt/fgas_codepage.h +++ b/xfa/fgas/crt/fgas_codepage.h @@ -134,18 +134,5 @@ #define FX_CHARSET_OEM 255 uint16_t FX_GetCodePageFromCharset(uint8_t charset); -void FX_SwapByteOrder(wchar_t* pStr, int32_t iLength); - -void FX_UTF16ToWChar(void* pBuffer, int32_t iLength); -int32_t FX_DecodeString(uint16_t wCodePage, - const char* pSrc, - int32_t* pSrcLen, - wchar_t* pDst, - int32_t* pDstLen, - bool bErrBreak); -int32_t FX_UTF8Decode(const char* pSrc, - int32_t* pSrcLen, - wchar_t* pDst, - int32_t* pDstLen); #endif // XFA_FGAS_CRT_FGAS_CODEPAGE_H_ diff --git a/xfa/fgas/crt/ifgas_stream.cpp b/xfa/fgas/crt/ifgas_stream.cpp index 712243d701..b4d03cf810 100644 --- a/xfa/fgas/crt/ifgas_stream.cpp +++ b/xfa/fgas/crt/ifgas_stream.cpp @@ -27,16 +27,16 @@ class IFGAS_StreamImp { public: virtual ~IFGAS_StreamImp() {} - virtual int32_t GetLength() const = 0; - virtual int32_t Seek(FX_STREAMSEEK eSeek, int32_t iOffset) = 0; - virtual int32_t GetPosition() = 0; + virtual FX_FILESIZE GetLength() const = 0; + virtual FX_FILESIZE GetPosition() = 0; + virtual void Seek(FX_STREAMSEEK eSeek, FX_FILESIZE iOffset) = 0; virtual bool IsEOF() const = 0; - virtual int32_t ReadData(uint8_t* pBuffer, int32_t iBufferSize) = 0; - virtual int32_t ReadString(wchar_t* pStr, int32_t iMaxLength, bool& bEOS) = 0; - virtual int32_t WriteData(const uint8_t* pBuffer, int32_t iBufferSize) = 0; - virtual int32_t WriteString(const wchar_t* pStr, int32_t iLength) = 0; - virtual void Flush() = 0; - virtual bool SetLength(int32_t iLength) = 0; + virtual FX_STRSIZE ReadData(uint8_t* pBuffer, FX_STRSIZE iBufferSize) = 0; + virtual FX_STRSIZE ReadString(wchar_t* pStr, + FX_STRSIZE iMaxLength, + bool* bEOS) = 0; + virtual void WriteData(const uint8_t* pBuffer, FX_STRSIZE iBufferSize) = 0; + virtual void WriteString(const wchar_t* pStr, FX_STRSIZE iLength) = 0; protected: IFGAS_StreamImp(); @@ -44,57 +44,52 @@ class IFGAS_StreamImp { class CFGAS_FileReadStreamImp : public IFGAS_StreamImp { public: - CFGAS_FileReadStreamImp(); + explicit CFGAS_FileReadStreamImp( + const CFX_RetainPtr<IFX_SeekableReadStream>& pFileRead); ~CFGAS_FileReadStreamImp() override {} - bool LoadFileRead(const CFX_RetainPtr<IFX_SeekableReadStream>& pFileRead); - // IFGAS_StreamImp: - int32_t GetLength() const override; - int32_t Seek(FX_STREAMSEEK eSeek, int32_t iOffset) override; - int32_t GetPosition() override { return m_iPosition; } + FX_FILESIZE GetLength() const override; + FX_FILESIZE GetPosition() override { return m_iPosition; } + void Seek(FX_STREAMSEEK eSeek, FX_FILESIZE iOffset) 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 { - return 0; - } - int32_t WriteString(const wchar_t* pStr, int32_t iLength) override { - return 0; - } - void Flush() override {} - bool SetLength(int32_t iLength) override { return false; } + FX_STRSIZE ReadData(uint8_t* pBuffer, FX_STRSIZE iBufferSize) override; + FX_STRSIZE ReadString(wchar_t* pStr, + FX_STRSIZE iMaxLength, + bool* bEOS) override; + void WriteData(const uint8_t* pBuffer, FX_STRSIZE iBufferSize) override {} + void WriteString(const wchar_t* pStr, FX_STRSIZE iLength) override {} private: CFX_RetainPtr<IFX_SeekableReadStream> m_pFileRead; - int32_t m_iPosition; - int32_t m_iLength; + FX_FILESIZE m_iPosition; }; class CFGAS_FileWriteStreamImp : public IFGAS_StreamImp { public: - CFGAS_FileWriteStreamImp(); + CFGAS_FileWriteStreamImp( + const CFX_RetainPtr<IFX_SeekableWriteStream>& pFileWrite); ~CFGAS_FileWriteStreamImp() override {} - bool LoadFileWrite(const CFX_RetainPtr<IFX_SeekableWriteStream>& pFileWrite); - // IFGAS_StreamImp: - int32_t GetLength() const override; - int32_t Seek(FX_STREAMSEEK eSeek, int32_t iOffset) override; - int32_t GetPosition() override { return m_iPosition; } + FX_FILESIZE GetLength() const override; + FX_FILESIZE GetPosition() override { return m_iPosition; } + void Seek(FX_STREAMSEEK eSeek, FX_FILESIZE iOffset) override; bool IsEOF() const override; - int32_t ReadData(uint8_t* pBuffer, int32_t iBufferSize) override { return 0; } - int32_t ReadString(wchar_t* pStr, int32_t iMaxLength, bool& bEOS) override { + FX_STRSIZE ReadData(uint8_t* pBuffer, FX_STRSIZE iBufferSize) override { return 0; } - 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 { return false; } + FX_STRSIZE ReadString(wchar_t* pStr, + FX_STRSIZE iMaxLength, + bool* bEOS) override { + return 0; + } + void WriteData(const uint8_t* pBuffer, FX_STRSIZE iBufferSize) override; + void WriteString(const wchar_t* pStr, FX_STRSIZE iLength) override; private: CFX_RetainPtr<IFX_SeekableWriteStream> m_pFileWrite; - int32_t m_iPosition; + FX_FILESIZE m_iPosition; }; class CFGAS_TextStream : public IFGAS_Stream { @@ -103,19 +98,19 @@ class CFGAS_TextStream : public IFGAS_Stream { friend CFX_RetainPtr<T> pdfium::MakeRetain(Args&&... args); // IFGAS_Stream - int32_t GetLength() const override; - int32_t Seek(FX_STREAMSEEK eSeek, int32_t iOffset) override; - int32_t GetPosition() override; + FX_FILESIZE GetLength() const override; + FX_FILESIZE GetPosition() override; + FX_STRSIZE GetBOMLength() const override; + void Seek(FX_STREAMSEEK eSeek, FX_FILESIZE iOffset) 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 GetBOMLength() const override; + FX_STRSIZE ReadData(uint8_t* pBuffer, FX_STRSIZE iBufferSize) override; + FX_STRSIZE ReadString(wchar_t* pStr, + FX_STRSIZE iMaxLength, + bool* bEOS) override; + void WriteData(const uint8_t* pBuffer, FX_STRSIZE iBufferSize) override; + void WriteString(const wchar_t* pStr, FX_STRSIZE iLength) override; uint16_t GetCodePage() const override; - uint16_t SetCodePage(uint16_t wCodePage) override; + void SetCodePage(uint16_t wCodePage) override; private: CFGAS_TextStream(std::unique_ptr<IFGAS_StreamImp> imp, bool isWriteSteam); @@ -124,7 +119,7 @@ class CFGAS_TextStream : public IFGAS_Stream { void InitStream(); uint16_t m_wCodePage; - int32_t m_wBOMLength; + FX_STRSIZE m_wBOMLength; bool m_IsWriteStream; std::unique_ptr<IFGAS_StreamImp> m_pStreamImp; }; @@ -135,47 +130,148 @@ class CFGAS_WideStringReadStream : public IFGAS_Stream { friend CFX_RetainPtr<T> pdfium::MakeRetain(Args&&... args); // IFGAS_Stream - int32_t GetLength() const override; - int32_t Seek(FX_STREAMSEEK eSeek, int32_t iOffset) override; - int32_t GetPosition() override; + FX_FILESIZE GetLength() const override; + FX_FILESIZE GetPosition() override; + FX_STRSIZE GetBOMLength() const override { return 0; } + void Seek(FX_STREAMSEEK eSeek, FX_FILESIZE iOffset) 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 GetBOMLength() const override; + FX_STRSIZE ReadData(uint8_t* pBuffer, FX_STRSIZE iBufferSize) override { + return 0; + } + FX_STRSIZE ReadString(wchar_t* pStr, + FX_STRSIZE iMaxLength, + bool* bEOS) override; + void WriteData(const uint8_t* pBuffer, FX_STRSIZE iBufferSize) override {} + void WriteString(const wchar_t* pStr, FX_STRSIZE iLength) override {} uint16_t GetCodePage() const override; - uint16_t SetCodePage(uint16_t wCodePage) override; + void SetCodePage(uint16_t wCodePage) override {} private: explicit CFGAS_WideStringReadStream(const CFX_WideString& wsBuffer); ~CFGAS_WideStringReadStream() override; CFX_WideString m_wsBuffer; - int32_t m_iPosition; + FX_FILESIZE m_iPosition; }; -IFGAS_StreamImp::IFGAS_StreamImp() {} +// Returns {src bytes consumed, dst bytes produced}. +std::pair<FX_STRSIZE, FX_STRSIZE> UTF8Decode(const char* pSrc, + FX_STRSIZE srcLen, + wchar_t* pDst, + FX_STRSIZE dstLen) { + ASSERT(pDst && dstLen > 0); + + if (srcLen < 1) + return {0, 0}; + + uint32_t dwCode = 0; + int32_t iPending = 0; + FX_STRSIZE iSrcNum = 0; + FX_STRSIZE iDstNum = 0; + FX_STRSIZE iIndex = 0; + int32_t k = 1; + while (iIndex < srcLen) { + uint8_t byte = static_cast<uint8_t>(*(pSrc + iIndex)); + if (byte < 0x80) { + iPending = 0; + k = 1; + iDstNum++; + iSrcNum += k; + *pDst++ = byte; + if (iDstNum >= dstLen) + break; + } else if (byte < 0xc0) { + if (iPending < 1) + break; + + iPending--; + dwCode |= (byte & 0x3f) << (iPending * 6); + if (iPending == 0) { + iDstNum++; + iSrcNum += k; + *pDst++ = dwCode; + if (iDstNum >= dstLen) + break; + } + } else if (byte < 0xe0) { + iPending = 1; + k = 2; + dwCode = (byte & 0x1f) << 6; + } else if (byte < 0xf0) { + iPending = 2; + k = 3; + dwCode = (byte & 0x0f) << 12; + } else if (byte < 0xf8) { + iPending = 3; + k = 4; + dwCode = (byte & 0x07) << 18; + } else if (byte < 0xfc) { + iPending = 4; + k = 5; + dwCode = (byte & 0x03) << 24; + } else if (byte < 0xfe) { + iPending = 5; + k = 6; + dwCode = (byte & 0x01) << 30; + } else { + break; + } + iIndex++; + } + return {iSrcNum, iDstNum}; +} -CFGAS_FileReadStreamImp::CFGAS_FileReadStreamImp() - : m_pFileRead(nullptr), m_iPosition(0), m_iLength(0) {} +void UTF16ToWChar(void* pBuffer, FX_STRSIZE iLength) { + ASSERT(pBuffer && iLength > 0); -bool CFGAS_FileReadStreamImp::LoadFileRead( - const CFX_RetainPtr<IFX_SeekableReadStream>& pFileRead) { - ASSERT(!m_pFileRead && pFileRead); + if (sizeof(wchar_t) == 2) + return; + + uint16_t* pSrc = static_cast<uint16_t*>(pBuffer); + wchar_t* pDst = static_cast<wchar_t*>(pBuffer); + while (--iLength >= 0) + pDst[iLength] = static_cast<wchar_t>(pSrc[iLength]); +} + +void SwapByteOrder(wchar_t* pStr, FX_STRSIZE iLength) { + ASSERT(pStr); + + if (iLength < 0) + iLength = FXSYS_wcslen(pStr); + + uint16_t wch; + if (sizeof(wchar_t) > 2) { + while (iLength-- > 0) { + wch = static_cast<uint16_t>(*pStr); + wch = (wch >> 8) | (wch << 8); + wch &= 0x00FF; + *pStr = wch; + pStr++; + } + return; + } - m_pFileRead = pFileRead; - m_iLength = m_pFileRead->GetSize(); - return true; + while (iLength-- > 0) { + wch = static_cast<uint16_t>(*pStr); + wch = (wch >> 8) | (wch << 8); + *pStr = wch; + pStr++; + } } -int32_t CFGAS_FileReadStreamImp::GetLength() const { - return m_iLength; +IFGAS_StreamImp::IFGAS_StreamImp() {} + +CFGAS_FileReadStreamImp::CFGAS_FileReadStreamImp( + const CFX_RetainPtr<IFX_SeekableReadStream>& pFileRead) + : m_pFileRead(pFileRead), m_iPosition(0) { + ASSERT(m_pFileRead); } -int32_t CFGAS_FileReadStreamImp::Seek(FX_STREAMSEEK eSeek, int32_t iOffset) { +FX_FILESIZE CFGAS_FileReadStreamImp::GetLength() const { + return m_pFileRead->GetSize(); +} + +void CFGAS_FileReadStreamImp::Seek(FX_STREAMSEEK eSeek, FX_FILESIZE iOffset) { switch (eSeek) { case FX_STREAMSEEK_Begin: m_iPosition = iOffset; @@ -183,71 +279,63 @@ int32_t CFGAS_FileReadStreamImp::Seek(FX_STREAMSEEK eSeek, int32_t iOffset) { case FX_STREAMSEEK_Current: m_iPosition += iOffset; break; - case FX_STREAMSEEK_End: - m_iPosition = m_iLength + iOffset; - break; } - if (m_iPosition < 0) { - m_iPosition = 0; - } else if (m_iPosition >= m_iLength) { - m_iPosition = m_iLength; - } - return m_iPosition; + m_iPosition = pdfium::clamp(m_iPosition, static_cast<FX_FILESIZE>(0), + m_pFileRead->GetSize()); } bool CFGAS_FileReadStreamImp::IsEOF() const { - return m_iPosition >= m_iLength; + return m_iPosition >= m_pFileRead->GetSize(); } -int32_t CFGAS_FileReadStreamImp::ReadData(uint8_t* pBuffer, - int32_t iBufferSize) { - ASSERT(m_pFileRead); + +FX_STRSIZE CFGAS_FileReadStreamImp::ReadData(uint8_t* pBuffer, + FX_STRSIZE iBufferSize) { ASSERT(pBuffer && iBufferSize > 0); - if (iBufferSize > m_iLength - m_iPosition) { - iBufferSize = m_iLength - m_iPosition; - } + + iBufferSize = + std::min(iBufferSize, + static_cast<FX_STRSIZE>(m_pFileRead->GetSize() - m_iPosition)); if (m_pFileRead->ReadBlock(pBuffer, m_iPosition, iBufferSize)) { - m_iPosition += iBufferSize; + pdfium::base::CheckedNumeric<FX_FILESIZE> new_pos = m_iPosition; + new_pos += iBufferSize; + if (!new_pos.IsValid()) + return 0; + + m_iPosition = new_pos.ValueOrDie(); return iBufferSize; } return 0; } -int32_t CFGAS_FileReadStreamImp::ReadString(wchar_t* pStr, - int32_t iMaxLength, - bool& bEOS) { - ASSERT(m_pFileRead); + +FX_STRSIZE CFGAS_FileReadStreamImp::ReadString(wchar_t* pStr, + FX_STRSIZE iMaxLength, + bool* bEOS) { ASSERT(pStr && iMaxLength > 0); - iMaxLength = ReadData((uint8_t*)pStr, iMaxLength * 2) / 2; - if (iMaxLength <= 0) { + + iMaxLength = ReadData(reinterpret_cast<uint8_t*>(pStr), iMaxLength * 2) / 2; + if (iMaxLength <= 0) return 0; - } - int32_t i = 0; - while (i < iMaxLength && pStr[i] != L'\0') { + + FX_STRSIZE i = 0; + while (i < iMaxLength && pStr[i] != L'\0') ++i; - } - bEOS = (m_iPosition >= m_iLength) || pStr[i] == L'\0'; + + *bEOS = m_iPosition >= m_pFileRead->GetSize() || pStr[i] == L'\0'; return i; } -CFGAS_FileWriteStreamImp::CFGAS_FileWriteStreamImp() - : m_pFileWrite(nullptr), m_iPosition(0) {} - -bool CFGAS_FileWriteStreamImp::LoadFileWrite( - const CFX_RetainPtr<IFX_SeekableWriteStream>& pFileWrite) { - ASSERT(!m_pFileWrite && pFileWrite); - - m_iPosition = pFileWrite->GetSize(); - m_pFileWrite = pFileWrite; - return true; +CFGAS_FileWriteStreamImp::CFGAS_FileWriteStreamImp( + const CFX_RetainPtr<IFX_SeekableWriteStream>& pFileWrite) + : m_pFileWrite(pFileWrite), m_iPosition(m_pFileWrite->GetSize()) { + ASSERT(m_pFileWrite); } -int32_t CFGAS_FileWriteStreamImp::GetLength() const { - if (!m_pFileWrite) - return 0; - - return (int32_t)m_pFileWrite->GetSize(); +FX_FILESIZE CFGAS_FileWriteStreamImp::GetLength() const { + return m_pFileWrite->GetSize(); } -int32_t CFGAS_FileWriteStreamImp::Seek(FX_STREAMSEEK eSeek, int32_t iOffset) { - int32_t iLength = GetLength(); + +void CFGAS_FileWriteStreamImp::Seek(FX_STREAMSEEK eSeek, FX_FILESIZE iOffset) { + FX_FILESIZE iLength = GetLength(); switch (eSeek) { case FX_STREAMSEEK_Begin: m_iPosition = iOffset; @@ -255,38 +343,31 @@ int32_t CFGAS_FileWriteStreamImp::Seek(FX_STREAMSEEK eSeek, int32_t iOffset) { case FX_STREAMSEEK_Current: m_iPosition += iOffset; break; - case FX_STREAMSEEK_End: - m_iPosition = iLength + iOffset; - break; - } - if (m_iPosition < 0) { - m_iPosition = 0; - } else if (m_iPosition >= iLength) { - m_iPosition = iLength; } - return m_iPosition; + m_iPosition = + pdfium::clamp(m_iPosition, static_cast<FX_FILESIZE>(0), iLength); } + bool CFGAS_FileWriteStreamImp::IsEOF() const { return m_iPosition >= GetLength(); } -int32_t CFGAS_FileWriteStreamImp::WriteData(const uint8_t* pBuffer, - int32_t iBufferSize) { - if (!m_pFileWrite) { - return 0; - } + +void CFGAS_FileWriteStreamImp::WriteData(const uint8_t* pBuffer, + FX_STRSIZE iBufferSize) { if (m_pFileWrite->WriteBlock(pBuffer, m_iPosition, iBufferSize)) { - m_iPosition += iBufferSize; + pdfium::base::CheckedNumeric<FX_STRSIZE> new_pos = m_iPosition; + new_pos += iBufferSize; + // TODO(dsinclair): Not sure what to do if we over flow .... + if (!new_pos.IsValid()) + return; + + m_iPosition = new_pos.ValueOrDie(); } - return iBufferSize; } -int32_t CFGAS_FileWriteStreamImp::WriteString(const wchar_t* pStr, - int32_t iLength) { - return WriteData((const uint8_t*)pStr, iLength * sizeof(wchar_t)); -} -void CFGAS_FileWriteStreamImp::Flush() { - if (m_pFileWrite) { - m_pFileWrite->Flush(); - } + +void CFGAS_FileWriteStreamImp::WriteString(const wchar_t* pStr, + FX_STRSIZE iLength) { + WriteData(reinterpret_cast<const uint8_t*>(pStr), iLength * sizeof(wchar_t)); } CFGAS_TextStream::CFGAS_TextStream(std::unique_ptr<IFGAS_StreamImp> imp, @@ -316,7 +397,7 @@ CFGAS_TextStream::~CFGAS_TextStream() {} #endif // _FX_ENDIAN_ == _FX_LITTLE_ENDIAN_ void CFGAS_TextStream::InitStream() { - int32_t iPosition = m_pStreamImp->GetPosition(); + FX_FILESIZE iPosition = m_pStreamImp->GetPosition(); m_pStreamImp->Seek(FX_STREAMSEEK_Begin, 0); uint32_t bom; @@ -340,18 +421,20 @@ void CFGAS_TextStream::InitStream() { } } - m_pStreamImp->Seek(FX_STREAMSEEK_Begin, std::max(m_wBOMLength, iPosition)); + m_pStreamImp->Seek( + FX_STREAMSEEK_Begin, + std::max(static_cast<FX_FILESIZE>(m_wBOMLength), iPosition)); } -int32_t CFGAS_TextStream::GetLength() const { +FX_FILESIZE CFGAS_TextStream::GetLength() const { return m_pStreamImp->GetLength(); } -int32_t CFGAS_TextStream::Seek(FX_STREAMSEEK eSeek, int32_t iOffset) { - return m_pStreamImp->Seek(eSeek, iOffset); +void CFGAS_TextStream::Seek(FX_STREAMSEEK eSeek, FX_FILESIZE iOffset) { + m_pStreamImp->Seek(eSeek, iOffset); } -int32_t CFGAS_TextStream::GetPosition() { +FX_FILESIZE CFGAS_TextStream::GetPosition() { return m_pStreamImp->GetPosition(); } @@ -359,42 +442,33 @@ bool CFGAS_TextStream::IsEOF() const { return m_pStreamImp->IsEOF(); } -int32_t CFGAS_TextStream::ReadData(uint8_t* pBuffer, int32_t iBufferSize) { +FX_STRSIZE CFGAS_TextStream::ReadData(uint8_t* pBuffer, + FX_STRSIZE iBufferSize) { ASSERT(pBuffer && iBufferSize > 0); if (m_IsWriteStream) return -1; - int32_t iLen = std::min( - m_pStreamImp->GetLength() - m_pStreamImp->GetPosition(), iBufferSize); + FX_STRSIZE iLen = + std::min(static_cast<FX_STRSIZE>(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) { +void CFGAS_TextStream::WriteData(const uint8_t* pBuffer, + FX_STRSIZE 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); + m_pStreamImp->WriteData(pBuffer, iBufferSize); } -int32_t CFGAS_TextStream::GetBOMLength() const { +FX_STRSIZE CFGAS_TextStream::GetBOMLength() const { if (m_wBOMLength < 1) return 0; return m_wBOMLength; @@ -404,76 +478,78 @@ uint16_t CFGAS_TextStream::GetCodePage() const { return m_wCodePage; } -uint16_t CFGAS_TextStream::SetCodePage(uint16_t wCodePage) { +void CFGAS_TextStream::SetCodePage(uint16_t wCodePage) { if (m_wBOMLength > 0) - return m_wCodePage; + return; - uint16_t v = m_wCodePage; m_wCodePage = wCodePage; - return v; } -int32_t CFGAS_TextStream::ReadString(wchar_t* pStr, - int32_t iMaxLength, - bool& bEOS) { +FX_STRSIZE CFGAS_TextStream::ReadString(wchar_t* pStr, + FX_STRSIZE iMaxLength, + bool* bEOS) { ASSERT(pStr && iMaxLength > 0); + if (m_IsWriteStream) return -1; if (m_wCodePage == FX_CODEPAGE_UTF16LE || m_wCodePage == FX_CODEPAGE_UTF16BE) { - int32_t iBytes = iMaxLength * 2; - int32_t iLen = m_pStreamImp->ReadData((uint8_t*)pStr, iBytes); + FX_FILESIZE iBytes = iMaxLength * 2; + FX_STRSIZE iLen = m_pStreamImp->ReadData((uint8_t*)pStr, iBytes); iMaxLength = iLen / 2; if (sizeof(wchar_t) > 2) - FX_UTF16ToWChar(pStr, iMaxLength); + UTF16ToWChar(pStr, iMaxLength); #if _FX_ENDIAN_ == _FX_BIG_ENDIAN_ if (m_wCodePage == FX_CODEPAGE_UTF16LE) - FX_SwapByteOrder(pStr, iMaxLength); + SwapByteOrder(pStr, iMaxLength); #else if (m_wCodePage == FX_CODEPAGE_UTF16BE) - FX_SwapByteOrder(pStr, iMaxLength); + SwapByteOrder(pStr, iMaxLength); #endif } else { - int32_t pos = m_pStreamImp->GetPosition(); - int32_t iBytes = std::min(iMaxLength, m_pStreamImp->GetLength() - pos); + FX_FILESIZE pos = m_pStreamImp->GetPosition(); + FX_STRSIZE iBytes = std::min( + iMaxLength, static_cast<FX_STRSIZE>(m_pStreamImp->GetLength() - pos)); + if (iBytes > 0) { std::vector<uint8_t> buf(iBytes); - int32_t iLen = m_pStreamImp->ReadData(buf.data(), iBytes); - int32_t iSrc = iLen; - int32_t iDecode = FX_DecodeString( - m_wCodePage, reinterpret_cast<const char*>(buf.data()), &iSrc, pStr, - &iMaxLength, true); - m_pStreamImp->Seek(FX_STREAMSEEK_Current, iSrc - iLen); - if (iDecode < 1) + FX_STRSIZE iLen = m_pStreamImp->ReadData(buf.data(), iBytes); + if (m_wCodePage != FX_CODEPAGE_UTF8) return -1; + + FX_STRSIZE iSrc = 0; + std::tie(iSrc, iMaxLength) = UTF8Decode( + reinterpret_cast<const char*>(buf.data()), iLen, pStr, iMaxLength); + m_pStreamImp->Seek(FX_STREAMSEEK_Current, iSrc - iLen); } else { iMaxLength = 0; } } - bEOS = m_pStreamImp->IsEOF(); + + *bEOS = m_pStreamImp->IsEOF(); return iMaxLength; } -int32_t CFGAS_TextStream::WriteString(const wchar_t* pStr, int32_t iLength) { +void CFGAS_TextStream::WriteString(const wchar_t* pStr, FX_STRSIZE iLength) { ASSERT(pStr && iLength > 0); if (!m_IsWriteStream) - return -1; + return; - if (m_wCodePage == FX_CODEPAGE_UTF8) { - int32_t len = iLength; - CFX_UTF8Encoder encoder; - while (len-- > 0) { - encoder.Input(*pStr++); - } - CFX_ByteStringC bsResult = encoder.GetResult(); - m_pStreamImp->WriteData((const uint8_t*)bsResult.c_str(), - bsResult.GetLength()); - } - return iLength; + if (m_wCodePage != FX_CODEPAGE_UTF8) + return; + + FX_STRSIZE len = iLength; + CFX_UTF8Encoder encoder; + while (len-- > 0) + encoder.Input(*pStr++); + + CFX_ByteStringC bsResult = encoder.GetResult(); + m_pStreamImp->WriteData(reinterpret_cast<const uint8_t*>(bsResult.c_str()), + bsResult.GetLength()); } CFGAS_WideStringReadStream::CFGAS_WideStringReadStream( @@ -482,11 +558,12 @@ CFGAS_WideStringReadStream::CFGAS_WideStringReadStream( CFGAS_WideStringReadStream::~CFGAS_WideStringReadStream() {} -int32_t CFGAS_WideStringReadStream::GetLength() const { +FX_FILESIZE CFGAS_WideStringReadStream::GetLength() const { return m_wsBuffer.GetLength() * sizeof(wchar_t); } -int32_t CFGAS_WideStringReadStream::Seek(FX_STREAMSEEK eSeek, int32_t iOffset) { +void CFGAS_WideStringReadStream::Seek(FX_STREAMSEEK eSeek, + FX_FILESIZE iOffset) { switch (eSeek) { case FX_STREAMSEEK_Begin: m_iPosition = iOffset; @@ -494,15 +571,12 @@ int32_t CFGAS_WideStringReadStream::Seek(FX_STREAMSEEK eSeek, int32_t iOffset) { case FX_STREAMSEEK_Current: m_iPosition += iOffset; break; - case FX_STREAMSEEK_End: - m_iPosition = m_wsBuffer.GetLength() + iOffset; - break; } - m_iPosition = pdfium::clamp(0, m_iPosition, m_wsBuffer.GetLength()); - return GetPosition(); + m_iPosition = pdfium::clamp(m_iPosition, static_cast<FX_FILESIZE>(0), + static_cast<FX_FILESIZE>(m_wsBuffer.GetLength())); } -int32_t CFGAS_WideStringReadStream::GetPosition() { +FX_FILESIZE CFGAS_WideStringReadStream::GetPosition() { return m_iPosition * sizeof(wchar_t); } @@ -510,50 +584,25 @@ bool CFGAS_WideStringReadStream::IsEOF() const { return m_iPosition >= m_wsBuffer.GetLength(); } -int32_t CFGAS_WideStringReadStream::ReadData(uint8_t* pBuffer, - int32_t iBufferSize) { - return 0; -} - -int32_t CFGAS_WideStringReadStream::ReadString(wchar_t* pStr, - int32_t iMaxLength, - bool& bEOS) { - iMaxLength = std::min(iMaxLength, m_wsBuffer.GetLength() - m_iPosition); +FX_STRSIZE CFGAS_WideStringReadStream::ReadString(wchar_t* pStr, + FX_STRSIZE iMaxLength, + bool* bEOS) { + iMaxLength = + std::min(iMaxLength, + static_cast<FX_STRSIZE>(m_wsBuffer.GetLength() - m_iPosition)); if (iMaxLength == 0) return 0; FXSYS_wcsncpy(pStr, m_wsBuffer.c_str() + m_iPosition, iMaxLength); m_iPosition += iMaxLength; - bEOS = IsEOF(); + *bEOS = IsEOF(); return iMaxLength; } -int32_t CFGAS_WideStringReadStream::WriteData(const uint8_t* pBuffer, - int32_t iBufferSize) { - return 0; -} - -int32_t CFGAS_WideStringReadStream::WriteString(const wchar_t* pStr, - int32_t iLength) { - return 0; -} - -bool CFGAS_WideStringReadStream::SetLength(int32_t iLength) { - return false; -} - -int32_t CFGAS_WideStringReadStream::GetBOMLength() const { - return 0; -} - uint16_t CFGAS_WideStringReadStream::GetCodePage() const { return (sizeof(wchar_t) == 2) ? FX_CODEPAGE_UTF16LE : FX_CODEPAGE_UTF32LE; } -uint16_t CFGAS_WideStringReadStream::SetCodePage(uint16_t wCodePage) { - return GetCodePage(); -} - } // namespace // static @@ -562,13 +611,8 @@ CFX_RetainPtr<IFGAS_Stream> IFGAS_Stream::CreateReadStream( if (!pFileRead) return nullptr; - std::unique_ptr<IFGAS_StreamImp> pImp = - pdfium::MakeUnique<CFGAS_FileReadStreamImp>(); - if (!static_cast<CFGAS_FileReadStreamImp*>(pImp.get()) - ->LoadFileRead(pFileRead)) { - return nullptr; - } - return pdfium::MakeRetain<CFGAS_TextStream>(std::move(pImp), false); + return pdfium::MakeRetain<CFGAS_TextStream>( + pdfium::MakeUnique<CFGAS_FileReadStreamImp>(pFileRead), false); } // static @@ -577,13 +621,8 @@ CFX_RetainPtr<IFGAS_Stream> IFGAS_Stream::CreateWriteStream( if (!pFileWrite) return nullptr; - std::unique_ptr<IFGAS_StreamImp> pImp = - pdfium::MakeUnique<CFGAS_FileWriteStreamImp>(); - if (!static_cast<CFGAS_FileWriteStreamImp*>(pImp.get()) - ->LoadFileWrite(pFileWrite)) { - return nullptr; - } - return pdfium::MakeRetain<CFGAS_TextStream>(std::move(pImp), true); + return pdfium::MakeRetain<CFGAS_TextStream>( + pdfium::MakeUnique<CFGAS_FileWriteStreamImp>(pFileWrite), true); } // static diff --git a/xfa/fgas/crt/ifgas_stream.h b/xfa/fgas/crt/ifgas_stream.h index b3f8a928d8..658afe73bf 100644 --- a/xfa/fgas/crt/ifgas_stream.h +++ b/xfa/fgas/crt/ifgas_stream.h @@ -14,7 +14,6 @@ enum FX_STREAMSEEK { FX_STREAMSEEK_Begin = 0, FX_STREAMSEEK_Current, - FX_STREAMSEEK_End, }; class IFGAS_Stream : public CFX_Retainable { @@ -26,19 +25,24 @@ class IFGAS_Stream : public CFX_Retainable { static CFX_RetainPtr<IFGAS_Stream> CreateWideStringReadStream( const CFX_WideString& buffer); - virtual int32_t GetLength() const = 0; - virtual int32_t Seek(FX_STREAMSEEK eSeek, int32_t iOffset) = 0; - virtual int32_t GetPosition() = 0; - virtual bool IsEOF() const = 0; - virtual int32_t ReadData(uint8_t* pBuffer, int32_t iBufferSize) = 0; - virtual int32_t ReadString(wchar_t* pStr, int32_t iMaxLength, bool& bEOS) = 0; - virtual int32_t WriteData(const uint8_t* pBuffer, int32_t iBufferSize) = 0; - 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 GetBOMLength() const = 0; + virtual FX_FILESIZE GetLength() const = 0; + virtual FX_FILESIZE GetPosition() = 0; + virtual FX_STRSIZE GetBOMLength() const = 0; + + virtual void Seek(FX_STREAMSEEK eSeek, FX_FILESIZE iOffset) = 0; + + virtual FX_STRSIZE ReadString(wchar_t* pStr, + FX_STRSIZE iMaxLength, + bool* bEOS) = 0; + virtual void WriteData(const uint8_t* pBuffer, FX_STRSIZE iBufferSize) = 0; + virtual void WriteString(const wchar_t* pStr, FX_STRSIZE iLength) = 0; + virtual uint16_t GetCodePage() const = 0; - virtual uint16_t SetCodePage(uint16_t wCodePage) = 0; + virtual void SetCodePage(uint16_t wCodePage) = 0; + + protected: + virtual bool IsEOF() const = 0; + virtual FX_STRSIZE ReadData(uint8_t* pBuffer, FX_STRSIZE iBufferSize) = 0; }; #endif // XFA_FGAS_CRT_IFGAS_STREAM_H_ |