7#include "core/fpdfapi/parser/cpdf_stream.h"
14#include "constants/stream_dict_common.h"
15#include "core/fpdfapi/parser/cpdf_dictionary.h"
16#include "core/fpdfapi/parser/cpdf_encryptor.h"
17#include "core/fpdfapi/parser/cpdf_flateencoder.h"
18#include "core/fpdfapi/parser/cpdf_number.h"
19#include "core/fpdfapi/parser/cpdf_stream_acc.h"
20#include "core/fpdfapi/parser/fpdf_parser_decode.h"
21#include "core/fpdfapi/parser/fpdf_parser_utility.h"
22#include "core/fxcrt/cfx_memorystream.h"
23#include "core/fxcrt/check.h"
24#include "core/fxcrt/containers/contains.h"
25#include "core/fxcrt/data_vector.h"
26#include "core/fxcrt/fx_stream.h"
27#include "core/fxcrt/numerics/safe_conversions.h"
28#include "core/fxcrt/span_util.h"
34 return ValidateDictType(dict,
"Metadata") &&
41 : CPDF_Stream(DataVector<uint8_t>(), std::move(dict)) {}
43CPDF_Stream::CPDF_Stream(pdfium::span<
const uint8_t> span)
44 : dict_(pdfium::MakeRetain<CPDF_Dictionary>()) {
48CPDF_Stream::CPDF_Stream(fxcrt::ostringstream* stream)
49 : dict_(pdfium::MakeRetain<CPDF_Dictionary>()) {
50 SetDataFromStringstream(stream);
55 : data_(std::move(file)), dict_(std::move(dict)) {
56 CHECK(dict_->IsInline());
57 SetLengthInDict(pdfium::checked_cast<
int>(
58 absl::get<RetainPtr<IFX_SeekableReadStream>>(data_)->GetSize()));
61CPDF_Stream::CPDF_Stream(DataVector<uint8_t> data,
63 : data_(std::move(data)), dict_(std::move(dict)) {
64 CHECK(dict_->IsInline());
66 pdfium::checked_cast<
int>(absl::get<DataVector<uint8_t>>(data_).size()));
71 if (dict_->GetObjNum() == kInvalidObjNum) {
89 const int size =
pdfium::checked_cast<
int>(file->GetSize());
90 data_ = std::move(file);
91 dict_ = pdfium::MakeRetain<CPDF_Dictionary>();
92 SetLengthInDict(size);
101 std::set<
const CPDF_Object*>* pVisited)
const {
102 pVisited->insert(
this);
103 auto pAcc =
pdfium::MakeRetain<CPDF_StreamAcc>(
pdfium::WrapRetain(
this));
104 pAcc->LoadAllDataRaw();
108 if (!
pdfium::Contains(*pVisited, pDict.Get())) {
109 pNewDict = ToDictionary(
static_cast<
const CPDF_Object*>(pDict.Get())
110 ->CloneNonCyclic(bDirect, pVisited));
112 return pdfium::MakeRetain<CPDF_Stream>(pAcc->DetachData(),
113 std::move(pNewDict));
118 dict_->RemoveFor(
"Filter");
119 dict_->RemoveFor(pdfium::stream::kDecodeParms);
123 fxcrt::ostringstream* stream) {
124 if (stream->tellp() <= 0) {
125 SetDataAndRemoveFilter({});
128 SetDataAndRemoveFilter(pdfium::as_byte_span(stream->str())
129 .first(
static_cast<size_t>(stream->tellp())));
132void CPDF_Stream::
SetData(pdfium::span<
const uint8_t> pData) {
133 DataVector<uint8_t> data_copy(pData.begin(), pData.end());
134 TakeData(std::move(data_copy));
137void CPDF_Stream::TakeData(DataVector<uint8_t> data) {
138 const int size = pdfium::checked_cast<
int>(data.size());
139 data_ = std::move(data);
140 SetLengthInDict(size);
144 if (stream->tellp() <= 0) {
148 SetData(pdfium::as_byte_span(stream->str())
149 .first(
static_cast<size_t>(stream->tellp())));
155 DataVector<uint8_t> result(GetRawSize());
158 auto underlying_stream = absl::get<RetainPtr<IFX_SeekableReadStream>>(data_);
159 if (!underlying_stream->ReadBlockAtOffset(result, 0))
160 return DataVector<uint8_t>();
166 return dict_->KeyExist(
"Filter");
170 auto pAcc =
pdfium::MakeRetain<CPDF_StreamAcc>(
pdfium::WrapRetain(
this));
171 pAcc->LoadAllDataFiltered();
172 return PDF_DecodeText(pAcc->GetSpan());
177 const bool is_metadata = IsMetaDataStreamDictionary(
GetDict().Get());
180 DataVector<uint8_t> encrypted_data;
181 pdfium::span<
const uint8_t> data = encoder.GetSpan();
182 if (encryptor && !is_metadata) {
183 encrypted_data = encryptor->Encrypt(data);
184 data = encrypted_data;
187 encoder.UpdateLength(data.size());
194 if (!archive->WriteBlock(data))
202 return pdfium::checked_cast<size_t>(
203 absl::get<RetainPtr<IFX_SeekableReadStream>>(data_)->GetSize());
205 return absl::get<DataVector<uint8_t>>(data_).size();
210 return absl::get<DataVector<uint8_t>>(data_);
213void CPDF_Stream::SetLengthInDict(
int length) {
214 dict_->SetNewFor<CPDF_Number>(
"Length", length);
std::map< ByteString, RetainPtr< CPDF_Object >, std::less<> > DictMap
ByteString GetNameFor(const ByteString &key) const
bool WriteDictTo(IFX_ArchiveStream *archive, const CPDF_Encryptor *encryptor) const
RetainPtr< const CPDF_Dictionary > GetDict() const
static constexpr uint32_t kInvalidObjNum
RetainPtr< CPDF_Object > CloneObjectNonCyclic(bool bDirect) const
RetainPtr< CPDF_Object > Clone() const override
size_t GetRawSize() const
CPDF_Stream * AsMutableStream() override
bool WriteTo(IFX_ArchiveStream *archive, const CPDF_Encryptor *encryptor) const override
void SetDataFromStringstreamAndRemoveFilter(fxcrt::ostringstream *stream)
Type GetType() const override
void SetDataAndRemoveFilter(pdfium::span< const uint8_t > pData)
void SetDataFromStringstream(fxcrt::ostringstream *stream)
DataVector< uint8_t > ReadAllRawData() const
void SetData(pdfium::span< const uint8_t > pData)
pdfium::span< const uint8_t > GetInMemoryRawData() const
RetainPtr< CPDF_Object > CloneNonCyclic(bool bDirect, std::set< const CPDF_Object * > *pVisited) const override
WideString GetUnicodeText() const override
const CPDF_Dictionary * GetDictInternal() const override
void InitStreamFromFile(RetainPtr< IFX_SeekableReadStream > file)
bool WriteString(ByteStringView str)
bool operator==(const char *ptr) const
fxcrt::WideString WideString