1 // Copyright 2016 PDFium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 6 7 #ifndef CORE_FPDFAPI_PARSER_CPDF_STREAM_H_ 8 #define CORE_FPDFAPI_PARSER_CPDF_STREAM_H_ 9 10 #include <memory> 11 #include <set> 12 #include <sstream> 13 14 #include "core/fpdfapi/parser/cpdf_dictionary.h" 15 #include "core/fpdfapi/parser/cpdf_object.h" 16 #include "core/fxcrt/fx_stream.h" 17 18 class CPDF_Stream : public CPDF_Object { 19 public: 20 CPDF_Stream(); 21 22 // Takes ownership of |pData|. 23 CPDF_Stream(std::unique_ptr<uint8_t, FxFreeDeleter> pData, 24 uint32_t size, 25 std::unique_ptr<CPDF_Dictionary> pDict); 26 27 ~CPDF_Stream() override; 28 29 // CPDF_Object: 30 Type GetType() const override; 31 std::unique_ptr<CPDF_Object> Clone() const override; 32 CPDF_Dictionary* GetDict() const override; 33 WideString GetUnicodeText() const override; 34 bool IsStream() const override; 35 CPDF_Stream* AsStream() override; 36 const CPDF_Stream* AsStream() const override; 37 bool WriteTo(IFX_ArchiveStream* archive) const override; 38 39 uint32_t GetRawSize() const { return m_dwSize; } 40 uint8_t* GetRawData() const { return m_pDataBuf.get(); } 41 42 // Does not takes ownership of |pData|, copies into internally-owned buffer. 43 void SetData(const uint8_t* pData, uint32_t size); 44 void SetData(std::unique_ptr<uint8_t, FxFreeDeleter> pData, uint32_t size); 45 void SetData(std::ostringstream* stream); 46 // Set data and remove "Filter" and "DecodeParms" fields from stream 47 // dictionary. 48 void SetDataAndRemoveFilter(const uint8_t* pData, uint32_t size); 49 void SetDataAndRemoveFilter(std::ostringstream* stream); 50 51 void InitStream(const uint8_t* pData, 52 uint32_t size, 53 std::unique_ptr<CPDF_Dictionary> pDict); 54 void InitStreamFromFile(const RetainPtr<IFX_SeekableReadStream>& pFile, 55 std::unique_ptr<CPDF_Dictionary> pDict); 56 57 bool ReadRawData(FX_FILESIZE start_pos, 58 uint8_t* pBuf, 59 uint32_t buf_size) const; 60 61 bool IsMemoryBased() const { return m_bMemoryBased; } 62 bool HasFilter() const; 63 64 protected: 65 std::unique_ptr<CPDF_Object> CloneNonCyclic( 66 bool bDirect, 67 std::set<const CPDF_Object*>* pVisited) const override; 68 69 bool m_bMemoryBased = true; 70 uint32_t m_dwSize = 0; 71 std::unique_ptr<CPDF_Dictionary> m_pDict; 72 std::unique_ptr<uint8_t, FxFreeDeleter> m_pDataBuf; 73 RetainPtr<IFX_SeekableReadStream> m_pFile; 74 }; 75 76 inline CPDF_Stream* ToStream(CPDF_Object* obj) { 77 return obj ? obj->AsStream() : nullptr; 78 } 79 80 inline const CPDF_Stream* ToStream(const CPDF_Object* obj) { 81 return obj ? obj->AsStream() : nullptr; 82 } 83 84 inline std::unique_ptr<CPDF_Stream> ToStream(std::unique_ptr<CPDF_Object> obj) { 85 CPDF_Stream* pStream = ToStream(obj.get()); 86 if (!pStream) 87 return nullptr; 88 obj.release(); 89 return std::unique_ptr<CPDF_Stream>(pStream); 90 } 91 92 #endif // CORE_FPDFAPI_PARSER_CPDF_STREAM_H_ 93