1d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann// Copyright 2017 PDFium Authors. All rights reserved. 2d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann// Use of this source code is governed by a BSD-style license that can be 3d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann// found in the LICENSE file. 4d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 5d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 6d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 7d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#ifndef CORE_FXCRT_CFX_MEMORYSTREAM_H_ 8d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#define CORE_FXCRT_CFX_MEMORYSTREAM_H_ 9d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 10d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include <vector> 11d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 12d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "core/fxcrt/fx_stream.h" 13d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "core/fxcrt/retain_ptr.h" 14d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 15d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannclass CFX_MemoryStream : public IFX_SeekableStream { 16d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann public: 17d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann enum Type { kConsecutive = 1 << 0, kTakeOver = 1 << 1 }; 18d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 19d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann template <typename T, typename... Args> 20d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann friend RetainPtr<T> pdfium::MakeRetain(Args&&... args); 21d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 22d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann // IFX_SeekableStream 23d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann FX_FILESIZE GetSize() override; 24d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann FX_FILESIZE GetPosition() override; 25d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann bool IsEOF() override; 26d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann bool ReadBlock(void* buffer, FX_FILESIZE offset, size_t size) override; 27d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann size_t ReadBlock(void* buffer, size_t size) override; 28d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann bool WriteBlock(const void* buffer, FX_FILESIZE offset, size_t size) override; 29d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann bool Flush() override; 30d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 31d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann bool IsConsecutive() const { return !!(m_dwFlags & Type::kConsecutive); } 32d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 33d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann uint8_t* GetBuffer() const { 34d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return !m_Blocks.empty() ? m_Blocks.front() : nullptr; 35d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 36d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 37d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann void EstimateSize(size_t nInitSize, size_t nGrowSize); 38d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann void AttachBuffer(uint8_t* pBuffer, size_t nSize); 39d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann void DetachBuffer(); 40d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 41d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann private: 42d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann explicit CFX_MemoryStream(bool bConsecutive); 43d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFX_MemoryStream(uint8_t* pBuffer, size_t nSize, bool bTakeOver); 44d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ~CFX_MemoryStream() override; 45d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 46d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann bool ExpandBlocks(size_t size); 47d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 48d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann std::vector<uint8_t*> m_Blocks; 49d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann size_t m_nTotalSize; 50d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann size_t m_nCurSize; 51d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann size_t m_nCurPos; 52d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann size_t m_nGrowSize; 53d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann uint32_t m_dwFlags; 54d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}; 55d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 56d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#endif // CORE_FXCRT_CFX_MEMORYSTREAM_H_ 57