cabinet: Pass an FCI pointer to internal functions instead of a handle.

This commit is contained in:
Alexandre Julliard 2011-02-04 11:32:46 +01:00
parent 9aa0e35ecc
commit b18b596621
2 changed files with 58 additions and 72 deletions

View File

@ -372,9 +372,6 @@ typedef struct {
PERF perf; PERF perf;
} FDI_Int, *PFDI_Int; } FDI_Int, *PFDI_Int;
/* cast an HFCI into a PFCI_Int */
#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))
@ -390,10 +387,6 @@ typedef struct {
#define FCI_INT_MAGIC 0xfcfcfc05 #define FCI_INT_MAGIC 0xfcfcfc05
#define FDI_INT_MAGIC 0xfdfdfd05 #define FDI_INT_MAGIC 0xfdfdfd05
#define REALLY_IS_FCI(hfci) ( \
((hfci) != NULL) && \
(PFCI_INT(hfci)->FCI_Intmagic == FCI_INT_MAGIC) )
#define REALLY_IS_FDI(hfdi) ( \ #define REALLY_IS_FDI(hfdi) ( \
((hfdi) != NULL) && \ ((hfdi) != NULL) && \
(PFDI_INT(hfdi)->FDI_Intmagic == FDI_INT_MAGIC) ) (PFDI_INT(hfdi)->FDI_Intmagic == FDI_INT_MAGIC) )

View File

@ -110,6 +110,18 @@ static void set_error( FCI_Int *fci, int oper, int err )
if (err) SetLastError( err ); if (err) SetLastError( err );
} }
static FCI_Int *get_fci_ptr( HFCI hfci )
{
FCI_Int *fci= (FCI_Int *)hfci;
if (!fci || !fci->FCI_Intmagic == FCI_INT_MAGIC)
{
SetLastError( ERROR_INVALID_HANDLE );
return NULL;
}
return fci;
}
/*********************************************************************** /***********************************************************************
* FCICreate (CABINET.10) * FCICreate (CABINET.10)
* *
@ -170,9 +182,8 @@ HFCI __cdecl FCICreate(
PCCAB pccab, PCCAB pccab,
void *pv) void *pv)
{ {
HFCI hfci;
int err; int err;
PFCI_Int p_fci_internal; FCI_Int *p_fci_internal;
if (!perf) { if (!perf) {
SetLastError(ERROR_BAD_ARGUMENTS); SetLastError(ERROR_BAD_ARGUMENTS);
@ -189,7 +200,7 @@ HFCI __cdecl FCICreate(
return NULL; return NULL;
} }
if (!((hfci = (*pfnalloc)(sizeof(FCI_Int))))) { if (!((p_fci_internal = pfnalloc(sizeof(FCI_Int))))) {
perf->erfOper = FCIERR_ALLOC_FAIL; perf->erfOper = FCIERR_ALLOC_FAIL;
perf->erfType = ERROR_NOT_ENOUGH_MEMORY; perf->erfType = ERROR_NOT_ENOUGH_MEMORY;
perf->fError = TRUE; perf->fError = TRUE;
@ -198,7 +209,6 @@ HFCI __cdecl FCICreate(
return NULL; return NULL;
} }
p_fci_internal=((PFCI_Int)(hfci));
p_fci_internal->FCI_Intmagic = FCI_INT_MAGIC; p_fci_internal->FCI_Intmagic = FCI_INT_MAGIC;
p_fci_internal->perf = perf; p_fci_internal->perf = perf;
p_fci_internal->fileplaced = pfnfiledest; p_fci_internal->fileplaced = pfnfiledest;
@ -341,23 +351,21 @@ HFCI __cdecl FCICreate(
/* TODO close and delete new files when return FALSE */ /* TODO close and delete new files when return FALSE */
/* TODO error checking of err */ /* TODO error checking of err */
return hfci; return (HFCI)p_fci_internal;
} /* end of FCICreate */ }
static BOOL fci_flush_data_block (HFCI hfci, int* err, static BOOL fci_flush_data_block (FCI_Int *p_fci_internal, int* err,
PFNFCISTATUS pfnfcis) { PFNFCISTATUS pfnfcis) {
/* attention no hfci checks!!! */
/* attention no checks if there is data available!!! */ /* attention no checks if there is data available!!! */
CFDATA data; CFDATA data;
CFDATA* cfdata=&data; CFDATA* cfdata=&data;
char* reserved; char* reserved;
PFCI_Int p_fci_internal=((PFCI_Int)(hfci));
UINT cbReserveCFData=p_fci_internal->pccab->cbReserveCFData; UINT cbReserveCFData=p_fci_internal->pccab->cbReserveCFData;
UINT i; UINT i;
@ -479,7 +487,7 @@ static cab_ULONG fci_get_checksum(const void *pv, UINT cb, CHECKSUM seed)
static BOOL fci_flushfolder_copy_cfdata(HFCI hfci, char* buffer, UINT cbReserveCFData, static BOOL fci_flushfolder_copy_cfdata(FCI_Int *p_fci_internal, char* buffer, UINT cbReserveCFData,
PFNFCISTATUS pfnfcis, int* err, int handleCFDATA1new, PFNFCISTATUS pfnfcis, int* err, int handleCFDATA1new,
cab_ULONG* psizeFileCFDATA1new, cab_ULONG* payload) cab_ULONG* psizeFileCFDATA1new, cab_ULONG* payload)
{ {
@ -487,7 +495,6 @@ static BOOL fci_flushfolder_copy_cfdata(HFCI hfci, char* buffer, UINT cbReserveC
CFDATA* pcfdata=(CFDATA*)buffer; CFDATA* pcfdata=(CFDATA*)buffer;
BOOL split_block=FALSE; BOOL split_block=FALSE;
cab_UWORD savedUncomp=0; cab_UWORD savedUncomp=0;
PFCI_Int p_fci_internal=((PFCI_Int)(hfci));
*payload=0; *payload=0;
@ -823,13 +830,12 @@ static BOOL fci_flushfolder_copy_cfdata(HFCI hfci, char* buffer, UINT cbReserveC
static BOOL fci_flushfolder_copy_cffolder(HFCI hfci, int* err, UINT cbReserveCFFolder, static BOOL fci_flushfolder_copy_cffolder(FCI_Int *p_fci_internal, int* err, UINT cbReserveCFFolder,
cab_ULONG sizeFileCFDATA2old) cab_ULONG sizeFileCFDATA2old)
{ {
CFFOLDER cffolder; CFFOLDER cffolder;
UINT i; UINT i;
char* reserved; char* reserved;
PFCI_Int p_fci_internal=((PFCI_Int)(hfci));
/* absolute offset cannot be set yet, because the size of cabinet header, */ /* absolute offset cannot be set yet, because the size of cabinet header, */
/* the number of CFFOLDERs and the number of CFFILEs may change. */ /* the number of CFFOLDERs and the number of CFFILEs may change. */
@ -886,7 +892,7 @@ static BOOL fci_flushfolder_copy_cffolder(HFCI hfci, int* err, UINT cbReserveCFF
static BOOL fci_flushfolder_copy_cffile(HFCI hfci, int* err, int handleCFFILE1new, static BOOL fci_flushfolder_copy_cffile(FCI_Int *p_fci_internal, int* err, int handleCFFILE1new,
cab_ULONG *psizeFileCFFILE1new, cab_ULONG payload) cab_ULONG *psizeFileCFFILE1new, cab_ULONG payload)
{ {
CFFILE cffile; CFFILE cffile;
@ -895,7 +901,7 @@ static BOOL fci_flushfolder_copy_cffile(HFCI hfci, int* err, int handleCFFILE1ne
cab_ULONG sizeOfFiles=0, sizeOfFilesPrev; cab_ULONG sizeOfFiles=0, sizeOfFilesPrev;
BOOL may_be_prev=TRUE; BOOL may_be_prev=TRUE;
cab_ULONG cbFileRemainer=0; cab_ULONG cbFileRemainer=0;
PFCI_Int p_fci_internal=((PFCI_Int)(hfci));
/* set seek of p_fci_internal->handleCFFILE1 to 0 */ /* set seek of p_fci_internal->handleCFFILE1 to 0 */
if( p_fci_internal->seek(p_fci_internal->handleCFFILE1,0,SEEK_SET,err, if( p_fci_internal->seek(p_fci_internal->handleCFFILE1,0,SEEK_SET,err,
p_fci_internal->pv) !=0 ) { p_fci_internal->pv) !=0 ) {
@ -1120,8 +1126,7 @@ static BOOL fci_flushfolder_copy_cffile(HFCI hfci, int* err, int handleCFFILE1ne
static BOOL fci_flush_folder( static BOOL fci_flush_folder( FCI_Int *p_fci_internal,
HFCI hfci,
BOOL fGetNextCab, BOOL fGetNextCab,
PFNFCIGETNEXTCABINET pfnfcignc, PFNFCIGETNEXTCABINET pfnfcignc,
PFNFCISTATUS pfnfcis) PFNFCISTATUS pfnfcis)
@ -1138,13 +1143,6 @@ static BOOL fci_flush_folder(
cab_ULONG sizeFileCFDATA2old; cab_ULONG sizeFileCFDATA2old;
cab_ULONG payload; cab_ULONG payload;
cab_ULONG read_result; cab_ULONG read_result;
PFCI_Int p_fci_internal=((PFCI_Int)(hfci));
/* test hfci */
if (!REALLY_IS_FCI(hfci)) {
SetLastError(ERROR_INVALID_HANDLE);
return FALSE;
}
if ((!pfnfcignc) || (!pfnfcis)) { if ((!pfnfcignc) || (!pfnfcis)) {
set_error( p_fci_internal, FCIERR_NONE, ERROR_BAD_ARGUMENTS ); set_error( p_fci_internal, FCIERR_NONE, ERROR_BAD_ARGUMENTS );
@ -1198,7 +1196,7 @@ static BOOL fci_flush_folder(
/* if there is data in p_fci_internal->data_in */ /* if there is data in p_fci_internal->data_in */
if (p_fci_internal->cdata_in!=0) { if (p_fci_internal->cdata_in!=0) {
if( !fci_flush_data_block(hfci, &err, pfnfcis) ) return FALSE; if( !fci_flush_data_block(p_fci_internal, &err, pfnfcis) ) return FALSE;
} }
/* reset to get the number of data blocks of this folder which are */ /* reset to get the number of data blocks of this folder which are */
@ -1434,7 +1432,7 @@ static BOOL fci_flush_folder(
return FALSE; return FALSE;
} }
if(!fci_flushfolder_copy_cfdata(hfci, reserved, cbReserveCFData, pfnfcis, &err, if(!fci_flushfolder_copy_cfdata(p_fci_internal, reserved, cbReserveCFData, pfnfcis, &err,
handleCFDATA1new, &sizeFileCFDATA1new, &payload handleCFDATA1new, &sizeFileCFDATA1new, &payload
)) { )) {
p_fci_internal->close(handleCFDATA1new,&err,p_fci_internal->pv); p_fci_internal->close(handleCFDATA1new,&err,p_fci_internal->pv);
@ -1449,7 +1447,7 @@ static BOOL fci_flush_folder(
p_fci_internal->free(reserved); p_fci_internal->free(reserved);
if(!fci_flushfolder_copy_cffolder(hfci, &err, cbReserveCFFolder, if(!fci_flushfolder_copy_cffolder(p_fci_internal, &err, cbReserveCFFolder,
sizeFileCFDATA2old )) { sizeFileCFDATA2old )) {
p_fci_internal->close(handleCFDATA1new,&err,p_fci_internal->pv); p_fci_internal->close(handleCFDATA1new,&err,p_fci_internal->pv);
/* TODO error handling of err */ /* TODO error handling of err */
@ -1460,7 +1458,7 @@ static BOOL fci_flush_folder(
return FALSE; return FALSE;
} }
if(!fci_flushfolder_copy_cffile(hfci, &err, handleCFFILE1new, if(!fci_flushfolder_copy_cffile(p_fci_internal, &err, handleCFFILE1new,
&sizeFileCFFILE1new, payload)) { &sizeFileCFFILE1new, payload)) {
p_fci_internal->close(handleCFDATA1new,&err,p_fci_internal->pv); p_fci_internal->close(handleCFDATA1new,&err,p_fci_internal->pv);
/* TODO error handling of err */ /* TODO error handling of err */
@ -1484,12 +1482,12 @@ static BOOL fci_flush_folder(
CB_MAX_FILENAME); CB_MAX_FILENAME);
/* put CFDATA1 file handle */ /* put CFDATA1 file handle */
PFCI_INT(hfci)->handleCFDATA1 = handleCFDATA1new; p_fci_internal->handleCFDATA1 = handleCFDATA1new;
/* set file size */ /* set file size */
PFCI_INT(hfci)->sizeFileCFDATA1 = sizeFileCFDATA1new; p_fci_internal->sizeFileCFDATA1 = sizeFileCFDATA1new;
/* close and delete PFCI_INT(hfci)->handleCFFILE1 */ /* close and delete PFCI_INT(hfci)->handleCFFILE1 */
p_fci_internal->close(p_fci_internal->handleCFFILE1,&err,PFCI_INT(hfci)->pv); p_fci_internal->close(p_fci_internal->handleCFFILE1,&err,p_fci_internal->pv);
/* TODO error handling of err */ /* TODO error handling of err */
p_fci_internal->delete(p_fci_internal->szFileNameCFFILE1,&err,p_fci_internal->pv); p_fci_internal->delete(p_fci_internal->szFileNameCFFILE1,&err,p_fci_internal->pv);
/* TODO error handling of err */ /* TODO error handling of err */
@ -1515,8 +1513,7 @@ static BOOL fci_flush_folder(
static BOOL fci_flush_cabinet( static BOOL fci_flush_cabinet( FCI_Int *p_fci_internal,
HFCI hfci,
BOOL fGetNextCab, BOOL fGetNextCab,
PFNFCIGETNEXTCABINET pfnfcignc, PFNFCIGETNEXTCABINET pfnfcignc,
PFNFCISTATUS pfnfcis) PFNFCISTATUS pfnfcis)
@ -1535,7 +1532,6 @@ static BOOL fci_flush_cabinet(
UINT cbReserveCFHeader, cbReserveCFFolder, i; UINT cbReserveCFHeader, cbReserveCFFolder, i;
char* reserved; char* reserved;
BOOL returntrue=FALSE; BOOL returntrue=FALSE;
PFCI_Int p_fci_internal=((PFCI_Int)(hfci));
/* TODO test if fci_flush_cabinet really aborts if there was no FCIAddFile */ /* TODO test if fci_flush_cabinet really aborts if there was no FCIAddFile */
@ -1544,7 +1540,7 @@ static BOOL fci_flush_cabinet(
returntrue=TRUE; returntrue=TRUE;
} }
if (!fci_flush_folder(hfci,fGetNextCab,pfnfcignc,pfnfcis)){ if (!fci_flush_folder(p_fci_internal,fGetNextCab,pfnfcignc,pfnfcis)){
/* TODO set error */ /* TODO set error */
return FALSE; return FALSE;
} }
@ -2240,7 +2236,7 @@ static BOOL fci_flush_cabinet(
/* too much data for the maximum size of a cabinet */ /* too much data for the maximum size of a cabinet */
if( p_fci_internal->fGetNextCabInVain==FALSE && if( p_fci_internal->fGetNextCabInVain==FALSE &&
p_fci_internal->pccab->cb < read_result ) { p_fci_internal->pccab->cb < read_result ) {
return fci_flush_cabinet( hfci, FALSE, pfnfcignc, pfnfcis); return fci_flush_cabinet( p_fci_internal, FALSE, pfnfcignc, pfnfcis);
} }
/* Might be too much data for the maximum size of a cabinet.*/ /* Might be too much data for the maximum size of a cabinet.*/
@ -2278,26 +2274,26 @@ static BOOL fci_flush_cabinet(
)) { )) {
p_fci_internal->fGetNextCabInVain=FALSE; p_fci_internal->fGetNextCabInVain=FALSE;
p_fci_internal->fNextCab=TRUE; p_fci_internal->fNextCab=TRUE;
return fci_flush_cabinet( hfci, FALSE, pfnfcignc, pfnfcis); return fci_flush_cabinet( p_fci_internal, FALSE, pfnfcignc, pfnfcis);
} }
/* if the FolderThreshold has been reached flush the folder automatically */ /* if the FolderThreshold has been reached flush the folder automatically */
if( p_fci_internal->fGetNextCabInVain ) { if( p_fci_internal->fGetNextCabInVain ) {
if( p_fci_internal->cCompressedBytesInFolder >= if( p_fci_internal->cCompressedBytesInFolder >=
p_fci_internal->oldCCAB.cbFolderThresh) { p_fci_internal->oldCCAB.cbFolderThresh) {
return FCIFlushFolder(hfci, pfnfcignc, pfnfcis); return fci_flush_folder(p_fci_internal, FALSE, pfnfcignc, pfnfcis);
} }
} else { } else {
if( p_fci_internal->cCompressedBytesInFolder >= if( p_fci_internal->cCompressedBytesInFolder >=
p_fci_internal->pccab->cbFolderThresh) { p_fci_internal->pccab->cbFolderThresh) {
return FCIFlushFolder(hfci, pfnfcignc, pfnfcis); return fci_flush_folder(p_fci_internal, FALSE, pfnfcignc, pfnfcis);
} }
} }
/* END OF COPIED FROM FCIAddFile and modified */ /* END OF COPIED FROM FCIAddFile and modified */
if( p_fci_internal->sizeFileCFFILE1>0 ) { if( p_fci_internal->sizeFileCFFILE1>0 ) {
if( !FCIFlushFolder(hfci, pfnfcignc, pfnfcis) ) return FALSE; if( !fci_flush_folder(p_fci_internal, FALSE, pfnfcignc, pfnfcis) ) return FALSE;
p_fci_internal->fNewPrevious=TRUE; p_fci_internal->fNewPrevious=TRUE;
} }
} else { } else {
@ -2361,13 +2357,9 @@ BOOL __cdecl FCIAddFile(
CFFILE cffile; CFFILE cffile;
cab_ULONG read_result; cab_ULONG read_result;
int file_handle; int file_handle;
PFCI_Int p_fci_internal=((PFCI_Int)(hfci)); FCI_Int *p_fci_internal = get_fci_ptr( hfci );
/* test hfci */ if (!p_fci_internal) return FALSE;
if (!REALLY_IS_FCI(hfci)) {
SetLastError(ERROR_INVALID_HANDLE);
return FALSE;
}
if ((!pszSourceFile) || (!pszFileName) || (!pfnfcignc) || (!pfnfcis) || if ((!pszSourceFile) || (!pszFileName) || (!pfnfcignc) || (!pfnfcis) ||
(!pfnfcigoi) || strlen(pszFileName)>=CB_MAX_FILENAME) { (!pfnfcigoi) || strlen(pszFileName)>=CB_MAX_FILENAME) {
@ -2521,7 +2513,7 @@ BOOL __cdecl FCIAddFile(
)) { )) {
p_fci_internal->fGetNextCabInVain=FALSE; p_fci_internal->fGetNextCabInVain=FALSE;
p_fci_internal->fNextCab=TRUE; p_fci_internal->fNextCab=TRUE;
if(!fci_flush_cabinet( hfci, FALSE, pfnfcignc, pfnfcis)) return FALSE; if(!fci_flush_cabinet( p_fci_internal, FALSE, pfnfcignc, pfnfcis)) return FALSE;
} }
if( p_fci_internal->fNextCab ) { if( p_fci_internal->fNextCab ) {
@ -2561,7 +2553,7 @@ BOOL __cdecl FCIAddFile(
/* write a whole block */ /* write a whole block */
if ( p_fci_internal->cdata_in == CAB_BLOCKMAX ) { if ( p_fci_internal->cdata_in == CAB_BLOCKMAX ) {
if( !fci_flush_data_block(hfci, &err, pfnfcis) ) return FALSE; if( !fci_flush_data_block(p_fci_internal, &err, pfnfcis) ) return FALSE;
} }
} }
@ -2637,7 +2629,7 @@ BOOL __cdecl FCIAddFile(
if( p_fci_internal->fGetNextCabInVain==FALSE && if( p_fci_internal->fGetNextCabInVain==FALSE &&
p_fci_internal->fNextCab==FALSE && /* this is always the case */ p_fci_internal->fNextCab==FALSE && /* this is always the case */
p_fci_internal->pccab->cb < read_result ) { p_fci_internal->pccab->cb < read_result ) {
return fci_flush_cabinet( hfci, FALSE, pfnfcignc, pfnfcis); return fci_flush_cabinet( p_fci_internal, FALSE, pfnfcignc, pfnfcis);
} }
/* Might be too much data for the maximum size of a cabinet.*/ /* Might be too much data for the maximum size of a cabinet.*/
@ -2688,7 +2680,7 @@ BOOL __cdecl FCIAddFile(
p_fci_internal->fGetNextCabInVain=FALSE; p_fci_internal->fGetNextCabInVain=FALSE;
p_fci_internal->fNextCab=TRUE; p_fci_internal->fNextCab=TRUE;
return fci_flush_cabinet( hfci, FALSE, pfnfcignc, pfnfcis); return fci_flush_cabinet( p_fci_internal, FALSE, pfnfcignc, pfnfcis);
} }
if( p_fci_internal->fNextCab ) { if( p_fci_internal->fNextCab ) {
@ -2753,8 +2745,11 @@ BOOL __cdecl FCIFlushFolder(
PFNFCIGETNEXTCABINET pfnfcignc, PFNFCIGETNEXTCABINET pfnfcignc,
PFNFCISTATUS pfnfcis) PFNFCISTATUS pfnfcis)
{ {
return fci_flush_folder(hfci,FALSE,pfnfcignc,pfnfcis); FCI_Int *p_fci_internal = get_fci_ptr( hfci );
} /* end of FCIFlushFolder */
if (!p_fci_internal) return FALSE;
return fci_flush_folder(p_fci_internal,FALSE,pfnfcignc,pfnfcis);
}
@ -2795,17 +2790,19 @@ BOOL __cdecl FCIFlushCabinet(
PFNFCIGETNEXTCABINET pfnfcignc, PFNFCIGETNEXTCABINET pfnfcignc,
PFNFCISTATUS pfnfcis) PFNFCISTATUS pfnfcis)
{ {
PFCI_Int p_fci_internal=((PFCI_Int)(hfci)); FCI_Int *p_fci_internal = get_fci_ptr( hfci );
if(!fci_flush_cabinet(hfci,fGetNextCab,pfnfcignc,pfnfcis)) return FALSE; if (!p_fci_internal) return FALSE;
if(!fci_flush_cabinet(p_fci_internal,fGetNextCab,pfnfcignc,pfnfcis)) return FALSE;
while( p_fci_internal->sizeFileCFFILE1>0 || while( p_fci_internal->sizeFileCFFILE1>0 ||
p_fci_internal->sizeFileCFFILE2>0 ) { p_fci_internal->sizeFileCFFILE2>0 ) {
if(!fci_flush_cabinet(hfci,fGetNextCab,pfnfcignc,pfnfcis)) return FALSE; if(!fci_flush_cabinet(p_fci_internal,fGetNextCab,pfnfcignc,pfnfcis)) return FALSE;
} }
return TRUE; return TRUE;
} /* end of FCIFlushCabinet */ }
/*********************************************************************** /***********************************************************************
@ -2823,9 +2820,10 @@ BOOL __cdecl FCIFlushCabinet(
*/ */
BOOL __cdecl FCIDestroy(HFCI hfci) BOOL __cdecl FCIDestroy(HFCI hfci)
{ {
int err; int err;
PFCI_Int p_fci_internal=((PFCI_Int)(hfci)); FCI_Int *p_fci_internal = get_fci_ptr( hfci );
if (REALLY_IS_FCI(hfci)) {
if (!p_fci_internal) return FALSE;
/* before hfci can be removed all temporary files must be closed */ /* before hfci can be removed all temporary files must be closed */
/* and deleted */ /* and deleted */
@ -2866,9 +2864,4 @@ BOOL __cdecl FCIDestroy(HFCI hfci)
/* hfci can now be removed */ /* hfci can now be removed */
p_fci_internal->free(hfci); p_fci_internal->free(hfci);
return TRUE; return TRUE;
} else { }
SetLastError(ERROR_INVALID_HANDLE);
return FALSE;
}
} /* end of FCIDestroy */