5#include "public/fpdf_structtree.h"
9#include "core/fpdfapi/page/cpdf_page.h"
10#include "core/fpdfapi/parser/cpdf_array.h"
11#include "core/fpdfapi/parser/cpdf_dictionary.h"
12#include "core/fpdfdoc/cpdf_structelement.h"
13#include "core/fpdfdoc/cpdf_structtree.h"
14#include "core/fxcrt/compiler_specific.h"
15#include "core/fxcrt/fx_memcpy_wrappers.h"
16#include "core/fxcrt/fx_safe_types.h"
17#include "core/fxcrt/numerics/safe_conversions.h"
18#include "core/fxcrt/stl_util.h"
19#include "fpdfsdk/cpdfsdk_helpers.h"
25 unsigned long buflen) {
30 return Utf16EncodeMaybeCopyAndReturnLength(
37 if (obj && obj->IsNumber())
38 return obj->GetInteger();
52 return FPDFStructTreeFromCPDFStructTree(
59 std::unique_ptr<CPDF_StructTree>(
60 CPDFStructTreeFromFPDFStructTree(struct_tree));
70 return tmp_size.ValueOrDefault(-1);
76 if (!tree || index < 0 ||
77 static_cast<size_t>(index) >= tree->CountTopElements()) {
80 return FPDFStructElementFromCPDFStructElement(
81 tree->GetTopElement(
static_cast<size_t>(index)));
87 unsigned long buflen) {
88 CPDF_StructElement* elem =
100 unsigned long buflen) {
101 CPDF_StructElement* elem =
114 unsigned long buflen) {
115 CPDF_StructElement* elem =
121 if (!id.has_value()) {
125 return Utf16EncodeMaybeCopyAndReturnLength(
132 unsigned long buflen) {
133 CPDF_StructElement* elem =
139 if (!lang.has_value()) {
143 return Utf16EncodeMaybeCopyAndReturnLength(
144 lang.value(),
UNSAFE_BUFFERS(SpanFromFPDFApiArgs(buffer, buflen)));
149 CPDF_StructElement* elem =
157 attr_obj = attr_obj->GetDirect();
160 if (attr_obj->IsArray())
161 return fxcrt::CollectionSize<
int>(*attr_obj->AsArray());
162 return attr_obj->IsDictionary() ? 1 : -1;
168 CPDF_StructElement* elem =
177 attr_obj = attr_obj->GetDirect();
181 if (attr_obj->IsDictionary()) {
182 return index == 0 ? FPDFStructElementAttrFromCPDFDictionary(
183 attr_obj->AsDictionary())
186 if (attr_obj->IsArray()) {
187 const CPDF_Array* array = attr_obj->AsArray();
188 if (index < 0 ||
static_cast<size_t>(index) >= array->size())
193 return FPDFStructElementAttrFromCPDFDictionary(array->GetDictAt(index));
200 FPDF_BYTESTRING attr_name,
202 unsigned long buflen) {
203 CPDF_StructElement* elem =
211 for (
const RetainPtr<CPDF_Object>& obj : locker) {
212 const CPDF_Dictionary* obj_dict = obj->AsDictionary();
216 RetainPtr<
const CPDF_Object> attr = obj_dict->GetObjectFor(attr_name);
217 if (!attr || !(attr->IsString() || attr->IsName())) {
221 return Utf16EncodeMaybeCopyAndReturnLength(
222 attr->GetUnicodeText(),
230 CPDF_StructElement* elem =
235 return p && p->IsNumber() ? p->GetInteger() : -1;
241 unsigned long buflen) {
242 CPDF_StructElement* elem =
255 unsigned long buflen) {
256 CPDF_StructElement* elem =
269 unsigned long buflen) {
270 CPDF_StructElement* elem =
281 CPDF_StructElement* elem =
287 return tmp_size.ValueOrDefault(-1);
293 CPDF_StructElement* elem =
295 if (!elem || index < 0 ||
static_cast<size_t>(index) >= elem->CountKids())
298 return FPDFStructElementFromCPDFStructElement(elem->GetKidIfElement(index));
304 CPDF_StructElement* elem =
306 if (!elem || index < 0 ||
static_cast<size_t>(index) >= elem->CountKids()) {
310 return elem->GetKidContentId(index);
315 CPDF_StructElement* elem =
317 CPDF_StructElement* parent = elem ? elem
->GetParent() :
nullptr;
330 return fxcrt::CollectionSize<
int>(*dict);
337 unsigned long buflen,
338 unsigned long* out_buflen) {
349 for (
auto& it : locker) {
352 *out_buflen = NulTerminateMaybeCopyAndReturnLength(
363 FPDF_BYTESTRING name) {
369 return FPDFStructElementAttrValueFromCPDFObject(
381 FPDF_BOOL* out_value) {
414 unsigned long buflen,
415 unsigned long* out_buflen) {
426 *out_buflen = Utf16EncodeMaybeCopyAndReturnLength(
427 WideString::FromUTF8(obj->GetString().AsStringView()),
435 unsigned long buflen,
436 unsigned long* out_buflen) {
447 auto result_span =
UNSAFE_BUFFERS(SpanFromFPDFApiArgs(buffer, buflen));
449 fxcrt::try_spancpy(result_span, blob_value.span());
450 *out_buflen =
pdfium::checked_cast<
unsigned long>(blob_value.span().size());
458 return array ?
fxcrt::CollectionSize<
int>(*array) : -1;
473 return FPDFStructElementAttrValueFromCPDFObject(array->GetObjectAt(index));
478 CPDF_StructElement* elem =
486 if (p->IsNumber() || p->IsDictionary())
489 return p->IsArray() ?
fxcrt::CollectionSize<
int>(*p->AsArray()) : -1;
495 CPDF_StructElement* elem =
504 return index == 0 ? p->GetInteger() : -1;
506 if (p->IsDictionary())
507 return GetMcidFromDict(p->GetDict().Get());
511 if (index < 0 ||
static_cast<size_t>(index) >= array->size())
514 if (array_elem->IsNumber())
515 return array_elem->GetInteger();
516 if (array_elem->IsDictionary()) {
517 return GetMcidFromDict(array_elem->GetDict().Get());
fxcrt::ByteString ByteString
std::vector< RetainPtr< CPDF_Object > >::const_iterator const_iterator
CPDF_DictionaryLocker(const CPDF_Dictionary *pDictionary)
RetainPtr< const CPDF_Object > GetDirectObjectFor(const ByteString &key) const
std::map< ByteString, RetainPtr< CPDF_Object >, std::less<> > DictMap
ByteString GetNameFor(const ByteString &key) const
virtual Type GetType() const =0
virtual ByteString GetString() const
virtual int GetInteger() const
virtual float GetNumber() const
CPDF_Document * GetDocument() const override
ByteString GetType() const
WideString GetTitle() const
WideString GetActualText() const
CPDF_StructElement * GetParent() const
ByteString GetObjType() const
WideString GetAltText() const
bool operator==(const char *ptr) const
static WideString FromUTF8(ByteStringView str)
#define UNSAFE_BUFFERS(...)
#define UNSAFE_BUFFER_USAGE
const CPDF_Array * ToArray(const CPDF_Object *obj)
CPDF_StructElement * CPDFStructElementFromFPDFStructElement(FPDF_STRUCTELEMENT struct_element)
FPDF_STRUCTELEMENT FPDFStructElementFromCPDFStructElement(CPDF_StructElement *struct_element)
const CPDF_Object * CPDFObjectFromFPDFStructElementAttrValue(FPDF_STRUCTELEMENT_ATTR_VALUE struct_element_attr_value)
CPDF_Page * CPDFPageFromFPDFPage(FPDF_PAGE page)
CPDF_StructTree * CPDFStructTreeFromFPDFStructTree(FPDF_STRUCTTREE struct_tree)
const CPDF_Dictionary * CPDFDictionaryFromFPDFStructElementAttr(FPDF_STRUCTELEMENT_ATTR struct_element_attr)
FPDF_EXPORT FPDF_STRUCTELEMENT FPDF_CALLCONV FPDF_StructElement_GetParent(FPDF_STRUCTELEMENT struct_element)
FPDF_EXPORT unsigned long FPDF_CALLCONV FPDF_StructElement_GetLang(FPDF_STRUCTELEMENT struct_element, void *buffer, unsigned long buflen)
FPDF_EXPORT int FPDF_CALLCONV FPDF_StructElement_GetAttributeCount(FPDF_STRUCTELEMENT struct_element)
FPDF_EXPORT void FPDF_CALLCONV FPDF_StructTree_Close(FPDF_STRUCTTREE struct_tree)
FPDF_EXPORT FPDF_STRUCTTREE FPDF_CALLCONV FPDF_StructTree_GetForPage(FPDF_PAGE page)
FPDF_EXPORT int FPDF_CALLCONV FPDF_StructElement_GetMarkedContentID(FPDF_STRUCTELEMENT struct_element)
FPDF_EXPORT unsigned long FPDF_CALLCONV FPDF_StructElement_GetStringAttribute(FPDF_STRUCTELEMENT struct_element, FPDF_BYTESTRING attr_name, void *buffer, unsigned long buflen)
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDF_StructElement_Attr_GetName(FPDF_STRUCTELEMENT_ATTR struct_attribute, int index, void *buffer, unsigned long buflen, unsigned long *out_buflen)
FPDF_EXPORT FPDF_STRUCTELEMENT_ATTR_VALUE FPDF_CALLCONV FPDF_StructElement_Attr_GetChildAtIndex(FPDF_STRUCTELEMENT_ATTR_VALUE value, int index)
FPDF_EXPORT int FPDF_CALLCONV FPDF_StructElement_GetMarkedContentIdAtIndex(FPDF_STRUCTELEMENT struct_element, int index)
FPDF_EXPORT unsigned long FPDF_CALLCONV FPDF_StructElement_GetActualText(FPDF_STRUCTELEMENT struct_element, void *buffer, unsigned long buflen)
FPDF_EXPORT FPDF_STRUCTELEMENT FPDF_CALLCONV FPDF_StructTree_GetChildAtIndex(FPDF_STRUCTTREE struct_tree, int index)
FPDF_EXPORT int FPDF_CALLCONV FPDF_StructElement_Attr_GetCount(FPDF_STRUCTELEMENT_ATTR struct_attribute)
FPDF_EXPORT unsigned long FPDF_CALLCONV FPDF_StructElement_GetID(FPDF_STRUCTELEMENT struct_element, void *buffer, unsigned long buflen)
FPDF_EXPORT FPDF_OBJECT_TYPE FPDF_CALLCONV FPDF_StructElement_Attr_GetType(FPDF_STRUCTELEMENT_ATTR_VALUE value)
FPDF_EXPORT FPDF_STRUCTELEMENT_ATTR_VALUE FPDF_CALLCONV FPDF_StructElement_Attr_GetValue(FPDF_STRUCTELEMENT_ATTR struct_attribute, FPDF_BYTESTRING name)
FPDF_EXPORT FPDF_STRUCTELEMENT FPDF_CALLCONV FPDF_StructElement_GetChildAtIndex(FPDF_STRUCTELEMENT struct_element, int index)
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDF_StructElement_Attr_GetNumberValue(FPDF_STRUCTELEMENT_ATTR_VALUE value, float *out_value)
FPDF_EXPORT unsigned long FPDF_CALLCONV FPDF_StructElement_GetObjType(FPDF_STRUCTELEMENT struct_element, void *buffer, unsigned long buflen)
FPDF_EXPORT FPDF_STRUCTELEMENT_ATTR FPDF_CALLCONV FPDF_StructElement_GetAttributeAtIndex(FPDF_STRUCTELEMENT struct_element, int index)
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDF_StructElement_Attr_GetBlobValue(FPDF_STRUCTELEMENT_ATTR_VALUE value, void *buffer, unsigned long buflen, unsigned long *out_buflen)
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDF_StructElement_Attr_GetStringValue(FPDF_STRUCTELEMENT_ATTR_VALUE value, void *buffer, unsigned long buflen, unsigned long *out_buflen)
FPDF_EXPORT unsigned long FPDF_CALLCONV FPDF_StructElement_GetType(FPDF_STRUCTELEMENT struct_element, void *buffer, unsigned long buflen)
FPDF_EXPORT int FPDF_CALLCONV FPDF_StructElement_Attr_CountChildren(FPDF_STRUCTELEMENT_ATTR_VALUE value)
FPDF_EXPORT unsigned long FPDF_CALLCONV FPDF_StructElement_GetAltText(FPDF_STRUCTELEMENT struct_element, void *buffer, unsigned long buflen)
FPDF_EXPORT int FPDF_CALLCONV FPDF_StructElement_GetChildMarkedContentID(FPDF_STRUCTELEMENT struct_element, int index)
FPDF_EXPORT int FPDF_CALLCONV FPDF_StructTree_CountChildren(FPDF_STRUCTTREE struct_tree)
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDF_StructElement_Attr_GetBooleanValue(FPDF_STRUCTELEMENT_ATTR_VALUE value, FPDF_BOOL *out_value)
FPDF_EXPORT int FPDF_CALLCONV FPDF_StructElement_CountChildren(FPDF_STRUCTELEMENT struct_element)
FPDF_EXPORT int FPDF_CALLCONV FPDF_StructElement_GetMarkedContentIdCount(FPDF_STRUCTELEMENT struct_element)
FPDF_EXPORT unsigned long FPDF_CALLCONV FPDF_StructElement_GetTitle(FPDF_STRUCTELEMENT struct_element, void *buffer, unsigned long buflen)
#define FPDF_OBJECT_UNKNOWN
pdfium::CheckedNumeric< int32_t > FX_SAFE_INT32
fxcrt::WideString WideString