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