--- trunk/reactos/lib/cabinet/cabinet.h 2005-05-26 20:07:10 UTC (rev 15529)
+++ trunk/reactos/lib/cabinet/cabinet.h 2005-05-26 20:39:17 UTC (rev 15530)
@@ -2,6 +2,7 @@
* cabinet.h
*
* Copyright 2002 Greg Turner
+ * Copyright 2005 Gerold Jens Wucherpfennig
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -292,6 +293,19 @@
typedef struct {
unsigned int FCI_Intmagic;
+ PERF perf;
+ PFNFCIFILEPLACED pfnfiledest;
+ PFNFCIALLOC pfnalloc;
+ PFNFCIFREE pfnfree;
+ PFNFCIOPEN pfnopen;
+ PFNFCIREAD pfnread;
+ PFNFCIWRITE pfnwrite;
+ PFNFCICLOSE pfnclose;
+ PFNFCISEEK pfnseek;
+ PFNFCIDELETE pfndelete;
+ PFNFCIGETTEMPFILE pfnfcigtf;
+ PCCAB pccab;
+ void *pv;
} FCI_Int, *PFCI_Int;
typedef struct {
@@ -307,7 +321,7 @@
} FDI_Int, *PFDI_Int;
/* cast an HFCI into a PFCI_Int */
-#define PFCI_INT(hfci) ((PFDI_Int)(hfci))
+#define PFCI_INT(hfci) ((PFCI_Int)(hfci))
/* cast an HFDI into a PFDI_Int */
#define PFDI_INT(hfdi) ((PFDI_Int)(hfdi))
--- trunk/reactos/lib/cabinet/fci.c 2005-05-26 20:07:10 UTC (rev 15529)
+++ trunk/reactos/lib/cabinet/fci.c 2005-05-26 20:39:17 UTC (rev 15530)
@@ -2,6 +2,7 @@
* File Compression Interface
*
* Copyright 2002 Patrik Stridvall
+ * Copyright 2005 Gerold Jens Wucherpfennig
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -26,6 +27,7 @@
#include "winbase.h"
#include "winerror.h"
#include "fci.h"
+#include "cabinet.h"
#include "wine/debug.h"
@@ -33,12 +35,55 @@
/***********************************************************************
* FCICreate (CABINET.10)
+ *
+ * Provided with several callbacks,
+ * returns a handle which can be used to perform operations
+ * on cabinet files.
+ *
+ * PARAMS
+ * perf [IO] A pointer to an ERF structure. When FCICreate
+ * returns an error condition, error information may
+ * be found here as well as from GetLastError.
+ * pfnfiledest [I] A pointer to a function which is called when a file
+ * is placed. Only useful for subsequent cabinet files.
+ * pfnalloc [I] A pointer to a function which allocates ram. Uses
+ * the same interface as malloc.
+ * pfnfree [I] A pointer to a function which frees ram. Uses the
+ * same interface as free.
+ * pfnopen [I] A pointer to a function which opens a file. Uses
+ * the same interface as _open.
+ * pfnread [I] A pointer to a function which reads from a file into
+ * a caller-provided buffer. Uses the same interface
+ * as _read
+ * pfnwrite [I] A pointer to a function which writes to a file from
+ * a caller-provided buffer. Uses the same interface
+ * as _write.
+ * pfnclose [I] A pointer to a function which closes a file handle.
+ * Uses the same interface as _close.
+ * pfnseek [I] A pointer to a function which seeks in a file.
+ * Uses the same interface as _lseek.
+ * pfndelete [I] A pointer to a function which deletes a file.
+ * pfnfcigtf [I] A pointer to a function which gets the name of a
+ * temporary file; ignored in wine
+ * pccab [I] A pointer to an initialized CCAB structure
+ * pv [I] A pointer to an application-defined notification
+ * function which will be passed to other FCI functions
+ * as a parameter.
+ *
+ * RETURNS
+ * On success, returns an FCI handle of type HFCI.
+ * On failure, the NULL file handle is returned. Error
+ * info can be retrieved from perf.
+ *
+ * INCLUDES
+ * fci.h
+ *
*/
HFCI __cdecl FCICreate(
PERF perf,
- PFNFCIFILEPLACED pfnfcifp,
- PFNFCIALLOC pfna,
- PFNFCIFREE pfnf,
+ PFNFCIFILEPLACED pfnfiledest,
+ PFNFCIALLOC pfnalloc,
+ PFNFCIFREE pfnfree,
PFNFCIOPEN pfnopen,
PFNFCIREAD pfnread,
PFNFCIWRITE pfnwrite,
@@ -49,17 +94,57 @@
PCCAB pccab,
void *pv)
{
- FIXME("(%p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p): stub\n",
- perf, pfnfcifp, pfna, pfnf, pfnopen, pfnread, pfnwrite, pfnclose,
- pfnseek, pfndelete, pfnfcigtf, pccab, pv);
+ HFCI rv;
+ if ((!pfnalloc) || (!pfnfree)) {
perf->erfOper = FCIERR_NONE;
- perf->erfType = 0;
+ perf->erfType = ERROR_BAD_ARGUMENTS;
perf->fError = TRUE;
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+ SetLastError(ERROR_BAD_ARGUMENTS);
+ return NULL;
+ }
+ if (!(rv = (HFCI) (*pfnalloc)(sizeof(FCI_Int)))) {
+ perf->erfOper = FCIERR_ALLOC_FAIL;
+ perf->erfType = ERROR_NOT_ENOUGH_MEMORY;
+ perf->fError = TRUE;
+
+ SetLastError(ERROR_NOT_ENOUGH_MEMORY);
return NULL;
+ }
+
+ PFCI_INT(rv)->FCI_Intmagic = FCI_INT_MAGIC;
+ PFCI_INT(rv)->perf = perf;
+ PFCI_INT(rv)->pfnfiledest = pfnfiledest;
+ PFCI_INT(rv)->pfnalloc = pfnalloc;
+ PFCI_INT(rv)->pfnfree = pfnfree;
+ PFCI_INT(rv)->pfnopen = pfnopen;
+ PFCI_INT(rv)->pfnread = pfnread;
+ PFCI_INT(rv)->pfnwrite = pfnwrite;
+ PFCI_INT(rv)->pfnclose = pfnclose;
+ PFCI_INT(rv)->pfnseek = pfnseek;
+ PFCI_INT(rv)->pfndelete = pfndelete;
+ PFCI_INT(rv)->pfnfcigtf = pfnfcigtf;
+ PFCI_INT(rv)->pccab = pccab;
+ PFCI_INT(rv)->pv = pv;
+
+ /* Still mark as incomplete, because of other missing FCI* APIs */
+
+ PFCI_INT(rv)->FCI_Intmagic = 0;
+ PFDI_FREE(rv, rv);
+ FIXME("(%p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p): stub\n",
+ perf, pfnfiledest, pfnalloc, pfnfree, pfnopen, pfnread, pfnwrite, pfnclose,
+ pfnseek, pfndelete, pfnfcigtf, pccab, pv);
+
+ perf->erfOper = FCIERR_NONE;
+ perf->erfType = 0;
+ perf->fError = TRUE;
+
+ SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+
+ return NULL;
+
}
/***********************************************************************
@@ -116,12 +201,30 @@
/***********************************************************************
* FCIDestroy (CABINET.14)
+ *
+ * Frees a handle created by FCICreate.
+ * Only reason for failure would be an invalid handle.
+ *
+ * PARAMS
+ * hfci [I] The HFCI to free
+ *
+ * RETURNS
+ * TRUE for success
+ * FALSE for failure
*/
BOOL __cdecl FCIDestroy(HFCI hfci)
{
- FIXME("(%p): stub\n", hfci);
+ if (REALLY_IS_FCI(hfci)) {
+ PFCI_INT(hfci)->FCI_Intmagic = 0;
+ PFDI_FREE(hfci, hfci);
+ /*return TRUE; */
+ } else {
+ SetLastError(ERROR_INVALID_HANDLE);
+ return FALSE;
+ }
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
-
- return FALSE;
+ /* Still mark as incomplete, because of other missing FCI* APIs */
+ FIXME("(%p): stub\n", hfci);
+ SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+ return FALSE;
}