From 2ed3c407589e5ce4fdebe56f3be0f61f607eec07 Mon Sep 17 00:00:00 2001 From: Gerold Jens Wucherpfennig Date: Sat, 14 May 2005 11:06:10 +0000 Subject: [PATCH] Initial FCI work (FCICreate and FCIDestroy). --- dlls/cabinet/cabinet.h | 16 ++++++- dlls/cabinet/fci.c | 127 ++++++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 130 insertions(+), 13 deletions(-) diff --git a/dlls/cabinet/cabinet.h b/dlls/cabinet/cabinet.h index 47221d26b6d..7d38521cecf 100644 --- a/dlls/cabinet/cabinet.h +++ b/dlls/cabinet/cabinet.h @@ -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 cds_forward { 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 @@ typedef struct { } 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)) diff --git a/dlls/cabinet/fci.c b/dlls/cabinet/fci.c index e588ba1ce54..9a97d56e331 100644 --- a/dlls/cabinet/fci.c +++ b/dlls/cabinet/fci.c @@ -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 @@ WINE_DEFAULT_DEBUG_CHANNEL(cabinet); /*********************************************************************** * 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 @@ HFCI __cdecl FCICreate( 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 @@ BOOL __cdecl FCIFlushFolder( /*********************************************************************** * 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); - - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - + if (REALLY_IS_FCI(hfci)) { + PFCI_INT(hfci)->FCI_Intmagic = 0; + PFDI_FREE(hfci, hfci); + /*return TRUE; */ + } else { + SetLastError(ERROR_INVALID_HANDLE); return FALSE; + } + + /* Still mark as incomplete, because of other missing FCI* APIs */ + FIXME("(%p): stub\n", hfci); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return FALSE; } -- 2.11.4.GIT