14d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Copyright 2016 PDFium Authors. All rights reserved.
24d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Use of this source code is governed by a BSD-style license that can be
34d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// found in the LICENSE file.
44d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
54d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
64d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
74d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#ifndef CORE_FPDFAPI_PARSER_CPDF_STREAM_H_
84d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#define CORE_FPDFAPI_PARSER_CPDF_STREAM_H_
94d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include <memory>
114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include <set>
12d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include <sstream>
134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/parser/cpdf_dictionary.h"
154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/parser/cpdf_object.h"
16d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "core/fxcrt/fx_stream.h"
174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannclass CPDF_Stream : public CPDF_Object {
194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann public:
204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_Stream();
214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  // Takes ownership of |pData|.
234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_Stream(std::unique_ptr<uint8_t, FxFreeDeleter> pData,
244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann              uint32_t size,
254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann              std::unique_ptr<CPDF_Dictionary> pDict);
264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  ~CPDF_Stream() override;
284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  // CPDF_Object:
304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  Type GetType() const override;
314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  std::unique_ptr<CPDF_Object> Clone() const override;
324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_Dictionary* GetDict() const override;
33d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  WideString GetUnicodeText() const override;
344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool IsStream() const override;
354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_Stream* AsStream() override;
364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  const CPDF_Stream* AsStream() const override;
37d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  bool WriteTo(IFX_ArchiveStream* archive) const override;
384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  uint32_t GetRawSize() const { return m_dwSize; }
404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  uint8_t* GetRawData() const { return m_pDataBuf.get(); }
414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
42d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  // Does not takes ownership of |pData|, copies into internally-owned buffer.
434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  void SetData(const uint8_t* pData, uint32_t size);
44d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  void SetData(std::unique_ptr<uint8_t, FxFreeDeleter> pData, uint32_t size);
45d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  void SetData(std::ostringstream* stream);
46d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  // Set data and remove "Filter" and "DecodeParms" fields from stream
47d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  // dictionary.
48d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  void SetDataAndRemoveFilter(const uint8_t* pData, uint32_t size);
49d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  void SetDataAndRemoveFilter(std::ostringstream* stream);
504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  void InitStream(const uint8_t* pData,
524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                  uint32_t size,
534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                  std::unique_ptr<CPDF_Dictionary> pDict);
54d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  void InitStreamFromFile(const RetainPtr<IFX_SeekableReadStream>& pFile,
554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                          std::unique_ptr<CPDF_Dictionary> pDict);
564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool ReadRawData(FX_FILESIZE start_pos,
584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                   uint8_t* pBuf,
594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                   uint32_t buf_size) const;
604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool IsMemoryBased() const { return m_bMemoryBased; }
624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool HasFilter() const;
634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann protected:
654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  std::unique_ptr<CPDF_Object> CloneNonCyclic(
664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      bool bDirect,
674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      std::set<const CPDF_Object*>* pVisited) const override;
684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool m_bMemoryBased = true;
704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  uint32_t m_dwSize = 0;
714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  std::unique_ptr<CPDF_Dictionary> m_pDict;
724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  std::unique_ptr<uint8_t, FxFreeDeleter> m_pDataBuf;
73d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  RetainPtr<IFX_SeekableReadStream> m_pFile;
744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann};
754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmanninline CPDF_Stream* ToStream(CPDF_Object* obj) {
774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return obj ? obj->AsStream() : nullptr;
784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmanninline const CPDF_Stream* ToStream(const CPDF_Object* obj) {
814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return obj ? obj->AsStream() : nullptr;
824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmanninline std::unique_ptr<CPDF_Stream> ToStream(std::unique_ptr<CPDF_Object> obj) {
854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_Stream* pStream = ToStream(obj.get());
864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pStream)
874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return nullptr;
884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  obj.release();
894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return std::unique_ptr<CPDF_Stream>(pStream);
904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#endif  // CORE_FPDFAPI_PARSER_CPDF_STREAM_H_
93