/* * FCIDLL.C -- FCI interface using CABINET.DLL * * Copyright (C) Microsoft Corporation 1997 * All Rights Reserved. * * Overview: * This code is a wrapper which provides access to the actual FCI code * in CABINET.DLL. CABINET.DLL dynamically loads/unloads as needed. */ #include #include "fci.h" static HINSTANCE hCabinetDll; /* DLL module handle */ /* pointers to the functions in the DLL */ static HFCI (FAR DIAMONDAPI *pfnFCICreate)( PERF perf, PFNFCIFILEPLACED pfnfiledest, PFNFCIALLOC pfnalloc, PFNFCIFREE pfnfree, PFNFCIOPEN pfnopen, PFNFCIREAD pfnread, PFNFCIWRITE pfnwrite, PFNFCICLOSE pfnclose, PFNFCISEEK pfnseek, PFNFCIDELETE pfndelete, PFNFCIGETTEMPFILE pfntemp, PCCAB pccab, void FAR * pv); static BOOL (FAR DIAMONDAPI *pfnFCIAddFile)( HFCI hfci, char *pszSourceFile, char *pszFileName, BOOL fExecute, PFNFCIGETNEXTCABINET GetNextCab, PFNFCISTATUS pfnProgress, PFNFCIGETOPENINFO pfnOpenInfo, TCOMP typeCompress); static BOOL (FAR DIAMONDAPI *pfnFCIFlushCabinet)( HFCI hfci, BOOL fGetNextCab, PFNFCIGETNEXTCABINET GetNextCab, PFNFCISTATUS pfnProgress); static BOOL (FAR DIAMONDAPI *pfnFCIFlushFolder)( HFCI hfci, PFNFCIGETNEXTCABINET GetNextCab, PFNFCISTATUS pfnProgress); static BOOL (FAR DIAMONDAPI *pfnFCIDestroy)( HFCI hfci); /* * FCICreate -- Create an FCI context * * See fci.h for entry/exit conditions. */ HFCI DIAMONDAPI FCICreate(PERF perf, PFNFCIFILEPLACED pfnfiledest, PFNFCIALLOC pfnalloc, PFNFCIFREE pfnfree, PFNFCIOPEN pfnopen, PFNFCIREAD pfnread, PFNFCIWRITE pfnwrite, PFNFCICLOSE pfnclose, PFNFCISEEK pfnseek, PFNFCIDELETE pfndelete, PFNFCIGETTEMPFILE pfntemp, PCCAB pccab, void FAR * pv) { HFCI hfci; hCabinetDll = LoadLibrary("CABINET"); if (hCabinetDll == NULL) { return(NULL); } pfnFCICreate = (void *) GetProcAddress(hCabinetDll,"FCICreate"); pfnFCIAddFile = (void *) GetProcAddress(hCabinetDll,"FCIAddFile"); pfnFCIFlushCabinet = (void *) GetProcAddress(hCabinetDll,"FCIFlushCabinet"); pfnFCIFlushFolder = (void *) GetProcAddress(hCabinetDll,"FCIFlushFolder"); pfnFCIDestroy = (void *) GetProcAddress(hCabinetDll,"FCIDestroy"); if ((pfnFCICreate == NULL) || (pfnFCIAddFile == NULL) || (pfnFCIFlushCabinet == NULL) || (pfnFCIDestroy == NULL)) { FreeLibrary(hCabinetDll); return(NULL); } hfci = pfnFCICreate(perf,pfnfiledest,pfnalloc,pfnfree, pfnopen,pfnread,pfnwrite,pfnclose,pfnseek,pfndelete,pfntemp, pccab,pv); if (hfci == NULL) { FreeLibrary(hCabinetDll); } return(hfci); } /* * FCIAddFile -- Add file to cabinet * * See fci.h for entry/exit conditions. */ BOOL DIAMONDAPI FCIAddFile(HFCI hfci, char *pszSourceFile, char *pszFileName, BOOL fExecute, PFNFCIGETNEXTCABINET GetNextCab, PFNFCISTATUS pfnProgress, PFNFCIGETOPENINFO pfnOpenInfo, TCOMP typeCompress) { if (pfnFCIAddFile == NULL) { return(FALSE); } return(pfnFCIAddFile(hfci,pszSourceFile,pszFileName,fExecute,GetNextCab, pfnProgress,pfnOpenInfo,typeCompress)); } /* * FCIFlushCabinet -- Complete the current cabinet under construction * * See fci.h for entry/exit conditions. */ BOOL DIAMONDAPI FCIFlushCabinet(HFCI hfci, BOOL fGetNextCab, PFNFCIGETNEXTCABINET GetNextCab, PFNFCISTATUS pfnProgress) { if (pfnFCIFlushCabinet == NULL) { return(FALSE); } return(pfnFCIFlushCabinet(hfci,fGetNextCab,GetNextCab,pfnProgress)); } /* * FCIFlushFolder -- Complete the current folder under construction * * See fci.h for entry/exit conditions. */ BOOL DIAMONDAPI FCIFlushFolder(HFCI hfci, PFNFCIGETNEXTCABINET GetNextCab, PFNFCISTATUS pfnProgress) { if (pfnFCIFlushFolder == NULL) { return(FALSE); } return(pfnFCIFlushFolder(hfci,GetNextCab,pfnProgress)); } /* * FCIDestroy -- Destroy an FCI context * * See fci.h for entry/exit conditions. */ BOOL DIAMONDAPI FCIDestroy(HFCI hfci) { BOOL rc; if (pfnFCIDestroy == NULL) { return(FALSE); } rc = pfnFCIDestroy(hfci); if (rc == TRUE) { FreeLibrary(hCabinetDll); } return(rc); }