blob: 241b398df4cfeaed6204062777bcb610e2a67993 [file] [log] [blame]
kumarashishg826308d2023-06-23 13:21:22 +00001// Copyright 2016 The PDFium Authors
Philip P. Moltmann4d3acf42017-03-20 11:05:52 -07002// 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_REFERENCE_H_
8#define CORE_FPDFAPI_PARSER_CPDF_REFERENCE_H_
9
Philip P. Moltmann4d3acf42017-03-20 11:05:52 -070010#include <set>
11
12#include "core/fpdfapi/parser/cpdf_object.h"
kumarashishg826308d2023-06-23 13:21:22 +000013#include "core/fxcrt/retain_ptr.h"
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -070014#include "core/fxcrt/unowned_ptr.h"
Philip P. Moltmann4d3acf42017-03-20 11:05:52 -070015
16class CPDF_IndirectObjectHolder;
17
Haibo Huang49cc9302020-04-27 16:14:24 -070018class CPDF_Reference final : public CPDF_Object {
Philip P. Moltmann4d3acf42017-03-20 11:05:52 -070019 public:
kumarashishg826308d2023-06-23 13:21:22 +000020 CONSTRUCT_VIA_MAKE_RETAIN;
Philip P. Moltmann4d3acf42017-03-20 11:05:52 -070021
22 // CPDF_Object:
23 Type GetType() const override;
Haibo Huang49cc9302020-04-27 16:14:24 -070024 RetainPtr<CPDF_Object> Clone() const override;
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -070025 ByteString GetString() const override;
26 float GetNumber() const override;
Philip P. Moltmann4d3acf42017-03-20 11:05:52 -070027 int GetInteger() const override;
kumarashishg826308d2023-06-23 13:21:22 +000028 CPDF_Reference* AsMutableReference() override;
Haibo Huang49cc9302020-04-27 16:14:24 -070029 bool WriteTo(IFX_ArchiveStream* archive,
30 const CPDF_Encryptor* encryptor) const override;
kumarashishg826308d2023-06-23 13:21:22 +000031 RetainPtr<CPDF_Reference> MakeReference(
Haibo Huang49cc9302020-04-27 16:14:24 -070032 CPDF_IndirectObjectHolder* holder) const override;
Philip P. Moltmann4d3acf42017-03-20 11:05:52 -070033
Philip P. Moltmann4d3acf42017-03-20 11:05:52 -070034 uint32_t GetRefObjNum() const { return m_RefObjNum; }
kumarashishg826308d2023-06-23 13:21:22 +000035 bool HasIndirectObjectHolder() const { return !!m_pObjList; }
Philip P. Moltmann4d3acf42017-03-20 11:05:52 -070036 void SetRef(CPDF_IndirectObjectHolder* pDoc, uint32_t objnum);
37
Haibo Huang49cc9302020-04-27 16:14:24 -070038 private:
kumarashishg826308d2023-06-23 13:21:22 +000039 friend class CPDF_Dictionary;
40
Haibo Huang49cc9302020-04-27 16:14:24 -070041 CPDF_Reference(CPDF_IndirectObjectHolder* pDoc, uint32_t objnum);
42 ~CPDF_Reference() override;
43
kumarashishg826308d2023-06-23 13:21:22 +000044 const CPDF_Object* GetDirectInternal() const override;
45 const CPDF_Dictionary* GetDictInternal() const override;
Haibo Huang49cc9302020-04-27 16:14:24 -070046 RetainPtr<CPDF_Object> CloneNonCyclic(
Philip P. Moltmann4d3acf42017-03-20 11:05:52 -070047 bool bDirect,
48 std::set<const CPDF_Object*>* pVisited) const override;
kumarashishg826308d2023-06-23 13:21:22 +000049
50 const CPDF_Object* FastGetDirect() const;
Philip P. Moltmann4d3acf42017-03-20 11:05:52 -070051
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -070052 UnownedPtr<CPDF_IndirectObjectHolder> m_pObjList;
Philip P. Moltmann4d3acf42017-03-20 11:05:52 -070053 uint32_t m_RefObjNum;
54};
55
56inline CPDF_Reference* ToReference(CPDF_Object* obj) {
kumarashishg826308d2023-06-23 13:21:22 +000057 return obj ? obj->AsMutableReference() : nullptr;
Philip P. Moltmann4d3acf42017-03-20 11:05:52 -070058}
59
60inline const CPDF_Reference* ToReference(const CPDF_Object* obj) {
61 return obj ? obj->AsReference() : nullptr;
62}
63
kumarashishg826308d2023-06-23 13:21:22 +000064inline RetainPtr<CPDF_Reference> ToReference(RetainPtr<CPDF_Object> obj) {
65 return RetainPtr<CPDF_Reference>(ToReference(obj.Get()));
66}
67
68inline RetainPtr<const CPDF_Reference> ToReference(
69 RetainPtr<const CPDF_Object> obj) {
70 return RetainPtr<const CPDF_Reference>(ToReference(obj.Get()));
71}
72
Philip P. Moltmann4d3acf42017-03-20 11:05:52 -070073#endif // CORE_FPDFAPI_PARSER_CPDF_REFERENCE_H_