Index: core/fpdfapi/parser/cpdf_parser.cpp |
diff --git a/core/fpdfapi/parser/cpdf_parser.cpp b/core/fpdfapi/parser/cpdf_parser.cpp |
index 1fae0d641c161529d157db2d6227dea63e822f41..47c5c4eab43080c9ef445b3c02820c1ca13eb0f9 100644 |
--- a/core/fpdfapi/parser/cpdf_parser.cpp |
+++ b/core/fpdfapi/parser/cpdf_parser.cpp |
@@ -52,7 +52,6 @@ int32_t GetStreamFirst(CPDF_StreamAcc* pObjStream) { |
CPDF_Parser::CPDF_Parser() |
: m_pDocument(nullptr), |
m_bHasParsed(false), |
- m_bOwnFileRead(true), |
m_bXRefStream(false), |
m_bVersionUpdated(false), |
m_FileVersion(0), |
@@ -64,11 +63,6 @@ CPDF_Parser::CPDF_Parser() |
CPDF_Parser::~CPDF_Parser() { |
ReleaseEncryptHandler(); |
SetEncryptDictionary(nullptr); |
- |
- if (m_bOwnFileRead && m_pSyntax->m_pFileAccess) { |
- m_pSyntax->m_pFileAccess->Release(); |
- m_pSyntax->m_pFileAccess = nullptr; |
- } |
} |
uint32_t CPDF_Parser::GetLastObjNum() const { |
@@ -109,7 +103,7 @@ CPDF_CryptoHandler* CPDF_Parser::GetCryptoHandler() { |
return m_pSyntax->m_pCryptoHandler.get(); |
} |
-IFX_SeekableReadStream* CPDF_Parser::GetFileAccess() const { |
+CFX_RetainPtr<IFX_SeekableReadStream> CPDF_Parser::GetFileAccess() const { |
return m_pSyntax->m_pFileAccess; |
} |
@@ -129,31 +123,30 @@ void CPDF_Parser::ShrinkObjectMap(uint32_t objnum) { |
m_ObjectInfo[objnum - 1].pos = 0; |
} |
-CPDF_Parser::Error CPDF_Parser::StartParse(IFX_SeekableReadStream* pFileAccess, |
- CPDF_Document* pDocument) { |
+CPDF_Parser::Error CPDF_Parser::StartParse( |
+ const CFX_RetainPtr<IFX_SeekableReadStream>& pFileAccess, |
+ CPDF_Document* pDocument) { |
ASSERT(!m_bHasParsed); |
m_bHasParsed = true; |
- |
m_bXRefStream = false; |
m_LastXRefOffset = 0; |
- m_bOwnFileRead = true; |
int32_t offset = GetHeaderOffset(pFileAccess); |
- if (offset == -1) { |
- if (pFileAccess) |
- pFileAccess->Release(); |
+ if (offset == -1) |
return FORMAT_ERROR; |
- } |
+ |
m_pSyntax->InitParser(pFileAccess, offset); |
uint8_t ch; |
if (!m_pSyntax->GetCharAt(5, ch)) |
return FORMAT_ERROR; |
+ |
if (std::isdigit(ch)) |
m_FileVersion = FXSYS_toDecimalDigit(static_cast<FX_WCHAR>(ch)) * 10; |
if (!m_pSyntax->GetCharAt(7, ch)) |
return FORMAT_ERROR; |
+ |
if (std::isdigit(ch)) |
m_FileVersion += FXSYS_toDecimalDigit(static_cast<FX_WCHAR>(ch)); |
@@ -1124,10 +1117,10 @@ std::unique_ptr<CPDF_Object> CPDF_Parser::ParseIndirectObject( |
if (!pObjStream) |
return nullptr; |
- ScopedFileStream file(IFX_MemoryStream::Create( |
- (uint8_t*)pObjStream->GetData(), (size_t)pObjStream->GetSize(), false)); |
+ CFX_RetainPtr<IFX_MemoryStream> file = IFX_MemoryStream::Create( |
+ (uint8_t*)pObjStream->GetData(), (size_t)pObjStream->GetSize(), false); |
CPDF_SyntaxParser syntax; |
- syntax.InitParser(file.get(), 0); |
+ syntax.InitParser(file, 0); |
const int32_t offset = GetStreamFirst(pObjStream); |
// Read object numbers from |pObjStream| into a cache. |
@@ -1203,11 +1196,11 @@ void CPDF_Parser::GetIndirectBinary(uint32_t objnum, |
int32_t offset = GetStreamFirst(pObjStream); |
const uint8_t* pData = pObjStream->GetData(); |
uint32_t totalsize = pObjStream->GetSize(); |
- ScopedFileStream file( |
- IFX_MemoryStream::Create((uint8_t*)pData, (size_t)totalsize, false)); |
- |
+ CFX_RetainPtr<IFX_MemoryStream> file = |
+ IFX_MemoryStream::Create((uint8_t*)pData, (size_t)totalsize, false); |
CPDF_SyntaxParser syntax; |
- syntax.InitParser(file.get(), 0); |
+ syntax.InitParser(file, 0); |
+ |
for (int i = GetStreamNCount(pObjStream); i > 0; --i) { |
uint32_t thisnum = syntax.GetDirectNum(); |
uint32_t thisoff = syntax.GetDirectNum(); |
@@ -1420,8 +1413,9 @@ uint32_t CPDF_Parser::GetPermissions() const { |
return dwPermission; |
} |
-bool CPDF_Parser::IsLinearizedFile(IFX_SeekableReadStream* pFileAccess, |
- uint32_t offset) { |
+bool CPDF_Parser::IsLinearizedFile( |
+ const CFX_RetainPtr<IFX_SeekableReadStream>& pFileAccess, |
+ uint32_t offset) { |
m_pSyntax->InitParser(pFileAccess, offset); |
m_pSyntax->RestorePos(m_pSyntax->m_HeaderOffset + 9); |
@@ -1454,13 +1448,11 @@ bool CPDF_Parser::IsLinearizedFile(IFX_SeekableReadStream* pFileAccess, |
} |
CPDF_Parser::Error CPDF_Parser::StartLinearizedParse( |
- IFX_SeekableReadStream* pFileAccess, |
+ const CFX_RetainPtr<IFX_SeekableReadStream>& pFileAccess, |
CPDF_Document* pDocument) { |
ASSERT(!m_bHasParsed); |
- |
m_bXRefStream = false; |
m_LastXRefOffset = 0; |
- m_bOwnFileRead = true; |
int32_t offset = GetHeaderOffset(pFileAccess); |
if (offset == -1) |
@@ -1474,7 +1466,6 @@ CPDF_Parser::Error CPDF_Parser::StartLinearizedParse( |
m_pDocument = pDocument; |
FX_FILESIZE dwFirstXRefOffset = m_pSyntax->SavePos(); |
- |
bool bXRefRebuilt = false; |
bool bLoadV4 = LoadCrossRefV4(dwFirstXRefOffset, 0, false); |
if (!bLoadV4 && !LoadCrossRefV5(&dwFirstXRefOffset, true)) { |