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