Commit 2ed3c407 authored by Gerold Jens Wucherpfennig's avatar Gerold Jens Wucherpfennig Committed by Alexandre Julliard

Initial FCI work (FCICreate and FCIDestroy).

parent 19312f30
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
* cabinet.h * cabinet.h
* *
* Copyright 2002 Greg Turner * Copyright 2002 Greg Turner
* Copyright 2005 Gerold Jens Wucherpfennig
* *
* This library is free software; you can redistribute it and/or * This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public * modify it under the terms of the GNU Lesser General Public
...@@ -292,6 +293,19 @@ typedef struct cds_forward { ...@@ -292,6 +293,19 @@ typedef struct cds_forward {
typedef struct { typedef struct {
unsigned int FCI_Intmagic; 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; } FCI_Int, *PFCI_Int;
typedef struct { typedef struct {
...@@ -307,7 +321,7 @@ typedef struct { ...@@ -307,7 +321,7 @@ typedef struct {
} FDI_Int, *PFDI_Int; } FDI_Int, *PFDI_Int;
/* cast an HFCI into a PFCI_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 */ /* cast an HFDI into a PFDI_Int */
#define PFDI_INT(hfdi) ((PFDI_Int)(hfdi)) #define PFDI_INT(hfdi) ((PFDI_Int)(hfdi))
......
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
* File Compression Interface * File Compression Interface
* *
* Copyright 2002 Patrik Stridvall * Copyright 2002 Patrik Stridvall
* Copyright 2005 Gerold Jens Wucherpfennig
* *
* This library is free software; you can redistribute it and/or * This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public * modify it under the terms of the GNU Lesser General Public
...@@ -26,6 +27,7 @@ ...@@ -26,6 +27,7 @@
#include "winbase.h" #include "winbase.h"
#include "winerror.h" #include "winerror.h"
#include "fci.h" #include "fci.h"
#include "cabinet.h"
#include "wine/debug.h" #include "wine/debug.h"
...@@ -33,12 +35,55 @@ WINE_DEFAULT_DEBUG_CHANNEL(cabinet); ...@@ -33,12 +35,55 @@ WINE_DEFAULT_DEBUG_CHANNEL(cabinet);
/*********************************************************************** /***********************************************************************
* FCICreate (CABINET.10) * 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( HFCI __cdecl FCICreate(
PERF perf, PERF perf,
PFNFCIFILEPLACED pfnfcifp, PFNFCIFILEPLACED pfnfiledest,
PFNFCIALLOC pfna, PFNFCIALLOC pfnalloc,
PFNFCIFREE pfnf, PFNFCIFREE pfnfree,
PFNFCIOPEN pfnopen, PFNFCIOPEN pfnopen,
PFNFCIREAD pfnread, PFNFCIREAD pfnread,
PFNFCIWRITE pfnwrite, PFNFCIWRITE pfnwrite,
...@@ -49,17 +94,57 @@ HFCI __cdecl FCICreate( ...@@ -49,17 +94,57 @@ HFCI __cdecl FCICreate(
PCCAB pccab, PCCAB pccab,
void *pv) void *pv)
{ {
FIXME("(%p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p): stub\n", HFCI rv;
perf, pfnfcifp, pfna, pfnf, pfnopen, pfnread, pfnwrite, pfnclose,
pfnseek, pfndelete, pfnfcigtf, pccab, pv);
if ((!pfnalloc) || (!pfnfree)) {
perf->erfOper = FCIERR_NONE; perf->erfOper = FCIERR_NONE;
perf->erfType = 0; perf->erfType = ERROR_BAD_ARGUMENTS;
perf->fError = TRUE; 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; 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( ...@@ -116,12 +201,30 @@ BOOL __cdecl FCIFlushFolder(
/*********************************************************************** /***********************************************************************
* FCIDestroy (CABINET.14) * 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) BOOL __cdecl FCIDestroy(HFCI hfci)
{ {
FIXME("(%p): stub\n", hfci); if (REALLY_IS_FCI(hfci)) {
PFCI_INT(hfci)->FCI_Intmagic = 0;
SetLastError(ERROR_CALL_NOT_IMPLEMENTED); PFDI_FREE(hfci, hfci);
/*return TRUE; */
} else {
SetLastError(ERROR_INVALID_HANDLE);
return FALSE; return FALSE;
}
/* Still mark as incomplete, because of other missing FCI* APIs */
FIXME("(%p): stub\n", hfci);
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return FALSE;
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment