Home | History | Annotate | Download | only in fpdfapi
      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