void CPDF_Stream::SetData(const uint8_t* pData, uint32_t size, FX_BOOL bCompressed, FX_BOOL bKeepBuf) { if (IsMemoryBased()) FX_Free(m_pDataBuf); m_GenNum = kMemoryBasedGenNum; if (bKeepBuf) { m_pDataBuf = const_cast<uint8_t*>(pData); } else { m_pDataBuf = FX_Alloc(uint8_t, size); if (pData) { FXSYS_memcpy(m_pDataBuf, pData, size); } } m_dwSize = size; if (!m_pDict) m_pDict = new CPDF_Dictionary; m_pDict->SetAtInteger("Length", size); if (!bCompressed) { m_pDict->RemoveAt("Filter"); m_pDict->RemoveAt("DecodeParms"); } }
CPDF_Stream::~CPDF_Stream() { if (IsMemoryBased()) FX_Free(m_pDataBuf); if (m_pDict) m_pDict->Release(); }
CPDF_Stream::~CPDF_Stream() { m_ObjNum = kInvalidObjNum; if (IsMemoryBased()) FX_Free(m_pDataBuf); if (m_pDict) m_pDict->Release(); }
FX_BOOL CPDF_Stream::ReadRawData(FX_FILESIZE offset, uint8_t* buf, FX_DWORD size) const { 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::InitStreamInternal(CPDF_Dictionary* pDict) { if (pDict) { if (m_pDict) m_pDict->Release(); m_pDict = pDict; } if (IsMemoryBased()) FX_Free(m_pDataBuf); m_GenNum = 0; m_pFile = nullptr; }
FX_BOOL CPDF_Stream::Identical(CPDF_Stream* pOther) const { if (!m_pDict) return !pOther->m_pDict; if (!m_pDict->Identical(pOther->m_pDict)) return FALSE; if (m_dwSize != pOther->m_dwSize) return FALSE; if (!IsMemoryBased() && !pOther->IsMemoryBased()) { if (m_pFile == pOther->m_pFile && !m_pFile) return TRUE; if (!m_pFile || !pOther->m_pFile) return FALSE; uint8_t srcBuf[kBlockSize]; uint8_t destBuf[kBlockSize]; FX_DWORD size = m_dwSize; if (m_pFile == pOther->m_pFile) return TRUE; FX_DWORD offset = 0; while (size > 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; offset += actualSize; } return TRUE; } if (!IsMemoryBased() || !pOther->IsMemoryBased()) { IFX_FileRead* pFile = nullptr; uint8_t* pBuf = nullptr; if (!pOther->IsMemoryBased()) { pFile = pOther->m_pFile; pBuf = m_pDataBuf; } else if (!IsMemoryBased()) { pFile = m_pFile; pBuf = pOther->m_pDataBuf; } if (!pBuf) return FALSE; uint8_t srcBuf[kBlockSize]; FX_DWORD size = m_dwSize; FX_DWORD offset = 0; while (size > 0) { FX_DWORD actualSize = std::min(size, kBlockSize); pFile->ReadBlock(srcBuf, offset, actualSize); if (FXSYS_memcmp(srcBuf, pBuf, actualSize) != 0) return FALSE; pBuf += actualSize; size -= actualSize; offset += actualSize; } return TRUE; } return FXSYS_memcmp(m_pDataBuf, pOther->m_pDataBuf, m_dwSize) == 0; }