/*****************************************************************************\
* MODULE: gencdf.h
*
* This is the main header for the CDF generation module.
*
* Copyright (C) 1996-1997 Microsoft Corporation
* Copyright (C) 1996-1997 Hewlett Packard
*
* History:
*   22-Nov-1996 HWP-Guys    Created.
*
\*****************************************************************************/

#define STD_CDF_BUFFER        256
#define MIN_CDF_BUFFER         16

#define CDF_SECTION_BLOCK    4096
#define CDF_SRCFILE_BLOCK    1024
#define CDF_SECTION_LIMIT       8


// Source-Files Structure.  This is used to track files
// by section.
//
typedef struct _SRCFILES {

    LPTSTR           lpszPath;
    LPTSTR           lpszFiles;
    DWORD            cbMax;
    DWORD            cbSize;
    struct _SRCFILES *pNext;

} SRCFILES;
typedef SRCFILES      *PSRCFILES;
typedef SRCFILES NEAR *NPSRCFILES;
typedef SRCFILES FAR  *LPSRCFILES;


// Element-Array idenifiers for FILEITEM
//
#define FI_MAX_ITEMS    2
#define FI_COL_FILENAME 0
#define FI_COL_PATH     1
#define FI_COL_LAST     1


// File-Item Structure.
//
typedef struct _FILEITEM {

    LPTSTR           aszCols[FI_MAX_ITEMS]; // Filename and Path.
    FILETIME         ftLastModify;          // Filetime stamp.
    struct _FILEITEM *pNext;                // Pointer to next File-Item.

} FILEITEM;
typedef FILEITEM      *PFILEITEM;
typedef FILEITEM NEAR *NPFILEITEM;
typedef FILEITEM FAR  *LPFILEITEM;


// CDF Object Structure.
//
typedef struct _CDFINFO {

    HANDLE    hInf;                  // Handle to current inf object
    DWORD     dwError;               // Error if CDF processing fails
    LPTSTR    lpszCdfFile;           // Full path-name to cdf-file.
    PFILEITEM pTop;                  // List of files to include in the .cdf
    HCATADMIN hCatAdmin;             // Context handle for catalog admin APIs
    BOOL      bSecure;

} CDFINFO;
typedef CDFINFO      *PCDFINFO;
typedef CDFINFO NEAR *NPCDFINFO;
typedef CDFINFO FAR  *LPCDFINFO;


// Interface Objects to CDF.
//
HANDLE cdfCreate(
    HANDLE hinf,
    BOOL   bSecure);

VOID cdfCleanUpSourceFiles(
    HANDLE hInf);

BOOL cdfProcess(
    HANDLE hcdf);

BOOL cdfDestroy(
    HANDLE hcdf);

LPCTSTR cdfGetName(
    HANDLE hcdf);

BOOL cdfGetModTime(
    HANDLE     hcdf,
    LPFILETIME lpftMod);

/***************************************\
* cdfGetError
\***************************************/
__inline DWORD cdfGetError(
    HANDLE hsed)
{
    return (hsed ? (DWORD)((PCDFINFO)hsed)->dwError : ERROR_SUCCESS);
}

/***************************************\
* cdfSetError
\***************************************/
__inline VOID cdfSetError(
    PCDFINFO  hsed,
    DWORD     dwError )
{
    hsed->dwError = dwError;
}