48#include "wine/winternl.h"
57#define fci_endian_ulong(x) RtlUlongByteSwap(x)
58#define fci_endian_uword(x) RtlUshortByteSwap(x)
60#define fci_endian_ulong(x) (x)
61#define fci_endian_uword(x) (x)
194#define FCI_INT_MAGIC 0xfcfcfc05
255 if (
file->handle == -1)
return TRUE;
457 while (cUlong-- > 0) {
468 ul |= (((
ULONG)(*pb++)) << 16);
471 ul |= (((
ULONG)(*pb++)) << 8);
536 memset( cffolder, 0, folder_size );
544 if (fci->
write(
handle, cffolder, folder_size, &
err, fci->
pv ) != folder_size)
610 memset( cfdata, 0, header_size );
611 data = (
char *)cfdata + header_size;
662 memset( cfheader, 0, header_size );
679 ptr = (
char *)(cfheader + 1);
713 assert(
ptr - (
char *)cfheader == header_size );
725 if (fci->
write(
handle, cfheader, header_size, &
err, fci->
pv ) != header_size)
775 fci->
data.handle = -1;
786 if (!(
new = fci->
alloc(
sizeof(*
new) )))
803 new->uncompressed = 0;
804 block->compressed -=
new->compressed;
809 new->compressed =
block->compressed;
810 new->uncompressed =
block->uncompressed;
813 start_pos +=
new->compressed;
817 (*payload) +=
new->uncompressed;
829 if (split_block)
break;
841 cab_ULONG sizeOfFiles = 0, sizeOfFilesPrev;
853 sizeOfFilesPrev = sizeOfFiles;
863 if (sizeOfFiles > payload)
878 if (sizeOfFiles > payload)
887 if (sizeOfFilesPrev <= payload)
891 cbFileRemainder = sizeOfFiles - payload;
914static void *
zalloc(
void *opaque,
unsigned int items,
unsigned int size )
920static void zfree(
void *opaque,
void *
ptr )
947 return stream.total_out + 2;
1001 PFNFCIALLOC pfnalloc,
1019 if ((!pfnalloc) || (!pfnfree) || (!pfnopen) || (!pfnread) ||
1020 (!pfnwrite) || (!pfnclose) || (!pfnseek) || (!pfndelete) ||
1021 (!pfnfcigtf) || (!pccab)) {
1030 if (!((p_fci_internal = pfnalloc(
sizeof(
FCI_Int))))) {
1041 p_fci_internal->
perf = perf;
1043 p_fci_internal->
alloc = pfnalloc;
1044 p_fci_internal->
free = pfnfree;
1045 p_fci_internal->
open = pfnopen;
1046 p_fci_internal->
read = pfnread;
1047 p_fci_internal->
write = pfnwrite;
1048 p_fci_internal->
close = pfnclose;
1049 p_fci_internal->
seek = pfnseek;
1050 p_fci_internal->
delete = pfndelete;
1051 p_fci_internal->
gettemp = pfnfcigtf;
1052 p_fci_internal->
ccab = *pccab;
1053 p_fci_internal->
pccab = pccab;
1054 p_fci_internal->
pv = pv;
1055 p_fci_internal->
data.handle = -1;
1065 return (
HFCI)p_fci_internal;
1080 if ((!pfnfcignc) || (!pfnfcis)) {
1129 p_fci_internal->
pv) == -1) {
1154 p_fci_internal->
ccab.
cb < read_result +
1166 if (!(*pfnfcignc)(p_fci_internal->
pccab,
1168 p_fci_internal->
pv)) {
1182 p_fci_internal->
ccab.
cb < read_result +
1195 if (p_fci_internal->
ccab.
cb <=
1242 if( p_fci_internal->
files_size==0 && fGetNextCab ) {
1251 if(returntrue)
return TRUE;
1288 p_fci_internal->
ccab = *p_fci_internal->
pccab;
1302 p_fci_internal->
ccab.
cb < read_result ) {
1313 p_fci_internal->
ccab.
cb < read_result +
1320 if (!(*pfnfcignc)(p_fci_internal->
pccab,
1322 p_fci_internal->
pv)) {
1333 p_fci_internal->
ccab.
cb < read_result +
1399 char *pszSourceFile,
1410 if (!p_fci_internal)
return FALSE;
1412 if ((!pszSourceFile) || (!
pszFileName) || (!pfnfcignc) || (!pfnfcis) ||
1421 switch (typeCompress)
1426 p_fci_internal->
compress = compress_MSZIP;
1430 FIXME(
"compression %x not supported, defaulting to none\n", typeCompress );
1469 ( p_fci_internal->
ccab.
cb < read_result +
1477 if (!(*pfnfcignc)(p_fci_internal->
pccab,
1479 p_fci_internal->
pv)) {
1500 p_fci_internal->
ccab.
cb < read_result +
1530 p_fci_internal->
ccab.
cb < read_result ) {
1543 ( p_fci_internal->
ccab.
cb < read_result +
1551 if (!(*pfnfcignc)(p_fci_internal->
pccab,
1553 p_fci_internal->
pv)) {
1573 p_fci_internal->
ccab.
cb < read_result +
1638 if (!p_fci_internal)
return FALSE;
1683 if (!p_fci_internal)
return FALSE;
1716 if (!p_fci_internal)
return FALSE;
1720 p_fci_internal->
magic = 0;
1738 p_fci_internal->
free(hfci);
ACPI_SIZE strlen(const char *String)
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
static void list_remove(struct list_entry *entry)
static int list_empty(struct list_entry *head)
static void list_add_tail(struct list_entry *head, struct list_entry *entry)
static void list_init(struct list_entry *head)
#define ERROR_NOT_ENOUGH_MEMORY
static BOOL reserve(struct dynamic_array *array, int count, int itemsize)
#define cffileCONTINUED_FROM_PREV
#define cfheadRESERVE_PRESENT
#define cffileCONTINUED_PREV_AND_NEXT
#define cfheadNEXT_CABINET
#define cffileCONTINUED_TO_NEXT
#define cfheadPREV_CABINET
#define ERROR_INVALID_HANDLE
#define Z_DEFAULT_STRATEGY
int deflate(z_streamp strm, int flush) DECLSPEC_HIDDEN
int deflateEnd(z_streamp strm) DECLSPEC_HIDDEN
#define Z_DEFAULT_COMPRESSION
static void * zalloc(void *priv, uInt items, uInt sz)
static void zfree(void *priv, void *addr)
static BOOL fci_flush_folder(FCI_Int *p_fci_internal, BOOL fGetNextCab, PFNFCIGETNEXTCABINET pfnfcignc, PFNFCISTATUS pfnfcis)
static void free_folder(FCI_Int *fci, struct folder *folder)
static BOOL write_files(FCI_Int *fci, INT_PTR handle, PFNFCISTATUS status_callback)
static struct file * copy_file(FCI_Int *fci, const struct file *orig)
static struct folder * add_folder(FCI_Int *fci)
static void free_data_block(FCI_Int *fci, struct data_block *block)
static BOOL add_data_block(FCI_Int *fci, PFNFCISTATUS status_callback)
static cab_ULONG get_header_size(FCI_Int *fci)
BOOL __cdecl FCIAddFile(HFCI hfci, char *pszSourceFile, char *pszFileName, BOOL fExecute, PFNFCIGETNEXTCABINET pfnfcignc, PFNFCISTATUS pfnfcis, PFNFCIGETOPENINFO pfnfcigoi, TCOMP typeCompress)
static BOOL add_file_data(FCI_Int *fci, char *sourcefile, char *filename, BOOL execute, PFNFCIGETOPENINFO get_open_info, PFNFCISTATUS status_callback)
static struct file * add_file(FCI_Int *fci, const char *filename)
static BOOL copy_data_blocks(FCI_Int *fci, INT_PTR handle, cab_ULONG start_pos, struct temp_file *temp, PFNFCISTATUS status_callback)
static void reset_cabinet(FCI_Int *fci)
static cab_UWORD compress_NONE(FCI_Int *fci)
static void set_error(FCI_Int *fci, int oper, int err)
static FCI_Int * get_fci_ptr(HFCI hfci)
static BOOL fci_flush_cabinet(FCI_Int *p_fci_internal, BOOL fGetNextCab, PFNFCIGETNEXTCABINET pfnfcignc, PFNFCISTATUS pfnfcis)
static BOOL write_cabinet(FCI_Int *fci, PFNFCISTATUS status_callback)
BOOL __cdecl FCIDestroy(HFCI hfci)
static BOOL create_temp_file(FCI_Int *fci, struct temp_file *file)
static cab_ULONG fci_get_checksum(const void *pv, UINT cb, cab_ULONG seed)
static BOOL write_folders(FCI_Int *fci, INT_PTR handle, cab_ULONG header_size, PFNFCISTATUS status_callback)
static BOOL write_data_blocks(FCI_Int *fci, INT_PTR handle, PFNFCISTATUS status_callback)
HFCI __cdecl FCICreate(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)
#define fci_endian_uword(x)
static BOOL close_temp_file(FCI_Int *fci, struct temp_file *file)
BOOL __cdecl FCIFlushFolder(HFCI hfci, PFNFCIGETNEXTCABINET pfnfcignc, PFNFCISTATUS pfnfcis)
BOOL __cdecl FCIFlushCabinet(HFCI hfci, BOOL fGetNextCab, PFNFCIGETNEXTCABINET pfnfcignc, PFNFCISTATUS pfnfcis)
static void free_file(FCI_Int *fci, struct file *file)
static BOOL add_files_to_folder(FCI_Int *fci, struct folder *folder, cab_ULONG payload)
static BOOL add_data_to_folder(FCI_Int *fci, struct folder *folder, cab_ULONG *payload, PFNFCISTATUS status_callback)
#define fci_endian_ulong(x)
#define CB_MAX_CABINET_NAME
LONG(__cdecl * PFNFCISEEK)(INT_PTR hf, LONG dist, int seektype, int *err, void *pv)
INT_PTR(__cdecl * PFNFCIOPEN)(char *pszFile, int oflag, int pmode, int *err, void *pv)
UINT(__cdecl * PFNFCIWRITE)(INT_PTR hf, void *memory, UINT cb, int *err, void *pv)
int(__cdecl * PFNFCIDELETE)(char *pszFile, int *err, void *pv)
UINT(__cdecl * PFNFCIREAD)(INT_PTR hf, void *memory, UINT cb, int *err, void *pv)
BOOL(__cdecl * PFNFCIGETTEMPFILE)(char *pszTempName, int cbTempName, void *pv)
LONG(__cdecl * PFNFCISTATUS)(UINT typeStatus, ULONG cb1, ULONG cb2, void *pv)
void(__cdecl * PFNFCIFREE)(void *memory)
int(__cdecl * PFNFCIFILEPLACED)(PCCAB pccab, char *pszFile, LONG cbFile, BOOL fContinuation, void *pv)
int(__cdecl * PFNFCICLOSE)(INT_PTR hf, int *err, void *pv)
INT_PTR(__cdecl * PFNFCIGETOPENINFO)(char *pszName, USHORT *pdate, USHORT *ptime, USHORT *pattribs, int *err, void *pv)
BOOL(__cdecl * PFNFCIGETNEXTCABINET)(PCCAB pccab, ULONG cbPrevCab, void *pv)
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
#define memcpy(s1, s2, n)
static INT_PTR CDECL get_open_info(char *pszName, USHORT *pdate, USHORT *ptime, USHORT *pattribs, int *err, void *pv)
static HMODULE MODULEINFO DWORD cb
static void WINAPI status_callback(HINTERNET handle, DWORD_PTR ctx, DWORD status, LPVOID info, DWORD info_len)
void execute(char *message, int(*func)(int))
static unsigned __int64 next
static unsigned int file_size
#define deflateInit2(strm, level, method, windowBits, memLevel, strategy)
#define LIST_FOR_EACH_ENTRY(elem, list, type, field)
#define LIST_FOR_EACH_ENTRY_SAFE(cursor, cursor2, list, type, field)
__WINE_SERVER_LIST_INLINE void list_add_before(struct list *elem, struct list *to_add)
char szDisk[CB_MAX_DISK_NAME]
char szCabPath[CB_MAX_CAB_PATH]
char szCab[CB_MAX_CABINET_NAME]
cab_ULONG uoffFolderStart
char szPrevDisk[CB_MAX_DISK_NAME]
cab_ULONG estimatedCabinetSize
cab_ULONG cbFileRemainder
unsigned char data_out[2 *CAB_BLOCKMAX]
cab_ULONG pending_data_size
cab_ULONG statusFolderCopied
cab_ULONG statusFolderTotal
PFNFCIFILEPLACED fileplaced
unsigned char data_in[CAB_BLOCKMAX]
cab_ULONG folders_data_size
ULONG cCompressedBytesInFolder
cab_UWORD(* compress)(struct FCI_Int *)
cab_ULONG placed_files_size
char szPrevCab[CB_MAX_CABINET_NAME]
PFNFCIGETTEMPFILE gettemp
#define new(TYPE, numElems)
#define FIELD_OFFSET(t, f)
WORD WORD PSZ PSZ pszFileName
#define ERROR_GEN_FAILURE
#define ERROR_FUNCTION_FAILED
#define ERROR_BAD_ARGUMENTS
static unsigned int block