#include "common.h"

/* Contents of file wcxhead.h */
/* It contains definitions of error codes, flags and callbacks */

/* Error codes returned to calling application */
#define E_SUCCESS          0            /* Success */
#define E_END_ARCHIVE     10            /* No more files in archive */
#define E_NO_MEMORY       11            /* Not enough memory */
#define E_BAD_DATA        12            /* Data is bad */
#define E_BAD_ARCHIVE     13            /* CRC error in archive data */
#define E_UNKNOWN_FORMAT  14            /* Archive format unknown */
#define E_EOPEN           15            /* Cannot open existing file */
#define E_ECREATE         16            /* Cannot create file */
#define E_ECLOSE          17            /* Error closing file */
#define E_EREAD           18            /* Error reading from file */
#define E_EWRITE          19            /* Error writing to file */
#define E_SMALL_BUF       20            /* Buffer too small */
#define E_EABORTED        21            /* Function aborted by user */
#define E_NO_FILES        22            /* No files found */
#define E_TOO_MANY_FILES  23            /* Too many files to pack */
#define E_NOT_SUPPORTED   24            /* Function not supported */

/* flags for unpacking */
#define PK_OM_LIST          0
#define PK_OM_EXTRACT       1

/* flags for ProcessFile */
#define PK_SKIP             0            /* Skip this file */
#define PK_TEST             1            /* Test file integrity */
#define PK_EXTRACT          2            /* Extract to disk */

/* Flags passed through ChangeVolProc */
#define PK_VOL_ASK          0            /* Ask user for location of next volume */
#define PK_VOL_NOTIFY       1            /* Notify app that next volume will be unpacked */

/* Flags for packing */

/* For PackFiles */
#define PK_PACK_MOVE_FILES  1    /* Delete original after packing        */
#define PK_PACK_SAVE_PATHS  2    /* Save path names of files             */
#define PK_PACK_ENCRYPT     4    /* Ask user for password, then encrypt  */

/* Returned by GetPackCaps */
#define PK_CAPS_NEW         1    /* Can create new archives              */
#define PK_CAPS_MODIFY      2    /* Can modify exisiting archives        */
#define PK_CAPS_MULTIPLE    4    /* Archive can contain multiple files   */
#define PK_CAPS_DELETE      8    /* Can delete files                     */
#define PK_CAPS_OPTIONS    16    /* Has options dialog                   */
#define PK_CAPS_MEMPACK    32    /* Supports packing in memory           */
#define PK_CAPS_BY_CONTENT 64    /* Detect archive type by content       */
#define PK_CAPS_SEARCHTEXT 128   /* Allow searching for text in archives */
                                 /* created with this plugin}            */
#define PK_CAPS_HIDE       256   /* Show as normal files (hide packer    */
                                 /* icon), open with Ctrl+PgDn, not Enter*/
#define PK_CAPS_ENCRYPT    512   /* Plugin supports PK_PACK_ENCRYPT option*/

/* Flags for packing in memory */
#define MEM_OPTIONS_WANTHEADERS 1  /* Return archive headers with packed data */

/* Errors returned by PackToMem */
#define MEMPACK_OK          0    /* Function call finished OK, but there is more data */
#define MEMPACK_DONE        1    /* Function call finished OK, there is no more data  */

#define PK_CRYPT_SAVE_PASSWORD 1
#define PK_CRYPT_LOAD_PASSWORD 2
#define PK_CRYPT_LOAD_PASSWORD_NO_UI 3 // Load password only if master password has already been entered!
#define PK_CRYPT_COPY_PASSWORD 4       // Copy encrypted password to new archive name
#define PK_CRYPT_MOVE_PASSWORD 5       // Move password when renaming an archive
#define PK_CRYPT_DELETE_PASSWORD 6     // Delete password

#define PK_CRYPTOPT_MASTERPASS_SET 1   // The user already has a master password defined

/* tHeaderData Flags */
#define RHDF_ENCRYPTED   0x04          // File encrypted with password

typedef struct {
    char ArcName[260];
    char FileName[260];
    int Flags;
    int PackSize;
    int UnpSize;
    int HostOS;
    int FileCRC;
    int FileTime;
    int UnpVer;
    int Method;
    int FileAttr;
    char* CmtBuf;
    int CmtBufSize;
    int CmtSize;
    int CmtState;
  } tHeaderData;

typedef struct {
    char ArcName[1024];
    char FileName[1024];
    int Flags;
    unsigned int PackSize;
    unsigned int PackSizeHigh;
    unsigned int UnpSize;
    unsigned int UnpSizeHigh;
    int HostOS;
    int FileCRC;
    int FileTime;
    int UnpVer;
    int Method;
    int FileAttr;
    char* CmtBuf;
    int CmtBufSize;
    int CmtSize;
    int CmtState;
    char Reserved[1024];
  } tHeaderDataEx;

typedef struct {
    WCHAR ArcName[1024];
    WCHAR FileName[1024];
    int Flags;
    unsigned int PackSize;
    unsigned int PackSizeHigh;
    unsigned int UnpSize;
    unsigned int UnpSizeHigh;
    int HostOS;
    int FileCRC;
    int FileTime;
    int UnpVer;
    int Method;
    int FileAttr;
    char* CmtBuf;
    int CmtBufSize;
    int CmtSize;
    int CmtState;
    char Reserved[1024];
    uint64_t MfileTime;
  } tHeaderDataExW;

typedef struct {
    char* ArcName;
    int OpenMode;
    int OpenResult;
    char* CmtBuf;
    int CmtBufSize;
    int CmtSize;
    int CmtState;
  } tOpenArchiveData;

typedef struct {
    WCHAR* ArcName;
    int OpenMode;
    int OpenResult;
    WCHAR* CmtBuf;
    int CmtBufSize;
    int CmtSize;
    int CmtState;
  } tOpenArchiveDataW;

typedef struct {
	int size;
	DWORD PluginInterfaceVersionLow;
	DWORD PluginInterfaceVersionHi;
	char DefaultIniName[MAX_PATH];
} PackDefaultParamStruct;

/* Definition of callback functions called by the DLL
Ask to swap disk for multi-volume archive */
typedef int (DCPCALL *tChangeVolProc)(char *ArcName,int Mode);
typedef int (DCPCALL *tChangeVolProcW)(WCHAR *ArcName,int Mode);
/* Notify that data is processed - used for progress dialog */
typedef int (DCPCALL *tProcessDataProc)(char *FileName,int Size);
typedef int (DCPCALL *tProcessDataProcW)(WCHAR *FileName,int Size);
typedef int (DCPCALL *tPkCryptProc)(int CryptoNr,int Mode,
             char* ArchiveName,char* Password,int maxlen);
typedef int (DCPCALL *tPkCryptProcW)(int CryptoNr,int Mode,
             WCHAR* ArchiveName,WCHAR* Password,int maxlen);


