5#include "public/fpdf_attachment.h"
13#include "constants/stream_dict_common.h"
14#include "core/fdrm/fx_crypt.h"
15#include "core/fpdfapi/parser/cpdf_array.h"
16#include "core/fpdfapi/parser/cpdf_dictionary.h"
17#include "core/fpdfapi/parser/cpdf_document.h"
18#include "core/fpdfapi/parser/cpdf_name.h"
19#include "core/fpdfapi/parser/cpdf_number.h"
20#include "core/fpdfapi/parser/cpdf_reference.h"
21#include "core/fpdfapi/parser/cpdf_stream.h"
22#include "core/fpdfapi/parser/cpdf_string.h"
23#include "core/fpdfapi/parser/fpdf_parser_decode.h"
24#include "core/fpdfdoc/cpdf_filespec.h"
25#include "core/fpdfdoc/cpdf_nametree.h"
26#include "core/fxcodec/data_and_bytes_consumed.h"
27#include "core/fxcrt/cfx_datetime.h"
28#include "core/fxcrt/data_vector.h"
29#include "core/fxcrt/fx_extension.h"
30#include "core/fxcrt/numerics/safe_conversions.h"
31#include "fpdfsdk/cpdfsdk_helpers.h"
35constexpr char kChecksumKey[] =
"CheckSum";
45 auto name_tree = CPDF_NameTree::Create(pDoc,
"EmbeddedFiles");
46 return name_tree ?
pdfium::checked_cast<
int>(name_tree->GetCount()) : 0;
61 CPDF_NameTree::CreateWithRootNameArray(pDoc,
"EmbeddedFiles");
67 pFile->SetNewFor<CPDF_Name>(
"Type",
"Filespec");
68 pFile->SetNewFor<CPDF_String>(
"UF", wsName.AsStringView());
72 if (!name_tree->AddValueAndName(pFile->MakeReference(pDoc), wsName))
76 return FPDFAttachmentFromCPDFObject(pFile);
82 if (!pDoc || index < 0)
85 auto name_tree = CPDF_NameTree::Create(pDoc,
"EmbeddedFiles");
86 if (!name_tree ||
static_cast<size_t>(index) >= name_tree->GetCount())
92 return FPDFAttachmentFromCPDFObject(
93 name_tree->LookupValueAndName(index, &csName));
99 if (!pDoc || index < 0)
102 auto name_tree = CPDF_NameTree::Create(pDoc,
"EmbeddedFiles");
103 if (!name_tree ||
static_cast<size_t>(index) >= name_tree->GetCount())
106 return name_tree->DeleteValueAndName(index);
112 unsigned long buflen) {
119 return Utf16EncodeMaybeCopyAndReturnLength(
120 spec.GetFileName(),
UNSAFE_BUFFERS(SpanFromFPDFApiArgs(buffer, buflen)));
131 return pParamsDict ? pParamsDict->KeyExist(key) : 0;
148 FPDF_WIDESTRING value) {
161 if (bsKey
== kChecksumKey) {
162 pParamsDict->SetNewFor<CPDF_String>(bsKey,
163 HexDecode(bsValue.unsigned_span()).data,
164 CPDF_String::DataType::kIsHex);
166 pParamsDict->SetNewFor<CPDF_String>(bsKey, bsValue);
175 unsigned long buflen) {
188 auto buffer_span =
UNSAFE_BUFFERS(SpanFromFPDFApiArgs(buffer, buflen));
192 if (!object || (!object->IsString() && !object->IsName())) {
194 return Utf16EncodeMaybeCopyAndReturnLength(WideString(), buffer_span);
197 if (key_str
== kChecksumKey) {
198 RetainPtr<
const CPDF_String> string_object = ToString(object);
199 if (string_object && string_object->IsHex()) {
201 PDF_HexEncodeString(string_object->GetString().AsStringView());
202 return Utf16EncodeMaybeCopyAndReturnLength(
203 PDF_DecodeText(encoded.unsigned_span()), buffer_span);
207 return Utf16EncodeMaybeCopyAndReturnLength(object->GetUnicodeText(),
213 FPDF_DOCUMENT document,
214 const void* contents,
217 if (!contents && len != 0) {
223 if (!pFile || !pFile->IsDictionary() || !pDoc || len > INT_MAX) {
229 auto pParamsDict = pFileStreamDict->SetNewFor<
CPDF_Dictionary>(
"Params");
233 static_cast<
int>(len));
234 pParamsDict->SetNewFor<CPDF_Number>(
"Size",
static_cast<
int>(len));
238 pParamsDict->SetNewFor<CPDF_String>(
247 pdfium::make_span(
static_cast<
const uint8_t*>(contents), len));
249 std::array<uint8_t, 16> digest;
250 CRYPT_MD5Generate(contents_span, digest);
253 pParamsDict->SetNewFor<CPDF_String>(kChecksumKey, digest,
257 auto pFileStream = pDoc->NewIndirect<CPDF_Stream>(
258 DataVector<uint8_t>(contents_span.begin(), contents_span.end()),
259 std::move(pFileStreamDict));
262 pEFDict->SetNewFor<CPDF_Reference>(
"F", pDoc, pFileStream->GetObjNum());
269 unsigned long buflen,
270 unsigned long* out_buflen) {
279 RetainPtr<
const CPDF_Stream> pFileStream = spec.GetFileStream();
284 *out_buflen = DecodeStreamMaybeCopyAndReturnLength(
285 std::move(pFileStream),
287 static_cast<size_t>(buflen))));
fxcrt::ByteString ByteString
static CFX_DateTime Now()
uint8_t GetSecond() const
uint8_t GetMinute() const
std::map< ByteString, RetainPtr< CPDF_Object >, std::less<> > DictMap
virtual CPDF_Dictionary * AsMutableDictionary()
static ByteString Format(const char *pFormat,...)
bool operator==(const char *ptr) const
#define UNSAFE_BUFFERS(...)
UNSAFE_BUFFER_USAGE WideString WideStringFromFPDFWideString(FPDF_WIDESTRING wide_string)
UNSAFE_BUFFER_USAGE ByteString ByteStringFromFPDFWideString(FPDF_WIDESTRING wide_string)
CPDF_Object * CPDFObjectFromFPDFAttachment(FPDF_ATTACHMENT attachment)
CPDF_Document * CPDFDocumentFromFPDFDocument(FPDF_DOCUMENT doc)
FPDF_EXPORT FPDF_OBJECT_TYPE FPDF_CALLCONV FPDFAttachment_GetValueType(FPDF_ATTACHMENT attachment, FPDF_BYTESTRING key)
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDFAttachment_SetFile(FPDF_ATTACHMENT attachment, FPDF_DOCUMENT document, const void *contents, unsigned long len)
FPDF_EXPORT unsigned long FPDF_CALLCONV FPDFAttachment_GetStringValue(FPDF_ATTACHMENT attachment, FPDF_BYTESTRING key, FPDF_WCHAR *buffer, unsigned long buflen)
FPDF_EXPORT int FPDF_CALLCONV FPDFDoc_GetAttachmentCount(FPDF_DOCUMENT document)
FPDF_EXPORT unsigned long FPDF_CALLCONV FPDFAttachment_GetName(FPDF_ATTACHMENT attachment, FPDF_WCHAR *buffer, unsigned long buflen)
FPDF_EXPORT FPDF_ATTACHMENT FPDF_CALLCONV FPDFDoc_AddAttachment(FPDF_DOCUMENT document, FPDF_WIDESTRING name)
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDFDoc_DeleteAttachment(FPDF_DOCUMENT document, int index)
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDFAttachment_SetStringValue(FPDF_ATTACHMENT attachment, FPDF_BYTESTRING key, FPDF_WIDESTRING value)
FPDF_EXPORT FPDF_ATTACHMENT FPDF_CALLCONV FPDFDoc_GetAttachment(FPDF_DOCUMENT document, int index)
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDFAttachment_GetFile(FPDF_ATTACHMENT attachment, void *buffer, unsigned long buflen, unsigned long *out_buflen)
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDFAttachment_HasKey(FPDF_ATTACHMENT attachment, FPDF_BYTESTRING key)
#define FPDF_OBJECT_UNKNOWN
fxcrt::WideString WideString