xref: /aosp_15_r20/external/pdfium/core/fpdfdoc/cpdf_bookmark.cpp (revision 3ac0a46f773bac49fa9476ec2b1cf3f8da5ec3a4)
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/fpdfdoc/cpdf_bookmark.h"
8 
9 #include <utility>
10 
11 #include "core/fpdfapi/parser/cpdf_array.h"
12 #include "core/fpdfapi/parser/cpdf_dictionary.h"
13 #include "core/fpdfapi/parser/cpdf_string.h"
14 #include "core/fxcrt/data_vector.h"
15 #include "core/fxge/dib/fx_dib.h"
16 
17 CPDF_Bookmark::CPDF_Bookmark() = default;
18 
19 CPDF_Bookmark::CPDF_Bookmark(const CPDF_Bookmark& that) = default;
20 
CPDF_Bookmark(RetainPtr<const CPDF_Dictionary> pDict)21 CPDF_Bookmark::CPDF_Bookmark(RetainPtr<const CPDF_Dictionary> pDict)
22     : m_pDict(std::move(pDict)) {}
23 
24 CPDF_Bookmark::~CPDF_Bookmark() = default;
25 
GetTitle() const26 WideString CPDF_Bookmark::GetTitle() const {
27   if (!m_pDict)
28     return WideString();
29 
30   RetainPtr<const CPDF_String> pString =
31       ToString(m_pDict->GetDirectObjectFor("Title"));
32   if (!pString)
33     return WideString();
34 
35   WideString title = pString->GetUnicodeText();
36   size_t len = title.GetLength();
37   if (!len)
38     return WideString();
39 
40   DataVector<wchar_t> buf(len);
41   for (size_t i = 0; i < len; i++) {
42     wchar_t w = title[i];
43     buf[i] = w > 0x20 ? w : 0x20;
44   }
45   return WideString(buf.data(), len);
46 }
47 
GetDest(CPDF_Document * pDocument) const48 CPDF_Dest CPDF_Bookmark::GetDest(CPDF_Document* pDocument) const {
49   if (!m_pDict)
50     return CPDF_Dest(nullptr);
51   return CPDF_Dest::Create(pDocument, m_pDict->GetDirectObjectFor("Dest"));
52 }
53 
GetAction() const54 CPDF_Action CPDF_Bookmark::GetAction() const {
55   return CPDF_Action(m_pDict ? m_pDict->GetDictFor("A") : nullptr);
56 }
57 
GetCount() const58 int CPDF_Bookmark::GetCount() const {
59   return m_pDict->GetIntegerFor("Count");
60 }
61