diff options
Diffstat (limited to 'core/fxcrt/xml/cfx_xmlparser.cpp')
-rw-r--r-- | core/fxcrt/xml/cfx_xmlparser.cpp | 35 |
1 files changed, 10 insertions, 25 deletions
diff --git a/core/fxcrt/xml/cfx_xmlparser.cpp b/core/fxcrt/xml/cfx_xmlparser.cpp index 7788a42907..bf578291e6 100644 --- a/core/fxcrt/xml/cfx_xmlparser.cpp +++ b/core/fxcrt/xml/cfx_xmlparser.cpp @@ -11,6 +11,7 @@ #include <iterator> #include <utility> +#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" @@ -57,13 +58,10 @@ bool CFX_XMLParser::IsXMLNameChar(wchar_t ch, bool bFirstChar) { } CFX_XMLParser::CFX_XMLParser(CFX_XMLNode* pParent, - const RetainPtr<IFX_SeekableStream>& pStream) + const RetainPtr<IFX_SeekableReadStream>& pStream) : m_pParent(pParent), m_pChild(nullptr), - m_pStream(pdfium::MakeRetain<CFX_SeekableStreamProxy>(pStream)), m_iXMLPlaneSize(1024), - m_iCurrentPos(0), - m_bEOS(false), m_Start(0), m_End(0), m_CurNodeType(FX_XMLNODE_Unknown), @@ -77,18 +75,19 @@ CFX_XMLParser::CFX_XMLParser(CFX_XMLNode* pParent, ASSERT(m_pParent); ASSERT(pStream); - uint16_t wCodePage = m_pStream->GetCodePage(); + auto proxy = pdfium::MakeRetain<CFX_SeekableStreamProxy>(pStream); + uint16_t wCodePage = proxy->GetCodePage(); if (wCodePage != FX_CODEPAGE_UTF16LE && wCodePage != FX_CODEPAGE_UTF16BE && wCodePage != FX_CODEPAGE_UTF8) { - m_pStream->SetCodePage(FX_CODEPAGE_UTF8); + proxy->SetCodePage(FX_CODEPAGE_UTF8); } + m_pStream = proxy; m_NodeStack.push(m_pParent); m_iXMLPlaneSize = std::min(m_iXMLPlaneSize, - pdfium::base::checked_cast<size_t>(m_pStream->GetLength())); - m_iCurrentPos = m_pStream->GetBOMLength(); + pdfium::base::checked_cast<size_t>(m_pStream->GetSize())); FX_SAFE_SIZE_T alloc_size_safe = m_iXMLPlaneSize; alloc_size_safe += 1; // For NUL. @@ -217,28 +216,20 @@ 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_bEOS || m_iCurrentPos >= iStreamLength) { + if (m_pStream->IsEOF()) { 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->ReadString(m_Buffer.data(), m_iXMLPlaneSize, &m_bEOS); - iPos = m_pStream->GetPosition(); + m_pStream->ReadBlock(m_Buffer.data(), m_iXMLPlaneSize); 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; } @@ -665,13 +656,7 @@ FX_XmlSyntaxResult CFX_XMLParser::DoSyntaxParse() { } bool CFX_XMLParser::GetStatus() const { - if (!m_pStream) - return false; - - int32_t iStreamLength = m_pStream->GetLength(); - if (iStreamLength < 1) - return true; - return m_syntaxParserResult != FX_XmlSyntaxResult::Error; + return m_pStream && m_syntaxParserResult != FX_XmlSyntaxResult::Error; } void CFX_XMLParser::ParseTextChar(wchar_t character) { |