| OLD | NEW |
| 1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 PDFium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
| 6 | 6 |
| 7 #include "../../public/fpdf_edit.h" | 7 #include "../../public/fpdf_edit.h" |
| 8 #include "../../public/fpdf_formfill.h" | 8 #include "../../public/fpdf_formfill.h" |
| 9 #include "../../public/fpdf_save.h" | 9 #include "../../public/fpdf_save.h" |
| 10 #include "../include/fsdk_define.h" | 10 #include "../include/fsdk_define.h" |
| 11 #include "../include/fpdfxfa/fpdfxfa_doc.h" | 11 #include "../include/fpdfxfa/fpdfxfa_doc.h" |
| 12 #include "../include/fpdfxfa/fpdfxfa_app.h" | 12 #include "../include/fpdfxfa/fpdfxfa_app.h" |
| 13 #include "../include/fpdfxfa/fpdfxfa_util.h" | 13 #include "../include/fpdfxfa/fpdfxfa_util.h" |
| 14 | 14 |
| 15 #if _FX_OS_ == _FX_ANDROID_ | 15 #if _FX_OS_ == _FX_ANDROID_ |
| 16 #include "time.h" | 16 #include "time.h" |
| 17 #else | 17 #else |
| 18 #include <ctime> | 18 #include <ctime> |
| 19 #endif | 19 #endif |
| 20 | 20 |
| 21 class CFX_IFileWrite final : public IFX_StreamWrite | 21 class CFX_IFileWrite final : public IFX_StreamWrite |
| 22 { | 22 { |
| 23 | 23 |
| 24 public: | 24 public: |
| 25 » CFX_IFileWrite(); | 25 CFX_IFileWrite(); |
| 26 » FX_BOOL»» » » Init( FPDF_FILEWRITE * pFileWriteStruct
); | 26 FX_BOOL Init( FPDF_FILEWRITE * pFileWriteStruct ); |
| 27 » virtual»FX_BOOL»» WriteBlock(const void* pData, size_t size) overr
ide; | 27 virtual FX_BOOL WriteBlock(const void* pData, size_t size) override; |
| 28 » virtual void» » Release() override {} | 28 virtual void Release() override {} |
| 29 | 29 |
| 30 protected: | 30 protected: |
| 31 » FPDF_FILEWRITE*»» m_pFileWriteStruct; | 31 FPDF_FILEWRITE* m_pFileWriteStruct; |
| 32 }; | 32 }; |
| 33 | 33 |
| 34 CFX_IFileWrite::CFX_IFileWrite() | 34 CFX_IFileWrite::CFX_IFileWrite() |
| 35 { | 35 { |
| 36 » m_pFileWriteStruct = NULL; | 36 m_pFileWriteStruct = NULL; |
| 37 } | 37 } |
| 38 | 38 |
| 39 FX_BOOL CFX_IFileWrite::Init( FPDF_FILEWRITE * pFileWriteStruct ) | 39 FX_BOOL CFX_IFileWrite::Init( FPDF_FILEWRITE * pFileWriteStruct ) |
| 40 { | 40 { |
| 41 » if (!pFileWriteStruct) | 41 if (!pFileWriteStruct) |
| 42 » » return FALSE; | 42 return FALSE; |
| 43 » else | 43 |
| 44 » { | 44 m_pFileWriteStruct = pFileWriteStruct; |
| 45 » » m_pFileWriteStruct = pFileWriteStruct; | 45 return TRUE; |
| 46 » } | |
| 47 » return TRUE; | |
| 48 } | 46 } |
| 49 | 47 |
| 50 FX_BOOL CFX_IFileWrite::WriteBlock(const void* pData, size_t size) | 48 FX_BOOL CFX_IFileWrite::WriteBlock(const void* pData, size_t size) |
| 51 { | 49 { |
| 52 » if (m_pFileWriteStruct) | 50 if (!m_pFileWriteStruct) |
| 53 » { | 51 return FALSE; |
| 54 » » m_pFileWriteStruct->WriteBlock( m_pFileWriteStruct, pData, size
); | 52 |
| 55 » » return TRUE; | 53 m_pFileWriteStruct->WriteBlock( m_pFileWriteStruct, pData, size ); |
| 56 » } | 54 return TRUE; |
| 57 » else | |
| 58 » » return FALSE; | |
| 59 } | 55 } |
| 60 | 56 |
| 61 #define XFA_DATASETS 0 | 57 #define XFA_DATASETS 0 |
| 62 #define XFA_FORMS 1 | 58 #define XFA_FORMS 1 |
| 63 | 59 |
| 64 FX_BOOL _SaveXFADocumentData(CPDFXFA_Document* pDocument, CFX_PtrArray& fileList
) | 60 FX_BOOL _SaveXFADocumentData(CPDFXFA_Document* pDocument, CFX_PtrArray& fileList
) |
| 65 { | 61 { |
| 66 » if (!pDocument) | 62 if (!pDocument) |
| 67 » » return FALSE; | 63 return FALSE; |
| 68 » if (pDocument->GetDocType() != DOCTYPE_DYNIMIC_XFA && pDocument->GetDocT
ype() != DOCTYPE_STATIC_XFA) | 64 if (pDocument->GetDocType() != DOCTYPE_DYNIMIC_XFA && pDocument->GetDocType(
) != DOCTYPE_STATIC_XFA) |
| 69 » » return TRUE; | 65 return TRUE; |
| 70 » if (!CPDFXFA_App::GetInstance()->GetXFAApp()) | 66 if (!CPDFXFA_App::GetInstance()->GetXFAApp()) |
| 71 » » return TRUE; | 67 return TRUE; |
| 72 | 68 |
| 73 » IXFA_DocView* pXFADocView = pDocument->GetXFADocView(); | 69 IXFA_DocView* pXFADocView = pDocument->GetXFADocView(); |
| 74 » if (NULL == pXFADocView) | 70 if (NULL == pXFADocView) |
| 75 » » return TRUE; | 71 return TRUE; |
| 76 | 72 |
| 77 » IXFA_DocHandler *pXFADocHandler = CPDFXFA_App::GetInstance()->GetXFAApp(
)->GetDocHandler(); | 73 IXFA_DocHandler *pXFADocHandler = CPDFXFA_App::GetInstance()->GetXFAApp()->G
etDocHandler(); |
| 78 » CPDF_Document * pPDFDocument = pDocument->GetPDFDoc(); | 74 CPDF_Document * pPDFDocument = pDocument->GetPDFDoc(); |
| 79 » if (pDocument == NULL) | 75 if (pDocument == NULL) |
| 80 » » return FALSE; | 76 return FALSE; |
| 81 | 77 |
| 82 » CPDF_Dictionary* pRoot = pPDFDocument->GetRoot(); | 78 CPDF_Dictionary* pRoot = pPDFDocument->GetRoot(); |
| 83 » if (pRoot == NULL) | 79 if (pRoot == NULL) |
| 84 » » return FALSE; | 80 return FALSE; |
| 85 » CPDF_Dictionary* pAcroForm = pRoot->GetDict("AcroForm"); | 81 CPDF_Dictionary* pAcroForm = pRoot->GetDict("AcroForm"); |
| 86 » if (NULL == pAcroForm) | 82 if (NULL == pAcroForm) |
| 87 » » return FALSE; | 83 return FALSE; |
| 88 » CPDF_Object* pXFA = pAcroForm->GetElement("XFA"); | 84 CPDF_Object* pXFA = pAcroForm->GetElement("XFA"); |
| 89 » if (pXFA == NULL) | 85 if (pXFA == NULL) |
| 90 » » return TRUE; | 86 return TRUE; |
| 91 » if(pXFA->GetType() != PDFOBJ_ARRAY) | 87 if(pXFA->GetType() != PDFOBJ_ARRAY) |
| 92 » » return FALSE; | 88 return FALSE; |
| 93 » CPDF_Array* pArray = pXFA->GetArray(); | 89 CPDF_Array* pArray = pXFA->GetArray(); |
| 94 » if (NULL == pArray) | 90 if (NULL == pArray) |
| 95 » » return FALSE; | 91 return FALSE; |
| 96 » int size = pArray->GetCount(); | 92 int size = pArray->GetCount(); |
| 97 » int iFormIndex = -1; | 93 int iFormIndex = -1; |
| 98 » int iDataSetsIndex = -1; | 94 int iDataSetsIndex = -1; |
| 99 » int iTemplate = -1; | 95 int iTemplate = -1; |
| 100 » int iLast = size - 2; | 96 int iLast = size - 2; |
| 101 » for (int i = 0; i < size - 1; i++) | 97 for (int i = 0; i < size - 1; i++) |
| 102 » { | 98 { |
| 103 » » CPDF_Object* pPDFObj = pArray->GetElement(i); | 99 CPDF_Object* pPDFObj = pArray->GetElement(i); |
| 104 » » if (pPDFObj->GetType() != PDFOBJ_STRING) | 100 if (pPDFObj->GetType() != PDFOBJ_STRING) |
| 105 » » » continue; | 101 continue; |
| 106 » » if (pPDFObj->GetString() == "form") | 102 if (pPDFObj->GetString() == "form") |
| 107 » » » iFormIndex = i+1; | 103 iFormIndex = i+1; |
| 108 » » else if (pPDFObj->GetString() == "datasets") | 104 else if (pPDFObj->GetString() == "datasets") |
| 109 » » » iDataSetsIndex = i+1; | 105 iDataSetsIndex = i+1; |
| 110 » » else if (pPDFObj->GetString() == FX_BSTRC("template")) | 106 else if (pPDFObj->GetString() == FX_BSTRC("template")) |
| 111 » » » iTemplate = i + 1; | 107 iTemplate = i + 1; |
| 112 » } | 108 } |
| 113 » IXFA_ChecksumContext* pContext = NULL; | 109 IXFA_ChecksumContext* pContext = NULL; |
| 114 #define XFA_USECKSUM | 110 #define XFA_USECKSUM |
| 115 #ifdef XFA_USECKSUM | 111 #ifdef XFA_USECKSUM |
| 116 » //Checksum | 112 //Checksum |
| 117 » pContext = XFA_Checksum_Create(); | 113 pContext = XFA_Checksum_Create(); |
| 118 » FXSYS_assert(pContext); | 114 FXSYS_assert(pContext); |
| 119 » pContext->StartChecksum(); | 115 pContext->StartChecksum(); |
| 120 | 116 |
| 121 » //template | 117 //template |
| 122 » if (iTemplate > -1) | 118 if (iTemplate > -1) |
| 123 » { | 119 { |
| 124 » » CPDF_Stream *pTemplateStream = pArray->GetStream(iTemplate); | 120 CPDF_Stream *pTemplateStream = pArray->GetStream(iTemplate); |
| 125 » » CPDF_StreamAcc streamAcc; | 121 CPDF_StreamAcc streamAcc; |
| 126 » » streamAcc.LoadAllData(pTemplateStream); | 122 streamAcc.LoadAllData(pTemplateStream); |
| 127 » » uint8_t* pData = (uint8_t*)streamAcc.GetData(); | 123 uint8_t* pData = (uint8_t*)streamAcc.GetData(); |
| 128 » » FX_DWORD dwSize2 = streamAcc.GetSize(); | 124 FX_DWORD dwSize2 = streamAcc.GetSize(); |
| 129 » » IFX_FileStream *pTemplate = FX_CreateMemoryStream(pData, dwSize2
); | 125 IFX_FileStream *pTemplate = FX_CreateMemoryStream(pData, dwSize2); |
| 130 » » pContext->UpdateChecksum((IFX_FileRead*)pTemplate); | 126 pContext->UpdateChecksum((IFX_FileRead*)pTemplate); |
| 131 » » pTemplate->Release(); | 127 pTemplate->Release(); |
| 132 » } | 128 } |
| 133 #endif | 129 #endif |
| 134 » CPDF_Stream* pFormStream = NULL; | 130 CPDF_Stream* pFormStream = NULL; |
| 135 » CPDF_Stream* pDataSetsStream = NULL; | 131 CPDF_Stream* pDataSetsStream = NULL; |
| 136 » if (iFormIndex != -1) | 132 if (iFormIndex != -1) |
| 137 » { | 133 { |
| 138 » » //Get form CPDF_Stream | 134 //Get form CPDF_Stream |
| 139 » » CPDF_Object* pFormPDFObj = pArray->GetElement(iFormIndex); | 135 CPDF_Object* pFormPDFObj = pArray->GetElement(iFormIndex); |
| 140 » » if (pFormPDFObj->GetType() == PDFOBJ_REFERENCE) | 136 if (pFormPDFObj->GetType() == PDFOBJ_REFERENCE) |
| 141 » » { | 137 { |
| 142 » » » CPDF_Reference* pFormRefObj = (CPDF_Reference*)pFormPDFO
bj; | 138 CPDF_Reference* pFormRefObj = (CPDF_Reference*)pFormPDFObj; |
| 143 » » » CPDF_Object* pFormDircetObj = pFormPDFObj->GetDirect(); | 139 CPDF_Object* pFormDircetObj = pFormPDFObj->GetDirect(); |
| 144 » » » if (NULL != pFormDircetObj && pFormDircetObj->GetType()
== PDFOBJ_STREAM) | 140 if (NULL != pFormDircetObj && pFormDircetObj->GetType() == PDFOBJ_ST
REAM) |
| 145 » » » { | 141 { |
| 146 » » » » pFormStream = (CPDF_Stream*)pFormDircetObj; | 142 pFormStream = (CPDF_Stream*)pFormDircetObj; |
| 147 » » » } | 143 } |
| 148 » » } | 144 } |
| 149 » » else if (pFormPDFObj->GetType() == PDFOBJ_STREAM) | 145 else if (pFormPDFObj->GetType() == PDFOBJ_STREAM) |
| 150 » » { | 146 { |
| 151 » » » pFormStream = (CPDF_Stream*)pFormPDFObj; | 147 pFormStream = (CPDF_Stream*)pFormPDFObj; |
| 152 » » } | 148 } |
| 153 » } | 149 } |
| 154 | 150 |
| 155 » if (iDataSetsIndex != -1) | 151 if (iDataSetsIndex != -1) |
| 156 » { | 152 { |
| 157 » » //Get datasets CPDF_Stream | 153 //Get datasets CPDF_Stream |
| 158 » » CPDF_Object* pDataSetsPDFObj = pArray->GetElement(iDataSetsIndex
); | 154 CPDF_Object* pDataSetsPDFObj = pArray->GetElement(iDataSetsIndex); |
| 159 » » if (pDataSetsPDFObj->GetType() == PDFOBJ_REFERENCE) | 155 if (pDataSetsPDFObj->GetType() == PDFOBJ_REFERENCE) |
| 160 » » { | 156 { |
| 161 » » » CPDF_Reference* pDataSetsRefObj = (CPDF_Reference*)pData
SetsPDFObj; | 157 CPDF_Reference* pDataSetsRefObj = (CPDF_Reference*)pDataSetsPDFObj; |
| 162 » » » CPDF_Object* pDataSetsDircetObj = pDataSetsRefObj->GetDi
rect(); | 158 CPDF_Object* pDataSetsDircetObj = pDataSetsRefObj->GetDirect(); |
| 163 » » » if (NULL != pDataSetsDircetObj && pDataSetsDircetObj->Ge
tType() == PDFOBJ_STREAM) | 159 if (NULL != pDataSetsDircetObj && pDataSetsDircetObj->GetType() == P
DFOBJ_STREAM) |
| 164 » » » { | 160 { |
| 165 » » » » pDataSetsStream = (CPDF_Stream*)pDataSetsDircetO
bj; | 161 pDataSetsStream = (CPDF_Stream*)pDataSetsDircetObj; |
| 166 » » » } | 162 } |
| 167 » » } | 163 } |
| 168 » » else if (pDataSetsPDFObj->GetType() == PDFOBJ_STREAM) | 164 else if (pDataSetsPDFObj->GetType() == PDFOBJ_STREAM) |
| 169 » » { | 165 { |
| 170 » » » pDataSetsStream = (CPDF_Stream*)pDataSetsPDFObj; | 166 pDataSetsStream = (CPDF_Stream*)pDataSetsPDFObj; |
| 171 » » } | 167 } |
| 172 » } | 168 } |
| 173 » //end | 169 //end |
| 174 » //L"datasets" | 170 //L"datasets" |
| 175 » { | 171 { |
| 176 » » IFX_FileStream* pDsfileWrite = FX_CreateMemoryStream(); | 172 IFX_FileStream* pDsfileWrite = FX_CreateMemoryStream(); |
| 177 » » if ( NULL == pDsfileWrite ) | 173 if ( NULL == pDsfileWrite ) |
| 178 » » { | 174 { |
| 179 » » » pContext->Release(); | 175 pContext->Release(); |
| 180 » » » pDsfileWrite->Release(); | 176 pDsfileWrite->Release(); |
| 181 » » » return FALSE; | 177 return FALSE; |
| 182 » » } | 178 } |
| 183 » » if (pXFADocHandler->SavePackage(pXFADocView->GetDoc(), CFX_WideS
tringC(L"datasets"), pDsfileWrite) && pDsfileWrite->GetSize()>0) | 179 if (pXFADocHandler->SavePackage(pXFADocView->GetDoc(), CFX_WideStringC(L
"datasets"), pDsfileWrite) && pDsfileWrite->GetSize()>0) |
| 184 » » { | 180 { |
| 185 #ifdef XFA_USECKSUM | 181 #ifdef XFA_USECKSUM |
| 186 » » //Datasets | 182 //Datasets |
| 187 » » pContext->UpdateChecksum((IFX_FileRead*)pDsfileWrite); | 183 pContext->UpdateChecksum((IFX_FileRead*)pDsfileWrite); |
| 188 » » pContext->FinishChecksum(); | 184 pContext->FinishChecksum(); |
| 189 #endif | 185 #endif |
| 190 » » » CPDF_Dictionary* pDataDict = FX_NEW CPDF_Dictionary; | 186 CPDF_Dictionary* pDataDict = FX_NEW CPDF_Dictionary; |
| 191 » » » if (iDataSetsIndex != -1) | 187 if (iDataSetsIndex != -1) |
| 192 » » » { | 188 { |
| 193 » » » » if (pDataSetsStream) | 189 if (pDataSetsStream) |
| 194 » » » » » pDataSetsStream->InitStream(pDsfileWrite
, pDataDict); | 190 pDataSetsStream->InitStream(pDsfileWrite, pDataDict); |
| 195 » » » } | 191 } |
| 196 » » » else | 192 else |
| 197 » » » { | 193 { |
| 198 » » » » CPDF_Stream* pData = FX_NEW CPDF_Stream(NULL, 0,
NULL); | 194 CPDF_Stream* pData = FX_NEW CPDF_Stream(NULL, 0, NULL); |
| 199 » » » » pData->InitStream(pDsfileWrite, pDataDict); | 195 pData->InitStream(pDsfileWrite, pDataDict); |
| 200 » » » » FX_DWORD AppStreamobjnum = pPDFDocument->AddIndi
rectObject(pData); | 196 FX_DWORD AppStreamobjnum = pPDFDocument->AddIndirectObject(pData
); |
| 201 » » » » CPDF_Reference* pRef = (CPDF_Reference*)pPDFDocu
ment->GetIndirectObject(AppStreamobjnum); | 197 CPDF_Reference* pRef = (CPDF_Reference*)pPDFDocument->GetIndirec
tObject(AppStreamobjnum); |
| 202 » » » » { | 198 { |
| 203 » » » » » iLast = pArray->GetCount() -2; | 199 iLast = pArray->GetCount() -2; |
| 204 » » » » » pArray->InsertAt(iLast,CPDF_String::Crea
te("datasets")); | 200 pArray->InsertAt(iLast,CPDF_String::Create("datasets")); |
| 205 » » » » » pArray->InsertAt(iLast+1, pData, pPDFDoc
ument); | 201 pArray->InsertAt(iLast+1, pData, pPDFDocument); |
| 206 » » » » } | 202 } |
| 207 » » » } | 203 } |
| 208 » » » fileList.Add(pDsfileWrite); | 204 fileList.Add(pDsfileWrite); |
| 209 » » } | 205 } |
| 210 » } | 206 } |
| 211 | 207 |
| 212 | 208 |
| 213 » //L"form" | 209 //L"form" |
| 214 » { | 210 { |
| 215 | 211 |
| 216 » » IFX_FileStream* pfileWrite = FX_CreateMemoryStream(); | 212 IFX_FileStream* pfileWrite = FX_CreateMemoryStream(); |
| 217 » » if (NULL == pfileWrite) | 213 if (NULL == pfileWrite) |
| 218 » » { | 214 { |
| 219 » » » pContext->Release(); | 215 pContext->Release(); |
| 220 » » » return FALSE; | 216 return FALSE; |
| 221 » » } | 217 } |
| 222 » » if(pXFADocHandler->SavePackage(pXFADocView->GetDoc(), CFX_WideSt
ringC(L"form"), pfileWrite, pContext) && pfileWrite > 0) | 218 if(pXFADocHandler->SavePackage(pXFADocView->GetDoc(), CFX_WideStringC(L"
form"), pfileWrite, pContext) && pfileWrite > 0) |
| 223 » » { | 219 { |
| 224 » » » CPDF_Dictionary* pDataDict = FX_NEW CPDF_Dictionary; | 220 CPDF_Dictionary* pDataDict = FX_NEW CPDF_Dictionary; |
| 225 » » » if (iFormIndex != -1) | 221 if (iFormIndex != -1) |
| 226 » » » { | 222 { |
| 227 » » » » if (pFormStream) | 223 if (pFormStream) |
| 228 » » » » » pFormStream->InitStream(pfileWrite, pDat
aDict); | 224 pFormStream->InitStream(pfileWrite, pDataDict); |
| 229 » » » } | 225 } |
| 230 » » » else | 226 else |
| 231 » » » { | 227 { |
| 232 » » » » CPDF_Stream* pData = FX_NEW CPDF_Stream(NULL, 0,
NULL); | 228 CPDF_Stream* pData = FX_NEW CPDF_Stream(NULL, 0, NULL); |
| 233 » » » » pData->InitStream(pfileWrite, pDataDict); | 229 pData->InitStream(pfileWrite, pDataDict); |
| 234 » » » » FX_DWORD AppStreamobjnum = pPDFDocument->AddIndi
rectObject(pData); | 230 FX_DWORD AppStreamobjnum = pPDFDocument->AddIndirectObject(pData
); |
| 235 » » » » CPDF_Reference* pRef = (CPDF_Reference*)pPDFDocu
ment->GetIndirectObject(AppStreamobjnum); | 231 CPDF_Reference* pRef = (CPDF_Reference*)pPDFDocument->GetIndirec
tObject(AppStreamobjnum); |
| 236 » » » » { | 232 { |
| 237 » » » » » iLast = pArray->GetCount() -2; | 233 iLast = pArray->GetCount() -2; |
| 238 » » » » » pArray->InsertAt(iLast, CPDF_String::Cre
ate("form")); | 234 pArray->InsertAt(iLast, CPDF_String::Create("form")); |
| 239 » » » » » pArray->InsertAt(iLast+1, pData, pPDFDoc
ument); | 235 pArray->InsertAt(iLast+1, pData, pPDFDocument); |
| 240 » » » » } | 236 } |
| 241 » » » } | 237 } |
| 242 » » » fileList.Add(pfileWrite); | 238 fileList.Add(pfileWrite); |
| 243 » » } | 239 } |
| 244 » } | 240 } |
| 245 » pContext->Release(); | 241 pContext->Release(); |
| 246 » return TRUE; | 242 return TRUE; |
| 247 } | 243 } |
| 248 | 244 |
| 249 | 245 |
| 250 FX_BOOL _SendPostSaveToXFADoc(CPDFXFA_Document* pDocument) | 246 FX_BOOL _SendPostSaveToXFADoc(CPDFXFA_Document* pDocument) |
| 251 { | 247 { |
| 252 » if (!pDocument) | 248 if (!pDocument) |
| 253 » » return FALSE; | 249 return FALSE; |
| 254 | 250 |
| 255 » if (pDocument->GetDocType() != DOCTYPE_DYNIMIC_XFA && pDocument->GetDocT
ype() != DOCTYPE_STATIC_XFA) | 251 if (pDocument->GetDocType() != DOCTYPE_DYNIMIC_XFA && pDocument->GetDocType(
) != DOCTYPE_STATIC_XFA) |
| 256 » » return TRUE; | 252 return TRUE; |
| 257 | 253 |
| 258 » IXFA_DocView* pXFADocView = pDocument->GetXFADocView(); | 254 IXFA_DocView* pXFADocView = pDocument->GetXFADocView(); |
| 259 » if (NULL == pXFADocView) | 255 if (NULL == pXFADocView) |
| 260 » » return FALSE; | 256 return FALSE; |
| 261 » IXFA_WidgetHandler* pWidgetHander = pXFADocView->GetWidgetHandler(); | 257 IXFA_WidgetHandler* pWidgetHander = pXFADocView->GetWidgetHandler(); |
| 262 | 258 |
| 263 » CXFA_WidgetAcc* pWidgetAcc = NULL; | 259 CXFA_WidgetAcc* pWidgetAcc = NULL; |
| 264 » IXFA_WidgetAccIterator* pWidgetAccIterator = pXFADocView->CreateWidgetAc
cIterator(); | 260 IXFA_WidgetAccIterator* pWidgetAccIterator = pXFADocView->CreateWidgetAccIte
rator(); |
| 265 » pWidgetAcc = pWidgetAccIterator->MoveToNext(); | 261 pWidgetAcc = pWidgetAccIterator->MoveToNext(); |
| 266 » while(pWidgetAcc) | 262 while(pWidgetAcc) |
| 267 » { | 263 { |
| 268 » » CXFA_EventParam preParam; | 264 CXFA_EventParam preParam; |
| 269 » » preParam.m_eType = XFA_EVENT_PostSave; | 265 preParam.m_eType = XFA_EVENT_PostSave; |
| 270 » » pWidgetHander->ProcessEvent(pWidgetAcc,&preParam); | 266 pWidgetHander->ProcessEvent(pWidgetAcc,&preParam); |
| 271 » » pWidgetAcc = pWidgetAccIterator->MoveToNext(); | 267 pWidgetAcc = pWidgetAccIterator->MoveToNext(); |
| 272 » } | 268 } |
| 273 » pWidgetAccIterator->Release(); | 269 pWidgetAccIterator->Release(); |
| 274 » pXFADocView->UpdateDocView(); | 270 pXFADocView->UpdateDocView(); |
| 275 » pDocument->_ClearChangeMark(); | 271 pDocument->_ClearChangeMark(); |
| 276 » return TRUE; | 272 return TRUE; |
| 277 } | 273 } |
| 278 | 274 |
| 279 | 275 |
| 280 FX_BOOL _SendPreSaveToXFADoc(CPDFXFA_Document* pDocument, CFX_PtrArray& fileList
) | 276 FX_BOOL _SendPreSaveToXFADoc(CPDFXFA_Document* pDocument, CFX_PtrArray& fileList
) |
| 281 { | 277 { |
| 282 » if (pDocument->GetDocType() != DOCTYPE_DYNIMIC_XFA && pDocument->GetDocT
ype() != DOCTYPE_STATIC_XFA) | 278 if (pDocument->GetDocType() != DOCTYPE_DYNIMIC_XFA && pDocument->GetDocType(
) != DOCTYPE_STATIC_XFA) |
| 283 » » return TRUE; | 279 return TRUE; |
| 284 » IXFA_DocView* pXFADocView = pDocument->GetXFADocView(); | 280 IXFA_DocView* pXFADocView = pDocument->GetXFADocView(); |
| 285 » if (NULL == pXFADocView) | 281 if (NULL == pXFADocView) |
| 286 » » return TRUE; | 282 return TRUE; |
| 287 » IXFA_WidgetHandler* pWidgetHander = pXFADocView->GetWidgetHandler(); | 283 IXFA_WidgetHandler* pWidgetHander = pXFADocView->GetWidgetHandler(); |
| 288 » CXFA_WidgetAcc* pWidgetAcc = NULL; | 284 CXFA_WidgetAcc* pWidgetAcc = NULL; |
| 289 » IXFA_WidgetAccIterator* pWidgetAccIterator = pXFADocView->CreateWidgetAc
cIterator(); | 285 IXFA_WidgetAccIterator* pWidgetAccIterator = pXFADocView->CreateWidgetAccIte
rator(); |
| 290 » pWidgetAcc = pWidgetAccIterator->MoveToNext(); | 286 pWidgetAcc = pWidgetAccIterator->MoveToNext(); |
| 291 » while(pWidgetAcc) | 287 while(pWidgetAcc) |
| 292 » { | 288 { |
| 293 » » CXFA_EventParam preParam; | 289 CXFA_EventParam preParam; |
| 294 » » preParam.m_eType = XFA_EVENT_PreSave; | 290 preParam.m_eType = XFA_EVENT_PreSave; |
| 295 » » pWidgetHander->ProcessEvent(pWidgetAcc, &preParam); | 291 pWidgetHander->ProcessEvent(pWidgetAcc, &preParam); |
| 296 » » pWidgetAcc = pWidgetAccIterator->MoveToNext(); | 292 pWidgetAcc = pWidgetAccIterator->MoveToNext(); |
| 297 » } | 293 } |
| 298 » pWidgetAccIterator->Release(); | 294 pWidgetAccIterator->Release(); |
| 299 » pXFADocView->UpdateDocView(); | 295 pXFADocView->UpdateDocView(); |
| 300 » return _SaveXFADocumentData(pDocument, fileList); | 296 return _SaveXFADocumentData(pDocument, fileList); |
| 301 } | 297 } |
| 302 | 298 |
| 303 FPDF_BOOL _FPDF_Doc_Save(FPDF_DOCUMENT document, FPDF_FILEWRITE * pFileWrite,FPD
F_DWORD flags, FPDF_BOOL bSetVersion, | 299 FPDF_BOOL _FPDF_Doc_Save(FPDF_DOCUMENT document, FPDF_FILEWRITE * pFileWrite,FPD
F_DWORD flags, FPDF_BOOL bSetVersion, |
| 304 » » » » » » int fileVerion) | 300 int fileVerion) |
| 305 { | 301 { |
| 306 » CPDFXFA_Document* pDoc = (CPDFXFA_Document*)document; | 302 CPDFXFA_Document* pDoc = (CPDFXFA_Document*)document; |
| 307 | 303 |
| 308 » CFX_PtrArray fileList; | 304 CFX_PtrArray fileList; |
| 309 | 305 |
| 310 » _SendPreSaveToXFADoc(pDoc, fileList); | 306 _SendPreSaveToXFADoc(pDoc, fileList); |
| 311 | 307 |
| 312 » CPDF_Document* pPDFDoc = pDoc->GetPDFDoc(); | 308 CPDF_Document* pPDFDoc = pDoc->GetPDFDoc(); |
| 313 » if (!pPDFDoc) | 309 if (!pPDFDoc) |
| 314 » » return 0; | 310 return 0; |
| 315 | 311 |
| 316 » if ( flags < FPDF_INCREMENTAL || flags > FPDF_REMOVE_SECURITY ) | 312 if ( flags < FPDF_INCREMENTAL || flags > FPDF_REMOVE_SECURITY ) |
| 317 » { | 313 { |
| 318 » » flags = 0; | 314 flags = 0; |
| 319 » } | 315 } |
| 320 | 316 |
| 321 » CPDF_Creator FileMaker(pPDFDoc); | 317 CPDF_Creator FileMaker(pPDFDoc); |
| 322 » if (bSetVersion) | 318 if (bSetVersion) |
| 323 » » FileMaker.SetFileVersion(fileVerion); | 319 FileMaker.SetFileVersion(fileVerion); |
| 324 » if (flags == FPDF_REMOVE_SECURITY) | 320 if (flags == FPDF_REMOVE_SECURITY) |
| 325 » { | 321 { |
| 326 » » flags = 0; | 322 flags = 0; |
| 327 » » FileMaker.RemoveSecurity(); | 323 FileMaker.RemoveSecurity(); |
| 328 » } | 324 } |
| 329 » CFX_IFileWrite* pStreamWrite = NULL; | 325 CFX_IFileWrite* pStreamWrite = NULL; |
| 330 » FX_BOOL bRet; | 326 FX_BOOL bRet; |
| 331 » pStreamWrite = new CFX_IFileWrite; | 327 pStreamWrite = new CFX_IFileWrite; |
| 332 » pStreamWrite->Init( pFileWrite ); | 328 pStreamWrite->Init( pFileWrite ); |
| 333 » bRet = FileMaker.Create(pStreamWrite, flags); | 329 bRet = FileMaker.Create(pStreamWrite, flags); |
| 334 | 330 |
| 335 » _SendPostSaveToXFADoc(pDoc); | 331 _SendPostSaveToXFADoc(pDoc); |
| 336 » //pDoc->_ClearChangeMark(); | 332 //pDoc->_ClearChangeMark(); |
| 337 | 333 |
| 338 » for (int i = 0; i < fileList.GetSize(); i++) | 334 for (int i = 0; i < fileList.GetSize(); i++) |
| 339 » { | 335 { |
| 340 » » IFX_FileStream* pFile = (IFX_FileStream*)fileList.GetAt(i); | 336 IFX_FileStream* pFile = (IFX_FileStream*)fileList.GetAt(i); |
| 341 » » pFile->Release(); | 337 pFile->Release(); |
| 342 » } | 338 } |
| 343 » fileList.RemoveAll(); | 339 fileList.RemoveAll(); |
| 344 | 340 |
| 345 » delete pStreamWrite; | 341 delete pStreamWrite; |
| 346 » return bRet; | 342 return bRet; |
| 347 } | 343 } |
| 348 | 344 |
| 349 DLLEXPORT FPDF_BOOL STDCALL FPDF_SaveAsCopy(» FPDF_DOCUMENT document,FPDF_FILE
WRITE * pFileWrite, | 345 DLLEXPORT FPDF_BOOL STDCALL FPDF_SaveAsCopy( FPDF_DOCUMENT document,FPDF_FILE
WRITE * pFileWrite, |
| 350 » » » » » » » » » »
» » FPDF_DWORD flags ) | 346 FPDF_DWORD flags ) |
| 351 { | 347 { |
| 352 » return _FPDF_Doc_Save(document, pFileWrite, flags, FALSE , 0); | 348 return _FPDF_Doc_Save(document, pFileWrite, flags, FALSE , 0); |
| 353 } | 349 } |
| 354 | 350 |
| 355 DLLEXPORT FPDF_BOOL STDCALL FPDF_SaveWithVersion(» FPDF_DOCUMENT document,F
PDF_FILEWRITE * pFileWrite, | 351 DLLEXPORT FPDF_BOOL STDCALL FPDF_SaveWithVersion( FPDF_DOCUMENT document,FPDF_
FILEWRITE * pFileWrite, |
| 356 » FPDF_DWORD flags, int fileVersion) | 352 FPDF_DWORD flags, int fileVersion) |
| 357 { | 353 { |
| 358 » return _FPDF_Doc_Save(document, pFileWrite, flags, TRUE , fileVersion); | 354 return _FPDF_Doc_Save(document, pFileWrite, flags, TRUE , fileVersion); |
| 359 } | 355 } |
| 360 | 356 |
| OLD | NEW |