Avoid directly including xfa/ layer in fpdf_save.cpp. All these calls should be routed through fpdfsdk/fpdfxfa - that's what it is there for. Change-Id: I374e63e34f1045d4d5061acb75831c45d626efd1 Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/64350 Commit-Queue: Tom Sepez <tsepez@chromium.org> Reviewed-by: Lei Zhang <thestig@chromium.org>
diff --git a/fpdfsdk/fpdf_save.cpp b/fpdfsdk/fpdf_save.cpp index 2dfd759..78e0e58 100644 --- a/fpdfsdk/fpdf_save.cpp +++ b/fpdfsdk/fpdf_save.cpp
@@ -29,8 +29,6 @@ #include "core/fxcrt/cfx_memorystream.h" #include "fpdfsdk/fpdfxfa/cpdfxfa_context.h" #include "public/fpdf_formfill.h" -#include "xfa/fxfa/cxfa_ffdocview.h" -#include "xfa/fxfa/parser/cxfa_object.h" #endif #if defined(OS_ANDROID) @@ -50,10 +48,6 @@ if (!pContext->ContainsExtensionForm()) return true; - CXFA_FFDocView* pXFADocView = pContext->GetXFADocView(); - if (!pXFADocView) - return true; - CPDF_Document* pPDFDocument = pContext->GetPDFDoc(); if (!pPDFDocument) return false; @@ -117,53 +111,44 @@ } // L"datasets" { - RetainPtr<IFX_SeekableStream> pDsfileWrite = + RetainPtr<IFX_SeekableStream> pFileWrite = pdfium::MakeRetain<CFX_MemoryStream>(); - CXFA_FFDoc* ffdoc = pXFADocView->GetDoc(); - if (ffdoc->SavePackage( - ToNode(ffdoc->GetXFADoc()->GetXFAObject(XFA_HASHCODE_Datasets)), - pDsfileWrite) && - pDsfileWrite->GetSize() > 0) { + if (pContext->SaveDatasetsPackage(pFileWrite) && + pFileWrite->GetSize() > 0) { auto pDataDict = pPDFDocument->New<CPDF_Dictionary>(); if (iDataSetsIndex != -1) { if (pDataSetsStream) { - pDataSetsStream->InitStreamFromFile(pDsfileWrite, - std::move(pDataDict)); + pDataSetsStream->InitStreamFromFile(pFileWrite, std::move(pDataDict)); } } else { CPDF_Stream* pData = pPDFDocument->NewIndirect<CPDF_Stream>(); - pData->InitStreamFromFile(pDsfileWrite, std::move(pDataDict)); + pData->InitStreamFromFile(pFileWrite, std::move(pDataDict)); int iLast = pArray->size() - 2; pArray->InsertNewAt<CPDF_String>(iLast, "datasets", false); pArray->InsertNewAt<CPDF_Reference>(iLast + 1, pPDFDocument, pData->GetObjNum()); } - fileList->push_back(std::move(pDsfileWrite)); + fileList->push_back(std::move(pFileWrite)); } } // L"form" { - RetainPtr<IFX_SeekableStream> pfileWrite = + RetainPtr<IFX_SeekableStream> pFileWrite = pdfium::MakeRetain<CFX_MemoryStream>(); - - CXFA_FFDoc* ffdoc = pXFADocView->GetDoc(); - if (ffdoc->SavePackage( - ToNode(ffdoc->GetXFADoc()->GetXFAObject(XFA_HASHCODE_Form)), - pfileWrite) && - pfileWrite->GetSize() > 0) { + if (pContext->SaveFormPackage(pFileWrite) && pFileWrite->GetSize() > 0) { auto pDataDict = pPDFDocument->New<CPDF_Dictionary>(); if (iFormIndex != -1) { if (pFormStream) - pFormStream->InitStreamFromFile(pfileWrite, std::move(pDataDict)); + pFormStream->InitStreamFromFile(pFileWrite, std::move(pDataDict)); } else { CPDF_Stream* pData = pPDFDocument->NewIndirect<CPDF_Stream>(); - pData->InitStreamFromFile(pfileWrite, std::move(pDataDict)); + pData->InitStreamFromFile(pFileWrite, std::move(pDataDict)); int iLast = pArray->size() - 2; pArray->InsertNewAt<CPDF_String>(iLast, "form", false); pArray->InsertNewAt<CPDF_Reference>(iLast + 1, pPDFDocument, pData->GetObjNum()); } - fileList->push_back(std::move(pfileWrite)); + fileList->push_back(std::move(pFileWrite)); } } return true;
diff --git a/fpdfsdk/fpdfxfa/cpdfxfa_context.cpp b/fpdfsdk/fpdfxfa/cpdfxfa_context.cpp index 5f86a90..7cb4a2c 100644 --- a/fpdfsdk/fpdfxfa/cpdfxfa_context.cpp +++ b/fpdfsdk/fpdfxfa/cpdfxfa_context.cpp
@@ -357,6 +357,27 @@ return m_pFormFillEnv ? m_pFormFillEnv->GetTimerHandler() : nullptr; } +bool CPDFXFA_Context::SaveDatasetsPackage( + const RetainPtr<IFX_SeekableStream>& pStream) { + return SavePackage(pStream, XFA_HASHCODE_Datasets); +} + +bool CPDFXFA_Context::SaveFormPackage( + const RetainPtr<IFX_SeekableStream>& pStream) { + return SavePackage(pStream, XFA_HASHCODE_Form); +} + +bool CPDFXFA_Context::SavePackage(const RetainPtr<IFX_SeekableStream>& pStream, + XFA_HashCode code) { + CXFA_FFDocView* pXFADocView = GetXFADocView(); + if (!pXFADocView) + return false; + + CXFA_FFDoc* ffdoc = pXFADocView->GetDoc(); + return ffdoc->SavePackage(ToNode(ffdoc->GetXFADoc()->GetXFAObject(code)), + pStream); +} + void CPDFXFA_Context::SendPostSaveToXFADoc() { if (!ContainsExtensionForm()) return;
diff --git a/fpdfsdk/fpdfxfa/cpdfxfa_context.h b/fpdfsdk/fpdfxfa/cpdfxfa_context.h index 310b18f..0f6a14b 100644 --- a/fpdfsdk/fpdfxfa/cpdfxfa_context.h +++ b/fpdfsdk/fpdfxfa/cpdfxfa_context.h
@@ -88,6 +88,8 @@ const WideString& wsEncode) override; TimerHandlerIface* GetTimerHandler() const override; + bool SaveDatasetsPackage(const RetainPtr<IFX_SeekableStream>& pStream); + bool SaveFormPackage(const RetainPtr<IFX_SeekableStream>& pStream); void SendPostSaveToXFADoc(); void SendPreSaveToXFADoc( std::vector<RetainPtr<IFX_SeekableStream>>* fileList); @@ -107,6 +109,8 @@ } CJS_Runtime* GetCJSRuntime() const; + bool SavePackage(const RetainPtr<IFX_SeekableStream>& pStream, + XFA_HashCode code); void CloseXFADoc(); FormType m_FormType = FormType::kNone;