5#include "core/fpdfapi/parser/cpdf_object_stream.h"
9#include "core/fpdfapi/parser/cpdf_dictionary.h"
10#include "core/fpdfapi/parser/cpdf_number.h"
11#include "core/fpdfapi/parser/cpdf_parser.h"
12#include "core/fpdfapi/parser/cpdf_reference.h"
13#include "core/fpdfapi/parser/cpdf_stream.h"
14#include "core/fpdfapi/parser/cpdf_stream_acc.h"
15#include "core/fpdfapi/parser/cpdf_syntax_parser.h"
16#include "core/fpdfapi/parser/fpdf_parser_utility.h"
17#include "core/fxcrt/cfx_read_only_span_stream.h"
18#include "core/fxcrt/fx_safe_types.h"
19#include "third_party/base/check.h"
20#include "third_party/base/memory/ptr_util.h"
24bool IsObjectStream(
const CPDF_Stream* stream) {
29 RetainPtr<
const CPDF_Dictionary> stream_dict = stream->GetDict();
30 if (!ValidateDictType(stream_dict.Get(),
"ObjStm"))
33 RetainPtr<
const CPDF_Number> number_of_objects =
34 stream_dict->GetNumberFor(
"N");
35 if (!number_of_objects || !number_of_objects->IsInteger() ||
36 number_of_objects->GetInteger() < 0 ||
37 number_of_objects->GetInteger() >=
42 RetainPtr<
const CPDF_Number> first_object_offset =
43 stream_dict->GetNumberFor(
"First");
44 if (!first_object_offset || !first_object_offset->IsInteger() ||
45 first_object_offset->GetInteger() < 0) {
57 if (!IsObjectStream(stream.Get()))
65 : stream_acc_(pdfium::MakeRetain<CPDF_StreamAcc>(obj_stream)),
66 first_object_offset_(obj_stream->GetDict()->GetIntegerFor(
"First")) {
67 DCHECK(IsObjectStream(obj_stream.Get()));
68 Init(obj_stream.Get());
76 uint32_t archive_obj_index)
const {
77 if (archive_obj_index >= object_info_.size())
80 const auto& info = object_info_[archive_obj_index];
81 if (info.obj_num != obj_number)
85 ParseObjectAtOffset(pObjList, info.obj_offset);
87 result->SetObjNum(obj_number);
92 stream_acc_->LoadAllDataFiltered();
94 pdfium::MakeRetain<CFX_ReadOnlySpanStream>(stream_acc_->GetSpan());
97 const int object_count = stream
->GetDict()->GetIntegerFor(
"N");
98 for (int32_t i = object_count; i > 0; --i) {
99 if (syntax.GetPos() >= data_stream_->GetSize())
107 object_info_.emplace_back(obj_num, obj_offset);
113 uint32_t object_offset)
const {
114 FX_SAFE_FILESIZE offset_in_stream = first_object_offset_;
115 offset_in_stream += object_offset;
117 if (!offset_in_stream.IsValid())
120 if (offset_in_stream.ValueOrDie() >= data_stream_->GetSize())
124 syntax
.SetPos(offset_in_stream.ValueOrDie()
);
RetainPtr< CPDF_Object > ParseObject(CPDF_IndirectObjectHolder *pObjList, uint32_t obj_number, uint32_t archive_obj_index) const
RetainPtr< const CPDF_Dictionary > GetDict() const
static constexpr uint32_t kMaxObjectNumber
void SetPos(FX_FILESIZE pos)
RetainPtr< CPDF_Object > GetObjectBody(CPDF_IndirectObjectHolder *pObjList)