📄 fci.c
字号:
/* TODO error handling of err don't forget PFCI_FREE(hfci, reserved) */
*psizeFileCFDATA1new += sizeof(CFDATA)+cbReserveCFData;
/* write compressed data into handleCFDATA1new */
if( PFCI_WRITE(hfci, handleCFDATA1new, /* file handle */
p_fci_internal->data_out + read_result, /* memory buffer + offset */
/* to last part of split data */
pcfdata->cbData, /* number of bytes to copy */
err, p_fci_internal->pv) != pcfdata->cbData) {
fci_set_error( FCIERR_TEMP_FILE, ERROR_WRITE_FAULT, TRUE );
return FALSE;
}
/* TODO error handling of err */
p_fci_internal->statusFolderCopied += pcfdata->cbData;
*psizeFileCFDATA1new += pcfdata->cbData;
/* the two blocks of the split data block have been written */
/* don't reset split_data yet, because it is still needed see below */
}
/* report status with pfnfcis about copied size of folder */
if( (*pfnfcis)(statusFolder,
p_fci_internal->statusFolderCopied, /*cfdata.cbData(+previous ones)*/
p_fci_internal->statusFolderTotal, /* total folder size */
p_fci_internal->pv) == -1) {
fci_set_error( FCIERR_USER_ABORT, 0, TRUE );
return FALSE;
}
}
/* if cabinet size too large */
/* write the remaining data blocks to the new CFDATA1 file */
if ( split_block ) { /* This does include the */
/* abused one (just search for "abused" )*/
if (p_fci_internal->fNextCab==FALSE ) {
/* internal error */
fci_set_error( FCIERR_NONE, ERROR_GEN_FAILURE, TRUE );
return FALSE;
}
/* copy all CFDATA structures from handleCFDATA1 to handleCFDATA1new */
while(!FALSE) {
/* read CFDATA from p_fci_internal->handleCFDATA1 to cfdata*/
read_result= PFCI_READ(hfci, p_fci_internal->handleCFDATA1,/* handle */
buffer, /* memory buffer */
sizeof(CFDATA)+cbReserveCFData, /* number of bytes to copy */
err, p_fci_internal->pv);
if (read_result!=sizeof(CFDATA)+cbReserveCFData) {
if (read_result==0) break; /* ALL DATA has been copied */
/* read error */
fci_set_error(FCIERR_NONE, ERROR_READ_FAULT, TRUE );
return FALSE;
}
/* TODO error handling of err */
/* REUSE buffer p_fci_internal->data_out !!! */
/* read data from p_fci_internal->handleCFDATA1 to */
/* p_fci_internal->data_out */
if( PFCI_READ(hfci, p_fci_internal->handleCFDATA1 /* file handle */,
p_fci_internal->data_out /* memory buffer */,
pcfdata->cbData /* number of bytes to copy */,
err, p_fci_internal->pv) != pcfdata->cbData ) {
/* read error */
fci_set_error( FCIERR_NONE, ERROR_READ_FAULT, TRUE);
return FALSE;
}
/* TODO error handling of err don't forget PFCI_FREE(hfci, reserved) */
/* write cfdata with checksum to handleCFDATA1new */
if( PFCI_WRITE(hfci, handleCFDATA1new, /* file handle */
buffer, /* memory buffer */
sizeof(CFDATA)+cbReserveCFData, /* number of bytes to copy */
err, p_fci_internal->pv) != sizeof(CFDATA)+cbReserveCFData ) {
fci_set_error( FCIERR_TEMP_FILE, ERROR_WRITE_FAULT, TRUE );
return FALSE;
}
/* TODO error handling of err don't forget PFCI_FREE(hfci, reserved) */
*psizeFileCFDATA1new += sizeof(CFDATA)+cbReserveCFData;
/* write compressed data into handleCFDATA1new */
if( PFCI_WRITE(hfci, handleCFDATA1new, /* file handle */
p_fci_internal->data_out, /* memory buffer */
pcfdata->cbData, /* number of bytes to copy */
err, p_fci_internal->pv) != pcfdata->cbData) {
fci_set_error( FCIERR_TEMP_FILE, ERROR_WRITE_FAULT, TRUE );
return FALSE;
}
/* TODO error handling of err */
*psizeFileCFDATA1new += pcfdata->cbData;
p_fci_internal->statusFolderCopied += pcfdata->cbData;
/* report status with pfnfcis about copied size of folder */
if( (*pfnfcis)(statusFolder,
p_fci_internal->statusFolderCopied,/*cfdata.cbData(+revious ones)*/
p_fci_internal->statusFolderTotal, /* total folder size */
p_fci_internal->pv) == -1) {
fci_set_error( FCIERR_USER_ABORT, 0, TRUE );
return FALSE;
}
} /* end of WHILE */
break; /* jump out of the next while loop */
} /* end of if( split_data ) */
} /* end of WHILE */
return TRUE;
} /* end of fci_flushfolder_copy_cfdata */
static BOOL fci_flushfolder_copy_cffolder(HFCI hfci, int* err, UINT cbReserveCFFolder,
cab_ULONG sizeFileCFDATA2old)
{
CFFOLDER cffolder;
UINT i;
char* reserved;
PFCI_Int p_fci_internal=((PFCI_Int)(hfci));
/* absolute offset cannot be set yet, because the size of cabinet header, */
/* the number of CFFOLDERs and the number of CFFILEs may change. */
/* Instead the size of all previous data blocks will be stored and */
/* the remainder of the offset will be added when the cabinet will be */
/* flushed to disk. */
/* This is exactly the way the original CABINET.DLL works!!! */
cffolder.coffCabStart=sizeFileCFDATA2old;
/* set the number of this folder's CFDATA sections */
cffolder.cCFData=p_fci_internal->cDataBlocks;
/* TODO set compression type */
cffolder.typeCompress = tcompTYPE_NONE;
/* write cffolder to p_fci_internal->handleCFFOLDER */
if( PFCI_WRITE(hfci, p_fci_internal->handleCFFOLDER, /* file handle */
&cffolder, /* memory buffer */
sizeof(cffolder), /* number of bytes to copy */
err, p_fci_internal->pv) != sizeof(cffolder) ) {
fci_set_error( FCIERR_TEMP_FILE, ERROR_WRITE_FAULT, TRUE );
return FALSE;
}
/* TODO error handling of err */
p_fci_internal->sizeFileCFFOLDER += sizeof(cffolder);
/* add optional reserved area */
if (cbReserveCFFolder!=0) {
if(!(reserved = (char*)PFCI_ALLOC(hfci, cbReserveCFFolder))) {
fci_set_error( FCIERR_ALLOC_FAIL, ERROR_NOT_ENOUGH_MEMORY, TRUE );
return FALSE;
}
for(i=0;i<cbReserveCFFolder;) {
reserved[i++]='\0';
}
if( PFCI_WRITE(hfci, p_fci_internal->handleCFFOLDER, /* file handle */
reserved, /* memory buffer */
cbReserveCFFolder, /* number of bytes to copy */
err, p_fci_internal->pv) != cbReserveCFFolder ) {
PFCI_FREE(hfci, reserved);
fci_set_error( FCIERR_TEMP_FILE, ERROR_WRITE_FAULT, TRUE );
return FALSE;
}
/* TODO error handling of err */
p_fci_internal->sizeFileCFFOLDER += cbReserveCFFolder;
PFCI_FREE(hfci, reserved);
}
return TRUE;
} /* end of fci_flushfolder_copy_cffolder */
static BOOL fci_flushfolder_copy_cffile(HFCI hfci, int* err, int handleCFFILE1new,
cab_ULONG *psizeFileCFFILE1new, cab_ULONG payload)
{
CFFILE cffile;
cab_ULONG read_result;
cab_ULONG seek=0;
cab_ULONG sizeOfFiles=0, sizeOfFilesPrev;
BOOL may_be_prev=TRUE;
cab_ULONG cbFileRemainer=0;
PFCI_Int p_fci_internal=((PFCI_Int)(hfci));
/* set seek of p_fci_internal->handleCFFILE1 to 0 */
if( PFCI_SEEK(hfci,p_fci_internal->handleCFFILE1,0,SEEK_SET,err,
p_fci_internal->pv) !=0 ) {
/* wrong return value */
fci_set_error( FCIERR_NONE, ERROR_SEEK, TRUE );
return FALSE;
}
/* TODO error handling of err */
/* while not all CFFILE structures have been copied do */
while(!FALSE) {
/* REUSE the variable read_result */
/* read data from p_fci_internal->handleCFFILE1 to cffile */
read_result = PFCI_READ(hfci,p_fci_internal->handleCFFILE1/* file handle */,
&cffile, /* memory buffer */
sizeof(cffile), /* number of bytes to copy */
err, p_fci_internal->pv);
if( read_result != sizeof(cffile) ) {
if( read_result == 0 ) break; /* ALL CFFILE structures have been copied */
/* read error */
fci_set_error( FCIERR_NONE, ERROR_READ_FAULT, TRUE );
return FALSE;
}
/* TODO error handling of err */
/* Microsoft's(R) CABINET.DLL would do a seek to the current! */
/* position. I don't know why so I'll just omit it */
/* read the filename from p_fci_internal->handleCFFILE1 */
/* REUSE the variable read_result AGAIN */
/* REUSE the memory buffer PFCI(hfci)->data_out */
if( PFCI_READ(hfci, p_fci_internal->handleCFFILE1 /*file handle*/,
p_fci_internal->data_out, /* memory buffer */
CB_MAX_FILENAME, /* number of bytes to copy */
err, p_fci_internal->pv) <2) {
/* read error */
fci_set_error( FCIERR_NONE, ERROR_READ_FAULT, TRUE );
return FALSE;
}
/* TODO maybe other checks of read_result */
/* TODO error handling of err */
/* safety */
if( strlen(p_fci_internal->data_out)>=CB_MAX_FILENAME ) {
/* set error code internal error */
fci_set_error( FCIERR_NONE, ERROR_INVALID_DATA, TRUE );
return FALSE;
}
seek+=sizeof(cffile) + strlen(p_fci_internal->data_out)+1;
/* set seek of p_fci_internal->handleCFFILE1 to end of file name */
/* i.e. seek to the next CFFILE area */
if( PFCI_SEEK(hfci,p_fci_internal->handleCFFILE1,
seek, /* seek position*/
SEEK_SET ,err,
p_fci_internal->pv)
!= seek) {
/* wrong return value */
fci_set_error( FCIERR_NONE, ERROR_SEEK, TRUE );
return FALSE;
}
/* TODO error handling of err */
/* fnfilfnfildest: placed file on cabinet */
if (p_fci_internal->fNextCab ||
p_fci_internal->fGetNextCabInVain) {
PFCI_FILEPLACED( hfci, &(p_fci_internal->oldCCAB),
p_fci_internal->data_out, /* the file name*/
cffile.cbFile, /* file size */
(cffile.iFolder==cffileCONTINUED_FROM_PREV),
p_fci_internal->pv
);
} else {
PFCI_FILEPLACED( hfci, p_fci_internal->pccab,
p_fci_internal->data_out, /* the file name*/
cffile.cbFile, /* file size */
(cffile.iFolder==cffileCONTINUED_FROM_PREV),
p_fci_internal->pv
);
}
/* Check special iFolder values */
if( cffile.iFolder==cffileCONTINUED_FROM_PREV &&
p_fci_internal->fPrevCab==FALSE ) {
/* THIS MAY NEVER HAPPEN */
/* set error code */
fci_set_error( FCIERR_NONE, ERROR_GEN_FAILURE, TRUE );
return FALSE;
}
if( cffile.iFolder==cffileCONTINUED_PREV_AND_NEXT ||
cffile.iFolder==cffileCONTINUED_TO_NEXT ) {
/* THIS MAY NEVER HAPPEN */
/* set error code */
fci_set_error( FCIERR_NONE, ERROR_GEN_FAILURE, TRUE );
return FALSE;
}
if( may_be_prev && cffile.iFolder!=cffileCONTINUED_FROM_PREV ) {
may_be_prev=FALSE;
}
if( cffile.iFolder==cffileCONTINUED_FROM_PREV && may_be_prev==FALSE ) {
/* THIS MAY NEVER HAPPEN */
/* set error code */
fci_set_error( FCIERR_NONE, ERROR_GEN_FAILURE, TRUE );
return FALSE;
}
if( cffile.iFolder!=cffileCONTINUED_FROM_PREV ) {
may_be_prev=FALSE;
}
sizeOfFilesPrev=sizeOfFiles;
/* Set complete size of all processed files */
if( cffile.iFolder==cffileCONTINUED_FROM_PREV &&
p_fci_internal->cbFileRemainer!=0
) {
sizeOfFiles+=p_fci_internal->cbFileRemainer;
p_fci_internal->cbFileRemainer=0;
} else {
sizeOfFiles+=cffile.cbFile;
}
/* Check if spanned file fits into this cabinet folder */
if( cffile.iFolder==cffileCONTINUED_FROM_PREV && sizeOfFiles>payload ) {
cffile.iFolder=cffileCONTINUED_PREV_AND_NEXT;
} else
/* Check if file doesn't fit into this cabinet folder */
if( sizeOfFiles>payload ) {
cffile.iFolder=cffileCONTINUED_TO_NEXT;
}
/* set little endian */
cffile.cbFile=fci_endian_ulong(cffile.cbFile);
cffile.uoffFolderStart=fci_endian_ulong(cffile.uoffFolderStart);
cffile.iFolder=fci_endian_uword(cffile.iFolder);
cffile.date=fci_endian_uword(cffile.date);
cffile.time=fci_endian_uword(cffile.time);
cffile.attribs=fci_endian_uword(cffile.attribs);
/* write cffile to p_fci_internal->handleCFFILE2 */
if( PFCI_WRITE(hfci, p_fci_internal->handleCFFILE2, /* file handle */
&cffile, /* memory buffer */
sizeof(cffile), /* number of bytes to copy */
err, p_fci_internal->pv) != sizeof(cffile) ) {
fci_set_error( FCIERR_TEMP_FILE, ERROR_WRITE_FAULT, TRUE );
return FALSE;
}
/* TODO error handling of err */
p_fci_internal->sizeFileCFFILE2 += sizeof(cffile);
/* reset little endian */
cffile.cbFile=fci_endian_ulong(cffile.cbFile);
cffile.uoffFolderStart=fci_endian_ulong(cffile.uoffFolderStart);
cffile.iFolder=fci_endian_uword(cffile.iFolder);
cffile.date=fci_endian_uword(cffile.date);
cffile.time=fci_endian_uword(cffile.time);
cffile.attribs=fci_endian_uword(cffile.attribs);
/* write file name to p_fci_internal->handleCFFILE2 */
if( PFCI_WRITE(hfci, p_fci_internal->handleCFFILE2, /* file handle */
p_fci_internal->data_out, /* memory buffer */
strlen(p_fci_internal->data_out)+1, /* number of bytes to copy */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -