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