Chromium Code Reviews| Index: core/fxcrt/fx_extension.cpp |
| diff --git a/core/fxcrt/fx_extension.cpp b/core/fxcrt/fx_extension.cpp |
| index 6bf61f1fb574a054e5136ee53ce44c9b130a380a..73e51202f8b67cc78de757036063fb70e1cd3d25 100644 |
| --- a/core/fxcrt/fx_extension.cpp |
| +++ b/core/fxcrt/fx_extension.cpp |
| @@ -19,8 +19,28 @@ |
| #include <ctime> |
| #endif |
| +namespace { |
| + |
| #ifdef PDF_ENABLE_XFA |
| +class CFX_CRTFileAccess : public IFX_FileAccess { |
| + public: |
| + CFX_CRTFileAccess(); |
| + ~CFX_CRTFileAccess() override; |
| + |
| + // IFX_FileAccess |
| + void Release() override; |
| + IFX_FileAccess* Retain() override; |
| + void GetPath(CFX_WideString& wsPath) override; |
| + IFX_SeekableStream* CreateFileStream(uint32_t dwModes) override; |
| + |
| + bool Init(const CFX_WideStringC& wsPath); |
| + |
| + private: |
| + CFX_WideString m_path; |
| + uint32_t m_RefCount; |
| +}; |
| + |
| CFX_CRTFileAccess::CFX_CRTFileAccess() : m_RefCount(0) {} |
| CFX_CRTFileAccess::~CFX_CRTFileAccess() {} |
| @@ -51,10 +71,113 @@ bool CFX_CRTFileAccess::Init(const CFX_WideStringC& wsPath) { |
| #endif // PDF_ENABLE_XFA |
| +class CFX_CRTFileStream final : public IFX_SeekableStream { |
| + public: |
| + explicit CFX_CRTFileStream(std::unique_ptr<IFXCRT_FileAccess> pFA); |
| + ~CFX_CRTFileStream() override; |
| + |
| + // IFX_SeekableStream: |
| + IFX_SeekableStream* Retain() override; |
| + void Release() override; |
| + FX_FILESIZE GetSize() override; |
| + bool IsEOF() override; |
| + FX_FILESIZE GetPosition() override; |
| + bool ReadBlock(void* buffer, FX_FILESIZE offset, size_t size) override; |
| + size_t ReadBlock(void* buffer, size_t size) override; |
| + bool WriteBlock(const void* buffer, FX_FILESIZE offset, size_t size) override; |
| + bool Flush() override; |
| + |
| + private: |
| + std::unique_ptr<IFXCRT_FileAccess> m_pFile; |
| + uint32_t m_dwCount; |
| +}; |
| + |
| CFX_CRTFileStream::CFX_CRTFileStream(std::unique_ptr<IFXCRT_FileAccess> pFA) |
| : m_pFile(std::move(pFA)), m_dwCount(1) {} |
| CFX_CRTFileStream::~CFX_CRTFileStream() {} |
| +IFX_SeekableStream* CFX_CRTFileStream::Retain() { |
| + m_dwCount++; |
| + return this; |
| +} |
| + |
| +void CFX_CRTFileStream::Release() { |
| + uint32_t nCount = --m_dwCount; |
| + if (!nCount) { |
|
npm
2016/12/01 21:42:20
Nit: no {}
Tom Sepez
2016/12/01 21:43:42
yup.
|
| + delete this; |
| + } |
| +} |
| + |
| +FX_FILESIZE CFX_CRTFileStream::GetSize() { |
| + return m_pFile->GetSize(); |
| +} |
| + |
| +bool CFX_CRTFileStream::IsEOF() { |
| + return GetPosition() >= GetSize(); |
| +} |
| + |
| +FX_FILESIZE CFX_CRTFileStream::GetPosition() { |
| + return m_pFile->GetPosition(); |
| +} |
| + |
| +bool CFX_CRTFileStream::ReadBlock(void* buffer, |
| + FX_FILESIZE offset, |
| + size_t size) { |
| + return m_pFile->ReadPos(buffer, size, offset) > 0; |
| +} |
| + |
| +size_t CFX_CRTFileStream::ReadBlock(void* buffer, size_t size) { |
| + return m_pFile->Read(buffer, size); |
| +} |
| + |
| +bool CFX_CRTFileStream::WriteBlock(const void* buffer, |
| + FX_FILESIZE offset, |
| + size_t size) { |
| + return !!m_pFile->WritePos(buffer, size, offset); |
| +} |
| + |
| +bool CFX_CRTFileStream::Flush() { |
| + return m_pFile->Flush(); |
| +} |
| + |
| +#define FX_MEMSTREAM_BlockSize (64 * 1024) |
| +#define FX_MEMSTREAM_Consecutive 0x01 |
| +#define FX_MEMSTREAM_TakeOver 0x02 |
| + |
| +class CFX_MemoryStream final : public IFX_MemoryStream { |
| + public: |
| + explicit CFX_MemoryStream(bool bConsecutive); |
| + CFX_MemoryStream(uint8_t* pBuffer, size_t nSize, bool bTakeOver); |
| + ~CFX_MemoryStream() override; |
| + |
| + // IFX_MemoryStream |
| + IFX_SeekableStream* Retain() override; |
| + void Release() override; |
| + FX_FILESIZE GetSize() override; |
| + bool IsEOF() override; |
| + FX_FILESIZE GetPosition() override; |
| + bool ReadBlock(void* buffer, FX_FILESIZE offset, size_t size) override; |
| + size_t ReadBlock(void* buffer, size_t size) override; |
| + bool WriteBlock(const void* buffer, FX_FILESIZE offset, size_t size) override; |
| + bool Flush() override; |
| + bool IsConsecutive() const override; |
| + void EstimateSize(size_t nInitSize, size_t nGrowSize) override; |
| + uint8_t* GetBuffer() const override; |
| + void AttachBuffer(uint8_t* pBuffer, |
| + size_t nSize, |
| + bool bTakeOver = false) override; |
| + void DetachBuffer() override; |
| + |
| + private: |
| + CFX_ArrayTemplate<uint8_t*> m_Blocks; |
| + uint32_t m_dwCount; |
| + size_t m_nTotalSize; |
| + size_t m_nCurSize; |
| + size_t m_nCurPos; |
| + size_t m_nGrowSize; |
| + uint32_t m_dwFlags; |
| + bool ExpandBlocks(size_t size); |
| +}; |
| CFX_MemoryStream::CFX_MemoryStream(bool bConsecutive) |
| : m_dwCount(1), |
| @@ -283,49 +406,7 @@ bool CFX_MemoryStream::ExpandBlocks(size_t size) { |
| return true; |
| } |
| -IFX_SeekableStream* CFX_CRTFileStream::Retain() { |
| - m_dwCount++; |
| - return this; |
| -} |
| - |
| -void CFX_CRTFileStream::Release() { |
| - uint32_t nCount = --m_dwCount; |
| - if (!nCount) { |
| - delete this; |
| - } |
| -} |
| - |
| -FX_FILESIZE CFX_CRTFileStream::GetSize() { |
| - return m_pFile->GetSize(); |
| -} |
| - |
| -bool CFX_CRTFileStream::IsEOF() { |
| - return GetPosition() >= GetSize(); |
| -} |
| - |
| -FX_FILESIZE CFX_CRTFileStream::GetPosition() { |
| - return m_pFile->GetPosition(); |
| -} |
| - |
| -bool CFX_CRTFileStream::ReadBlock(void* buffer, |
| - FX_FILESIZE offset, |
| - size_t size) { |
| - return m_pFile->ReadPos(buffer, size, offset) > 0; |
| -} |
| - |
| -size_t CFX_CRTFileStream::ReadBlock(void* buffer, size_t size) { |
| - return m_pFile->Read(buffer, size); |
| -} |
| - |
| -bool CFX_CRTFileStream::WriteBlock(const void* buffer, |
| - FX_FILESIZE offset, |
| - size_t size) { |
| - return !!m_pFile->WritePos(buffer, size, offset); |
| -} |
| - |
| -bool CFX_CRTFileStream::Flush() { |
| - return m_pFile->Flush(); |
| -} |
| +} // namespace |
| #ifdef PDF_ENABLE_XFA |
| IFX_FileAccess* FX_CreateDefaultFileAccess(const CFX_WideStringC& wsPath) { |