| Index: fpdfsdk/src/fpdfsave.cpp
|
| diff --git a/fpdfsdk/src/fpdfsave.cpp b/fpdfsdk/src/fpdfsave.cpp
|
| deleted file mode 100644
|
| index 81defbf0a75e48873b0e3887204f7b49f193014b..0000000000000000000000000000000000000000
|
| --- a/fpdfsdk/src/fpdfsave.cpp
|
| +++ /dev/null
|
| @@ -1,328 +0,0 @@
|
| -// Copyright 2014 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.
|
| -
|
| -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
|
| -
|
| -#include "public/fpdf_save.h"
|
| -
|
| -#include <vector>
|
| -
|
| -#include "core/include/fpdfapi/cpdf_array.h"
|
| -#include "core/include/fpdfapi/cpdf_document.h"
|
| -#include "core/include/fpdfapi/cpdf_reference.h"
|
| -#include "core/include/fpdfapi/cpdf_string.h"
|
| -#include "core/include/fpdfapi/fpdf_serial.h"
|
| -#include "core/include/fxcrt/fx_ext.h"
|
| -#include "fpdfsdk/include/fsdk_define.h"
|
| -#include "public/fpdf_edit.h"
|
| -
|
| -#ifdef PDF_ENABLE_XFA
|
| -#include "fpdfsdk/include/fpdfxfa/fpdfxfa_app.h"
|
| -#include "fpdfsdk/include/fpdfxfa/fpdfxfa_doc.h"
|
| -#include "fpdfsdk/include/fpdfxfa/fpdfxfa_util.h"
|
| -#include "public/fpdf_formfill.h"
|
| -#endif
|
| -
|
| -#if _FX_OS_ == _FX_ANDROID_
|
| -#include "time.h"
|
| -#else
|
| -#include <ctime>
|
| -#endif
|
| -
|
| -class CFX_IFileWrite final : public IFX_StreamWrite {
|
| - public:
|
| - CFX_IFileWrite();
|
| - FX_BOOL Init(FPDF_FILEWRITE* pFileWriteStruct);
|
| - FX_BOOL WriteBlock(const void* pData, size_t size) override;
|
| - void Release() override;
|
| -
|
| - protected:
|
| - ~CFX_IFileWrite() override {}
|
| -
|
| - FPDF_FILEWRITE* m_pFileWriteStruct;
|
| -};
|
| -
|
| -CFX_IFileWrite::CFX_IFileWrite() {
|
| - m_pFileWriteStruct = NULL;
|
| -}
|
| -
|
| -FX_BOOL CFX_IFileWrite::Init(FPDF_FILEWRITE* pFileWriteStruct) {
|
| - if (!pFileWriteStruct)
|
| - return FALSE;
|
| -
|
| - m_pFileWriteStruct = pFileWriteStruct;
|
| - return TRUE;
|
| -}
|
| -
|
| -FX_BOOL CFX_IFileWrite::WriteBlock(const void* pData, size_t size) {
|
| - if (!m_pFileWriteStruct)
|
| - return FALSE;
|
| -
|
| - m_pFileWriteStruct->WriteBlock(m_pFileWriteStruct, pData, size);
|
| - return TRUE;
|
| -}
|
| -
|
| -void CFX_IFileWrite::Release() {
|
| - delete this;
|
| -}
|
| -
|
| -namespace {
|
| -
|
| -#ifdef PDF_ENABLE_XFA
|
| -bool SaveXFADocumentData(CPDFXFA_Document* pDocument,
|
| - std::vector<ScopedFileStream>* fileList) {
|
| - if (!pDocument)
|
| - return false;
|
| -
|
| - if (pDocument->GetDocType() != DOCTYPE_DYNAMIC_XFA &&
|
| - pDocument->GetDocType() != DOCTYPE_STATIC_XFA)
|
| - return true;
|
| -
|
| - if (!CPDFXFA_App::GetInstance()->GetXFAApp())
|
| - return true;
|
| -
|
| - IXFA_DocView* pXFADocView = pDocument->GetXFADocView();
|
| - if (!pXFADocView)
|
| - return true;
|
| -
|
| - IXFA_DocHandler* pXFADocHandler =
|
| - CPDFXFA_App::GetInstance()->GetXFAApp()->GetDocHandler();
|
| - CPDF_Document* pPDFDocument = pDocument->GetPDFDoc();
|
| - if (!pDocument)
|
| - return false;
|
| -
|
| - CPDF_Dictionary* pRoot = pPDFDocument->GetRoot();
|
| - if (!pRoot)
|
| - return false;
|
| -
|
| - CPDF_Dictionary* pAcroForm = pRoot->GetDictBy("AcroForm");
|
| - if (!pAcroForm)
|
| - return false;
|
| -
|
| - CPDF_Object* pXFA = pAcroForm->GetElement("XFA");
|
| - if (!pXFA)
|
| - return true;
|
| -
|
| - if (!pXFA->IsArray())
|
| - return false;
|
| -
|
| - CPDF_Array* pArray = pXFA->GetArray();
|
| - if (!pArray)
|
| - return false;
|
| -
|
| - int size = pArray->GetCount();
|
| - int iFormIndex = -1;
|
| - int iDataSetsIndex = -1;
|
| - int iTemplate = -1;
|
| - int iLast = size - 2;
|
| - for (int i = 0; i < size - 1; i++) {
|
| - CPDF_Object* pPDFObj = pArray->GetElement(i);
|
| - if (!pPDFObj->IsString())
|
| - continue;
|
| - if (pPDFObj->GetString() == "form")
|
| - iFormIndex = i + 1;
|
| - else if (pPDFObj->GetString() == "datasets")
|
| - iDataSetsIndex = i + 1;
|
| - else if (pPDFObj->GetString() == "template")
|
| - iTemplate = i + 1;
|
| - }
|
| - std::unique_ptr<IXFA_ChecksumContext, ReleaseDeleter<IXFA_ChecksumContext>>
|
| - pContext(XFA_Checksum_Create());
|
| - pContext->StartChecksum();
|
| -
|
| - // template
|
| - if (iTemplate > -1) {
|
| - CPDF_Stream* pTemplateStream = pArray->GetStreamAt(iTemplate);
|
| - CPDF_StreamAcc streamAcc;
|
| - streamAcc.LoadAllData(pTemplateStream);
|
| - uint8_t* pData = (uint8_t*)streamAcc.GetData();
|
| - FX_DWORD dwSize2 = streamAcc.GetSize();
|
| - ScopedFileStream pTemplate(FX_CreateMemoryStream(pData, dwSize2));
|
| - pContext->UpdateChecksum(pTemplate.get());
|
| - }
|
| - CPDF_Stream* pFormStream = NULL;
|
| - CPDF_Stream* pDataSetsStream = NULL;
|
| - if (iFormIndex != -1) {
|
| - // Get form CPDF_Stream
|
| - CPDF_Object* pFormPDFObj = pArray->GetElement(iFormIndex);
|
| - if (pFormPDFObj->IsReference()) {
|
| - CPDF_Object* pFormDirectObj = pFormPDFObj->GetDirect();
|
| - if (pFormDirectObj && pFormDirectObj->IsStream()) {
|
| - pFormStream = (CPDF_Stream*)pFormDirectObj;
|
| - }
|
| - } else if (pFormPDFObj->IsStream()) {
|
| - pFormStream = (CPDF_Stream*)pFormPDFObj;
|
| - }
|
| - }
|
| -
|
| - if (iDataSetsIndex != -1) {
|
| - // Get datasets CPDF_Stream
|
| - CPDF_Object* pDataSetsPDFObj = pArray->GetElement(iDataSetsIndex);
|
| - if (pDataSetsPDFObj->IsReference()) {
|
| - CPDF_Reference* pDataSetsRefObj = (CPDF_Reference*)pDataSetsPDFObj;
|
| - CPDF_Object* pDataSetsDirectObj = pDataSetsRefObj->GetDirect();
|
| - if (pDataSetsDirectObj && pDataSetsDirectObj->IsStream()) {
|
| - pDataSetsStream = (CPDF_Stream*)pDataSetsDirectObj;
|
| - }
|
| - } else if (pDataSetsPDFObj->IsStream()) {
|
| - pDataSetsStream = (CPDF_Stream*)pDataSetsPDFObj;
|
| - }
|
| - }
|
| - // L"datasets"
|
| - {
|
| - ScopedFileStream pDsfileWrite(FX_CreateMemoryStream());
|
| - if (pXFADocHandler->SavePackage(pXFADocView->GetDoc(),
|
| - CFX_WideStringC(L"datasets"),
|
| - pDsfileWrite.get()) &&
|
| - pDsfileWrite->GetSize() > 0) {
|
| - // Datasets
|
| - pContext->UpdateChecksum(pDsfileWrite.get());
|
| - pContext->FinishChecksum();
|
| - CPDF_Dictionary* pDataDict = new CPDF_Dictionary;
|
| - if (iDataSetsIndex != -1) {
|
| - if (pDataSetsStream)
|
| - pDataSetsStream->InitStreamFromFile(pDsfileWrite.get(), pDataDict);
|
| - } else {
|
| - CPDF_Stream* pData = new CPDF_Stream(NULL, 0, NULL);
|
| - pData->InitStreamFromFile(pDsfileWrite.get(), pDataDict);
|
| - pPDFDocument->AddIndirectObject(pData);
|
| - iLast = pArray->GetCount() - 2;
|
| - pArray->InsertAt(iLast, new CPDF_String("datasets", FALSE));
|
| - pArray->InsertAt(iLast + 1, pData, pPDFDocument);
|
| - }
|
| - fileList->push_back(std::move(pDsfileWrite));
|
| - }
|
| - }
|
| - // L"form"
|
| - {
|
| - ScopedFileStream pfileWrite(FX_CreateMemoryStream());
|
| - if (pXFADocHandler->SavePackage(pXFADocView->GetDoc(),
|
| - CFX_WideStringC(L"form"), pfileWrite.get(),
|
| - pContext.get()) &&
|
| - pfileWrite->GetSize() > 0) {
|
| - CPDF_Dictionary* pDataDict = new CPDF_Dictionary;
|
| - if (iFormIndex != -1) {
|
| - if (pFormStream)
|
| - pFormStream->InitStreamFromFile(pfileWrite.get(), pDataDict);
|
| - } else {
|
| - CPDF_Stream* pData = new CPDF_Stream(NULL, 0, NULL);
|
| - pData->InitStreamFromFile(pfileWrite.get(), pDataDict);
|
| - pPDFDocument->AddIndirectObject(pData);
|
| - iLast = pArray->GetCount() - 2;
|
| - pArray->InsertAt(iLast, new CPDF_String("form", FALSE));
|
| - pArray->InsertAt(iLast + 1, pData, pPDFDocument);
|
| - }
|
| - fileList->push_back(std::move(pfileWrite));
|
| - }
|
| - }
|
| - return true;
|
| -}
|
| -
|
| -bool SendPostSaveToXFADoc(CPDFXFA_Document* pDocument) {
|
| - if (!pDocument)
|
| - return false;
|
| -
|
| - if (pDocument->GetDocType() != DOCTYPE_DYNAMIC_XFA &&
|
| - pDocument->GetDocType() != DOCTYPE_STATIC_XFA)
|
| - return true;
|
| -
|
| - IXFA_DocView* pXFADocView = pDocument->GetXFADocView();
|
| - if (!pXFADocView)
|
| - return false;
|
| -
|
| - IXFA_WidgetHandler* pWidgetHander = pXFADocView->GetWidgetHandler();
|
| - CXFA_WidgetAcc* pWidgetAcc = NULL;
|
| - IXFA_WidgetAccIterator* pWidgetAccIterator =
|
| - pXFADocView->CreateWidgetAccIterator();
|
| - pWidgetAcc = pWidgetAccIterator->MoveToNext();
|
| - while (pWidgetAcc) {
|
| - CXFA_EventParam preParam;
|
| - preParam.m_eType = XFA_EVENT_PostSave;
|
| - pWidgetHander->ProcessEvent(pWidgetAcc, &preParam);
|
| - pWidgetAcc = pWidgetAccIterator->MoveToNext();
|
| - }
|
| - pWidgetAccIterator->Release();
|
| - pXFADocView->UpdateDocView();
|
| - pDocument->_ClearChangeMark();
|
| - return true;
|
| -}
|
| -
|
| -bool SendPreSaveToXFADoc(CPDFXFA_Document* pDocument,
|
| - std::vector<ScopedFileStream>* fileList) {
|
| - if (pDocument->GetDocType() != DOCTYPE_DYNAMIC_XFA &&
|
| - pDocument->GetDocType() != DOCTYPE_STATIC_XFA)
|
| - return true;
|
| -
|
| - IXFA_DocView* pXFADocView = pDocument->GetXFADocView();
|
| - if (!pXFADocView)
|
| - return true;
|
| -
|
| - IXFA_WidgetHandler* pWidgetHander = pXFADocView->GetWidgetHandler();
|
| - CXFA_WidgetAcc* pWidgetAcc = NULL;
|
| - IXFA_WidgetAccIterator* pWidgetAccIterator =
|
| - pXFADocView->CreateWidgetAccIterator();
|
| - pWidgetAcc = pWidgetAccIterator->MoveToNext();
|
| - while (pWidgetAcc) {
|
| - CXFA_EventParam preParam;
|
| - preParam.m_eType = XFA_EVENT_PreSave;
|
| - pWidgetHander->ProcessEvent(pWidgetAcc, &preParam);
|
| - pWidgetAcc = pWidgetAccIterator->MoveToNext();
|
| - }
|
| - pWidgetAccIterator->Release();
|
| - pXFADocView->UpdateDocView();
|
| - return SaveXFADocumentData(pDocument, fileList);
|
| -}
|
| -#endif // PDF_ENABLE_XFA
|
| -
|
| -bool FPDF_Doc_Save(FPDF_DOCUMENT document,
|
| - FPDF_FILEWRITE* pFileWrite,
|
| - FPDF_DWORD flags,
|
| - FPDF_BOOL bSetVersion,
|
| - int fileVerion) {
|
| - CPDF_Document* pPDFDoc = CPDFDocumentFromFPDFDocument(document);
|
| - if (!pPDFDoc)
|
| - return 0;
|
| -
|
| -#ifdef PDF_ENABLE_XFA
|
| - CPDFXFA_Document* pDoc = static_cast<CPDFXFA_Document*>(document);
|
| - std::vector<ScopedFileStream> fileList;
|
| - SendPreSaveToXFADoc(pDoc, &fileList);
|
| -#endif // PDF_ENABLE_XFA
|
| -
|
| - if (flags < FPDF_INCREMENTAL || flags > FPDF_REMOVE_SECURITY)
|
| - flags = 0;
|
| -
|
| - CPDF_Creator FileMaker(pPDFDoc);
|
| - if (bSetVersion)
|
| - FileMaker.SetFileVersion(fileVerion);
|
| - if (flags == FPDF_REMOVE_SECURITY) {
|
| - flags = 0;
|
| - FileMaker.RemoveSecurity();
|
| - }
|
| -
|
| - CFX_IFileWrite* pStreamWrite = NULL;
|
| - pStreamWrite = new CFX_IFileWrite;
|
| - pStreamWrite->Init(pFileWrite);
|
| - bool bRet = FileMaker.Create(pStreamWrite, flags);
|
| -#ifdef PDF_ENABLE_XFA
|
| - SendPostSaveToXFADoc(pDoc);
|
| -#endif // PDF_ENABLE_XFA
|
| - pStreamWrite->Release();
|
| - return bRet;
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -DLLEXPORT FPDF_BOOL STDCALL FPDF_SaveAsCopy(FPDF_DOCUMENT document,
|
| - FPDF_FILEWRITE* pFileWrite,
|
| - FPDF_DWORD flags) {
|
| - return FPDF_Doc_Save(document, pFileWrite, flags, FALSE, 0);
|
| -}
|
| -
|
| -DLLEXPORT FPDF_BOOL STDCALL FPDF_SaveWithVersion(FPDF_DOCUMENT document,
|
| - FPDF_FILEWRITE* pFileWrite,
|
| - FPDF_DWORD flags,
|
| - int fileVersion) {
|
| - return FPDF_Doc_Save(document, pFileWrite, flags, TRUE, fileVersion);
|
| -}
|
|
|