53#define fci_endian_ulong(x) RtlUlongByteSwap(x)
54#define fci_endian_uword(x) RtlUshortByteSwap(x)
56#define fci_endian_ulong(x) (x)
57#define fci_endian_uword(x) (x)
190#define FCI_INT_MAGIC 0xfcfcfc05
251 if (
file->handle == -1)
return TRUE;
453 while (cUlong-- > 0) {
464 ul |= (((
ULONG)(*pb++)) << 16);
467 ul |= (((
ULONG)(*pb++)) << 8);
532 memset( cffolder, 0, folder_size );
540 if (fci->
write(
handle, cffolder, folder_size, &
err, fci->
pv ) != folder_size)
606 memset( cfdata, 0, header_size );
607 data = (
char *)cfdata + header_size;
658 memset( cfheader, 0, header_size );
675 ptr = (
char *)(cfheader + 1);
709 assert(
ptr - (
char *)cfheader == header_size );
721 if (fci->
write(
handle, cfheader, header_size, &
err, fci->
pv ) != header_size)
771 fci->
data.handle = -1;
782 if (!(
new = fci->
alloc(
sizeof(*
new) )))
799 new->uncompressed = 0;
800 block->compressed -=
new->compressed;
805 new->compressed =
block->compressed;
806 new->uncompressed =
block->uncompressed;
809 start_pos +=
new->compressed;
813 (*payload) +=
new->uncompressed;
825 if (split_block)
break;
837 cab_ULONG sizeOfFiles = 0, sizeOfFilesPrev;
849 sizeOfFilesPrev = sizeOfFiles;
859 if (sizeOfFiles > payload)
874 if (sizeOfFiles > payload)
883 if (sizeOfFilesPrev <= payload)
887 cbFileRemainder = sizeOfFiles - payload;
941 return stream.total_out + 2;
993 PFNFCIALLOC pfnalloc,
1011 if ((!pfnalloc) || (!pfnfree) || (!pfnopen) || (!pfnread) ||
1012 (!pfnwrite) || (!pfnclose) || (!pfnseek) || (!pfndelete) ||
1013 (!pfnfcigtf) || (!pccab)) {
1022 if (!((p_fci_internal = pfnalloc(
sizeof(
FCI_Int))))) {
1033 p_fci_internal->
perf = perf;
1035 p_fci_internal->
alloc = pfnalloc;
1036 p_fci_internal->
free = pfnfree;
1037 p_fci_internal->
open = pfnopen;
1038 p_fci_internal->
read = pfnread;
1039 p_fci_internal->
write = pfnwrite;
1040 p_fci_internal->
close = pfnclose;
1041 p_fci_internal->
seek = pfnseek;
1042 p_fci_internal->
delete = pfndelete;
1043 p_fci_internal->
gettemp = pfnfcigtf;
1044 p_fci_internal->
ccab = *pccab;
1045 p_fci_internal->
pccab = pccab;
1046 p_fci_internal->
pv = pv;
1047 p_fci_internal->
data.handle = -1;
1057 return (
HFCI)p_fci_internal;
1072 if ((!pfnfcignc) || (!pfnfcis)) {
1121 p_fci_internal->
pv) == -1) {
1146 p_fci_internal->
ccab.
cb < read_result +
1158 if (!(*pfnfcignc)(p_fci_internal->
pccab,
1160 p_fci_internal->
pv)) {
1174 p_fci_internal->
ccab.
cb < read_result +
1187 if (p_fci_internal->
ccab.
cb <=
1234 if( p_fci_internal->
files_size==0 && fGetNextCab ) {
1243 if(returntrue)
return TRUE;
1280 p_fci_internal->
ccab = *p_fci_internal->
pccab;
1294 p_fci_internal->
ccab.
cb < read_result ) {
1305 p_fci_internal->
ccab.
cb < read_result +
1312 if (!(*pfnfcignc)(p_fci_internal->
pccab,
1314 p_fci_internal->
pv)) {
1325 p_fci_internal->
ccab.
cb < read_result +
1391 char *pszSourceFile,
1402 if (!p_fci_internal)
return FALSE;
1404 if ((!pszSourceFile) || (!
pszFileName) || (!pfnfcignc) || (!pfnfcis) ||
1413 switch (typeCompress)
1420 FIXME(
"compression %x not supported, defaulting to none\n", typeCompress );
1459 ( p_fci_internal->
ccab.
cb < read_result +
1467 if (!(*pfnfcignc)(p_fci_internal->
pccab,
1469 p_fci_internal->
pv)) {
1490 p_fci_internal->
ccab.
cb < read_result +
1520 p_fci_internal->
ccab.
cb < read_result ) {
1533 ( p_fci_internal->
ccab.
cb < read_result +
1541 if (!(*pfnfcignc)(p_fci_internal->
pccab,
1543 p_fci_internal->
pv)) {
1563 p_fci_internal->
ccab.
cb < read_result +
1628 if (!p_fci_internal)
return FALSE;
1673 if (!p_fci_internal)
return FALSE;
1706 if (!p_fci_internal)
return FALSE;
1710 p_fci_internal->
magic = 0;
1728 p_fci_internal->
free(hfci);
#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
_ACRTIMP size_t __cdecl strlen(const char *)
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 void * zalloc(void *opaque, unsigned int items, unsigned int size)
static cab_UWORD compress_MSZIP(FCI_Int *fci)
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)
static void zfree(void *opaque, void *ptr)
#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 void WINAPI status_callback(HINTERNET handle, DWORD_PTR ctx, DWORD status, LPVOID info, DWORD info_len)
void execute(char *message, int(*func)(int))
_In_opt_ _In_opt_ _In_ _In_ DWORD cbData
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