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.
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
7 #ifndef CORE_INCLUDE_FPDFAPI_FPDF_SERIAL_H_
8 #define CORE_INCLUDE_FPDFAPI_FPDF_SERIAL_H_
10 #include "fpdf_page.h"
11 #include "fpdf_pageobj.h"
13 class CPDF_ObjectStream;
14 class CPDF_XRefStream;
15 CFX_ByteTextBuf& operator << (CFX_ByteTextBuf& buf, const CPDF_Object* pObj);
16 class CPDF_ObjArchiveSaver : public CFX_ArchiveSaver
20 friend CPDF_ObjArchiveSaver& operator << (CPDF_ObjArchiveSaver& ar, const CPDF_Object* pObj);
23 CFX_MapPtrToPtr m_ObjectMap;
25 class CPDF_ObjArchiveLoader : public CFX_ArchiveLoader
29 CPDF_ObjArchiveLoader(const uint8_t* pData, FX_DWORD dwSize) : CFX_ArchiveLoader(pData, dwSize),
30 m_IndirectObjects(NULL) {}
32 friend CPDF_ObjArchiveLoader& operator >> (CPDF_ObjArchiveLoader& ar, CPDF_Object*& pObj);
35 CPDF_IndirectObjects m_IndirectObjects;
37 class CPDF_PageArchiveSaver : public CPDF_ObjArchiveSaver
41 CPDF_PageArchiveSaver(CPDF_PageObjects* pPageObjs);
43 friend CPDF_PageArchiveSaver& operator << (CPDF_PageArchiveSaver& ar, CPDF_PageObject* pObj);
47 friend CPDF_PageArchiveSaver& operator << (CPDF_PageArchiveSaver& ar, CPDF_ClipPath clip_path);
49 friend CPDF_PageArchiveSaver& operator << (CPDF_PageArchiveSaver& ar, CPDF_GraphState graph_state);
51 friend CPDF_PageArchiveSaver& operator << (CPDF_PageArchiveSaver& ar, CPDF_TextState text_state);
53 friend CPDF_PageArchiveSaver& operator << (CPDF_PageArchiveSaver& ar, CPDF_ColorState color_state);
55 friend CPDF_PageArchiveSaver& operator << (CPDF_PageArchiveSaver& ar, CPDF_GeneralState general_state);
59 CPDF_ClipPath m_LastClipPath;
61 CPDF_GraphState m_LastGraphState;
63 CPDF_ColorState m_LastColorState;
65 CPDF_TextState m_LastTextState;
67 CPDF_GeneralState m_LastGeneralState;
69 CPDF_PageObjects* m_pCurPage;
71 class CPDF_PageArchiveLoader : public CPDF_ObjArchiveLoader
75 CPDF_PageArchiveLoader(CPDF_PageObjects* pPageObjs, const uint8_t* pData, FX_DWORD dwSize);
77 friend CPDF_PageArchiveLoader& operator >> (CPDF_PageArchiveLoader& ar, CPDF_PageObject*& pObj);
81 friend CPDF_PageArchiveLoader& operator >> (CPDF_PageArchiveLoader& ar, CPDF_ClipPath& clip_path);
83 friend CPDF_PageArchiveLoader& operator >> (CPDF_PageArchiveLoader& ar, CPDF_GraphState& graph_state);
85 friend CPDF_PageArchiveLoader& operator >> (CPDF_PageArchiveLoader& ar, CPDF_TextState& text_state);
87 friend CPDF_PageArchiveLoader& operator >> (CPDF_PageArchiveLoader& ar, CPDF_ColorState& color_state);
89 friend CPDF_PageArchiveLoader& operator >> (CPDF_PageArchiveLoader& ar, CPDF_GeneralState& general_state);
92 void PostProcColor(CPDF_Color& color);
94 CPDF_Object* AddResource(CPDF_Object* pSrcObj, const FX_CHAR* type);
96 CPDF_ClipPath m_LastClipPath;
98 CPDF_GraphState m_LastGraphState;
100 CPDF_ColorState m_LastColorState;
102 CPDF_TextState m_LastTextState;
104 CPDF_GeneralState m_LastGeneralState;
106 CPDF_PageObjects* m_pCurPage;
108 CFX_MapPtrToPtr m_ObjectMap;
110 #define FPDFCREATE_INCREMENTAL 1
111 #define FPDFCREATE_NO_ORIGINAL 2
112 #define FPDFCREATE_PROGRESSIVE 4
113 #define FPDFCREATE_OBJECTSTREAM 8
118 CPDF_Creator(CPDF_Document* pDoc);
122 void RemoveSecurity();
124 FX_BOOL Create(const FX_WCHAR* filename, FX_DWORD flags = 0);
126 FX_BOOL Create(const FX_CHAR* filename, FX_DWORD flags = 0);
128 FX_BOOL Create(IFX_StreamWrite* pFile, FX_DWORD flags = 0);
130 int32_t Continue(IFX_Pause *pPause = NULL);
132 FX_BOOL SetFileVersion(int32_t fileVersion = 17);
135 CPDF_Document* m_pDocument;
137 CPDF_Parser* m_pParser;
141 FX_BOOL m_bSecurityChanged;
143 CPDF_Dictionary* m_pEncryptDict;
144 FX_DWORD m_dwEnryptObjNum;
145 FX_BOOL m_bEncryptCloned;
147 FX_BOOL m_bStandardSecurity;
149 CPDF_CryptoHandler* m_pCryptoHandler;
150 FX_BOOL m_bNewCrypto;
152 FX_BOOL m_bEncryptMetadata;
154 CPDF_Object* m_pMetadata;
156 CPDF_XRefStream* m_pXRefStream;
158 int32_t m_ObjectStreamSize;
160 FX_DWORD m_dwLastObjNum;
161 FX_BOOL Create(FX_DWORD flags);
162 void ResetStandardSecurity();
164 int32_t WriteDoc_Stage1(IFX_Pause *pPause);
165 int32_t WriteDoc_Stage2(IFX_Pause *pPause);
166 int32_t WriteDoc_Stage3(IFX_Pause *pPause);
167 int32_t WriteDoc_Stage4(IFX_Pause *pPause);
169 CFX_FileBufferArchive m_File;
171 FX_FILESIZE m_Offset;
172 void InitOldObjNumOffsets();
173 void InitNewObjNumOffsets();
174 void AppendNewObjNum(FX_DWORD objbum);
175 int32_t WriteOldIndirectObject(FX_DWORD objnum);
176 int32_t WriteOldObjs(IFX_Pause *pPause);
177 int32_t WriteNewObjs(FX_BOOL bIncremental, IFX_Pause *pPause);
178 int32_t WriteIndirectObj(const CPDF_Object* pObj);
179 int32_t WriteDirectObj(FX_DWORD objnum, const CPDF_Object* pObj, FX_BOOL bEncrypt = TRUE);
180 int32_t WriteIndirectObjectToStream(const CPDF_Object* pObj);
181 int32_t WriteIndirectObj(FX_DWORD objnum, const CPDF_Object* pObj);
182 int32_t WriteIndirectObjectToStream(FX_DWORD objnum, const uint8_t* pBuffer, FX_DWORD dwSize);
183 int32_t AppendObjectNumberToXRef(FX_DWORD objnum);
184 void InitID(FX_BOOL bDefault = TRUE);
185 int32_t WriteStream(const CPDF_Object* pStream, FX_DWORD objnum, CPDF_CryptoHandler* pCrypto);
190 FX_FILESIZE m_XrefStart;
192 CFX_FileSizeListArray m_ObjectOffset;
194 CFX_DWordListArray m_ObjectSize;
195 CFX_DWordArray m_NewObjNumArray;
197 CPDF_Array* m_pIDArray;
199 int32_t m_FileVersion;
200 friend class CPDF_ObjectStream;
201 friend class CPDF_XRefStream;
204 #endif // CORE_INCLUDE_FPDFAPI_FPDF_SERIAL_H_