From 857231a0723c0bf74ea6c13f1c3ce56548e23303 Mon Sep 17 00:00:00 2001 From: dsinclair Date: Mon, 23 Apr 2018 18:34:57 +0000 Subject: Revert "Make CFX_SeekableStreamProxy a subclass of IFX_SeekableReadStream" This reverts commit c6077a0164340fa084be03eb059d608bc2675b2b. Reason for revert: Gerrit did not do what i expected. Original change's description: > Make CFX_SeekableStreamProxy a subclass of IFX_SeekableReadStream > > This CL changes CFX_SeekableStreamProxy to be an IFX_SeekableReadStream > subclass. > > Change-Id: I28ccb4771606fd6c9cc60e57297ae2e776fc5a9f > Reviewed-on: https://pdfium-review.googlesource.com/30879 > Commit-Queue: dsinclair > Reviewed-by: Tom Sepez TBR=tsepez@chromium.org,dsinclair@chromium.org,hnakashima@chromium.org Change-Id: I65e7647221e9bad2c0db7d068638178996972437 No-Presubmit: true No-Tree-Checks: true No-Try: true Reviewed-on: https://pdfium-review.googlesource.com/31210 Reviewed-by: dsinclair Commit-Queue: dsinclair --- core/fxcrt/cfx_seekablestreamproxy.cpp | 54 ++++++++++++---------------------- core/fxcrt/cfx_seekablestreamproxy.h | 19 ++++++------ core/fxcrt/xml/cfx_xmlparser.cpp | 35 +++++++++++++++------- core/fxcrt/xml/cfx_xmlparser.h | 9 ++++-- 4 files changed, 59 insertions(+), 58 deletions(-) diff --git a/core/fxcrt/cfx_seekablestreamproxy.cpp b/core/fxcrt/cfx_seekablestreamproxy.cpp index eb5874b7a2..d8fe4f4832 100644 --- a/core/fxcrt/cfx_seekablestreamproxy.cpp +++ b/core/fxcrt/cfx_seekablestreamproxy.cpp @@ -134,7 +134,7 @@ void SwapByteOrder(wchar_t* pStr, size_t iLength) { #define BOM_UTF16_LE 0x0000FEFF CFX_SeekableStreamProxy::CFX_SeekableStreamProxy( - const RetainPtr& stream) + const RetainPtr& stream) : m_wCodePage(FX_CODEPAGE_DefANSI), m_wBOMLength(0), m_iPosition(0), @@ -169,18 +169,6 @@ CFX_SeekableStreamProxy::CFX_SeekableStreamProxy( CFX_SeekableStreamProxy::~CFX_SeekableStreamProxy() = default; -FX_FILESIZE CFX_SeekableStreamProxy::GetSize() { - return m_pStream->GetSize(); -} - -FX_FILESIZE CFX_SeekableStreamProxy::GetPosition() { - return m_iPosition; -} - -bool CFX_SeekableStreamProxy::IsEOF() { - return m_iPosition >= GetSize(); -} - void CFX_SeekableStreamProxy::Seek(From eSeek, FX_FILESIZE iOffset) { switch (eSeek) { case From::Begin: @@ -194,7 +182,7 @@ void CFX_SeekableStreamProxy::Seek(From eSeek, FX_FILESIZE iOffset) { } break; } m_iPosition = - pdfium::clamp(m_iPosition, static_cast(0), GetSize()); + pdfium::clamp(m_iPosition, static_cast(0), GetLength()); } void CFX_SeekableStreamProxy::SetCodePage(uint16_t wCodePage) { @@ -207,7 +195,7 @@ size_t CFX_SeekableStreamProxy::ReadData(uint8_t* pBuffer, size_t iBufferSize) { ASSERT(pBuffer && iBufferSize > 0); iBufferSize = - std::min(iBufferSize, static_cast(GetSize() - m_iPosition)); + std::min(iBufferSize, static_cast(GetLength() - m_iPosition)); if (iBufferSize <= 0) return 0; @@ -220,24 +208,27 @@ size_t CFX_SeekableStreamProxy::ReadData(uint8_t* pBuffer, size_t iBufferSize) { return new_pos.IsValid() ? iBufferSize : 0; } -size_t CFX_SeekableStreamProxy::ReadBlock(void* pStr, size_t size) { - if (!pStr || size == 0) +size_t CFX_SeekableStreamProxy::ReadString(wchar_t* pStr, + size_t iMaxLength, + bool* bEOS) { + if (!pStr || iMaxLength == 0) return 0; if (m_wCodePage == FX_CODEPAGE_UTF16LE || m_wCodePage == FX_CODEPAGE_UTF16BE) { - size_t iBytes = size * 2; + size_t iBytes = iMaxLength * 2; size_t iLen = ReadData(reinterpret_cast(pStr), iBytes); - size = iLen / 2; - if (sizeof(wchar_t) > 2 && size > 0) - UTF16ToWChar(pStr, size); + iMaxLength = iLen / 2; + if (sizeof(wchar_t) > 2 && iMaxLength > 0) + UTF16ToWChar(pStr, iMaxLength); if (m_wCodePage == FX_CODEPAGE_UTF16BE) - SwapByteOrder(static_cast(pStr), size); + SwapByteOrder(pStr, iMaxLength); } else { FX_FILESIZE pos = GetPosition(); - size_t iBytes = std::min(size, static_cast(GetSize() - pos)); + size_t iBytes = + std::min(iMaxLength, static_cast(GetLength() - pos)); if (iBytes > 0) { std::vector buf(iBytes); @@ -247,21 +238,14 @@ size_t CFX_SeekableStreamProxy::ReadBlock(void* pStr, size_t size) { return 0; size_t iSrc = 0; - std::tie(iSrc, size) = - UTF8Decode(reinterpret_cast(buf.data()), iLen, - static_cast(pStr), size); + std::tie(iSrc, iMaxLength) = UTF8Decode( + reinterpret_cast(buf.data()), iLen, pStr, iMaxLength); Seek(From::Current, iSrc - iLen); } else { - size = 0; + iMaxLength = 0; } } - return size; -} - -bool CFX_SeekableStreamProxy::ReadBlock(void* pStr, - FX_FILESIZE offset, - size_t size) { - NOTREACHED(); - return false; + *bEOS = IsEOF(); + return iMaxLength; } diff --git a/core/fxcrt/cfx_seekablestreamproxy.h b/core/fxcrt/cfx_seekablestreamproxy.h index d389baf13f..5e0eecb87b 100644 --- a/core/fxcrt/cfx_seekablestreamproxy.h +++ b/core/fxcrt/cfx_seekablestreamproxy.h @@ -13,7 +13,7 @@ #include "core/fxcrt/fx_system.h" #include "core/fxcrt/retain_ptr.h" -class CFX_SeekableStreamProxy : public IFX_SeekableReadStream { +class CFX_SeekableStreamProxy : public Retainable { public: enum class From { Begin = 0, @@ -23,28 +23,27 @@ class CFX_SeekableStreamProxy : public IFX_SeekableReadStream { template friend RetainPtr pdfium::MakeRetain(Args&&... args); - FX_FILESIZE GetSize() override; - FX_FILESIZE GetPosition() override; - bool IsEOF() override; + FX_FILESIZE GetLength() const { return m_pStream->GetSize(); } + FX_FILESIZE GetPosition() { return m_iPosition; } + size_t GetBOMLength() const { return m_wBOMLength; } + bool IsEOF() const { return m_iPosition >= GetLength(); } - size_t ReadBlock(void* pStr, size_t size) override; - bool ReadBlock(void* pStr, FX_FILESIZE offset, size_t size) override; + void Seek(From eSeek, FX_FILESIZE iOffset); + size_t ReadString(wchar_t* pStr, size_t iMaxLength, bool* bEOS); uint16_t GetCodePage() const { return m_wCodePage; } void SetCodePage(uint16_t wCodePage); private: - explicit CFX_SeekableStreamProxy( - const RetainPtr& stream); + explicit CFX_SeekableStreamProxy(const RetainPtr& stream); ~CFX_SeekableStreamProxy() override; - void Seek(From eSeek, FX_FILESIZE iOffset); size_t ReadData(uint8_t* pBuffer, size_t iBufferSize); uint16_t m_wCodePage; size_t m_wBOMLength; FX_FILESIZE m_iPosition; - RetainPtr m_pStream; + RetainPtr m_pStream; }; #endif // CORE_FXCRT_CFX_SEEKABLESTREAMPROXY_H_ diff --git a/core/fxcrt/xml/cfx_xmlparser.cpp b/core/fxcrt/xml/cfx_xmlparser.cpp index bf578291e6..7788a42907 100644 --- a/core/fxcrt/xml/cfx_xmlparser.cpp +++ b/core/fxcrt/xml/cfx_xmlparser.cpp @@ -11,7 +11,6 @@ #include #include -#include "core/fxcrt/cfx_seekablestreamproxy.h" #include "core/fxcrt/fx_codepage.h" #include "core/fxcrt/fx_extension.h" #include "core/fxcrt/fx_safe_types.h" @@ -58,10 +57,13 @@ bool CFX_XMLParser::IsXMLNameChar(wchar_t ch, bool bFirstChar) { } CFX_XMLParser::CFX_XMLParser(CFX_XMLNode* pParent, - const RetainPtr& pStream) + const RetainPtr& pStream) : m_pParent(pParent), m_pChild(nullptr), + m_pStream(pdfium::MakeRetain(pStream)), m_iXMLPlaneSize(1024), + m_iCurrentPos(0), + m_bEOS(false), m_Start(0), m_End(0), m_CurNodeType(FX_XMLNODE_Unknown), @@ -75,19 +77,18 @@ CFX_XMLParser::CFX_XMLParser(CFX_XMLNode* pParent, ASSERT(m_pParent); ASSERT(pStream); - auto proxy = pdfium::MakeRetain(pStream); - uint16_t wCodePage = proxy->GetCodePage(); + uint16_t wCodePage = m_pStream->GetCodePage(); if (wCodePage != FX_CODEPAGE_UTF16LE && wCodePage != FX_CODEPAGE_UTF16BE && wCodePage != FX_CODEPAGE_UTF8) { - proxy->SetCodePage(FX_CODEPAGE_UTF8); + m_pStream->SetCodePage(FX_CODEPAGE_UTF8); } - m_pStream = proxy; m_NodeStack.push(m_pParent); m_iXMLPlaneSize = std::min(m_iXMLPlaneSize, - pdfium::base::checked_cast(m_pStream->GetSize())); + pdfium::base::checked_cast(m_pStream->GetLength())); + m_iCurrentPos = m_pStream->GetBOMLength(); FX_SAFE_SIZE_T alloc_size_safe = m_iXMLPlaneSize; alloc_size_safe += 1; // For NUL. @@ -216,20 +217,28 @@ FX_XmlSyntaxResult CFX_XMLParser::DoSyntaxParse() { return m_syntaxParserResult; } + FX_FILESIZE iStreamLength = m_pStream->GetLength(); + FX_FILESIZE iPos; + FX_XmlSyntaxResult syntaxParserResult = FX_XmlSyntaxResult::None; while (true) { if (m_Start >= m_End) { - if (m_pStream->IsEOF()) { + if (m_bEOS || m_iCurrentPos >= iStreamLength) { m_syntaxParserResult = FX_XmlSyntaxResult::EndOfString; return m_syntaxParserResult; } + if (m_pStream->GetPosition() != m_iCurrentPos) + m_pStream->Seek(CFX_SeekableStreamProxy::From::Begin, m_iCurrentPos); size_t buffer_chars = - m_pStream->ReadBlock(m_Buffer.data(), m_iXMLPlaneSize); + m_pStream->ReadString(m_Buffer.data(), m_iXMLPlaneSize, &m_bEOS); + iPos = m_pStream->GetPosition(); if (buffer_chars == 0) { + m_iCurrentPos = iStreamLength; m_syntaxParserResult = FX_XmlSyntaxResult::EndOfString; return m_syntaxParserResult; } + m_iCurrentPos = iPos; m_Start = 0; m_End = buffer_chars; } @@ -656,7 +665,13 @@ FX_XmlSyntaxResult CFX_XMLParser::DoSyntaxParse() { } bool CFX_XMLParser::GetStatus() const { - return m_pStream && m_syntaxParserResult != FX_XmlSyntaxResult::Error; + if (!m_pStream) + return false; + + int32_t iStreamLength = m_pStream->GetLength(); + if (iStreamLength < 1) + return true; + return m_syntaxParserResult != FX_XmlSyntaxResult::Error; } void CFX_XMLParser::ParseTextChar(wchar_t character) { diff --git a/core/fxcrt/xml/cfx_xmlparser.h b/core/fxcrt/xml/cfx_xmlparser.h index 6405b61a64..f369453de1 100644 --- a/core/fxcrt/xml/cfx_xmlparser.h +++ b/core/fxcrt/xml/cfx_xmlparser.h @@ -12,13 +12,14 @@ #include #include "core/fxcrt/cfx_blockbuffer.h" +#include "core/fxcrt/cfx_seekablestreamproxy.h" #include "core/fxcrt/fx_string.h" #include "core/fxcrt/retain_ptr.h" #include "core/fxcrt/xml/cfx_xmlnode.h" class CFX_XMLElement; class CFX_XMLNode; -class IFX_SeekableReadStream; +class IFX_SeekableStream; enum class FX_XmlSyntaxResult { None, @@ -43,7 +44,7 @@ class CFX_XMLParser { static bool IsXMLNameChar(wchar_t ch, bool bFirstChar); CFX_XMLParser(CFX_XMLNode* pParent, - const RetainPtr& pStream); + const RetainPtr& pStream); virtual ~CFX_XMLParser(); bool Parse(); @@ -99,9 +100,11 @@ class CFX_XMLParser { std::stack m_NodeStack; WideString m_ws1; - RetainPtr m_pStream; + RetainPtr m_pStream; size_t m_iXMLPlaneSize; + FX_FILESIZE m_iCurrentPos; std::vector m_Buffer; + bool m_bEOS; FX_FILESIZE m_Start; // Start position in m_Buffer FX_FILESIZE m_End; // End position in m_Buffer FX_XMLNODETYPE m_CurNodeType; -- cgit v1.2.3