// drpf.h
// !! this file should not be modified

// NB DRPF file is:
// REMOTEINFO
// LICENCEINFO (however many are needed)
// ALGCHANGE (however many are needed)
// DATACHANGE (however many are needed) - may refer to external files.

// Remember: you only need to specify a value if you want to change it. Otherwise you
// specify the default "no change" setting. For most entries this is indicated by 0.
// However, for MaxNetUsers and LicenceNetUsers it is "-2" because 0 is a valid value to change to.

#pragma pack (push,1)                   // so it is byte-aligned

typedef struct REMOTEINFO {
    char            Header[4];          // Should be set to "DRPF" = DinkeyRemote Parameter File
    unsigned int    Version;            // version of this structure - currently 2
    char            ProdCode[12];
    unsigned int    DongleNumber;           
    int             UpdateNumber;           
    char            Notes[256];         // user-defined notes       
    unsigned int    NumLicences;
    unsigned int    NumAlgs;            // number of algs to set (incl r/w alg)
    unsigned int    NumDataChanges;     // number of data change blocks specified   
    unsigned int    DataAreaSize;       // -1 = increase as necessary. specifies the new size of the data area
    int             PerLicence;         // 0 = no change, 1 = per licence net users, 2 = per product net users
    int             MaxNetUsers;        // product net users, unlimited = -1, no change = -2
    unsigned int    LastUsedDay;        // Day = 0 (only) -> no change
    unsigned int    LastUsedMonth;
    unsigned int    LastUsedYear;
    char            DataEncKeyProdCode[12]; 
    unsigned int    ChangeCodeType;     // 0 = no change, bit0 = only accept secure codes, bit1 = accept secure & short codes
    int             CodeType;           // type of code to generate. 0 = secure code, 1 = short code    
    char            OutputFileName[256];// name of file to output code to. Null (default) -> UpdateCode.ducf
    int             LockDongle;         // 1 = lock dongle to user's computer
    int             ResetDongleLock;    // 1 = reset the dongle lock so that the dongle can be locked to a new machine
} REMOTEINFO;

typedef struct LICENCEINFO {
    char            LicenceName[256];
    unsigned int    Action;             // 0 = change, 1 = delete, 2 = add
    unsigned int    AddSetExecs;        // 0 = no change to execs, 1 = add, 2 = set
    int             Execs;              // -1 = no limit
    int             ExecsWarn;          // 0 = remove warning, -1 = no change
    int             ExpiryDay;          // -1 = no limit, 0 = no change
    int             ExpiryMonth;
    int             ExpiryYear;
    unsigned int    AddSetMaxDays;      // 0 = no change, 1 = add, 2 = set
    int             MaxDays;            // -1 = no limit
    int             DaysWarn;           // 0 = remove warning, -1 = no change
    int             FeaturesFlag;       // 0 = don't change features, 1 = change features
    unsigned int    Features;           // all values OK
    int             LicenceNetUsers;    // unlimited = -1,  no change = -2
} LICENCEINFO;

typedef struct ALGCHANGE {              
    int alg_number;                     // number of algorithm to set (0 = r/w algorithm)
    unsigned char algorithm[12];        // algorithm
} ALGCHANGE;

typedef struct DATACHANGE {
    unsigned int type;                  // 1 = file, 2 = hex data, 3 = ascii, 4 = ascii null-term string
    unsigned int offset;                // offset in dongle data memory to write data
    int length;                         // length of data to change 
    unsigned char data[256];            // data to write OR name of data file depending on which method set
} DATACHANGE;

typedef struct UPDATE_CODE_OUTPUTS {
    char szShortCode[128*3];            // the update code (for short update codes only)
    char szUpdateCodeFile[256];         // the output ducf that contains the update code 
    char szConfirmationCode[8];         // the confirmation code
} UPDATE_CODE_OUTPUTS; 

typedef void *DRPF_HANDLE;              // for DinkeyRemote Module API functions

#pragma pack (pop)

// constants
#define DRPF_VERSION            2       // current DRPF version

// WriteDRPF API flags
#define FLAGS_LOSE_FEATURES     1       // means that you can save the DRPF file to an earlier version even if it means losing some new features that have been currently set

// constants for drpf_format in ReadDRPFEx and WriteDRPFEx functions
#define DRPF_FORMAT_BINARY      1
#define DRPF_FORMAT_JSON        2
#define DRPF_FORMAT_JSON_MIN    3       // this value is only used with WriteDRPEx. ReadDRPFEx cannot return this value.

#define MAX_LICENCES            255     // max number of licence changes in a DRPF file (theoretically unlimited but easier if we limit it)
#define MAX_ALG_CHANGES         21      // max number of alg changes in DRPF file
#define MAX_DATA_CHANGES        127     // max number of data area changes in DRPF file

// DinkeyRemote module API declarations
#ifdef __cplusplus
    extern "C" {
#endif

int WINAPI ReadDRPFEx(char *szFileDRPF, REMOTEINFO *pRemoteInfo, LICENCEINFO *pLicenceInfo, ALGCHANGE *pAlgChanges, DATACHANGE *pDataChanges, int *drpf_version, int *drpf_format);

DRPF_HANDLE WINAPI LoadDRPF(REMOTEINFO *pRemoteInfo, LICENCEINFO *pLicenceInfo, ALGCHANGE *pAlgChanges, DATACHANGE *pDataChanges, int *err_code);

DRPF_HANDLE WINAPI LoadDRPFFromFile(char *szFileDRPF, int *err_code);

int WINAPI WriteDRPFEx(DRPF_HANDLE handle, char *szFileDRPF, int drpf_format, int drpf_version, int flags);

void WINAPI UnloadDRPF(DRPF_HANDLE *handle);

int WINAPI GenerateUpdateCode(DRPF_HANDLE handle, unsigned int dongle_number, int update_number, char *ducf_file, char *logfile, UPDATE_CODE_OUTPUTS *pOutputs);

void WINAPI GetLastMessage(char *szMessage, int buffer_size, int *message_length);

int WINAPI GetLastExtendedError(void);

#ifdef __cplusplus
}
#endif
