8e5e476ca2a36d0089ac573747c66703c76d8a98
[pdfium.git] / fpdfsdk / src / fpdfsave.cpp
1 // Copyright 2014 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6
7 #include "../../public/fpdf_edit.h"
8 #include "../../public/fpdf_save.h"
9 #include "../include/fsdk_define.h"
10
11 #if _FX_OS_ == _FX_ANDROID_
12 #include "time.h"
13 #else
14 #include <ctime>
15 #endif
16
17 class CFX_IFileWrite final : public IFX_StreamWrite
18 {
19
20 public:
21     CFX_IFileWrite();
22     bool             Init( FPDF_FILEWRITE * pFileWriteStruct );
23     virtual bool     WriteBlock(const void* pData, size_t size) override;
24     virtual void        Release() override {}
25
26 protected:
27     FPDF_FILEWRITE*     m_pFileWriteStruct;
28 };
29
30 CFX_IFileWrite::CFX_IFileWrite()
31 {
32     m_pFileWriteStruct = NULL;
33 }
34
35 bool CFX_IFileWrite::Init( FPDF_FILEWRITE * pFileWriteStruct )
36 {
37     if (!pFileWriteStruct)
38         return false;
39
40     m_pFileWriteStruct = pFileWriteStruct;
41     return true;
42 }
43
44 bool CFX_IFileWrite::WriteBlock(const void* pData, size_t size)
45 {
46     if (!m_pFileWriteStruct)
47         return false;
48
49     m_pFileWriteStruct->WriteBlock( m_pFileWriteStruct, pData, size );
50     return true;
51 }
52
53 FPDF_BOOL _FPDF_Doc_Save(FPDF_DOCUMENT document,FPDF_FILEWRITE * pFileWrite,FPDF_DWORD flags, FPDF_BOOL bSetVersion,
54                          int fileVerion)
55 {
56     CPDF_Document* pDoc = (CPDF_Document*)document;
57     if (!pDoc)
58         return 0;
59
60     if ( flags < FPDF_INCREMENTAL || flags > FPDF_REMOVE_SECURITY )
61     {
62         flags = 0;
63     }
64
65     CPDF_Creator FileMaker(pDoc);
66     if(bSetVersion)
67         FileMaker.SetFileVersion(fileVerion);
68     if(flags == FPDF_REMOVE_SECURITY)
69     {
70         flags =  0;
71         FileMaker.RemoveSecurity();
72     }
73     CFX_IFileWrite* pStreamWrite = NULL;
74     bool bRet;
75     pStreamWrite = new CFX_IFileWrite;
76     pStreamWrite->Init( pFileWrite );
77     bRet = FileMaker.Create(pStreamWrite, flags);
78     delete pStreamWrite;
79     return bRet;
80 }
81
82 DLLEXPORT FPDF_BOOL STDCALL FPDF_SaveAsCopy(    FPDF_DOCUMENT document,FPDF_FILEWRITE * pFileWrite,
83                                                 FPDF_DWORD flags )
84 {
85     return _FPDF_Doc_Save(document, pFileWrite, flags, false , 0);
86 }
87
88
89 DLLEXPORT FPDF_BOOL STDCALL FPDF_SaveWithVersion(   FPDF_DOCUMENT document,FPDF_FILEWRITE * pFileWrite,
90     FPDF_DWORD flags, int fileVersion)
91 {
92     return _FPDF_Doc_Save(document, pFileWrite, flags, true , fileVersion);
93 }