Index: fpdfsdk/fpdfsave.cpp |
diff --git a/fpdfsdk/fpdfsave.cpp b/fpdfsdk/fpdfsave.cpp |
index c65ff88f3d6859627a920b166f51822891df9d53..0cfcd4af577c3a5ac480cb070c109fc0a1ae13e3 100644 |
--- a/fpdfsdk/fpdfsave.cpp |
+++ b/fpdfsdk/fpdfsave.cpp |
@@ -39,21 +39,23 @@ |
class CFX_IFileWrite final : public IFX_WriteStream { |
public: |
- CFX_IFileWrite(); |
+ static CFX_RetainPtr<CFX_IFileWrite> Create(); |
bool Init(FPDF_FILEWRITE* pFileWriteStruct); |
bool WriteBlock(const void* pData, size_t size) override; |
- void Release() override; |
protected: |
+ CFX_IFileWrite(); |
~CFX_IFileWrite() override {} |
FPDF_FILEWRITE* m_pFileWriteStruct; |
}; |
-CFX_IFileWrite::CFX_IFileWrite() { |
- m_pFileWriteStruct = nullptr; |
+CFX_RetainPtr<CFX_IFileWrite> CFX_IFileWrite::Create() { |
+ return CFX_RetainPtr<CFX_IFileWrite>(new CFX_IFileWrite()); |
} |
+CFX_IFileWrite::CFX_IFileWrite() : m_pFileWriteStruct(nullptr) {} |
+ |
bool CFX_IFileWrite::Init(FPDF_FILEWRITE* pFileWriteStruct) { |
if (!pFileWriteStruct) |
return false; |
@@ -70,15 +72,12 @@ bool CFX_IFileWrite::WriteBlock(const void* pData, size_t size) { |
return true; |
} |
-void CFX_IFileWrite::Release() { |
- delete this; |
-} |
- |
namespace { |
#ifdef PDF_ENABLE_XFA |
-bool SaveXFADocumentData(CPDFXFA_Context* pContext, |
- std::vector<ScopedFileStream>* fileList) { |
+bool SaveXFADocumentData( |
+ CPDFXFA_Context* pContext, |
+ std::vector<CFX_RetainPtr<IFX_SeekableStream>>* fileList) { |
if (!pContext) |
return false; |
@@ -136,8 +135,9 @@ bool SaveXFADocumentData(CPDFXFA_Context* pContext, |
streamAcc.LoadAllData(pTemplateStream); |
uint8_t* pData = (uint8_t*)streamAcc.GetData(); |
uint32_t dwSize2 = streamAcc.GetSize(); |
- ScopedFileStream pTemplate(IFX_MemoryStream::Create(pData, dwSize2)); |
- pChecksum->UpdateChecksum(pTemplate.get()); |
+ CFX_RetainPtr<IFX_SeekableStream> pTemplate = |
+ IFX_MemoryStream::Create(pData, dwSize2); |
+ pChecksum->UpdateChecksum(pTemplate); |
} |
CPDF_Stream* pFormStream = nullptr; |
CPDF_Stream* pDataSetsStream = nullptr; |
@@ -169,23 +169,23 @@ bool SaveXFADocumentData(CPDFXFA_Context* pContext, |
} |
// L"datasets" |
{ |
- ScopedFileStream pDsfileWrite(IFX_MemoryStream::Create()); |
- if (pXFADocView->GetDoc()->SavePackage(XFA_HASHCODE_Datasets, |
- pDsfileWrite.get(), nullptr) && |
+ CFX_RetainPtr<IFX_SeekableStream> pDsfileWrite = IFX_MemoryStream::Create(); |
+ if (pXFADocView->GetDoc()->SavePackage(XFA_HASHCODE_Datasets, pDsfileWrite, |
+ nullptr) && |
pDsfileWrite->GetSize() > 0) { |
// Datasets |
- pChecksum->UpdateChecksum(pDsfileWrite.get()); |
+ pChecksum->UpdateChecksum(pDsfileWrite); |
pChecksum->FinishChecksum(); |
auto pDataDict = pdfium::MakeUnique<CPDF_Dictionary>( |
pPDFDocument->GetByteStringPool()); |
if (iDataSetsIndex != -1) { |
if (pDataSetsStream) { |
- pDataSetsStream->InitStreamFromFile(pDsfileWrite.get(), |
+ pDataSetsStream->InitStreamFromFile(pDsfileWrite, |
std::move(pDataDict)); |
} |
} else { |
CPDF_Stream* pData = pPDFDocument->NewIndirect<CPDF_Stream>(); |
- pData->InitStreamFromFile(pDsfileWrite.get(), std::move(pDataDict)); |
+ pData->InitStreamFromFile(pDsfileWrite, std::move(pDataDict)); |
iLast = pArray->GetCount() - 2; |
pArray->InsertNewAt<CPDF_String>(iLast, "datasets", false); |
pArray->InsertNewAt<CPDF_Reference>(iLast + 1, pPDFDocument, |
@@ -196,20 +196,18 @@ bool SaveXFADocumentData(CPDFXFA_Context* pContext, |
} |
// L"form" |
{ |
- ScopedFileStream pfileWrite(IFX_MemoryStream::Create()); |
- if (pXFADocView->GetDoc()->SavePackage(XFA_HASHCODE_Form, pfileWrite.get(), |
+ CFX_RetainPtr<IFX_SeekableStream> pfileWrite = IFX_MemoryStream::Create(); |
+ if (pXFADocView->GetDoc()->SavePackage(XFA_HASHCODE_Form, pfileWrite, |
pChecksum.get()) && |
pfileWrite->GetSize() > 0) { |
auto pDataDict = pdfium::MakeUnique<CPDF_Dictionary>( |
pPDFDocument->GetByteStringPool()); |
if (iFormIndex != -1) { |
- if (pFormStream) { |
- pFormStream->InitStreamFromFile(pfileWrite.get(), |
- std::move(pDataDict)); |
- } |
+ if (pFormStream) |
+ pFormStream->InitStreamFromFile(pfileWrite, std::move(pDataDict)); |
} else { |
CPDF_Stream* pData = pPDFDocument->NewIndirect<CPDF_Stream>(); |
- pData->InitStreamFromFile(pfileWrite.get(), std::move(pDataDict)); |
+ pData->InitStreamFromFile(pfileWrite, std::move(pDataDict)); |
iLast = pArray->GetCount() - 2; |
pArray->InsertNewAt<CPDF_String>(iLast, "form", false); |
pArray->InsertNewAt<CPDF_Reference>(iLast + 1, pPDFDocument, |
@@ -246,8 +244,9 @@ bool SendPostSaveToXFADoc(CPDFXFA_Context* pContext) { |
return true; |
} |
-bool SendPreSaveToXFADoc(CPDFXFA_Context* pContext, |
- std::vector<ScopedFileStream>* fileList) { |
+bool SendPreSaveToXFADoc( |
+ CPDFXFA_Context* pContext, |
+ std::vector<CFX_RetainPtr<IFX_SeekableStream>>* fileList) { |
if (pContext->GetDocType() != DOCTYPE_DYNAMIC_XFA && |
pContext->GetDocType() != DOCTYPE_STATIC_XFA) |
return true; |
@@ -280,7 +279,7 @@ bool FPDF_Doc_Save(FPDF_DOCUMENT document, |
#ifdef PDF_ENABLE_XFA |
CPDFXFA_Context* pContext = static_cast<CPDFXFA_Context*>(document); |
- std::vector<ScopedFileStream> fileList; |
+ std::vector<CFX_RetainPtr<IFX_SeekableStream>> fileList; |
SendPreSaveToXFADoc(pContext, &fileList); |
#endif // PDF_ENABLE_XFA |
@@ -295,13 +294,12 @@ bool FPDF_Doc_Save(FPDF_DOCUMENT document, |
FileMaker.RemoveSecurity(); |
} |
- CFX_IFileWrite* pStreamWrite = new CFX_IFileWrite; |
+ CFX_RetainPtr<CFX_IFileWrite> pStreamWrite = CFX_IFileWrite::Create(); |
pStreamWrite->Init(pFileWrite); |
bool bRet = FileMaker.Create(pStreamWrite, flags); |
#ifdef PDF_ENABLE_XFA |
SendPostSaveToXFADoc(pContext); |
#endif // PDF_ENABLE_XFA |
- pStreamWrite->Release(); |
return bRet; |
} |