From 2617056df6d6e1d0f17031f0c9db09f9192cb0fa Mon Sep 17 00:00:00 2001 From: Lei Zhang Date: Tue, 17 Apr 2018 17:01:52 +0000 Subject: Add constants for PDF 1.7 spec, table 3.4. Add constants/stream_dict_common.h. The header lists all the constants in the table in the same order. Constants that are not used at all are commented out. BUG=pdfium:1049 Change-Id: I6539090e0ad56319ea628883e388aeacef044e52 Reviewed-on: https://pdfium-review.googlesource.com/29090 Reviewed-by: dsinclair Commit-Queue: Lei Zhang --- BUILD.gn | 7 ++++++ DEPS | 1 + constants/stream_dict_common.h | 27 ++++++++++++++++++++ core/fpdfapi/edit/cpdf_flateencoder.cpp | 3 ++- core/fpdfapi/page/cpdf_image.cpp | 4 ++- core/fpdfapi/page/cpdf_streamparser.cpp | 5 ++-- core/fpdfapi/parser/cpdf_object_unittest.cpp | 37 +++++++++++++++++----------- core/fpdfapi/parser/cpdf_stream.cpp | 3 ++- core/fpdfapi/parser/fpdf_parser_decode.cpp | 3 ++- core/fpdfdoc/cpdf_action.cpp | 6 +++-- core/fpdfdoc/cpdf_filespec.cpp | 8 +++--- core/fpdfdoc/cpdf_interform.cpp | 3 ++- fpdfsdk/cpdfsdk_helpers.cpp | 4 ++- fpdfsdk/fpdf_attachment.cpp | 6 +++-- 14 files changed, 87 insertions(+), 30 deletions(-) create mode 100644 constants/stream_dict_common.h diff --git a/BUILD.gn b/BUILD.gn index 5d69b8d5bd..e78b2cf6e4 100644 --- a/BUILD.gn +++ b/BUILD.gn @@ -192,6 +192,7 @@ jumbo_static_library("pdfium") { configs += [ ":pdfium_core_config" ] deps = [ + ":constants", ":fdrm", ":formfiller", ":fpdfapi", @@ -291,6 +292,12 @@ visibility = [ "//:gn_visibility", ] +source_set("constants") { + sources = [ + "constants/stream_dict_common.h", + ] +} + jumbo_static_library("fdrm") { sources = [ "core/fdrm/crypto/fx_crypt.cpp", diff --git a/DEPS b/DEPS index 38ff99db05..476f404175 100644 --- a/DEPS +++ b/DEPS @@ -138,6 +138,7 @@ recursedeps = [ include_rules = [ # Basic stuff that everyone can use. # Note: public is not here because core cannot depend on public. + '+constants', '+testing', '+third_party/base', ] diff --git a/constants/stream_dict_common.h b/constants/stream_dict_common.h new file mode 100644 index 0000000000..fc12622b61 --- /dev/null +++ b/constants/stream_dict_common.h @@ -0,0 +1,27 @@ +// Copyright 2018 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CONSTANTS_STREAM_DICT_COMMON_H_ +#define CONSTANTS_STREAM_DICT_COMMON_H_ + +namespace pdfium { +namespace stream { + +// PDF 1.7 spec, table 3.4. +// Entries common to all stream dictionaries. + +// TODO(https://crbug.com/pdfium/1049): Examine all usages of "Length", +// "Filter", and "F". +constexpr char kLength[] = "Length"; +constexpr char kFilter[] = "Filter"; +constexpr char kDecodeParms[] = "DecodeParms"; +constexpr char kF[] = "F"; +// constexpr char kFFilter[] = "FFilter"; +// constexpr char kFDecodeParms[] = "FDecodeParms"; +constexpr char kDL[] = "DL"; + +} // namespace stream +} // namespace pdfium + +#endif // CONSTANTS_STREAM_DICT_COMMON_H_ diff --git a/core/fpdfapi/edit/cpdf_flateencoder.cpp b/core/fpdfapi/edit/cpdf_flateencoder.cpp index 9826932d2a..f6125b8847 100644 --- a/core/fpdfapi/edit/cpdf_flateencoder.cpp +++ b/core/fpdfapi/edit/cpdf_flateencoder.cpp @@ -8,6 +8,7 @@ #include +#include "constants/stream_dict_common.h" #include "core/fpdfapi/parser/cpdf_name.h" #include "core/fpdfapi/parser/cpdf_number.h" #include "core/fpdfapi/parser/fpdf_parser_decode.h" @@ -43,7 +44,7 @@ CPDF_FlateEncoder::CPDF_FlateEncoder(const CPDF_Stream* pStream, m_pDict = ToDictionary(pStream->GetDict()->Clone()); m_pDict->SetNewFor("Length", static_cast(m_dwSize)); m_pDict->SetNewFor("Filter", "FlateDecode"); - m_pDict->RemoveFor("DecodeParms"); + m_pDict->RemoveFor(pdfium::stream::kDecodeParms); } CPDF_FlateEncoder::~CPDF_FlateEncoder() {} diff --git a/core/fpdfapi/page/cpdf_image.cpp b/core/fpdfapi/page/cpdf_image.cpp index ec826dc5ed..68a6a3243c 100644 --- a/core/fpdfapi/page/cpdf_image.cpp +++ b/core/fpdfapi/page/cpdf_image.cpp @@ -11,6 +11,7 @@ #include #include +#include "constants/stream_dict_common.h" #include "core/fpdfapi/cpdf_modulemgr.h" #include "core/fpdfapi/page/cpdf_page.h" #include "core/fpdfapi/parser/cpdf_array.h" @@ -105,7 +106,8 @@ std::unique_ptr CPDF_Image::InitJPEG(uint8_t* pData, pDict->SetNewFor("BitsPerComponent", bits); pDict->SetNewFor("Filter", "DCTDecode"); if (!color_trans) { - CPDF_Dictionary* pParms = pDict->SetNewFor("DecodeParms"); + CPDF_Dictionary* pParms = + pDict->SetNewFor(pdfium::stream::kDecodeParms); pParms->SetNewFor("ColorTransform", 0); } m_bIsMask = false; diff --git a/core/fpdfapi/page/cpdf_streamparser.cpp b/core/fpdfapi/page/cpdf_streamparser.cpp index 82f31dd007..b6658ee5fb 100644 --- a/core/fpdfapi/page/cpdf_streamparser.cpp +++ b/core/fpdfapi/page/cpdf_streamparser.cpp @@ -13,6 +13,7 @@ #include #include +#include "constants/stream_dict_common.h" #include "core/fpdfapi/cpdf_modulemgr.h" #include "core/fpdfapi/page/cpdf_docpagedata.h" #include "core/fpdfapi/parser/cpdf_array.h" @@ -126,12 +127,12 @@ std::unique_ptr CPDF_StreamParser::ReadInlineStream( if (pFilter) { if (CPDF_Array* pArray = pFilter->AsArray()) { Decoder = pArray->GetStringAt(0); - CPDF_Array* pParams = pDict->GetArrayFor("DecodeParms"); + CPDF_Array* pParams = pDict->GetArrayFor(pdfium::stream::kDecodeParms); if (pParams) pParam = pParams->GetDictAt(0); } else { Decoder = pFilter->GetString(); - pParam = pDict->GetDictFor("DecodeParms"); + pParam = pDict->GetDictFor(pdfium::stream::kDecodeParms); } } uint32_t width = pDict->GetIntegerFor("Width"); diff --git a/core/fpdfapi/parser/cpdf_object_unittest.cpp b/core/fpdfapi/parser/cpdf_object_unittest.cpp index 4b16021069..4780e87bc0 100644 --- a/core/fpdfapi/parser/cpdf_object_unittest.cpp +++ b/core/fpdfapi/parser/cpdf_object_unittest.cpp @@ -7,6 +7,7 @@ #include #include +#include "constants/stream_dict_common.h" #include "core/fpdfapi/parser/cpdf_array.h" #include "core/fpdfapi/parser/cpdf_boolean.h" #include "core/fpdfapi/parser/cpdf_dictionary.h" @@ -790,21 +791,25 @@ TEST(PDFStreamTest, SetData) { stream->InitStream(data.data(), data.size(), pdfium::MakeUnique()); EXPECT_EQ(static_cast(data.size()), - stream->GetDict()->GetIntegerFor("Length")); + stream->GetDict()->GetIntegerFor(pdfium::stream::kLength)); - stream->GetDict()->SetNewFor("Filter", L"SomeFilter"); - stream->GetDict()->SetNewFor("DecodeParms", L"SomeParams"); + stream->GetDict()->SetNewFor(pdfium::stream::kFilter, + L"SomeFilter"); + stream->GetDict()->SetNewFor(pdfium::stream::kDecodeParms, + L"SomeParams"); std::vector new_data(data.size() * 2); stream->SetData(new_data.data(), new_data.size()); // The "Length" field should be updated for new data size. EXPECT_EQ(static_cast(new_data.size()), - stream->GetDict()->GetIntegerFor("Length")); + stream->GetDict()->GetIntegerFor(pdfium::stream::kLength)); // The "Filter" and "DecodeParms" fields should not be changed. - EXPECT_EQ(stream->GetDict()->GetUnicodeTextFor("Filter"), L"SomeFilter"); - EXPECT_EQ(stream->GetDict()->GetUnicodeTextFor("DecodeParms"), L"SomeParams"); + EXPECT_EQ(stream->GetDict()->GetUnicodeTextFor(pdfium::stream::kFilter), + L"SomeFilter"); + EXPECT_EQ(stream->GetDict()->GetUnicodeTextFor(pdfium::stream::kDecodeParms), + L"SomeParams"); } TEST(PDFStreamTest, SetDataAndRemoveFilter) { @@ -813,20 +818,22 @@ TEST(PDFStreamTest, SetDataAndRemoveFilter) { stream->InitStream(data.data(), data.size(), pdfium::MakeUnique()); EXPECT_EQ(static_cast(data.size()), - stream->GetDict()->GetIntegerFor("Length")); + stream->GetDict()->GetIntegerFor(pdfium::stream::kLength)); - stream->GetDict()->SetNewFor("Filter", L"SomeFilter"); - stream->GetDict()->SetNewFor("DecodeParms", L"SomeParams"); + stream->GetDict()->SetNewFor(pdfium::stream::kFilter, + L"SomeFilter"); + stream->GetDict()->SetNewFor(pdfium::stream::kDecodeParms, + L"SomeParams"); std::vector new_data(data.size() * 2); stream->SetDataAndRemoveFilter(new_data.data(), new_data.size()); // The "Length" field should be updated for new data size. EXPECT_EQ(static_cast(new_data.size()), - stream->GetDict()->GetIntegerFor("Length")); + stream->GetDict()->GetIntegerFor(pdfium::stream::kLength)); // The "Filter" and "DecodeParms" should be removed. - EXPECT_FALSE(stream->GetDict()->KeyExist("Filter")); - EXPECT_FALSE(stream->GetDict()->KeyExist("DecodeParms")); + EXPECT_FALSE(stream->GetDict()->KeyExist(pdfium::stream::kFilter)); + EXPECT_FALSE(stream->GetDict()->KeyExist(pdfium::stream::kDecodeParms)); } TEST(PDFStreamTest, LengthInDictionaryOnCreate) { @@ -838,18 +845,18 @@ TEST(PDFStreamTest, LengthInDictionaryOnCreate) { auto stream = pdfium::MakeUnique( std::move(data), kBufSize, pdfium::MakeUnique()); EXPECT_EQ(static_cast(kBufSize), - stream->GetDict()->GetIntegerFor("Length")); + stream->GetDict()->GetIntegerFor(pdfium::stream::kLength)); } // The length field should be corrected on stream create. { std::unique_ptr data; data.reset(FX_Alloc(uint8_t, kBufSize)); auto dict = pdfium::MakeUnique(); - dict->SetNewFor("Length", 30000); + dict->SetNewFor(pdfium::stream::kLength, 30000); auto stream = pdfium::MakeUnique(std::move(data), kBufSize, std::move(dict)); EXPECT_EQ(static_cast(kBufSize), - stream->GetDict()->GetIntegerFor("Length")); + stream->GetDict()->GetIntegerFor(pdfium::stream::kLength)); } } diff --git a/core/fpdfapi/parser/cpdf_stream.cpp b/core/fpdfapi/parser/cpdf_stream.cpp index 5ff748469b..45d2ebb30d 100644 --- a/core/fpdfapi/parser/cpdf_stream.cpp +++ b/core/fpdfapi/parser/cpdf_stream.cpp @@ -8,6 +8,7 @@ #include +#include "constants/stream_dict_common.h" #include "core/fpdfapi/parser/cpdf_dictionary.h" #include "core/fpdfapi/parser/cpdf_number.h" #include "core/fpdfapi/parser/cpdf_stream_acc.h" @@ -96,7 +97,7 @@ std::unique_ptr CPDF_Stream::CloneNonCyclic( void CPDF_Stream::SetDataAndRemoveFilter(const uint8_t* pData, uint32_t size) { SetData(pData, size); m_pDict->RemoveFor("Filter"); - m_pDict->RemoveFor("DecodeParms"); + m_pDict->RemoveFor(pdfium::stream::kDecodeParms); } void CPDF_Stream::SetDataAndRemoveFilter(std::ostringstream* stream) { diff --git a/core/fpdfapi/parser/fpdf_parser_decode.cpp b/core/fpdfapi/parser/fpdf_parser_decode.cpp index 90dca2edcb..e879615ddd 100644 --- a/core/fpdfapi/parser/fpdf_parser_decode.cpp +++ b/core/fpdfapi/parser/fpdf_parser_decode.cpp @@ -13,6 +13,7 @@ #include #include +#include "constants/stream_dict_common.h" #include "core/fpdfapi/cpdf_modulemgr.h" #include "core/fpdfapi/parser/cpdf_array.h" #include "core/fpdfapi/parser/cpdf_dictionary.h" @@ -344,7 +345,7 @@ bool PDF_DataDecode(const uint8_t* src_buf, return false; CPDF_Object* pParams = - pDict ? pDict->GetDirectObjectFor("DecodeParms") : nullptr; + pDict ? pDict->GetDirectObjectFor(pdfium::stream::kDecodeParms) : nullptr; std::vector> DecoderArray; if (CPDF_Array* pDecoders = pDecoder->AsArray()) { diff --git a/core/fpdfdoc/cpdf_action.cpp b/core/fpdfdoc/cpdf_action.cpp index 383f328b9f..4ac86fe104 100644 --- a/core/fpdfdoc/cpdf_action.cpp +++ b/core/fpdfdoc/cpdf_action.cpp @@ -6,6 +6,7 @@ #include "core/fpdfdoc/cpdf_action.h" +#include "constants/stream_dict_common.h" #include "core/fpdfapi/parser/cpdf_array.h" #include "core/fpdfapi/parser/cpdf_document.h" #include "core/fpdfdoc/cpdf_filespec.h" @@ -70,14 +71,15 @@ WideString CPDF_Action::GetFilePath() const { return WideString(); } - CPDF_Object* pFile = m_pDict->GetDirectObjectFor("F"); + CPDF_Object* pFile = m_pDict->GetDirectObjectFor(pdfium::stream::kF); if (pFile) return CPDF_FileSpec(pFile).GetFileName(); if (type == "Launch") { CPDF_Dictionary* pWinDict = m_pDict->GetDictFor("Win"); if (pWinDict) { - return WideString::FromLocal(pWinDict->GetStringFor("F").AsStringView()); + return WideString::FromLocal( + pWinDict->GetStringFor(pdfium::stream::kF).AsStringView()); } } return WideString(); diff --git a/core/fpdfdoc/cpdf_filespec.cpp b/core/fpdfdoc/cpdf_filespec.cpp index 2f999bcf4e..e741ac61ce 100644 --- a/core/fpdfdoc/cpdf_filespec.cpp +++ b/core/fpdfdoc/cpdf_filespec.cpp @@ -8,6 +8,7 @@ #include +#include "constants/stream_dict_common.h" #include "core/fpdfapi/parser/cpdf_dictionary.h" #include "core/fpdfapi/parser/cpdf_name.h" #include "core/fpdfapi/parser/cpdf_object.h" @@ -94,8 +95,8 @@ WideString CPDF_FileSpec::GetFileName() const { if (CPDF_Dictionary* pDict = m_pObj->AsDictionary()) { csFileName = pDict->GetUnicodeTextFor("UF"); if (csFileName.IsEmpty()) { - csFileName = - WideString::FromLocal(pDict->GetStringFor("F").AsStringView()); + csFileName = WideString::FromLocal( + pDict->GetStringFor(pdfium::stream::kF).AsStringView()); } if (pDict->GetStringFor("FS") == "URL") return csFileName; @@ -187,7 +188,8 @@ void CPDF_FileSpec::SetFileName(const WideString& wsFileName) { if (m_pObj->IsString()) { m_pObj->SetString(ByteString::FromUnicode(wsStr)); } else if (CPDF_Dictionary* pDict = m_pObj->AsDictionary()) { - pDict->SetNewFor("F", ByteString::FromUnicode(wsStr), false); + pDict->SetNewFor(pdfium::stream::kF, + ByteString::FromUnicode(wsStr), false); pDict->SetNewFor("UF", PDF_EncodeText(wsStr), false); } } diff --git a/core/fpdfdoc/cpdf_interform.cpp b/core/fpdfdoc/cpdf_interform.cpp index 6c53c971d8..6bf72fd5ef 100644 --- a/core/fpdfdoc/cpdf_interform.cpp +++ b/core/fpdfdoc/cpdf_interform.cpp @@ -9,6 +9,7 @@ #include #include +#include "constants/stream_dict_common.h" #include "core/fpdfapi/font/cpdf_font.h" #include "core/fpdfapi/font/cpdf_fontencoding.h" #include "core/fpdfapi/page/cpdf_page.h" @@ -1117,7 +1118,7 @@ std::unique_ptr CPDF_InterForm::ExportToFDF( if (bSimpleFileSpec) { WideString wsFilePath = CPDF_FileSpec::EncodeFileName(pdf_path); pMainDict->SetNewFor( - "F", ByteString::FromUnicode(wsFilePath), false); + pdfium::stream::kF, ByteString::FromUnicode(wsFilePath), false); pMainDict->SetNewFor("UF", PDF_EncodeText(wsFilePath), false); } else { diff --git a/fpdfsdk/cpdfsdk_helpers.cpp b/fpdfsdk/cpdfsdk_helpers.cpp index 16e7efc873..9cf4c44147 100644 --- a/fpdfsdk/cpdfsdk_helpers.cpp +++ b/fpdfsdk/cpdfsdk_helpers.cpp @@ -6,6 +6,7 @@ #include "fpdfsdk/cpdfsdk_helpers.h" +#include "constants/stream_dict_common.h" #include "core/fpdfapi/cpdf_modulemgr.h" #include "core/fpdfapi/parser/cpdf_array.h" #include "core/fpdfapi/parser/cpdf_document.h" @@ -350,7 +351,8 @@ unsigned long DecodeStreamMaybeCopyAndReturnLength(const CPDF_Stream* stream, uint32_t decoded_len = 0; ByteString dummy_last_decoder; CPDF_Dictionary* dummy_last_param; - if (PDF_DataDecode(data, len, dict, dict->GetIntegerFor("DL"), false, + if (PDF_DataDecode(data, len, dict, + dict->GetIntegerFor(pdfium::stream::kDL), false, &decoded_data, &decoded_len, &dummy_last_decoder, &dummy_last_param)) { if (buffer && buflen >= decoded_len) diff --git a/fpdfsdk/fpdf_attachment.cpp b/fpdfsdk/fpdf_attachment.cpp index 0bb9364834..25957174bc 100644 --- a/fpdfsdk/fpdf_attachment.cpp +++ b/fpdfsdk/fpdf_attachment.cpp @@ -7,6 +7,7 @@ #include #include +#include "constants/stream_dict_common.h" #include "core/fdrm/crypto/fx_crypt.h" #include "core/fpdfapi/parser/cpdf_array.h" #include "core/fpdfapi/parser/cpdf_document.h" @@ -90,7 +91,7 @@ FPDFDoc_AddAttachment(FPDF_DOCUMENT document, FPDF_WIDESTRING name) { CPDF_Dictionary* pFile = pDoc->NewIndirect(); pFile->SetNewFor("Type", "Filespec"); pFile->SetNewFor("UF", wsName); - pFile->SetNewFor("F", wsName); + pFile->SetNewFor(pdfium::stream::kF, wsName); // Add the new attachment name and filespec into the document's EmbeddedFiles. CPDF_NameTree nameTree(pDoc, "EmbeddedFiles"); @@ -230,7 +231,8 @@ FPDFAttachment_SetFile(FPDF_ATTACHMENT attachment, pFileStreamDict->SetNewFor("Params"); // Set the size of the new file in the dictionary. - pFileStreamDict->SetNewFor("DL", static_cast(len)); + pFileStreamDict->SetNewFor(pdfium::stream::kDL, + static_cast(len)); pParamsDict->SetNewFor("Size", static_cast(len)); // Set the creation date of the new attachment in the dictionary. -- cgit v1.2.3