• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_string.h"
8 
9 #include <stdint.h>
10 
11 #include <utility>
12 
13 #include "core/fpdfapi/parser/cpdf_encryptor.h"
14 #include "core/fpdfapi/parser/fpdf_parser_decode.h"
15 #include "core/fxcrt/data_vector.h"
16 #include "core/fxcrt/fx_stream.h"
17 
18 CPDF_String::CPDF_String() = default;
19 
CPDF_String(WeakPtr<ByteStringPool> pPool,const ByteString & str,bool bHex)20 CPDF_String::CPDF_String(WeakPtr<ByteStringPool> pPool,
21                          const ByteString& str,
22                          bool bHex)
23     : m_String(str), m_bHex(bHex) {
24   if (pPool)
25     m_String = pPool->Intern(m_String);
26 }
27 
CPDF_String(WeakPtr<ByteStringPool> pPool,WideStringView str)28 CPDF_String::CPDF_String(WeakPtr<ByteStringPool> pPool, WideStringView str)
29     : m_String(PDF_EncodeText(str)) {
30   if (pPool)
31     m_String = pPool->Intern(m_String);
32 }
33 
34 CPDF_String::~CPDF_String() = default;
35 
GetType() const36 CPDF_Object::Type CPDF_String::GetType() const {
37   return kString;
38 }
39 
Clone() const40 RetainPtr<CPDF_Object> CPDF_String::Clone() const {
41   auto pRet = pdfium::MakeRetain<CPDF_String>();
42   pRet->m_String = m_String;
43   pRet->m_bHex = m_bHex;
44   return pRet;
45 }
46 
GetString() const47 ByteString CPDF_String::GetString() const {
48   return m_String;
49 }
50 
SetString(const ByteString & str)51 void CPDF_String::SetString(const ByteString& str) {
52   m_String = str;
53 }
54 
AsMutableString()55 CPDF_String* CPDF_String::AsMutableString() {
56   return this;
57 }
58 
GetUnicodeText() const59 WideString CPDF_String::GetUnicodeText() const {
60   return PDF_DecodeText(m_String.raw_span());
61 }
62 
WriteTo(IFX_ArchiveStream * archive,const CPDF_Encryptor * encryptor) const63 bool CPDF_String::WriteTo(IFX_ArchiveStream* archive,
64                           const CPDF_Encryptor* encryptor) const {
65   DataVector<uint8_t> encrypted_data;
66   pdfium::span<const uint8_t> data = m_String.raw_span();
67   if (encryptor) {
68     encrypted_data = encryptor->Encrypt(data);
69     data = encrypted_data;
70   }
71   ByteStringView raw(data.data(), data.size());
72   ByteString content =
73       m_bHex ? PDF_HexEncodeString(raw) : PDF_EncodeString(raw);
74   return archive->WriteString(content.AsStringView());
75 }
76 
EncodeString() const77 ByteString CPDF_String::EncodeString() const {
78   return m_bHex ? PDF_HexEncodeString(m_String.AsStringView())
79                 : PDF_EncodeString(m_String.AsStringView());
80 }
81