Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
cpdf_reference.cpp
Go to the documentation of this file.
1// Copyright 2016 The PDFium Authors
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#include "core/fpdfapi/parser/cpdf_reference.h"
8
9#include "core/fpdfapi/parser/cpdf_dictionary.h"
10#include "core/fpdfapi/parser/cpdf_indirect_object_holder.h"
11#include "core/fxcrt/fx_stream.h"
12#include "third_party/base/check_op.h"
13#include "third_party/base/containers/contains.h"
14
15CPDF_Reference::CPDF_Reference(CPDF_IndirectObjectHolder* pDoc, uint32_t objnum)
16 : m_pObjList(pDoc), m_RefObjNum(objnum) {}
17
18CPDF_Reference::~CPDF_Reference() = default;
19
20CPDF_Object::Type CPDF_Reference::GetType() const {
21 return kReference;
22}
23
24ByteString CPDF_Reference::GetString() const {
25 const CPDF_Object* obj = FastGetDirect();
26 return obj ? obj->GetString() : ByteString();
27}
28
29float CPDF_Reference::GetNumber() const {
30 const CPDF_Object* obj = FastGetDirect();
31 return obj ? obj->GetNumber() : 0;
32}
33
34int CPDF_Reference::GetInteger() const {
35 const CPDF_Object* obj = FastGetDirect();
36 return obj ? obj->GetInteger() : 0;
37}
38
39const CPDF_Dictionary* CPDF_Reference::GetDictInternal() const {
40 const CPDF_Object* obj = FastGetDirect();
41 return obj ? obj->GetDictInternal() : nullptr;
42}
43
44CPDF_Reference* CPDF_Reference::AsMutableReference() {
45 return this;
46}
47
48RetainPtr<CPDF_Object> CPDF_Reference::Clone() const {
49 return CloneObjectNonCyclic(false);
50}
51
53 bool bDirect,
54 std::set<const CPDF_Object*>* pVisited) const {
55 pVisited->insert(this);
56 if (!bDirect) {
57 return pdfium::MakeRetain<CPDF_Reference>(m_pObjList, m_RefObjNum);
58 }
59 RetainPtr<const CPDF_Object> pDirect = GetDirect();
60 return pDirect && !pdfium::Contains(*pVisited, pDirect.Get())
61 ? pDirect->CloneNonCyclic(true, pVisited)
62 : nullptr;
63}
64
65const CPDF_Object* CPDF_Reference::FastGetDirect() const {
66 if (!m_pObjList)
67 return nullptr;
68 const CPDF_Object* obj =
69 m_pObjList->GetOrParseIndirectObjectInternal(m_RefObjNum);
70 return (obj && !obj->IsReference()) ? obj : nullptr;
71}
72
73void CPDF_Reference::SetRef(CPDF_IndirectObjectHolder* pDoc, uint32_t objnum) {
74 m_pObjList = pDoc;
75 m_RefObjNum = objnum;
76}
77
78const CPDF_Object* CPDF_Reference::GetDirectInternal() const {
79 return m_pObjList ? m_pObjList->GetOrParseIndirectObjectInternal(m_RefObjNum)
80 : nullptr;
81}
82
83bool CPDF_Reference::WriteTo(IFX_ArchiveStream* archive,
84 const CPDF_Encryptor* encryptor) const {
85 return archive->WriteString(" ") && archive->WriteDWord(GetRefObjNum()) &&
86 archive->WriteString(" 0 R ");
87}
88
89RetainPtr<CPDF_Reference> CPDF_Reference::MakeReference(
90 CPDF_IndirectObjectHolder* holder) const {
91 DCHECK_EQ(holder, m_pObjList);
92 // Do not allow reference to reference, just create other reference for same
93 // object.
94 return pdfium::MakeRetain<CPDF_Reference>(holder, GetRefObjNum());
95}
virtual ByteString GetString() const
virtual int GetInteger() const
virtual float GetNumber() const
bool IsReference() const
RetainPtr< CPDF_Object > CloneObjectNonCyclic(bool bDirect) const
virtual const CPDF_Dictionary * GetDictInternal() const
RetainPtr< CPDF_Object > CloneNonCyclic(bool bDirect, std::set< const CPDF_Object * > *pVisited) const override
void SetRef(CPDF_IndirectObjectHolder *pDoc, uint32_t objnum)
~CPDF_Reference() override
float GetNumber() const override
int GetInteger() const override
const CPDF_Dictionary * GetDictInternal() const override
const CPDF_Object * GetDirectInternal() const override
RetainPtr< CPDF_Reference > MakeReference(CPDF_IndirectObjectHolder *holder) const override
uint32_t GetRefObjNum() const
CPDF_Reference * AsMutableReference() override
bool WriteTo(IFX_ArchiveStream *archive, const CPDF_Encryptor *encryptor) const override
ByteString GetString() const override
Type GetType() const override
RetainPtr< CPDF_Object > Clone() const override
bool WriteString(ByteStringView str)
Definition fx_stream.cpp:47
bool WriteDWord(uint32_t i)
Definition fx_stream.cpp:55