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 #ifndef _FPDF_SERIAL_ 8 #define _FPDF_SERIAL_ 9 #ifndef _FPDF_PAGE_ 10 #include "fpdf_page.h" 11 #endif 12 #ifndef _FPDF_PAGEOBJ_H_ 13 #include "fpdf_pageobj.h" 14 #endif 15 class CPDF_ObjectStream; 16 class CPDF_XRefStream; 17 CFX_ByteTextBuf& operator << (CFX_ByteTextBuf& buf, const CPDF_Object* pObj); 18 class CPDF_ObjArchiveSaver : public CFX_ArchiveSaver 19 { 20 public: 21 22 friend CPDF_ObjArchiveSaver& operator << (CPDF_ObjArchiveSaver& ar, const CPDF_Object* pObj); 23 protected: 24 25 CFX_MapPtrToPtr m_ObjectMap; 26 }; 27 class CPDF_ObjArchiveLoader : public CFX_ArchiveLoader 28 { 29 public: 30 31 CPDF_ObjArchiveLoader(FX_LPCBYTE pData, FX_DWORD dwSize) : CFX_ArchiveLoader(pData, dwSize), 32 m_IndirectObjects(NULL) {} 33 34 friend CPDF_ObjArchiveLoader& operator >> (CPDF_ObjArchiveLoader& ar, CPDF_Object*& pObj); 35 protected: 36 37 CPDF_IndirectObjects m_IndirectObjects; 38 }; 39 class CPDF_PageArchiveSaver : public CPDF_ObjArchiveSaver 40 { 41 public: 42 43 CPDF_PageArchiveSaver(CPDF_PageObjects* pPageObjs); 44 45 friend CPDF_PageArchiveSaver& operator << (CPDF_PageArchiveSaver& ar, CPDF_PageObject* pObj); 46 47 48 49 friend CPDF_PageArchiveSaver& operator << (CPDF_PageArchiveSaver& ar, CPDF_ClipPath clip_path); 50 51 friend CPDF_PageArchiveSaver& operator << (CPDF_PageArchiveSaver& ar, CPDF_GraphState graph_state); 52 53 friend CPDF_PageArchiveSaver& operator << (CPDF_PageArchiveSaver& ar, CPDF_TextState text_state); 54 55 friend CPDF_PageArchiveSaver& operator << (CPDF_PageArchiveSaver& ar, CPDF_ColorState color_state); 56 57 friend CPDF_PageArchiveSaver& operator << (CPDF_PageArchiveSaver& ar, CPDF_GeneralState general_state); 58 59 protected: 60 61 CPDF_ClipPath m_LastClipPath; 62 63 CPDF_GraphState m_LastGraphState; 64 65 CPDF_ColorState m_LastColorState; 66 67 CPDF_TextState m_LastTextState; 68 69 CPDF_GeneralState m_LastGeneralState; 70 71 CPDF_PageObjects* m_pCurPage; 72 }; 73 class CPDF_PageArchiveLoader : public CPDF_ObjArchiveLoader 74 { 75 public: 76 77 CPDF_PageArchiveLoader(CPDF_PageObjects* pPageObjs, FX_LPCBYTE pData, FX_DWORD dwSize); 78 79 friend CPDF_PageArchiveLoader& operator >> (CPDF_PageArchiveLoader& ar, CPDF_PageObject*& pObj); 80 81 82 83 friend CPDF_PageArchiveLoader& operator >> (CPDF_PageArchiveLoader& ar, CPDF_ClipPath& clip_path); 84 85 friend CPDF_PageArchiveLoader& operator >> (CPDF_PageArchiveLoader& ar, CPDF_GraphState& graph_state); 86 87 friend CPDF_PageArchiveLoader& operator >> (CPDF_PageArchiveLoader& ar, CPDF_TextState& text_state); 88 89 friend CPDF_PageArchiveLoader& operator >> (CPDF_PageArchiveLoader& ar, CPDF_ColorState& color_state); 90 91 friend CPDF_PageArchiveLoader& operator >> (CPDF_PageArchiveLoader& ar, CPDF_GeneralState& general_state); 92 93 protected: 94 void PostProcColor(CPDF_Color& color); 95 96 CPDF_Object* AddResource(CPDF_Object* pSrcObj, FX_LPCSTR type); 97 98 CPDF_ClipPath m_LastClipPath; 99 100 CPDF_GraphState m_LastGraphState; 101 102 CPDF_ColorState m_LastColorState; 103 104 CPDF_TextState m_LastTextState; 105 106 CPDF_GeneralState m_LastGeneralState; 107 108 CPDF_PageObjects* m_pCurPage; 109 110 CFX_MapPtrToPtr m_ObjectMap; 111 }; 112 #define FPDFCREATE_INCREMENTAL 1 113 #define FPDFCREATE_NO_ORIGINAL 2 114 #define FPDFCREATE_PROGRESSIVE 4 115 #define FPDFCREATE_OBJECTSTREAM 8 116 class CPDF_Creator : public CFX_Object 117 { 118 public: 119 120 CPDF_Creator(CPDF_Document* pDoc); 121 122 ~CPDF_Creator(); 123 124 FX_BOOL Create(FX_LPCWSTR filename, FX_DWORD flags = 0); 125 126 FX_BOOL Create(FX_LPCSTR filename, FX_DWORD flags = 0); 127 128 FX_BOOL Create(IFX_StreamWrite* pFile, FX_DWORD flags = 0); 129 130 FX_INT32 Continue(IFX_Pause *pPause = NULL); 131 132 FX_BOOL SetFileVersion(FX_INT32 fileVersion = 17); 133 protected: 134 135 CPDF_Document* m_pDocument; 136 137 CPDF_Parser* m_pParser; 138 139 FX_BOOL m_bCompress; 140 141 FX_BOOL m_bSecurityChanged; 142 143 CPDF_Dictionary* m_pEncryptDict; 144 FX_DWORD m_dwEnryptObjNum; 145 FX_BOOL m_bEncryptCloned; 146 147 FX_BOOL m_bStandardSecurity; 148 149 CPDF_CryptoHandler* m_pCryptoHandler; 150 FX_BOOL m_bNewCrypto; 151 152 FX_BOOL m_bEncryptMetadata; 153 154 CPDF_Object* m_pMetadata; 155 156 CPDF_XRefStream* m_pXRefStream; 157 158 FX_INT32 m_ObjectStreamSize; 159 160 FX_DWORD m_dwLastObjNum; 161 FX_BOOL Create(FX_DWORD flags); 162 void ResetStandardSecurity(); 163 void Clear(); 164 FX_INT32 WriteDoc_Stage1(IFX_Pause *pPause); 165 FX_INT32 WriteDoc_Stage2(IFX_Pause *pPause); 166 FX_INT32 WriteDoc_Stage3(IFX_Pause *pPause); 167 FX_INT32 WriteDoc_Stage4(IFX_Pause *pPause); 168 169 CFX_FileBufferArchive m_File; 170 171 FX_FILESIZE m_Offset; 172 void InitOldObjNumOffsets(); 173 void InitNewObjNumOffsets(); 174 void AppendNewObjNum(FX_DWORD objbum); 175 FX_INT32 WriteOldIndirectObject(FX_DWORD objnum); 176 FX_INT32 WriteOldObjs(IFX_Pause *pPause); 177 FX_INT32 WriteNewObjs(FX_BOOL bIncremental, IFX_Pause *pPause); 178 FX_INT32 WriteIndirectObj(const CPDF_Object* pObj); 179 FX_INT32 WriteDirectObj(FX_DWORD objnum, const CPDF_Object* pObj, FX_BOOL bEncrypt = TRUE); 180 FX_INT32 WriteIndirectObjectToStream(const CPDF_Object* pObj); 181 FX_INT32 WriteIndirectObj(FX_DWORD objnum, const CPDF_Object* pObj); 182 FX_INT32 WriteIndirectObjectToStream(FX_DWORD objnum, FX_LPCBYTE pBuffer, FX_DWORD dwSize); 183 FX_INT32 AppendObjectNumberToXRef(FX_DWORD objnum); 184 void InitID(FX_BOOL bDefault = TRUE); 185 FX_INT32 WriteStream(const CPDF_Object* pStream, FX_DWORD objnum, CPDF_CryptoHandler* pCrypto); 186 187 FX_INT32 m_iStage; 188 FX_DWORD m_dwFlags; 189 FX_POSITION m_Pos; 190 FX_FILESIZE m_XrefStart; 191 192 CFX_FileSizeListArray m_ObjectOffset; 193 194 CFX_DWordListArray m_ObjectSize; 195 CFX_DWordArray m_NewObjNumArray; 196 197 CPDF_Array* m_pIDArray; 198 199 FX_INT32 m_FileVersion; 200 friend class CPDF_ObjectStream; 201 friend class CPDF_XRefStream; 202 }; 203 #endif 204