diff options
author | Jane Liu <janeliulwq@google.com> | 2017-07-11 15:16:08 -0400 |
---|---|---|
committer | Chromium commit bot <commit-bot@chromium.org> | 2017-07-12 20:12:44 +0000 |
commit | dc1aa325c22a3d6cd240efa9d35f9e175fe8455b (patch) | |
tree | ccaec7e2305811fc68e34091370dcb17221aab14 /core/fpdfdoc/cpdf_filespec.cpp | |
parent | d79ac21b7595442bce82ec93f59cda9f8fb3cb24 (diff) | |
download | pdfium-dc1aa325c22a3d6cd240efa9d35f9e175fe8455b.tar.xz |
Added helper functions in the class CPDF_FileSpec
1. Added two helper functions in CPDF_FileSpec, which will be useful
when adding support for embedded files:
CPDF_FileSpec::GetFileStream() - useful because the stream object
contains the file's data
CPDF_FileSpec::GetParamsDict() - useful because the params dictionary
contains parameters of the file, such as creation date, size, etc.
* Added two unit tests testing both functions.
Bug=pdfium:174
Change-Id: I33ea21ddb621434007f94767f281ead0b00ecb8a
Reviewed-on: https://pdfium-review.googlesource.com/7355
Reviewed-by: dsinclair <dsinclair@chromium.org>
Reviewed-by: Lei Zhang <thestig@chromium.org>
Commit-Queue: Jane Liu <janeliulwq@google.com>
Diffstat (limited to 'core/fpdfdoc/cpdf_filespec.cpp')
-rw-r--r-- | core/fpdfdoc/cpdf_filespec.cpp | 49 |
1 files changed, 44 insertions, 5 deletions
diff --git a/core/fpdfdoc/cpdf_filespec.cpp b/core/fpdfdoc/cpdf_filespec.cpp index 59915eaa05..7d1f0e68b9 100644 --- a/core/fpdfdoc/cpdf_filespec.cpp +++ b/core/fpdfdoc/cpdf_filespec.cpp @@ -6,9 +6,12 @@ #include "core/fpdfdoc/cpdf_filespec.h" +#include <vector> + #include "core/fpdfapi/parser/cpdf_dictionary.h" #include "core/fpdfapi/parser/cpdf_name.h" #include "core/fpdfapi/parser/cpdf_object.h" +#include "core/fpdfapi/parser/cpdf_stream.h" #include "core/fpdfapi/parser/cpdf_string.h" #include "core/fpdfapi/parser/fpdf_parser_decode.h" #include "core/fxcrt/fx_system.h" @@ -50,6 +53,12 @@ CFX_WideString ChangeSlashToPDF(const wchar_t* str) { } // namespace +CPDF_FileSpec::CPDF_FileSpec(CPDF_Object* pObj) : m_pObj(pObj) { + ASSERT(m_pObj); +} + +CPDF_FileSpec::~CPDF_FileSpec() {} + CFX_WideString CPDF_FileSpec::DecodeFileName(const CFX_WideString& filepath) { if (filepath.GetLength() <= 1) return CFX_WideString(); @@ -112,9 +121,42 @@ bool CPDF_FileSpec::GetFileName(CFX_WideString* csFileName) const { return true; } -CPDF_FileSpec::CPDF_FileSpec(CPDF_Object* pObj) : m_pObj(pObj) {} +CPDF_Stream* CPDF_FileSpec::GetFileStream() const { + CPDF_Dictionary* pDict = m_pObj->AsDictionary(); + if (!pDict) + return nullptr; + + // Get the embedded files dictionary. + CPDF_Dictionary* pFiles = pDict->GetDictFor("EF"); + if (!pFiles) + return nullptr; + + // Get the file stream of the highest precedence with its file specification + // string available. Follows the same precedence order as GetFileName(). + constexpr const char* keys[] = {"UF", "F", "DOS", "Mac", "Unix"}; + size_t end = pDict->GetStringFor("FS") == "URL" ? 2 : FX_ArraySize(keys); + for (size_t i = 0; i < end; ++i) { + const CFX_ByteString& key = keys[i]; + if (!pDict->GetUnicodeTextFor(key).IsEmpty()) { + CPDF_Stream* pStream = pFiles->GetStreamFor(key); + if (pStream) + return pStream; + } + } + return nullptr; +} -CPDF_FileSpec::~CPDF_FileSpec() {} +CPDF_Dictionary* CPDF_FileSpec::GetParamsDict() const { + CPDF_Stream* pStream = GetFileStream(); + if (!pStream) + return nullptr; + + CPDF_Dictionary* pDict = pStream->GetDict(); + if (!pDict) + return nullptr; + + return pDict->GetDictFor("Params"); +} CFX_WideString CPDF_FileSpec::EncodeFileName(const CFX_WideString& filepath) { if (filepath.GetLength() <= 1) @@ -146,9 +188,6 @@ CFX_WideString CPDF_FileSpec::EncodeFileName(const CFX_WideString& filepath) { } void CPDF_FileSpec::SetFileName(const CFX_WideString& wsFileName) { - if (!m_pObj) - return; - CFX_WideString wsStr = EncodeFileName(wsFileName); if (m_pObj->IsString()) { m_pObj->SetString(CFX_ByteString::FromUnicode(wsStr)); |