Index: fpdfsdk/src/fpdfsave.cpp |
diff --git a/fpdfsdk/src/fpdfsave.cpp b/fpdfsdk/src/fpdfsave.cpp |
index b8e9c6e25c3b89c171b2f64dc8206eb8790c868d..ca0fa5364dd05b111ec08cdb2ac40611b0434a0d 100644 |
--- a/fpdfsdk/src/fpdfsave.cpp |
+++ b/fpdfsdk/src/fpdfsave.cpp |
@@ -6,6 +6,7 @@ |
#include "public/fpdf_save.h" |
+#include "core/include/fpdfapi/fpdf_parser.h" |
#include "core/include/fpdfapi/fpdf_serial.h" |
#include "fpdfsdk/include/fsdk_define.h" |
#include "public/fpdf_edit.h" |
@@ -60,41 +61,50 @@ void CFX_IFileWrite::Release() { |
delete this; |
} |
+namespace { |
+ |
#ifdef PDF_ENABLE_XFA |
-FX_BOOL _SaveXFADocumentData(CPDFXFA_Document* pDocument, |
- CFX_PtrArray& fileList) { |
+bool SaveXFADocumentData(CPDFXFA_Document* pDocument, |
+ std::vector<ScopedFileStream>* fileList) { |
if (!pDocument) |
- return FALSE; |
+ return false; |
+ |
if (pDocument->GetDocType() != DOCTYPE_DYNAMIC_XFA && |
pDocument->GetDocType() != DOCTYPE_STATIC_XFA) |
- return TRUE; |
+ return true; |
+ |
if (!CPDFXFA_App::GetInstance()->GetXFAApp()) |
- return TRUE; |
+ return true; |
IXFA_DocView* pXFADocView = pDocument->GetXFADocView(); |
- if (NULL == pXFADocView) |
- return TRUE; |
+ if (!pXFADocView) |
+ return true; |
IXFA_DocHandler* pXFADocHandler = |
CPDFXFA_App::GetInstance()->GetXFAApp()->GetDocHandler(); |
CPDF_Document* pPDFDocument = pDocument->GetPDFDoc(); |
- if (pDocument == NULL) |
- return FALSE; |
+ if (!pDocument) |
+ return false; |
CPDF_Dictionary* pRoot = pPDFDocument->GetRoot(); |
- if (pRoot == NULL) |
- return FALSE; |
+ if (!pRoot) |
+ return false; |
+ |
CPDF_Dictionary* pAcroForm = pRoot->GetDictBy("AcroForm"); |
- if (NULL == pAcroForm) |
- return FALSE; |
+ if (!pAcroForm) |
+ return false; |
+ |
CPDF_Object* pXFA = pAcroForm->GetElement("XFA"); |
- if (pXFA == NULL) |
- return TRUE; |
+ if (!pXFA) |
+ return true; |
+ |
if (!pXFA->IsArray()) |
- return FALSE; |
+ return false; |
+ |
CPDF_Array* pArray = pXFA->GetArray(); |
- if (NULL == pArray) |
- return FALSE; |
+ if (!pArray) |
+ return false; |
+ |
int size = pArray->GetCount(); |
int iFormIndex = -1; |
int iDataSetsIndex = -1; |
@@ -111,10 +121,8 @@ FX_BOOL _SaveXFADocumentData(CPDFXFA_Document* pDocument, |
else if (pPDFObj->GetString() == "template") |
iTemplate = i + 1; |
} |
- IXFA_ChecksumContext* pContext = NULL; |
- // Checksum |
- pContext = XFA_Checksum_Create(); |
- FXSYS_assert(pContext); |
+ std::unique_ptr<IXFA_ChecksumContext, ReleaseDeleter<IXFA_ChecksumContext>> |
+ pContext(XFA_Checksum_Create()); |
pContext->StartChecksum(); |
// template |
@@ -124,9 +132,8 @@ FX_BOOL _SaveXFADocumentData(CPDFXFA_Document* pDocument, |
streamAcc.LoadAllData(pTemplateStream); |
uint8_t* pData = (uint8_t*)streamAcc.GetData(); |
FX_DWORD dwSize2 = streamAcc.GetSize(); |
- IFX_FileStream* pTemplate = FX_CreateMemoryStream(pData, dwSize2); |
- pContext->UpdateChecksum((IFX_FileRead*)pTemplate); |
- pTemplate->Release(); |
+ ScopedFileStream pTemplate(FX_CreateMemoryStream(pData, dwSize2)); |
+ pContext->UpdateChecksum(pTemplate.get()); |
} |
CPDF_Stream* pFormStream = NULL; |
CPDF_Stream* pDataSetsStream = NULL; |
@@ -156,81 +163,69 @@ FX_BOOL _SaveXFADocumentData(CPDFXFA_Document* pDocument, |
pDataSetsStream = (CPDF_Stream*)pDataSetsPDFObj; |
} |
} |
- // end |
// L"datasets" |
{ |
- IFX_FileStream* pDsfileWrite = FX_CreateMemoryStream(); |
- if (NULL == pDsfileWrite) { |
- pContext->Release(); |
- pDsfileWrite->Release(); |
- return FALSE; |
- } |
+ ScopedFileStream pDsfileWrite(FX_CreateMemoryStream()); |
if (pXFADocHandler->SavePackage(pXFADocView->GetDoc(), |
CFX_WideStringC(L"datasets"), |
- pDsfileWrite) && |
+ pDsfileWrite.get()) && |
pDsfileWrite->GetSize() > 0) { |
// Datasets |
- pContext->UpdateChecksum((IFX_FileRead*)pDsfileWrite); |
+ pContext->UpdateChecksum(pDsfileWrite.get()); |
pContext->FinishChecksum(); |
CPDF_Dictionary* pDataDict = new CPDF_Dictionary; |
if (iDataSetsIndex != -1) { |
if (pDataSetsStream) |
- pDataSetsStream->InitStreamFromFile(pDsfileWrite, pDataDict); |
+ pDataSetsStream->InitStreamFromFile(pDsfileWrite.get(), pDataDict); |
} else { |
CPDF_Stream* pData = new CPDF_Stream(NULL, 0, NULL); |
- pData->InitStreamFromFile(pDsfileWrite, pDataDict); |
+ 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.Add(pDsfileWrite); |
+ fileList->push_back(std::move(pDsfileWrite)); |
} |
} |
- |
// L"form" |
{ |
- IFX_FileStream* pfileWrite = FX_CreateMemoryStream(); |
- if (NULL == pfileWrite) { |
- pContext->Release(); |
- return FALSE; |
- } |
+ ScopedFileStream pfileWrite(FX_CreateMemoryStream()); |
if (pXFADocHandler->SavePackage(pXFADocView->GetDoc(), |
- CFX_WideStringC(L"form"), pfileWrite, |
- pContext) && |
- pfileWrite > 0) { |
Tom Sepez
2016/02/05 22:49:45
This had to be wrong. Comparing a pointer greater
|
+ 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, pDataDict); |
+ pFormStream->InitStreamFromFile(pfileWrite.get(), pDataDict); |
} else { |
CPDF_Stream* pData = new CPDF_Stream(NULL, 0, NULL); |
- pData->InitStreamFromFile(pfileWrite, pDataDict); |
+ 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.Add(pfileWrite); |
+ fileList->push_back(std::move(pfileWrite)); |
} |
} |
- pContext->Release(); |
- return TRUE; |
+ return true; |
} |
-FX_BOOL _SendPostSaveToXFADoc(CPDFXFA_Document* pDocument) { |
+bool SendPostSaveToXFADoc(CPDFXFA_Document* pDocument) { |
if (!pDocument) |
- return FALSE; |
+ return false; |
if (pDocument->GetDocType() != DOCTYPE_DYNAMIC_XFA && |
pDocument->GetDocType() != DOCTYPE_STATIC_XFA) |
- return TRUE; |
+ return true; |
IXFA_DocView* pXFADocView = pDocument->GetXFADocView(); |
- if (NULL == pXFADocView) |
- return FALSE; |
- IXFA_WidgetHandler* pWidgetHander = pXFADocView->GetWidgetHandler(); |
+ if (!pXFADocView) |
+ return false; |
+ IXFA_WidgetHandler* pWidgetHander = pXFADocView->GetWidgetHandler(); |
CXFA_WidgetAcc* pWidgetAcc = NULL; |
IXFA_WidgetAccIterator* pWidgetAccIterator = |
pXFADocView->CreateWidgetAccIterator(); |
@@ -244,17 +239,19 @@ FX_BOOL _SendPostSaveToXFADoc(CPDFXFA_Document* pDocument) { |
pWidgetAccIterator->Release(); |
pXFADocView->UpdateDocView(); |
pDocument->_ClearChangeMark(); |
- return TRUE; |
+ return true; |
} |
-FX_BOOL _SendPreSaveToXFADoc(CPDFXFA_Document* pDocument, |
- CFX_PtrArray& fileList) { |
+bool SendPreSaveToXFADoc(CPDFXFA_Document* pDocument, |
+ std::vector<ScopedFileStream>* fileList) { |
if (pDocument->GetDocType() != DOCTYPE_DYNAMIC_XFA && |
pDocument->GetDocType() != DOCTYPE_STATIC_XFA) |
- return TRUE; |
+ return true; |
+ |
IXFA_DocView* pXFADocView = pDocument->GetXFADocView(); |
- if (NULL == pXFADocView) |
- return TRUE; |
+ if (!pXFADocView) |
+ return true; |
+ |
IXFA_WidgetHandler* pWidgetHander = pXFADocView->GetWidgetHandler(); |
CXFA_WidgetAcc* pWidgetAcc = NULL; |
IXFA_WidgetAccIterator* pWidgetAccIterator = |
@@ -268,28 +265,27 @@ FX_BOOL _SendPreSaveToXFADoc(CPDFXFA_Document* pDocument, |
} |
pWidgetAccIterator->Release(); |
pXFADocView->UpdateDocView(); |
- return _SaveXFADocumentData(pDocument, fileList); |
+ return SaveXFADocumentData(pDocument, fileList); |
} |
#endif // PDF_ENABLE_XFA |
-FPDF_BOOL _FPDF_Doc_Save(FPDF_DOCUMENT document, |
- FPDF_FILEWRITE* pFileWrite, |
- FPDF_DWORD flags, |
- FPDF_BOOL bSetVersion, |
- int fileVerion) { |
+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 = (CPDFXFA_Document*)document; |
- CFX_PtrArray fileList; |
- _SendPreSaveToXFADoc(pDoc, fileList); |
+ CPDFXFA_Document* pDoc = static_cast<CPDFXFA_Document*>(document); |
+ std::vector<ScopedFileStream> fileList; |
Lei Zhang
2016/02/05 23:32:49
Do we actually need to hold on to the file streams
Tom Sepez
2016/02/08 17:10:20
I didn't think so ... given the loop at old line 3
Lei Zhang
2016/02/08 20:10:29
What I was wonder is, do we need to hold on to the
|
+ SendPreSaveToXFADoc(pDoc, &fileList); |
#endif // PDF_ENABLE_XFA |
- if (flags < FPDF_INCREMENTAL || flags > FPDF_REMOVE_SECURITY) { |
+ if (flags < FPDF_INCREMENTAL || flags > FPDF_REMOVE_SECURITY) |
flags = 0; |
- } |
CPDF_Creator FileMaker(pPDFDoc); |
if (bSetVersion) |
@@ -305,26 +301,23 @@ FPDF_BOOL _FPDF_Doc_Save(FPDF_DOCUMENT document, |
pStreamWrite->Init(pFileWrite); |
bRet = FileMaker.Create(pStreamWrite, flags); |
#ifdef PDF_ENABLE_XFA |
- _SendPostSaveToXFADoc(pDoc); |
- for (int i = 0; i < fileList.GetSize(); i++) { |
- IFX_FileStream* pFile = (IFX_FileStream*)fileList.GetAt(i); |
- pFile->Release(); |
- } |
- fileList.RemoveAll(); |
+ 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); |
+ 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); |
+ return FPDF_Doc_Save(document, pFileWrite, flags, TRUE, fileVersion); |
} |