version 2.13, 2005/03/11 07:38:58
|
version 2.14, 2005/03/13 12:13:17
|
|
|
#include "winerror.h" | #include "winerror.h" |
#include "fdi.h" | #include "fdi.h" |
| |
#ifndef WIN_ENV |
|
#include <msvcrt/fcntl.h> |
|
#else |
|
#include <fcntl.h> | #include <fcntl.h> |
#endif |
|
| |
#include "tvfs.h" | #include "tvfs.h" |
#include "data.h" | #include "data.h" |
| |
#ifndef STANDALONE | #ifndef STANDALONE |
#include <wine/test.h> | #include <wine/test.h> |
#define _S_IREAD 0x0100 |
|
#define _S_IWRITE 0x0080 |
|
#define ok2 ok | #define ok2 ok |
#else | #else |
|
#include "standalone.h" |
/* To build outside Wine tree, compile with cl -DSTANDALONE -D_X86_ -DWIN_ENV tvfs.c cabinet_fdi.c FDI.lib | /* To build outside Wine tree, compile with cl -DSTANDALONE -D_X86_ -DWIN_ENV tvfs.c cabinet_fdi.c FDI.lib |
These are only called if standalone are used, defining ok and START_TEST, which would normally be declared in winetree */ |
standalone.h is used if standalone are used, defining ok and START_TEST, which would normally be declared in winetree */ |
#include <assert.h> |
|
|
|
#define START_TEST(name) main(int argc, char **argv) |
|
#define ok(condition, msg) \ |
|
do { if(!(condition)) { \ |
|
fprintf(stderr,"failed at %d, msg:" msg "\n",__LINE__); \ |
|
exit(1); \ |
|
} } while(0) |
|
#define ok2(condition, msg, arg) \ |
|
do { if(!(condition)) { \ |
|
fprintf(stderr,"failed at %d, msg:" msg "\n",__LINE__, arg); \ |
|
exit(1); \ |
|
} } while(0) |
|
#define todo_wine |
|
|
|
static void trace(const char *s, ...) |
|
{ |
|
va_list ellipsis; |
|
va_start (ellipsis, s); |
|
vprintf(s, ellipsis); |
|
va_end(ellipsis); |
|
} |
|
|
|
#endif | #endif |
| |
/* Do malloc and free output debug messages? |
|
#define DEBUG_ALLOC |
|
#define VERBOSE |
|
*/ |
|
|
|
#ifndef DEBUG_ALLOC |
|
FNALLOC(final_alloc) { |
|
return malloc(cb); |
|
} |
|
FNFREE(final_free) { |
|
free(pv); |
|
return; |
|
} |
|
#else |
|
FNALLOC(final_alloc) { | FNALLOC(final_alloc) { |
trace(" FNALLOC just called with %d\n",cb); | trace(" FNALLOC just called with %d\n",cb); |
return malloc(cb); | return malloc(cb); |
|
|
free(pv); | free(pv); |
return; | return; |
} | } |
#endif |
|
/*Possible non trivial addition: | /*Possible non trivial addition: |
Notify receives some information about the cab file(see FDI documentation). | Notify receives some information about the cab file(see FDI documentation). |
Since this info is different depending on the value of fdint, and Notify should | Since this info is different depending on the value of fdint, and Notify should |
|
|
*/ | */ |
FNFDINOTIFY(notification_function) | FNFDINOTIFY(notification_function) |
{ | { |
#ifdef VERBOSE |
|
trace(" FNFDINOTIFY real just called with %d, %d \n",fdint,pfdin); | trace(" FNFDINOTIFY real just called with %d, %d \n",fdint,pfdin); |
#endif |
|
switch (fdint) | switch (fdint) |
{ | { |
case fdintCABINET_INFO: | case fdintCABINET_INFO: |
{ | { |
#ifdef VERBOSE |
|
trace( | trace( |
"fdintCABINET_INFO:\n" | "fdintCABINET_INFO:\n" |
"-next cab name: %s\n" | "-next cab name: %s\n" |
|
|
"-path name: %s\n" | "-path name: %s\n" |
"-set ID: %d\n" | "-set ID: %d\n" |
"-number in set: %d\n", | "-number in set: %d\n", |
pfdin->psz1, |
pfdin->psz1, pfdin->psz2, pfdin->psz3, pfdin->setID, pfdin->iCabinet |
pfdin->psz2, |
|
pfdin->psz3, |
|
pfdin->setID, |
|
pfdin->iCabinet |
|
); | ); |
#endif |
|
return 0; | return 0; |
} | } |
case fdintPARTIAL_FILE: | case fdintPARTIAL_FILE: |
{ | { |
#ifdef VERBOSE |
|
trace("dintPARTIAL_FILE\n"); | trace("dintPARTIAL_FILE\n"); |
#endif |
|
| |
return 0; | return 0; |
} | } |
|
|
{ | { |
int fih = 0; | int fih = 0; |
char target[256]; | char target[256]; |
#ifdef VERBOSE |
|
trace( | trace( |
"fdintCOPY_FILE:\n" | "fdintCOPY_FILE:\n" |
"-name: %s\n" | "-name: %s\n" |
|
|
"-time: %d\n" | "-time: %d\n" |
"-attributes: %d\n" | "-attributes: %d\n" |
"-file's folder index: %d\n", | "-file's folder index: %d\n", |
pfdin->psz1, |
pfdin->psz1, pfdin->cb, pfdin->date, pfdin->time, pfdin->attribs, pfdin->iFolder |
pfdin->cb, |
|
pfdin->date, |
|
pfdin->time, |
|
pfdin->attribs, |
|
pfdin->iFolder |
|
); | ); |
#endif |
|
sprintf(target, "./%s",pfdin->psz1); | sprintf(target, "./%s",pfdin->psz1); |
fih = tvfs_open (target, | fih = tvfs_open (target, |
_O_BINARY | _O_CREAT | _O_WRONLY | _O_SEQUENTIAL, | _O_BINARY | _O_CREAT | _O_WRONLY | _O_SEQUENTIAL, |
|
|
"-attributes: %d\n" | "-attributes: %d\n" |
"-file's folder index: %d\n" | "-file's folder index: %d\n" |
"-run: %d\n", | "-run: %d\n", |
pfdin->psz1, |
pfdin->psz1, pfdin->hf, pfdin->date, pfdin->time, pfdin->attribs, pfdin->iFolder, pfdin->cb |
pfdin->hf, |
|
pfdin->date, |
|
pfdin->time, |
|
pfdin->attribs, |
|
pfdin->iFolder, |
|
pfdin->cb |
|
); | ); |
#endif | #endif |
| |
|
|
} | } |
case fdintNEXT_CABINET: | case fdintNEXT_CABINET: |
{ | { |
#ifdef VERBOSE |
|
trace("fdintNEXT_CABINET\n"); | trace("fdintNEXT_CABINET\n"); |
#endif |
|
return 0; | return 0; |
} | } |
case fdintENUMERATE: | case fdintENUMERATE: |
{ | { |
#ifdef VERBOSE |
|
trace("fdintENUMERATE\n"); | trace("fdintENUMERATE\n"); |
#endif |
|
return 0; | return 0; |
} | } |
} | } |
|
|
} | } |
| |
static void printCabInfo(FDICABINETINFO cabinfo){ | static void printCabInfo(FDICABINETINFO cabinfo){ |
#ifdef VERBOSE |
|
trace(" Cabinet Data : cbC %d cF %d cFi %d si %d iC %d fr %d hp %d hn %d\n", | trace(" Cabinet Data : cbC %d cF %d cFi %d si %d iC %d fr %d hp %d hn %d\n", |
cabinfo.cbCabinet, | cabinfo.cbCabinet, |
cabinfo.cFolders , | cabinfo.cFolders , |
|
|
cabinfo.fReserve , | cabinfo.fReserve , |
cabinfo.hasprev , | cabinfo.hasprev , |
cabinfo.hasnext ); | cabinfo.hasnext ); |
#endif |
|
} | } |
| |
static void CheckCabInfo(char * cabname, | static void CheckCabInfo(char * cabname, |
|
|
ok2 ( cabinfo.hasprev == Thasprev, "FDIIsCabinet,cabinfo %s data did not match! Failed!\n", cabname); | ok2 ( cabinfo.hasprev == Thasprev, "FDIIsCabinet,cabinfo %s data did not match! Failed!\n", cabname); |
ok2 ( cabinfo.hasnext == Thasnext, "FDIIsCabinet,cabinfo %s data did not match! Failed!\n", cabname); | ok2 ( cabinfo.hasnext == Thasnext, "FDIIsCabinet,cabinfo %s data did not match! Failed!\n", cabname); |
} | } |
|
/* TODO : Message should contain variable values */ |
|
/* TODO : Use ok - is ok in standalone different fron winetest? */ |
| |
static HFDI hfdi_unknown; | static HFDI hfdi_unknown; |
/* yes its global and ugly */ | /* yes its global and ugly */ |
|
|
CheckCabInfo("simple.cab",fdi_cabinfo_simple,121,1,1,0,0,0,0,0); | CheckCabInfo("simple.cab",fdi_cabinfo_simple,121,1,1,0,0,0,0,0); |
| |
tvfs_close(fd); | tvfs_close(fd); |
|
|
tvfs_create( name_complex_cab, file_complex_cab, size_complex_cab); |
|
fd = tvfs_open( name_complex_cab, _O_BINARY, 0 ); |
|
|
|
ok( FDIIsCabinet( hfdi_unknown, fd, &fdi_cabinfo_complex) == TRUE, |
|
"FDIIsCabinet (Virtual File = Complex.cab) failed!\n"); |
|
|
|
printCabInfo(fdi_cabinfo_complex); |
|
CheckCabInfo("complex.cab",fdi_cabinfo_complex,12918,1,2,0,0,0,0,0); |
|
|
|
tvfs_close(fd); |
|
tvfs_free(); | tvfs_free(); |
| |
trace("Ending TestInfo()\n"); | trace("Ending TestInfo()\n"); |
|
|
trace ("File %s compare failed!\n",name_file_path); | trace ("File %s compare failed!\n",name_file_path); |
tvfs_free(); | tvfs_free(); |
| |
trace("---complex.cab\n"); |
|
tvfs_create( name_complex_cab, file_complex_cab, size_complex_cab); |
|
FDICopy(hfdi_unknown, |
|
"complex.cab", |
|
"", |
|
0, |
|
notification_function, |
|
NULL, |
|
NULL); |
|
|
|
|
|
tvfs_free(); |
|
|
|
trace("Ending TestCopy()\n"); | trace("Ending TestCopy()\n"); |
} | } |
| |