From e04b66cc759c2cf0ceafae47340fdf9588ca2e23 Mon Sep 17 00:00:00 2001 From: dan sinclair Date: Fri, 13 Apr 2018 16:43:05 +0000 Subject: Move SharedForm check to CPDF_Metadata class This CL moves code related to shared form detection into the CPDF_Metadata class. This allows us to hide the usage of CXML inside CPDF_Metadata. Change-Id: I547471a2bcc119221565c415a58211c1500cbb3c Reviewed-on: https://pdfium-review.googlesource.com/30370 Reviewed-by: Henrique Nakashima Commit-Queue: dsinclair --- fpdfsdk/cpdfsdk_helpers.cpp | 54 ++++++++------------------------------------- fpdfsdk/fpdf_ext.cpp | 51 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+), 45 deletions(-) (limited to 'fpdfsdk') diff --git a/fpdfsdk/cpdfsdk_helpers.cpp b/fpdfsdk/cpdfsdk_helpers.cpp index 19252f7c5b..16e7efc873 100644 --- a/fpdfsdk/cpdfsdk_helpers.cpp +++ b/fpdfsdk/cpdfsdk_helpers.cpp @@ -13,8 +13,6 @@ #include "core/fpdfdoc/cpdf_annot.h" #include "core/fpdfdoc/cpdf_interform.h" #include "core/fpdfdoc/cpdf_metadata.h" -#include "core/fxcrt/xml/cxml_content.h" -#include "core/fxcrt/xml/cxml_element.h" #include "public/fpdf_ext.h" namespace { @@ -37,45 +35,6 @@ bool RaiseUnSupportError(int nError) { return true; } -bool CheckSharedForm(const CXML_Element* pElement, ByteString cbName) { - size_t count = pElement->CountAttrs(); - for (size_t i = 0; i < count; ++i) { - ByteString space; - ByteString name; - WideString value; - pElement->GetAttrByIndex(i, &space, &name, &value); - if (space == "xmlns" && name == "adhocwf" && - value == L"http://ns.adobe.com/AcrobatAdhocWorkflow/1.0/") { - CXML_Element* pVersion = - pElement->GetElement("adhocwf", cbName.AsStringView(), 0); - if (!pVersion) - continue; - CXML_Content* pContent = ToContent(pVersion->GetChild(0)); - if (!pContent) - continue; - switch (pContent->m_Content.GetInteger()) { - case 1: - RaiseUnSupportError(FPDF_UNSP_DOC_SHAREDFORM_ACROBAT); - break; - case 2: - RaiseUnSupportError(FPDF_UNSP_DOC_SHAREDFORM_FILESYSTEM); - break; - case 0: - RaiseUnSupportError(FPDF_UNSP_DOC_SHAREDFORM_EMAIL); - break; - } - } - } - - size_t nCount = pElement->CountChildren(); - for (size_t i = 0; i < nCount; ++i) { - CXML_Element* pChild = ToElement(pElement->GetChild(i)); - if (pChild && CheckSharedForm(pChild, cbName)) - return true; - } - return false; -} - #ifdef PDF_ENABLE_XFA class FPDF_FileHandlerContext : public IFX_SeekableStream { public: @@ -300,10 +259,15 @@ void CheckUnSupportError(CPDF_Document* pDoc, uint32_t err_code) { } // SharedForm - CPDF_Metadata metaData(pDoc); - const CXML_Element* pElement = metaData.GetRoot(); - if (pElement) - CheckSharedForm(pElement, "workflowType"); + const CPDF_Dictionary* pRoot = pDoc->GetRoot(); + if (pRoot) { + CPDF_Stream* pStream = pRoot->GetStreamFor("Metadata"); + if (pStream) { + CPDF_Metadata metaData(pStream); + for (const auto& err : metaData.CheckForSharedForm()) + RaiseUnSupportError(static_cast(err)); + } + } #ifndef PDF_ENABLE_XFA // XFA Forms diff --git a/fpdfsdk/fpdf_ext.cpp b/fpdfsdk/fpdf_ext.cpp index 2f05fc5cdc..509cfe818b 100644 --- a/fpdfsdk/fpdf_ext.cpp +++ b/fpdfsdk/fpdf_ext.cpp @@ -9,12 +9,63 @@ #include "core/fpdfapi/cpdf_modulemgr.h" #include "core/fpdfapi/parser/cpdf_document.h" #include "core/fpdfdoc/cpdf_interform.h" +#include "core/fpdfdoc/cpdf_metadata.h" #include "fpdfsdk/cpdfsdk_helpers.h" #ifdef PDF_ENABLE_XFA #include "fpdfsdk/fpdfxfa/cpdfxfa_context.h" #endif // PDF_ENABLE_XFA +static_assert(static_cast(UnsupportedFeature::kDocumentXFAForm) == + FPDF_UNSP_DOC_XFAFORM, + "UnsupportedFeature::kDocumentXFAForm value mismatch"); +static_assert( + static_cast(UnsupportedFeature::kDocumentPortableCollection) == + FPDF_UNSP_DOC_PORTABLECOLLECTION, + "UnsupportedFeature::kDocumentPortableCollection value mismatch"); +static_assert(static_cast(UnsupportedFeature::kDocumentAttachment) == + FPDF_UNSP_DOC_ATTACHMENT, + "UnsupportedFeature::kDocumentAttachment value mismatch"); +static_assert(static_cast(UnsupportedFeature::kDocumentSecurity) == + FPDF_UNSP_DOC_SECURITY, + "UnsupportedFeature::kDocumentSecurity value mismatch"); +static_assert(static_cast(UnsupportedFeature::kDocumentSharedReview) == + FPDF_UNSP_DOC_SHAREDREVIEW, + "UnsupportedFeature::kDocumentSharedReview value mismatch"); +static_assert( + static_cast(UnsupportedFeature::kDocumentSharedFormAcrobat) == + FPDF_UNSP_DOC_SHAREDFORM_ACROBAT, + "UnsupportedFeature::kDocumentSharedFormAcrobat value mismatch"); +static_assert( + static_cast(UnsupportedFeature::kDocumentSharedFormFilesystem) == + FPDF_UNSP_DOC_SHAREDFORM_FILESYSTEM, + "UnsupportedFeature::kDocumentSharedFormFilesystem value mismatch"); +static_assert(static_cast(UnsupportedFeature::kDocumentSharedFormEmail) == + FPDF_UNSP_DOC_SHAREDFORM_EMAIL, + "UnsupportedFeature::kDocumentSharedFormEmail value mismatch"); +static_assert(static_cast(UnsupportedFeature::kAnnotation3d) == + FPDF_UNSP_ANNOT_3DANNOT, + "UnsupportedFeature::kAnnotation3d value mismatch"); +static_assert(static_cast(UnsupportedFeature::kAnnotationMovie) == + FPDF_UNSP_ANNOT_MOVIE, + "UnsupportedFeature::kAnnotationMovie value mismatch"); +static_assert(static_cast(UnsupportedFeature::kAnnotationSound) == + FPDF_UNSP_ANNOT_SOUND, + "UnsupportedFeature::kAnnotationSound value mismatch"); +static_assert(static_cast(UnsupportedFeature::kAnnotationScreenMedia) == + FPDF_UNSP_ANNOT_SCREEN_MEDIA, + "UnsupportedFeature::kAnnotationScreenMedia value mismatch"); +static_assert( + static_cast(UnsupportedFeature::kAnnotationScreenRichMedia) == + FPDF_UNSP_ANNOT_SCREEN_RICHMEDIA, + "UnsupportedFeature::kAnnotationScreenRichMedia value mismatch"); +static_assert(static_cast(UnsupportedFeature::kAnnotationAttachment) == + FPDF_UNSP_ANNOT_ATTACHMENT, + "UnsupportedFeature::kAnnotationAttachment value mismatch"); +static_assert(static_cast(UnsupportedFeature::kAnnotationSignature) == + FPDF_UNSP_ANNOT_SIG, + "UnsupportedFeature::kAnnotationSignature value mismatch"); + FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FSDK_SetUnSpObjProcessHandler(UNSUPPORT_INFO* unsp_info) { if (!unsp_info || unsp_info->version != 1) -- cgit v1.2.3