ReactOS  0.4.13-dev-443-g10f00f8
fci.h File Reference
#include <basetsd.h>
#include <pshpack4.h>
#include <poppack.h>
Include dependency graph for fci.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

struct  ERF
 
struct  CCAB
 

Macros

#define INCLUDED_TYPES_FCI_FDI   1
 
#define CB_MAX_CHUNK   32768U
 
#define CB_MAX_DISK   0x7fffffffL
 
#define CB_MAX_FILENAME   256
 
#define CB_MAX_CABINET_NAME   256
 
#define CB_MAX_CAB_PATH   256
 
#define CB_MAX_DISK_NAME   256
 
#define tcompMASK_TYPE   0x000F /* Mask for compression type */
 
#define tcompTYPE_NONE   0x0000 /* No compression */
 
#define tcompTYPE_MSZIP   0x0001 /* MSZIP */
 
#define tcompTYPE_QUANTUM   0x0002 /* Quantum */
 
#define tcompTYPE_LZX   0x0003 /* LZX */
 
#define tcompBAD   0x000F /* Unspecified compression type */
 
#define tcompMASK_LZX_WINDOW   0x1F00 /* Mask for LZX Compression Memory */
 
#define tcompLZX_WINDOW_LO   0x0F00 /* Lowest LZX Memory (15) */
 
#define tcompLZX_WINDOW_HI   0x1500 /* Highest LZX Memory (21) */
 
#define tcompSHIFT_LZX_WINDOW   8 /* Amount to shift over to get int */
 
#define tcompMASK_QUANTUM_LEVEL   0x00F0 /* Mask for Quantum Compression Level */
 
#define tcompQUANTUM_LEVEL_LO   0x0010 /* Lowest Quantum Level (1) */
 
#define tcompQUANTUM_LEVEL_HI   0x0070 /* Highest Quantum Level (7) */
 
#define tcompSHIFT_QUANTUM_LEVEL   4 /* Amount to shift over to get int */
 
#define tcompMASK_QUANTUM_MEM   0x1F00 /* Mask for Quantum Compression Memory */
 
#define tcompQUANTUM_MEM_LO   0x0A00 /* Lowest Quantum Memory (10) */
 
#define tcompQUANTUM_MEM_HI   0x1500 /* Highest Quantum Memory (21) */
 
#define tcompSHIFT_QUANTUM_MEM   8 /* Amount to shift over to get int */
 
#define tcompMASK_RESERVED   0xE000 /* Reserved bits (high 3 bits) */
 
#define CompressionTypeFromTCOMP(tc)   ((tc) & tcompMASK_TYPE)
 
#define CompressionLevelFromTCOMP(tc)   (((tc) & tcompMASK_QUANTUM_LEVEL) >> tcompSHIFT_QUANTUM_LEVEL)
 
#define CompressionMemoryFromTCOMP(tc)   (((tc) & tcompMASK_QUANTUM_MEM) >> tcompSHIFT_QUANTUM_MEM)
 
#define TCOMPfromTypeLevelMemory(t, l, m)
 
#define LZXCompressionWindowFromTCOMP(tc)   (((tc) & tcompMASK_LZX_WINDOW) >> tcompSHIFT_LZX_WINDOW)
 
#define TCOMPfromLZXWindow(w)
 
#define _A_NAME_IS_UTF   0x80
 
#define _A_EXEC   0x40
 
#define FNFCIALLOC(fn)   void * __cdecl fn(ULONG cb)
 
#define FNFCIFREE(fn)   void __cdecl fn(void *memory)
 
#define FNFCIOPEN(fn)   INT_PTR __cdecl fn(char *pszFile, int oflag, int pmode, int *err, void *pv)
 
#define FNFCIREAD(fn)   UINT __cdecl fn(INT_PTR hf, void *memory, UINT cb, int *err, void *pv)
 
#define FNFCIWRITE(fn)   UINT __cdecl fn(INT_PTR hf, void *memory, UINT cb, int *err, void *pv)
 
#define FNFCICLOSE(fn)   int __cdecl fn(INT_PTR hf, int *err, void *pv)
 
#define FNFCISEEK(fn)   LONG __cdecl fn(INT_PTR hf, LONG dist, int seektype, int *err, void *pv)
 
#define FNFCIDELETE(fn)   int __cdecl fn(char *pszFile, int *err, void *pv)
 
#define FNFCIGETNEXTCABINET(fn)
 
#define FNFCIFILEPLACED(fn)
 
#define FNFCIGETOPENINFO(fn)
 
#define statusFile   0 /* Add File to Folder callback */
 
#define statusFolder   1 /* Add Folder to Cabinet callback */
 
#define statusCabinet   2 /* Write out a completed cabinet callback */
 
#define FNFCISTATUS(fn)
 
#define FNFCIGETTEMPFILE(fn)
 

Typedefs

typedef ULONG CHECKSUM
 
typedef ULONG UOFF
 
typedef ULONG COFF
 
typedef struct ERFPERF
 
typedef unsigned short TCOMP
 
typedef voidHFCI
 
typedef struct CCABPCCAB
 
typedef void *__cdecl __WINE_ALLOC_SIZE(1) *PFNFCIALLOC) (ULONG cb)
 
typedef void(__cdeclPFNFCIFREE) (void *memory)
 
typedef INT_PTR(__cdeclPFNFCIOPEN) (char *pszFile, int oflag, int pmode, int *err, void *pv)
 
typedef UINT(__cdeclPFNFCIREAD) (INT_PTR hf, void *memory, UINT cb, int *err, void *pv)
 
typedef UINT(__cdeclPFNFCIWRITE) (INT_PTR hf, void *memory, UINT cb, int *err, void *pv)
 
typedef int(__cdeclPFNFCICLOSE) (INT_PTR hf, int *err, void *pv)
 
typedef LONG(__cdeclPFNFCISEEK) (INT_PTR hf, LONG dist, int seektype, int *err, void *pv)
 
typedef int(__cdeclPFNFCIDELETE) (char *pszFile, int *err, void *pv)
 
typedef BOOL(__cdeclPFNFCIGETNEXTCABINET) (PCCAB pccab, ULONG cbPrevCab, void *pv)
 
typedef int(__cdeclPFNFCIFILEPLACED) (PCCAB pccab, char *pszFile, LONG cbFile, BOOL fContinuation, void *pv)
 
typedef INT_PTR(__cdeclPFNFCIGETOPENINFO) (char *pszName, USHORT *pdate, USHORT *ptime, USHORT *pattribs, int *err, void *pv)
 
typedef LONG(__cdeclPFNFCISTATUS) (UINT typeStatus, ULONG cb1, ULONG cb2, void *pv)
 
typedef BOOL(__cdeclPFNFCIGETTEMPFILE) (char *pszTempName, int cbTempName, void *pv)
 

Enumerations

enum  FCIERROR {
  FCIERR_NONE, FCIERR_OPEN_SRC, FCIERR_READ_SRC, FCIERR_ALLOC_FAIL,
  FCIERR_TEMP_FILE, FCIERR_BAD_COMPR_TYPE, FCIERR_CAB_FILE, FCIERR_USER_ABORT,
  FCIERR_MCI_FAIL
}
 

Functions

HFCI __cdecl FCICreate (PERF, PFNFCIFILEPLACED, PFNFCIALLOC, PFNFCIFREE, PFNFCIOPEN, PFNFCIREAD, PFNFCIWRITE, PFNFCICLOSE, PFNFCISEEK, PFNFCIDELETE, PFNFCIGETTEMPFILE, PCCAB, void *)
 
BOOL __cdecl FCIAddFile (HFCI, char *, char *, BOOL, PFNFCIGETNEXTCABINET, PFNFCISTATUS, PFNFCIGETOPENINFO, TCOMP)
 
BOOL __cdecl FCIFlushCabinet (HFCI, BOOL, PFNFCIGETNEXTCABINET, PFNFCISTATUS)
 
BOOL __cdecl FCIFlushFolder (HFCI, PFNFCIGETNEXTCABINET, PFNFCISTATUS)
 
BOOL __cdecl FCIDestroy (HFCI hfci)
 

Macro Definition Documentation

◆ _A_EXEC

#define _A_EXEC   0x40

Definition at line 135 of file fci.h.

◆ _A_NAME_IS_UTF

#define _A_NAME_IS_UTF   0x80

Definition at line 131 of file fci.h.

◆ CB_MAX_CAB_PATH

#define CB_MAX_CAB_PATH   256

Definition at line 56 of file fci.h.

◆ CB_MAX_CABINET_NAME

#define CB_MAX_CABINET_NAME   256

Definition at line 55 of file fci.h.

◆ CB_MAX_CHUNK

#define CB_MAX_CHUNK   32768U

Definition at line 52 of file fci.h.

◆ CB_MAX_DISK

#define CB_MAX_DISK   0x7fffffffL

Definition at line 53 of file fci.h.

◆ CB_MAX_DISK_NAME

#define CB_MAX_DISK_NAME   256

Definition at line 57 of file fci.h.

◆ CB_MAX_FILENAME

#define CB_MAX_FILENAME   256

Definition at line 54 of file fci.h.

◆ CompressionLevelFromTCOMP

#define CompressionLevelFromTCOMP (   tc)    (((tc) & tcompMASK_QUANTUM_LEVEL) >> tcompSHIFT_QUANTUM_LEVEL)

Definition at line 92 of file fci.h.

◆ CompressionMemoryFromTCOMP

#define CompressionMemoryFromTCOMP (   tc)    (((tc) & tcompMASK_QUANTUM_MEM) >> tcompSHIFT_QUANTUM_MEM)

Definition at line 95 of file fci.h.

◆ CompressionTypeFromTCOMP

#define CompressionTypeFromTCOMP (   tc)    ((tc) & tcompMASK_TYPE)

Definition at line 89 of file fci.h.

◆ FNFCIALLOC

#define FNFCIALLOC (   fn)    void * __cdecl fn(ULONG cb)

Definition at line 167 of file fci.h.

◆ FNFCICLOSE

#define FNFCICLOSE (   fn)    int __cdecl fn(INT_PTR hf, int *err, void *pv)

Definition at line 182 of file fci.h.

◆ FNFCIDELETE

#define FNFCIDELETE (   fn)    int __cdecl fn(char *pszFile, int *err, void *pv)

Definition at line 188 of file fci.h.

◆ FNFCIFILEPLACED

#define FNFCIFILEPLACED (   fn)
Value:
int __cdecl fn(PCCAB pccab, \
char *pszFile, \
LONG cbFile, \
BOOL fContinuation, \
void *pv)
#define __cdecl
Definition: accygwin.h:79
static GLenum _GLUfuncptr fn
Definition: wgl_font.c:159
Definition: fci.h:144
unsigned int BOOL
Definition: ntddk_ex.h:94
long LONG
Definition: pedump.c:60

Definition at line 200 of file fci.h.

◆ FNFCIFREE

#define FNFCIFREE (   fn)    void __cdecl fn(void *memory)

Definition at line 170 of file fci.h.

◆ FNFCIGETNEXTCABINET

#define FNFCIGETNEXTCABINET (   fn)
Value:
BOOL __cdecl fn(PCCAB pccab, \
ULONG cbPrevCab, \
void *pv)
#define __cdecl
Definition: accygwin.h:79
static GLenum _GLUfuncptr fn
Definition: wgl_font.c:159
Definition: fci.h:144
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned int ULONG
Definition: retypes.h:1

Definition at line 191 of file fci.h.

◆ FNFCIGETOPENINFO

#define FNFCIGETOPENINFO (   fn)
Value:
INT_PTR __cdecl fn(char *pszName, \
USHORT *pdate, \
USHORT *ptime, \
USHORT *pattribs, \
int *err, \
void *pv)
#define __cdecl
Definition: accygwin.h:79
static GLenum _GLUfuncptr fn
Definition: wgl_font.c:159
int32_t INT_PTR
Definition: typedefs.h:62
#define err(...)
unsigned short USHORT
Definition: pedump.c:61

Definition at line 212 of file fci.h.

◆ FNFCIGETTEMPFILE

#define FNFCIGETTEMPFILE (   fn)
Value:
BOOL __cdecl fn(char *pszTempName, \
int cbTempName, \
void *pv)
#define __cdecl
Definition: accygwin.h:79
static GLenum _GLUfuncptr fn
Definition: wgl_font.c:159
unsigned int BOOL
Definition: ntddk_ex.h:94

Definition at line 235 of file fci.h.

◆ FNFCIOPEN

#define FNFCIOPEN (   fn)    INT_PTR __cdecl fn(char *pszFile, int oflag, int pmode, int *err, void *pv)

Definition at line 173 of file fci.h.

◆ FNFCIREAD

#define FNFCIREAD (   fn)    UINT __cdecl fn(INT_PTR hf, void *memory, UINT cb, int *err, void *pv)

Definition at line 176 of file fci.h.

◆ FNFCISEEK

#define FNFCISEEK (   fn)    LONG __cdecl fn(INT_PTR hf, LONG dist, int seektype, int *err, void *pv)

Definition at line 185 of file fci.h.

◆ FNFCISTATUS

#define FNFCISTATUS (   fn)
Value:
LONG __cdecl fn(UINT typeStatus, \
ULONG cb1, \
ULONG cb2, \
void *pv)
#define __cdecl
Definition: accygwin.h:79
static GLenum _GLUfuncptr fn
Definition: wgl_font.c:159
long LONG
Definition: pedump.c:60
unsigned int UINT
Definition: ndis.h:50
unsigned int ULONG
Definition: retypes.h:1

Definition at line 227 of file fci.h.

◆ FNFCIWRITE

#define FNFCIWRITE (   fn)    UINT __cdecl fn(INT_PTR hf, void *memory, UINT cb, int *err, void *pv)

Definition at line 179 of file fci.h.

◆ INCLUDED_TYPES_FCI_FDI

#define INCLUDED_TYPES_FCI_FDI   1

Definition at line 31 of file fci.h.

◆ LZXCompressionWindowFromTCOMP

#define LZXCompressionWindowFromTCOMP (   tc)    (((tc) & tcompMASK_LZX_WINDOW) >> tcompSHIFT_LZX_WINDOW)

Definition at line 103 of file fci.h.

◆ statusCabinet

#define statusCabinet   2 /* Write out a completed cabinet callback */

Definition at line 221 of file fci.h.

◆ statusFile

#define statusFile   0 /* Add File to Folder callback */

Definition at line 219 of file fci.h.

◆ statusFolder

#define statusFolder   1 /* Add Folder to Cabinet callback */

Definition at line 220 of file fci.h.

◆ tcompBAD

#define tcompBAD   0x000F /* Unspecified compression type */

Definition at line 68 of file fci.h.

◆ TCOMPfromLZXWindow

#define TCOMPfromLZXWindow (   w)
Value:
GLubyte GLubyte GLubyte GLubyte w
Definition: glext.h:6102
#define tcompSHIFT_LZX_WINDOW
Definition: fci.h:73
#define tcompTYPE_LZX
Definition: fci.h:67

Definition at line 106 of file fci.h.

◆ TCOMPfromTypeLevelMemory

#define TCOMPfromTypeLevelMemory (   t,
  l,
  m 
)
Value:
( t ))
#define tcompSHIFT_QUANTUM_LEVEL
Definition: fci.h:78
GLdouble GLdouble t
Definition: gl.h:2047
const GLfloat * m
Definition: glext.h:10848
#define tcompSHIFT_QUANTUM_MEM
Definition: fci.h:83
r l[0]
Definition: byte_order.h:167

Definition at line 98 of file fci.h.

◆ tcompLZX_WINDOW_HI

#define tcompLZX_WINDOW_HI   0x1500 /* Highest LZX Memory (21) */

Definition at line 72 of file fci.h.

◆ tcompLZX_WINDOW_LO

#define tcompLZX_WINDOW_LO   0x0F00 /* Lowest LZX Memory (15) */

Definition at line 71 of file fci.h.

◆ tcompMASK_LZX_WINDOW

#define tcompMASK_LZX_WINDOW   0x1F00 /* Mask for LZX Compression Memory */

Definition at line 70 of file fci.h.

◆ tcompMASK_QUANTUM_LEVEL

#define tcompMASK_QUANTUM_LEVEL   0x00F0 /* Mask for Quantum Compression Level */

Definition at line 75 of file fci.h.

◆ tcompMASK_QUANTUM_MEM

#define tcompMASK_QUANTUM_MEM   0x1F00 /* Mask for Quantum Compression Memory */

Definition at line 80 of file fci.h.

◆ tcompMASK_RESERVED

#define tcompMASK_RESERVED   0xE000 /* Reserved bits (high 3 bits) */

Definition at line 85 of file fci.h.

◆ tcompMASK_TYPE

#define tcompMASK_TYPE   0x000F /* Mask for compression type */

Definition at line 63 of file fci.h.

◆ tcompQUANTUM_LEVEL_HI

#define tcompQUANTUM_LEVEL_HI   0x0070 /* Highest Quantum Level (7) */

Definition at line 77 of file fci.h.

◆ tcompQUANTUM_LEVEL_LO

#define tcompQUANTUM_LEVEL_LO   0x0010 /* Lowest Quantum Level (1) */

Definition at line 76 of file fci.h.

◆ tcompQUANTUM_MEM_HI

#define tcompQUANTUM_MEM_HI   0x1500 /* Highest Quantum Memory (21) */

Definition at line 82 of file fci.h.

◆ tcompQUANTUM_MEM_LO

#define tcompQUANTUM_MEM_LO   0x0A00 /* Lowest Quantum Memory (10) */

Definition at line 81 of file fci.h.

◆ tcompSHIFT_LZX_WINDOW

#define tcompSHIFT_LZX_WINDOW   8 /* Amount to shift over to get int */

Definition at line 73 of file fci.h.

◆ tcompSHIFT_QUANTUM_LEVEL

#define tcompSHIFT_QUANTUM_LEVEL   4 /* Amount to shift over to get int */

Definition at line 78 of file fci.h.

◆ tcompSHIFT_QUANTUM_MEM

#define tcompSHIFT_QUANTUM_MEM   8 /* Amount to shift over to get int */

Definition at line 83 of file fci.h.

◆ tcompTYPE_LZX

#define tcompTYPE_LZX   0x0003 /* LZX */

Definition at line 67 of file fci.h.

◆ tcompTYPE_MSZIP

#define tcompTYPE_MSZIP   0x0001 /* MSZIP */

Definition at line 65 of file fci.h.

◆ tcompTYPE_NONE

#define tcompTYPE_NONE   0x0000 /* No compression */

Definition at line 64 of file fci.h.

◆ tcompTYPE_QUANTUM

#define tcompTYPE_QUANTUM   0x0002 /* Quantum */

Definition at line 66 of file fci.h.

Typedef Documentation

◆ __WINE_ALLOC_SIZE

static void * __WINE_ALLOC_SIZE
inline

Definition at line 166 of file fci.h.

◆ CHECKSUM

typedef ULONG CHECKSUM

Definition at line 37 of file fci.h.

◆ COFF

typedef ULONG COFF

Definition at line 40 of file fci.h.

◆ HFCI

typedef void* HFCI

Definition at line 140 of file fci.h.

◆ PCCAB

typedef struct CCAB * PCCAB

◆ PERF

typedef struct ERF * PERF

◆ PFNFCICLOSE

typedef int(__cdecl * PFNFCICLOSE) (INT_PTR hf, int *err, void *pv)

Definition at line 181 of file fci.h.

◆ PFNFCIDELETE

typedef int(__cdecl * PFNFCIDELETE) (char *pszFile, int *err, void *pv)

Definition at line 187 of file fci.h.

◆ PFNFCIFILEPLACED

typedef int(__cdecl * PFNFCIFILEPLACED) (PCCAB pccab, char *pszFile, LONG cbFile, BOOL fContinuation, void *pv)

Definition at line 195 of file fci.h.

◆ PFNFCIFREE

typedef void(__cdecl * PFNFCIFREE) (void *memory)

Definition at line 169 of file fci.h.

◆ PFNFCIGETNEXTCABINET

typedef BOOL(__cdecl * PFNFCIGETNEXTCABINET) (PCCAB pccab, ULONG cbPrevCab, void *pv)

Definition at line 190 of file fci.h.

◆ PFNFCIGETOPENINFO

typedef INT_PTR(__cdecl * PFNFCIGETOPENINFO) (char *pszName, USHORT *pdate, USHORT *ptime, USHORT *pattribs, int *err, void *pv)

Definition at line 206 of file fci.h.

◆ PFNFCIGETTEMPFILE

typedef BOOL(__cdecl * PFNFCIGETTEMPFILE) (char *pszTempName, int cbTempName, void *pv)

Definition at line 232 of file fci.h.

◆ PFNFCIOPEN

typedef INT_PTR(__cdecl * PFNFCIOPEN) (char *pszFile, int oflag, int pmode, int *err, void *pv)

Definition at line 172 of file fci.h.

◆ PFNFCIREAD

typedef UINT(__cdecl * PFNFCIREAD) (INT_PTR hf, void *memory, UINT cb, int *err, void *pv)

Definition at line 175 of file fci.h.

◆ PFNFCISEEK

typedef LONG(__cdecl * PFNFCISEEK) (INT_PTR hf, LONG dist, int seektype, int *err, void *pv)

Definition at line 184 of file fci.h.

◆ PFNFCISTATUS

typedef LONG(__cdecl * PFNFCISTATUS) (UINT typeStatus, ULONG cb1, ULONG cb2, void *pv)

Definition at line 223 of file fci.h.

◆ PFNFCIWRITE

typedef UINT(__cdecl * PFNFCIWRITE) (INT_PTR hf, void *memory, UINT cb, int *err, void *pv)

Definition at line 178 of file fci.h.

◆ TCOMP

typedef unsigned short TCOMP

Definition at line 61 of file fci.h.

◆ UOFF

typedef ULONG UOFF

Definition at line 39 of file fci.h.

Enumeration Type Documentation

◆ FCIERROR

Enumerator
FCIERR_NONE 
FCIERR_OPEN_SRC 
FCIERR_READ_SRC 
FCIERR_ALLOC_FAIL 
FCIERR_TEMP_FILE 
FCIERR_BAD_COMPR_TYPE 
FCIERR_CAB_FILE 
FCIERR_USER_ABORT 
FCIERR_MCI_FAIL 

Definition at line 116 of file fci.h.

Function Documentation

◆ FCIAddFile()

BOOL __cdecl FCIAddFile ( HFCI  ,
char ,
char ,
BOOL  ,
PFNFCIGETNEXTCABINET  ,
PFNFCISTATUS  ,
PFNFCIGETOPENINFO  ,
TCOMP   
)

Definition at line 1397 of file fci.c.

1406 {
1407  cab_ULONG read_result;
1408  FCI_Int *p_fci_internal = get_fci_ptr( hfci );
1409 
1410  if (!p_fci_internal) return FALSE;
1411 
1412  if ((!pszSourceFile) || (!pszFileName) || (!pfnfcignc) || (!pfnfcis) ||
1413  (!pfnfcigoi) || strlen(pszFileName)>=CB_MAX_FILENAME) {
1414  set_error( p_fci_internal, FCIERR_NONE, ERROR_BAD_ARGUMENTS );
1415  return FALSE;
1416  }
1417 
1418  if (typeCompress != p_fci_internal->compression)
1419  {
1420  if (!FCIFlushFolder( hfci, pfnfcignc, pfnfcis )) return FALSE;
1421  switch (typeCompress)
1422  {
1423  case tcompTYPE_MSZIP:
1424 #ifdef HAVE_ZLIB
1425  p_fci_internal->compression = tcompTYPE_MSZIP;
1426  p_fci_internal->compress = compress_MSZIP;
1427  break;
1428 #endif
1429  default:
1430  FIXME( "compression %x not supported, defaulting to none\n", typeCompress );
1431  /* fall through */
1432  case tcompTYPE_NONE:
1433  p_fci_internal->compression = tcompTYPE_NONE;
1434  p_fci_internal->compress = compress_NONE;
1435  break;
1436  }
1437  }
1438 
1439  /* TODO check if pszSourceFile??? */
1440 
1441  if(p_fci_internal->fGetNextCabInVain && p_fci_internal->fNextCab) {
1442  /* internal error */
1443  set_error( p_fci_internal, FCIERR_NONE, ERROR_GEN_FAILURE );
1444  return FALSE;
1445  }
1446 
1447  if(p_fci_internal->fNextCab) {
1448  /* internal error */
1449  set_error( p_fci_internal, FCIERR_NONE, ERROR_GEN_FAILURE );
1450  return FALSE;
1451  }
1452 
1453  /* REUSE the variable read_result */
1454  read_result=get_header_size( p_fci_internal ) + p_fci_internal->ccab.cbReserveCFFolder;
1455 
1456  read_result+= sizeof(CFFILE) + strlen(pszFileName)+1 +
1457  p_fci_internal->files_size + p_fci_internal->folders_data_size +
1458  p_fci_internal->placed_files_size + p_fci_internal->folders_size +
1459  sizeof(CFFOLDER); /* size of new CFFolder entry */
1460 
1461  /* Might be too much data for the maximum size of a cabinet.*/
1462  /* When any further data will be added later, it might not */
1463  /* be possible to flush the cabinet, because there might */
1464  /* not be enough space to store the name of the following */
1465  /* cabinet and name of the corresponding disk. */
1466  /* So take care of this and get the name of the next cabinet */
1467  if( p_fci_internal->fGetNextCabInVain==FALSE &&
1468  p_fci_internal->fNextCab==FALSE &&
1469  ( p_fci_internal->ccab.cb < read_result +
1471  )
1472  ) {
1473  /* increment cabinet index */
1474  ++(p_fci_internal->pccab->iCab);
1475  /* get name of next cabinet */
1476  p_fci_internal->estimatedCabinetSize=p_fci_internal->statusFolderTotal;
1477  if (!(*pfnfcignc)(p_fci_internal->pccab,
1478  p_fci_internal->estimatedCabinetSize, /* estimated size of cab */
1479  p_fci_internal->pv)) {
1480  /* error handling */
1481  set_error( p_fci_internal, FCIERR_NONE, ERROR_FUNCTION_FAILED );
1482  return FALSE;
1483  }
1484  /* Skip a few lines of code. This is caught by the next if. */
1485  p_fci_internal->fGetNextCabInVain=TRUE;
1486  }
1487 
1488  if( p_fci_internal->fGetNextCabInVain &&
1489  p_fci_internal->fNextCab
1490  ) {
1491  /* THIS CAN NEVER HAPPEN */
1492  /* set error code */
1493  set_error( p_fci_internal, FCIERR_NONE, ERROR_GEN_FAILURE );
1494  return FALSE;
1495  }
1496 
1497  /* too much data for cabinet */
1498  if( p_fci_internal->fGetNextCabInVain &&
1499  (
1500  p_fci_internal->ccab.cb < read_result +
1501  strlen(p_fci_internal->pccab->szCab)+1+
1502  strlen(p_fci_internal->pccab->szDisk)+1
1503  )) {
1504  p_fci_internal->fGetNextCabInVain=FALSE;
1505  p_fci_internal->fNextCab=TRUE;
1506  if(!fci_flush_cabinet( p_fci_internal, FALSE, pfnfcignc, pfnfcis)) return FALSE;
1507  }
1508 
1509  if( p_fci_internal->fNextCab ) {
1510  /* THIS MAY NEVER HAPPEN */
1511  /* set error code */
1512  set_error( p_fci_internal, FCIERR_NONE, ERROR_GEN_FAILURE );
1513  return FALSE;
1514  }
1515 
1516  if (!add_file_data( p_fci_internal, pszSourceFile, pszFileName, fExecute, pfnfcigoi, pfnfcis ))
1517  return FALSE;
1518 
1519  /* REUSE the variable read_result */
1520  read_result = get_header_size( p_fci_internal ) + p_fci_internal->ccab.cbReserveCFFolder;
1521  read_result+= p_fci_internal->pending_data_size +
1522  p_fci_internal->files_size + p_fci_internal->folders_data_size +
1523  p_fci_internal->placed_files_size + p_fci_internal->folders_size +
1524  sizeof(CFFOLDER); /* set size of new CFFolder entry */
1525 
1526  /* too much data for the maximum size of a cabinet */
1527  /* (ignoring the unflushed data block) */
1528  if( p_fci_internal->fGetNextCabInVain==FALSE &&
1529  p_fci_internal->fNextCab==FALSE && /* this is always the case */
1530  p_fci_internal->ccab.cb < read_result ) {
1531  return fci_flush_cabinet( p_fci_internal, FALSE, pfnfcignc, pfnfcis);
1532  }
1533 
1534  /* Might be too much data for the maximum size of a cabinet.*/
1535  /* When any further data will be added later, it might not */
1536  /* be possible to flush the cabinet, because there might */
1537  /* not be enough space to store the name of the following */
1538  /* cabinet and name of the corresponding disk. */
1539  /* So take care of this and get the name of the next cabinet */
1540  /* (ignoring the unflushed data block) */
1541  if( p_fci_internal->fGetNextCabInVain==FALSE &&
1542  p_fci_internal->fNextCab==FALSE &&
1543  ( p_fci_internal->ccab.cb < read_result +
1545  )
1546  ) {
1547  /* increment cabinet index */
1548  ++(p_fci_internal->pccab->iCab);
1549  /* get name of next cabinet */
1550  p_fci_internal->estimatedCabinetSize=p_fci_internal->statusFolderTotal;
1551  if (!(*pfnfcignc)(p_fci_internal->pccab,
1552  p_fci_internal->estimatedCabinetSize,/* estimated size of cab */
1553  p_fci_internal->pv)) {
1554  /* error handling */
1555  set_error( p_fci_internal, FCIERR_NONE, ERROR_FUNCTION_FAILED );
1556  return FALSE;
1557  }
1558  /* Skip a few lines of code. This is caught by the next if. */
1559  p_fci_internal->fGetNextCabInVain=TRUE;
1560  }
1561 
1562  if( p_fci_internal->fGetNextCabInVain &&
1563  p_fci_internal->fNextCab
1564  ) {
1565  /* THIS CAN NEVER HAPPEN */
1566  set_error( p_fci_internal, FCIERR_NONE, ERROR_GEN_FAILURE );
1567  return FALSE;
1568  }
1569 
1570  /* too much data for cabinet */
1571  if( (p_fci_internal->fGetNextCabInVain ||
1572  p_fci_internal->fNextCab) && (
1573  p_fci_internal->ccab.cb < read_result +
1574  strlen(p_fci_internal->pccab->szCab)+1+
1575  strlen(p_fci_internal->pccab->szDisk)+1
1576  )) {
1577 
1578  p_fci_internal->fGetNextCabInVain=FALSE;
1579  p_fci_internal->fNextCab=TRUE;
1580  return fci_flush_cabinet( p_fci_internal, FALSE, pfnfcignc, pfnfcis);
1581  }
1582 
1583  if( p_fci_internal->fNextCab ) {
1584  /* THIS MAY NEVER HAPPEN */
1585  /* set error code */
1586  set_error( p_fci_internal, FCIERR_NONE, ERROR_GEN_FAILURE );
1587  return FALSE;
1588  }
1589 
1590  /* if the FolderThreshold has been reached flush the folder automatically */
1591  if (p_fci_internal->cCompressedBytesInFolder >= p_fci_internal->ccab.cbFolderThresh)
1592  return FCIFlushFolder(hfci, pfnfcignc, pfnfcis);
1593 
1594  return TRUE;
1595 } /* end of FCIAddFile */
ULONG cbFolderThresh
Definition: fci.h:146
#define TRUE
Definition: types.h:120
cab_ULONG pending_data_size
Definition: fci.c:188
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269
static void set_error(FCI_Int *fci, int oper, int err)
Definition: fci.c:196
static BOOL fci_flush_cabinet(FCI_Int *p_fci_internal, BOOL fGetNextCab, PFNFCIGETNEXTCABINET pfnfcignc, PFNFCISTATUS pfnfcis)
Definition: fci.c:1231
cab_ULONG placed_files_size
Definition: fci.c:187
#define ERROR_BAD_ARGUMENTS
Definition: winerror.h:232
CCAB ccab
Definition: fci.c:159
BOOL __cdecl FCIFlushFolder(HFCI hfci, PFNFCIGETNEXTCABINET pfnfcignc, PFNFCISTATUS pfnfcis)
Definition: fci.c:1631
#define CB_MAX_FILENAME
Definition: fci.h:54
cab_ULONG files_size
Definition: fci.c:186
struct _CFFILE CFFILE
int iCab
Definition: fci.h:151
Definition: fci.c:145
#define tcompTYPE_MSZIP
Definition: fci.h:65
BOOL fNextCab
Definition: fci.c:162
struct _CFFOLDER CFFOLDER
#define ERROR_FUNCTION_FAILED
Definition: winerror.h:985
UINT32 cab_ULONG
Definition: mszip.h:27
cab_ULONG folders_data_size
Definition: fci.c:189
char szDisk[CB_MAX_DISK_NAME]
Definition: fci.h:159
#define FIXME(fmt,...)
Definition: debug.h:110
char szCab[CB_MAX_CABINET_NAME]
Definition: fci.h:160
WORD WORD PSZ PSZ pszFileName
Definition: vdmdbg.h:41
ULONG cb
Definition: fci.h:145
TCOMP compression
Definition: fci.c:190
BOOL fGetNextCabInVain
Definition: fci.c:166
static BOOL add_file_data(FCI_Int *fci, char *sourcefile, char *filename, BOOL execute, PFNFCIGETOPENINFO get_open_info, PFNFCISTATUS status_callback)
Definition: fci.c:353
#define tcompTYPE_NONE
Definition: fci.h:64
cab_ULONG statusFolderTotal
Definition: fci.c:165
cab_ULONG folders_size
Definition: fci.c:185
static cab_UWORD compress_NONE(FCI_Int *fci)
Definition: fci.c:906
#define CB_MAX_DISK_NAME
Definition: fci.h:57
#define CB_MAX_CABINET_NAME
Definition: fci.h:55
cab_ULONG estimatedCabinetSize
Definition: fci.c:181
ULONG cCompressedBytesInFolder
Definition: fci.c:173
cab_UWORD(* compress)(struct FCI_Int *)
Definition: fci.c:191
UINT cbReserveCFFolder
Definition: fci.h:149
static FCI_Int * get_fci_ptr(HFCI hfci)
Definition: fci.c:204
#define ERROR_GEN_FAILURE
Definition: winerror.h:134
void * pv
Definition: fci.c:167
PCCAB pccab
Definition: fci.c:160
static cab_ULONG get_header_size(FCI_Int *fci)
Definition: fci.c:217

Referenced by add_file().

◆ FCICreate()

HFCI __cdecl FCICreate ( PERF  ,
PFNFCIFILEPLACED  ,
PFNFCIALLOC  ,
PFNFCIFREE  ,
PFNFCIOPEN  ,
PFNFCIREAD  ,
PFNFCIWRITE  ,
PFNFCICLOSE  ,
PFNFCISEEK  ,
PFNFCIDELETE  ,
PFNFCIGETTEMPFILE  ,
PCCAB  ,
void  
)

Definition at line 998 of file fci.c.

1012 {
1013  FCI_Int *p_fci_internal;
1014 
1015  if (!perf) {
1017  return NULL;
1018  }
1019  if ((!pfnalloc) || (!pfnfree) || (!pfnopen) || (!pfnread) ||
1020  (!pfnwrite) || (!pfnclose) || (!pfnseek) || (!pfndelete) ||
1021  (!pfnfcigtf) || (!pccab)) {
1022  perf->erfOper = FCIERR_NONE;
1023  perf->erfType = ERROR_BAD_ARGUMENTS;
1024  perf->fError = TRUE;
1025 
1027  return NULL;
1028  }
1029 
1030  if (!((p_fci_internal = pfnalloc(sizeof(FCI_Int))))) {
1031  perf->erfOper = FCIERR_ALLOC_FAIL;
1032  perf->erfType = ERROR_NOT_ENOUGH_MEMORY;
1033  perf->fError = TRUE;
1034 
1036  return NULL;
1037  }
1038 
1039  memset(p_fci_internal, 0, sizeof(FCI_Int));
1040  p_fci_internal->magic = FCI_INT_MAGIC;
1041  p_fci_internal->perf = perf;
1042  p_fci_internal->fileplaced = pfnfiledest;
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;
1056  p_fci_internal->compress = compress_NONE;
1057 
1058  list_init( &p_fci_internal->folders_list );
1059  list_init( &p_fci_internal->files_list );
1060  list_init( &p_fci_internal->blocks_list );
1061 
1062  memcpy(p_fci_internal->szPrevCab, pccab->szCab, CB_MAX_CABINET_NAME);
1063  memcpy(p_fci_internal->szPrevDisk, pccab->szDisk, CB_MAX_DISK_NAME);
1064 
1065  return (HFCI)p_fci_internal;
1066 }
PFNFCISEEK seek
Definition: fci.c:156
#define TRUE
Definition: types.h:120
PFNFCIDELETE delete
Definition: fci.c:157
PFNFCIALLOC alloc
Definition: fci.c:150
unsigned int magic
Definition: fci.c:147
#define ERROR_BAD_ARGUMENTS
Definition: winerror.h:232
CCAB ccab
Definition: fci.c:159
#define ERROR_NOT_ENOUGH_MEMORY
Definition: dderror.h:7
PFNFCIFREE free
Definition: fci.c:151
char szPrevDisk[CB_MAX_DISK_NAME]
Definition: fci.c:169
Definition: fci.c:145
smooth NULL
Definition: ftsmooth.c:416
struct list folders_list
Definition: fci.c:182
PFNFCIFILEPLACED fileplaced
Definition: fci.c:149
#define SetLastError(x)
Definition: compat.h:409
#define FCI_INT_MAGIC
Definition: fci.c:194
static cab_UWORD compress_NONE(FCI_Int *fci)
Definition: fci.c:906
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
#define CB_MAX_DISK_NAME
Definition: fci.h:57
PFNFCIGETTEMPFILE gettemp
Definition: fci.c:158
#define CB_MAX_CABINET_NAME
Definition: fci.h:55
PFNFCIREAD read
Definition: fci.c:153
struct temp_file data
Definition: fci.c:179
char szPrevCab[CB_MAX_CABINET_NAME]
Definition: fci.c:168
cab_UWORD(* compress)(struct FCI_Int *)
Definition: fci.c:191
PFNFCIWRITE write
Definition: fci.c:154
__WINE_SERVER_LIST_INLINE void list_init(struct list *list)
Definition: list.h:149
PFNFCIOPEN open
Definition: fci.c:152
PFNFCICLOSE close
Definition: fci.c:155
struct list blocks_list
Definition: fci.c:184
struct list files_list
Definition: fci.c:183
void * pv
Definition: fci.c:167
#define memset(x, y, z)
Definition: compat.h:39
PCCAB pccab
Definition: fci.c:160
PERF perf
Definition: fci.c:148

Referenced by create_cab_file(), create_cc_test_files(), and test_FDICopy().

◆ FCIDestroy()

BOOL __cdecl FCIDestroy ( HFCI  hfci)

Definition at line 1709 of file fci.c.

1710 {
1711  struct folder *folder, *folder_next;
1712  struct file *file, *file_next;
1713  struct data_block *block, *block_next;
1714  FCI_Int *p_fci_internal = get_fci_ptr( hfci );
1715 
1716  if (!p_fci_internal) return FALSE;
1717 
1718  /* before hfci can be removed all temporary files must be closed */
1719  /* and deleted */
1720  p_fci_internal->magic = 0;
1721 
1722  LIST_FOR_EACH_ENTRY_SAFE( folder, folder_next, &p_fci_internal->folders_list, struct folder, entry )
1723  {
1724  free_folder( p_fci_internal, folder );
1725  }
1726  LIST_FOR_EACH_ENTRY_SAFE( file, file_next, &p_fci_internal->files_list, struct file, entry )
1727  {
1728  free_file( p_fci_internal, file );
1729  }
1730  LIST_FOR_EACH_ENTRY_SAFE( block, block_next, &p_fci_internal->blocks_list, struct data_block, entry )
1731  {
1732  free_data_block( p_fci_internal, block );
1733  }
1734 
1735  close_temp_file( p_fci_internal, &p_fci_internal->data );
1736 
1737  /* hfci can now be removed */
1738  p_fci_internal->free(hfci);
1739  return TRUE;
1740 }
static unsigned int block
Definition: xmlmemory.c:118
#define TRUE
Definition: types.h:120
Definition: fci.c:115
unsigned int magic
Definition: fci.c:147
PFNFCIFREE free
Definition: fci.c:151
Definition: fci.c:145
struct CFFOLDER folder
Definition: fdi.c:110
struct list folders_list
Definition: fci.c:182
static void free_folder(FCI_Int *fci, struct folder *folder)
Definition: fci.c:417
const char file[]
Definition: icontest.c:11
static void free_data_block(FCI_Int *fci, struct data_block *block)
Definition: fci.c:390
uint32_t entry
Definition: isohybrid.c:63
#define LIST_FOR_EACH_ENTRY_SAFE(cursor, cursor2, list, type, field)
Definition: list.h:204
static void free_file(FCI_Int *fci, struct file *file)
Definition: fci.c:306
struct temp_file data
Definition: fci.c:179
static FCI_Int * get_fci_ptr(HFCI hfci)
Definition: fci.c:204
struct list blocks_list
Definition: fci.c:184
struct list files_list
Definition: fci.c:183
static BOOL close_temp_file(FCI_Int *fci, struct temp_file *file)
Definition: fci.c:251
Definition: fci.c:126

Referenced by create_cab_file(), create_cc_test_files(), and test_FDICopy().

◆ FCIFlushCabinet()

BOOL __cdecl FCIFlushCabinet ( HFCI  ,
BOOL  ,
PFNFCIGETNEXTCABINET  ,
PFNFCISTATUS   
)

Definition at line 1675 of file fci.c.

1680 {
1681  FCI_Int *p_fci_internal = get_fci_ptr( hfci );
1682 
1683  if (!p_fci_internal) return FALSE;
1684 
1685  if(!fci_flush_cabinet(p_fci_internal,fGetNextCab,pfnfcignc,pfnfcis)) return FALSE;
1686 
1687  while( p_fci_internal->files_size>0 ||
1688  p_fci_internal->placed_files_size>0 ) {
1689  if(!fci_flush_cabinet(p_fci_internal,fGetNextCab,pfnfcignc,pfnfcis)) return FALSE;
1690  }
1691 
1692  return TRUE;
1693 }
#define TRUE
Definition: types.h:120
static BOOL fci_flush_cabinet(FCI_Int *p_fci_internal, BOOL fGetNextCab, PFNFCIGETNEXTCABINET pfnfcignc, PFNFCISTATUS pfnfcis)
Definition: fci.c:1231
cab_ULONG placed_files_size
Definition: fci.c:187
cab_ULONG files_size
Definition: fci.c:186
Definition: fci.c:145
static FCI_Int * get_fci_ptr(HFCI hfci)
Definition: fci.c:204

Referenced by create_cab_file(), create_cc_test_files(), and test_FDICopy().

◆ FCIFlushFolder()

BOOL __cdecl FCIFlushFolder ( HFCI  ,
PFNFCIGETNEXTCABINET  ,
PFNFCISTATUS   
)

Definition at line 1631 of file fci.c.

1635 {
1636  FCI_Int *p_fci_internal = get_fci_ptr( hfci );
1637 
1638  if (!p_fci_internal) return FALSE;
1639  return fci_flush_folder(p_fci_internal,FALSE,pfnfcignc,pfnfcis);
1640 }
Definition: fci.c:145
static BOOL fci_flush_folder(FCI_Int *p_fci_internal, BOOL fGetNextCab, PFNFCIGETNEXTCABINET pfnfcignc, PFNFCISTATUS pfnfcis)
Definition: fci.c:1071
static FCI_Int * get_fci_ptr(HFCI hfci)
Definition: fci.c:204

Referenced by FCIAddFile().