// 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 "core/include/fpdfapi/fpdf_page.h"
#include "core/include/fpdfapi/fpdf_pageobj.h"

class CPDF_ObjectStream;
class CPDF_XRefStream;

CFX_ByteTextBuf& operator<<(CFX_ByteTextBuf& buf, const CPDF_Object* pObj);

#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();
  FX_BOOL Create(IFX_StreamWrite* pFile, FX_DWORD flags = 0);
  int32_t Continue(IFX_Pause* pPause = NULL);
  FX_BOOL SetFileVersion(int32_t fileVersion = 17);

 protected:
  CPDF_Document* m_pDocument;

  CPDF_Parser* m_pParser;

  FX_BOOL m_bCompress;

  FX_BOOL m_bSecurityChanged;

  CPDF_Dictionary* m_pEncryptDict;
  FX_DWORD m_dwEnryptObjNum;
  FX_BOOL m_bEncryptCloned;

  FX_BOOL m_bStandardSecurity;

  CPDF_CryptoHandler* m_pCryptoHandler;
  FX_BOOL m_bNewCrypto;

  FX_BOOL m_bEncryptMetadata;

  CPDF_Object* m_pMetadata;

  CPDF_XRefStream* m_pXRefStream;

  int32_t m_ObjectStreamSize;

  FX_DWORD m_dwLastObjNum;
  FX_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(FX_BOOL bIncremental, IFX_Pause* pPause);
  int32_t WriteIndirectObj(const CPDF_Object* pObj);
  int32_t WriteDirectObj(FX_DWORD objnum,
                         const CPDF_Object* pObj,
                         FX_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(FX_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_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_
