Index: core/src/fpdfapi/fpdf_parser/fpdf_parser_objects.cpp |
diff --git a/core/src/fpdfapi/fpdf_parser/fpdf_parser_objects.cpp b/core/src/fpdfapi/fpdf_parser/fpdf_parser_objects.cpp |
index c36e1466a2d79194dd5ca5beb6cc70365984e92c..990bf5f0e2cfeaf99dee194726a8c246cc3c44ca 100644 |
--- a/core/src/fpdfapi/fpdf_parser/fpdf_parser_objects.cpp |
+++ b/core/src/fpdfapi/fpdf_parser/fpdf_parser_objects.cpp |
@@ -8,6 +8,12 @@ |
#include "core/include/fxcrt/fx_string.h" |
+namespace { |
+ |
+const FX_DWORD kBlockSize = 1024; |
+ |
+} // namespace |
+ |
// static |
int CPDF_Object::s_nCurRefDepth = 0; |
@@ -816,41 +822,38 @@ void CPDF_Dictionary::SetAtMatrix(const CFX_ByteStringC& key, |
SetAt(key, pArray); |
} |
CPDF_Stream::CPDF_Stream(uint8_t* pData, FX_DWORD size, CPDF_Dictionary* pDict) |
- : CPDF_Object(PDFOBJ_STREAM) { |
- m_pDict = pDict; |
- m_dwSize = size; |
- m_GenNum = (FX_DWORD)-1; |
- m_pDataBuf = pData; |
- m_pCryptoHandler = NULL; |
-} |
+ : CPDF_Object(PDFOBJ_STREAM), |
+ m_pDict(pDict), |
+ m_dwSize(size), |
+ m_GenNum(kMemoryBasedGenNum), |
+ m_pDataBuf(pData) {} |
+ |
CPDF_Stream::~CPDF_Stream() { |
- if (m_GenNum == (FX_DWORD)-1) { |
+ if (IsMemoryBased()) |
FX_Free(m_pDataBuf); |
- } |
- if (m_pDict) { |
+ |
+ if (m_pDict) |
m_pDict->Release(); |
- } |
} |
-void CPDF_Stream::InitStream(CPDF_Dictionary* pDict) { |
+ |
+void CPDF_Stream::InitStreamInternal(CPDF_Dictionary* pDict) { |
if (pDict) { |
- if (m_pDict) { |
+ if (m_pDict) |
m_pDict->Release(); |
- } |
m_pDict = pDict; |
} |
- if (m_GenNum == (FX_DWORD)-1) { |
+ if (IsMemoryBased()) |
FX_Free(m_pDataBuf); |
- } |
+ |
m_GenNum = 0; |
- m_pFile = NULL; |
- m_pCryptoHandler = NULL; |
- m_FileOffset = 0; |
+ m_pFile = nullptr; |
} |
+ |
void CPDF_Stream::InitStream(uint8_t* pData, |
FX_DWORD size, |
CPDF_Dictionary* pDict) { |
- InitStream(pDict); |
- m_GenNum = (FX_DWORD)-1; |
+ InitStreamInternal(pDict); |
+ m_GenNum = kMemoryBasedGenNum; |
m_pDataBuf = FX_Alloc(uint8_t, size); |
if (pData) { |
FXSYS_memcpy(m_pDataBuf, pData, size); |
@@ -864,12 +867,10 @@ void CPDF_Stream::SetData(const uint8_t* pData, |
FX_DWORD size, |
FX_BOOL bCompressed, |
FX_BOOL bKeepBuf) { |
- if (m_GenNum == (FX_DWORD)-1) { |
+ if (IsMemoryBased()) |
FX_Free(m_pDataBuf); |
- } else { |
- m_GenNum = (FX_DWORD)-1; |
- m_pCryptoHandler = NULL; |
- } |
+ m_GenNum = kMemoryBasedGenNum; |
+ |
if (bKeepBuf) { |
m_pDataBuf = (uint8_t*)pData; |
} else { |
@@ -879,9 +880,8 @@ void CPDF_Stream::SetData(const uint8_t* pData, |
} |
} |
m_dwSize = size; |
- if (m_pDict == NULL) { |
+ if (!m_pDict) |
m_pDict = new CPDF_Dictionary; |
- } |
m_pDict->SetAtInteger(FX_BSTRC("Length"), size); |
if (!bCompressed) { |
m_pDict->RemoveAt(FX_BSTRC("Filter")); |
@@ -891,16 +891,16 @@ void CPDF_Stream::SetData(const uint8_t* pData, |
FX_BOOL CPDF_Stream::ReadRawData(FX_FILESIZE offset, |
uint8_t* buf, |
FX_DWORD size) const { |
- if ((m_GenNum != (FX_DWORD)-1) && m_pFile) { |
- return m_pFile->ReadBlock(buf, m_FileOffset + offset, size); |
- } |
- if (m_pDataBuf) { |
+ if (!IsMemoryBased() && m_pFile) |
+ return m_pFile->ReadBlock(buf, offset, size); |
+ |
+ if (m_pDataBuf) |
FXSYS_memcpy(buf, m_pDataBuf + offset, size); |
- } |
return TRUE; |
} |
-void CPDF_Stream::InitStream(IFX_FileRead* pFile, CPDF_Dictionary* pDict) { |
- InitStream(pDict); |
+void CPDF_Stream::InitStreamFromFile(IFX_FileRead* pFile, |
+ CPDF_Dictionary* pDict) { |
+ InitStreamInternal(pDict); |
m_pFile = pFile; |
m_dwSize = (FX_DWORD)pFile->GetSize(); |
if (m_pDict) { |
@@ -910,66 +910,63 @@ void CPDF_Stream::InitStream(IFX_FileRead* pFile, CPDF_Dictionary* pDict) { |
FX_BOOL CPDF_Stream::Identical(CPDF_Stream* pOther) const { |
if (!m_pDict) |
- return pOther->m_pDict ? FALSE : TRUE; |
+ return !pOther->m_pDict; |
- if (!m_pDict->Identical(pOther->m_pDict)) { |
+ if (!m_pDict->Identical(pOther->m_pDict)) |
return FALSE; |
- } |
- if (m_dwSize != pOther->m_dwSize) { |
+ |
+ if (m_dwSize != pOther->m_dwSize) |
return FALSE; |
- } |
- if (m_GenNum != (FX_DWORD)-1 && pOther->m_GenNum != (FX_DWORD)-1) { |
- if (m_pFile == pOther->m_pFile && m_pFile == NULL) { |
+ |
+ if (!IsMemoryBased() && !pOther->IsMemoryBased()) { |
+ if (m_pFile == pOther->m_pFile && !m_pFile) |
return TRUE; |
- } |
- if (!m_pFile || !pOther->m_pFile) { |
+ |
+ if (!m_pFile || !pOther->m_pFile) |
return FALSE; |
- } |
- uint8_t srcBuf[1024]; |
- uint8_t destBuf[1024]; |
+ |
+ uint8_t srcBuf[kBlockSize]; |
+ uint8_t destBuf[kBlockSize]; |
FX_DWORD size = m_dwSize; |
- FX_DWORD srcOffset = m_FileOffset; |
- FX_DWORD destOffset = pOther->m_FileOffset; |
- if (m_pFile == pOther->m_pFile && srcOffset == destOffset) { |
+ if (m_pFile == pOther->m_pFile) |
return TRUE; |
- } |
+ |
+ FX_DWORD offset = 0; |
while (size > 0) { |
- FX_DWORD actualSize = size > 1024 ? 1024 : size; |
- m_pFile->ReadBlock(srcBuf, srcOffset, actualSize); |
- pOther->m_pFile->ReadBlock(destBuf, destOffset, actualSize); |
- if (FXSYS_memcmp(srcBuf, destBuf, actualSize) != 0) { |
+ FX_DWORD actualSize = std::min(size, kBlockSize); |
+ m_pFile->ReadBlock(srcBuf, offset, actualSize); |
+ pOther->m_pFile->ReadBlock(destBuf, offset, actualSize); |
+ if (FXSYS_memcmp(srcBuf, destBuf, actualSize) != 0) |
return FALSE; |
- } |
+ |
size -= actualSize; |
- srcOffset += actualSize; |
- destOffset += actualSize; |
+ offset += actualSize; |
} |
return TRUE; |
} |
- if (m_GenNum != (FX_DWORD)-1 || pOther->m_GenNum != (FX_DWORD)-1) { |
- IFX_FileRead* pFile = NULL; |
- uint8_t* pBuf = NULL; |
- FX_DWORD offset = 0; |
- if (pOther->m_GenNum != (FX_DWORD)-1) { |
+ |
+ if (!IsMemoryBased() || !pOther->IsMemoryBased()) { |
+ IFX_FileRead* pFile = nullptr; |
+ uint8_t* pBuf = nullptr; |
+ if (!pOther->IsMemoryBased()) { |
pFile = pOther->m_pFile; |
pBuf = m_pDataBuf; |
- offset = pOther->m_FileOffset; |
- } else if (m_GenNum != (FX_DWORD)-1) { |
+ } else if (!IsMemoryBased()) { |
pFile = m_pFile; |
pBuf = pOther->m_pDataBuf; |
- offset = m_FileOffset; |
} |
- if (NULL == pBuf) { |
+ if (!pBuf) |
return FALSE; |
- } |
- uint8_t srcBuf[1024]; |
+ |
+ uint8_t srcBuf[kBlockSize]; |
FX_DWORD size = m_dwSize; |
+ FX_DWORD offset = 0; |
while (size > 0) { |
- FX_DWORD actualSize = std::min(size, 1024U); |
+ FX_DWORD actualSize = std::min(size, kBlockSize); |
pFile->ReadBlock(srcBuf, offset, actualSize); |
- if (FXSYS_memcmp(srcBuf, pBuf, actualSize) != 0) { |
+ if (FXSYS_memcmp(srcBuf, pBuf, actualSize) != 0) |
return FALSE; |
- } |
+ |
pBuf += actualSize; |
size -= actualSize; |
offset += actualSize; |
@@ -1013,23 +1010,8 @@ void CPDF_StreamAcc::LoadAllData(const CPDF_Stream* pStream, |
} else { |
pSrcData = pStream->m_pDataBuf; |
} |
- uint8_t* pDecryptedData; |
- FX_DWORD dwDecryptedSize; |
- if (pStream->m_pCryptoHandler) { |
- CFX_BinaryBuf dest_buf; |
- dest_buf.EstimateSize(pStream->m_pCryptoHandler->DecryptGetSize(dwSrcSize)); |
- void* context = pStream->m_pCryptoHandler->DecryptStart( |
- pStream->GetObjNum(), pStream->m_GenNum); |
- pStream->m_pCryptoHandler->DecryptStream(context, pSrcData, dwSrcSize, |
- dest_buf); |
- pStream->m_pCryptoHandler->DecryptFinish(context, dest_buf); |
- pDecryptedData = dest_buf.GetBuffer(); |
- dwDecryptedSize = dest_buf.GetSize(); |
- dest_buf.DetachBuffer(); |
- } else { |
- pDecryptedData = pSrcData; |
- dwDecryptedSize = dwSrcSize; |
- } |
+ uint8_t* pDecryptedData = pSrcData; |
+ FX_DWORD dwDecryptedSize = dwSrcSize; |
if (!pStream->GetDict()->KeyExist(FX_BSTRC("Filter")) || bRawAccess) { |
m_pData = pDecryptedData; |
m_dwSize = dwDecryptedSize; |