blob: 06cf213d99637cdf04b9046a7c521865d53e0042 [file] [log] [blame]
// Copyright 2014 PDFium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
#ifndef CORE_INCLUDE_FPDFAPI_FPDF_SERIAL_H_
#define CORE_INCLUDE_FPDFAPI_FPDF_SERIAL_H_
#include "fpdf_page.h"
#include "fpdf_pageobj.h"
class CPDF_ObjectStream;
class CPDF_XRefStream;
CFX_ByteTextBuf& operator << (CFX_ByteTextBuf& buf, const CPDF_Object* pObj);
class CPDF_ObjArchiveSaver : public CFX_ArchiveSaver
{
public:
friend CPDF_ObjArchiveSaver& operator << (CPDF_ObjArchiveSaver& ar, const CPDF_Object* pObj);
protected:
CFX_MapPtrToPtr m_ObjectMap;
};
class CPDF_ObjArchiveLoader : public CFX_ArchiveLoader
{
public:
CPDF_ObjArchiveLoader(const uint8_t* pData, FX_DWORD dwSize) : CFX_ArchiveLoader(pData, dwSize),
m_IndirectObjects(NULL) {}
friend CPDF_ObjArchiveLoader& operator >> (CPDF_ObjArchiveLoader& ar, CPDF_Object*& pObj);
protected:
CPDF_IndirectObjects m_IndirectObjects;
};
class CPDF_PageArchiveSaver : public CPDF_ObjArchiveSaver
{
public:
CPDF_PageArchiveSaver(CPDF_PageObjects* pPageObjs);
friend CPDF_PageArchiveSaver& operator << (CPDF_PageArchiveSaver& ar, CPDF_PageObject* pObj);
friend CPDF_PageArchiveSaver& operator << (CPDF_PageArchiveSaver& ar, CPDF_ClipPath clip_path);
friend CPDF_PageArchiveSaver& operator << (CPDF_PageArchiveSaver& ar, CPDF_GraphState graph_state);
friend CPDF_PageArchiveSaver& operator << (CPDF_PageArchiveSaver& ar, CPDF_TextState text_state);
friend CPDF_PageArchiveSaver& operator << (CPDF_PageArchiveSaver& ar, CPDF_ColorState color_state);
friend CPDF_PageArchiveSaver& operator << (CPDF_PageArchiveSaver& ar, CPDF_GeneralState general_state);
protected:
CPDF_ClipPath m_LastClipPath;
CPDF_GraphState m_LastGraphState;
CPDF_ColorState m_LastColorState;
CPDF_TextState m_LastTextState;
CPDF_GeneralState m_LastGeneralState;
};
class CPDF_PageArchiveLoader : public CPDF_ObjArchiveLoader
{
public:
CPDF_PageArchiveLoader(CPDF_PageObjects* pPageObjs, const uint8_t* pData, FX_DWORD dwSize);
friend CPDF_PageArchiveLoader& operator >> (CPDF_PageArchiveLoader& ar, CPDF_PageObject*& pObj);
friend CPDF_PageArchiveLoader& operator >> (CPDF_PageArchiveLoader& ar, CPDF_ClipPath& clip_path);
friend CPDF_PageArchiveLoader& operator >> (CPDF_PageArchiveLoader& ar, CPDF_GraphState& graph_state);
friend CPDF_PageArchiveLoader& operator >> (CPDF_PageArchiveLoader& ar, CPDF_TextState& text_state);
friend CPDF_PageArchiveLoader& operator >> (CPDF_PageArchiveLoader& ar, CPDF_ColorState& color_state);
friend CPDF_PageArchiveLoader& operator >> (CPDF_PageArchiveLoader& ar, CPDF_GeneralState& general_state);
protected:
void PostProcColor(CPDF_Color& color);
CPDF_Object* AddResource(CPDF_Object* pSrcObj, const FX_CHAR* type);
CPDF_ClipPath m_LastClipPath;
CPDF_GraphState m_LastGraphState;
CPDF_ColorState m_LastColorState;
CPDF_TextState m_LastTextState;
CPDF_GeneralState m_LastGeneralState;
CFX_MapPtrToPtr m_ObjectMap;
};
#define FPDFCREATE_INCREMENTAL 1
#define FPDFCREATE_NO_ORIGINAL 2
#define FPDFCREATE_PROGRESSIVE 4
#define FPDFCREATE_OBJECTSTREAM 8
class CPDF_Creator
{
public:
CPDF_Creator(CPDF_Document* pDoc);
~CPDF_Creator();
void RemoveSecurity();
bool Create(const FX_WCHAR* filename, FX_DWORD flags = 0);
bool Create(const FX_CHAR* filename, FX_DWORD flags = 0);
bool Create(IFX_StreamWrite* pFile, FX_DWORD flags = 0);
int32_t Continue(IFX_Pause *pPause = NULL);
bool SetFileVersion(int32_t fileVersion = 17);
protected:
CPDF_Document* m_pDocument;
CPDF_Parser* m_pParser;
bool m_bCompress;
bool m_bSecurityChanged;
CPDF_Dictionary* m_pEncryptDict;
FX_DWORD m_dwEnryptObjNum;
bool m_bEncryptCloned;
bool m_bStandardSecurity;
CPDF_CryptoHandler* m_pCryptoHandler;
bool m_bNewCrypto;
bool m_bEncryptMetadata;
CPDF_Object* m_pMetadata;
CPDF_XRefStream* m_pXRefStream;
int32_t m_ObjectStreamSize;
FX_DWORD m_dwLastObjNum;
bool Create(FX_DWORD flags);
void ResetStandardSecurity();
void Clear();
int32_t WriteDoc_Stage1(IFX_Pause *pPause);
int32_t WriteDoc_Stage2(IFX_Pause *pPause);
int32_t WriteDoc_Stage3(IFX_Pause *pPause);
int32_t WriteDoc_Stage4(IFX_Pause *pPause);
CFX_FileBufferArchive m_File;
FX_FILESIZE m_Offset;
void InitOldObjNumOffsets();
void InitNewObjNumOffsets();
void AppendNewObjNum(FX_DWORD objbum);
int32_t WriteOldIndirectObject(FX_DWORD objnum);
int32_t WriteOldObjs(IFX_Pause *pPause);
int32_t WriteNewObjs(bool bIncremental, IFX_Pause *pPause);
int32_t WriteIndirectObj(const CPDF_Object* pObj);
int32_t WriteDirectObj(FX_DWORD objnum, const CPDF_Object* pObj, bool bEncrypt = true);
int32_t WriteIndirectObjectToStream(const CPDF_Object* pObj);
int32_t WriteIndirectObj(FX_DWORD objnum, const CPDF_Object* pObj);
int32_t WriteIndirectObjectToStream(FX_DWORD objnum, const uint8_t* pBuffer, FX_DWORD dwSize);
int32_t AppendObjectNumberToXRef(FX_DWORD objnum);
void InitID(bool bDefault = true);
int32_t WriteStream(const CPDF_Object* pStream, FX_DWORD objnum, CPDF_CryptoHandler* pCrypto);
int32_t m_iStage;
FX_DWORD m_dwFlags;
FX_POSITION m_Pos;
FX_FILESIZE m_XrefStart;
CFX_FileSizeListArray m_ObjectOffset;
CFX_DWordListArray m_ObjectSize;
CFX_DWordArray m_NewObjNumArray;
CPDF_Array* m_pIDArray;
int32_t m_FileVersion;
friend class CPDF_ObjectStream;
friend class CPDF_XRefStream;
};
#endif // CORE_INCLUDE_FPDFAPI_FPDF_SERIAL_H_