cabinet: Formalize the SESSION struct and add more tests of its members.

This commit is contained in:
James Hawkins 2007-08-21 10:15:39 -07:00 committed by Alexandre Julliard
parent fef9879ce4
commit 75e9ae7ece
1 changed files with 323 additions and 71 deletions

View File

@ -21,6 +21,7 @@
#include <stdio.h> #include <stdio.h>
#include <windows.h> #include <windows.h>
#include "fci.h" #include "fci.h"
#include "fdi.h"
#include "wine/test.h" #include "wine/test.h"
/* make the max size large so there is only one cab file */ /* make the max size large so there is only one cab file */
@ -31,32 +32,31 @@
* because they are undocumented in windows. * because they are undocumented in windows.
*/ */
/* EXTRACTdest flags */ /* SESSION Operation */
#define EXTRACT_FILLFILELIST 0x00000001 #define EXTRACT_FILLFILELIST 0x00000001
#define EXTRACT_EXTRACTFILES 0x00000002 #define EXTRACT_EXTRACTFILES 0x00000002
struct ExtractFileList { struct FILELIST{
LPSTR filename; LPSTR FileName;
struct ExtractFileList *next; struct FILELIST *next;
BOOL flag; BOOL Extracted;
}; };
/* the first parameter of the function extract */
typedef struct { typedef struct {
long result1; /* 0x000 */ INT FileSize;
long unknown1[3]; /* 0x004 */ ERF Error;
struct ExtractFileList *filelist; /* 0x010 */ struct FILELIST *FileList;
long filecount; /* 0x014 */ INT FileCount;
long flags; /* 0x018 */ INT Operation;
char directory[MAX_PATH]; /* 0x01c */ CHAR Destination[MAX_PATH];
char lastfile[MAX_PATH]; /* 0x120 */ CHAR CurrentFile[MAX_PATH];
char unknown2[MAX_PATH]; /* 0x224 */ CHAR Reserved[MAX_PATH];
struct ExtractFileList *filterlist; /* 0x328 */ struct FILELIST *FilterList;
} EXTRACTDEST; } SESSION;
/* function pointers */ /* function pointers */
HMODULE hCabinet; HMODULE hCabinet;
static HRESULT (WINAPI *pExtract)(EXTRACTDEST*, LPCSTR); static HRESULT (WINAPI *pExtract)(SESSION*, LPCSTR);
CHAR CURR_DIR[MAX_PATH]; CHAR CURR_DIR[MAX_PATH];
@ -314,19 +314,20 @@ static void create_cab_file(void)
ok(res, "Failed to destroy the cabinet\n"); ok(res, "Failed to destroy the cabinet\n");
} }
static BOOL check_list(EXTRACTDEST *dest, const char *filename, BOOL flag) static BOOL check_list(struct FILELIST *filelist, const char *filename, BOOL extracted)
{ {
struct ExtractFileList *i; struct FILELIST *fl;
for (fl = filelist; fl; fl = fl->next)
if (!lstrcmp(filename, fl->FileName))
return (extracted == fl->Extracted);
for (i = dest->filelist; i; i=i->next)
if (!lstrcmp(filename, i->filename))
return (flag == i->flag);
return FALSE; return FALSE;
} }
static void test_Extract(void) static void test_Extract(void)
{ {
EXTRACTDEST extractDest; SESSION session;
HRESULT res; HRESULT res;
/* native windows crashes if /* native windows crashes if
@ -336,117 +337,368 @@ static void test_Extract(void)
*/ */
/* try to extract all files */ /* try to extract all files */
ZeroMemory(&extractDest, sizeof(EXTRACTDEST)); ZeroMemory(&session, sizeof(SESSION));
lstrcpyA(extractDest.directory, "dest"); lstrcpyA(session.Destination, "dest");
extractDest.flags = EXTRACT_FILLFILELIST | EXTRACT_EXTRACTFILES; session.Operation = EXTRACT_FILLFILELIST | EXTRACT_EXTRACTFILES;
res = pExtract(&extractDest, "extract.cab"); res = pExtract(&session, "extract.cab");
ok(res == S_OK, "Expected S_OK, got %d\n", res); ok(res == S_OK, "Expected S_OK, got %d\n", res);
todo_wine
{
ok(session.FileSize == 40, "Expected 40, got %d\n", session.FileSize);
}
ok(session.Error.erfOper == FDIERROR_NONE,
"Expected FDIERROR_NONE, got %d\n", session.Error.erfOper);
ok(session.Error.erfType == 0, "Expected 0, got %d\n", session.Error.erfType);
ok(session.Error.fError == FALSE, "Expected FALSE, got %d\n", session.Error.fError);
ok(session.FileCount == 4, "Expected 4, got %d\n", session.FileCount);
ok(session.Operation == (EXTRACT_FILLFILELIST | EXTRACT_EXTRACTFILES),
"Expected EXTRACT_FILLFILELIST | EXTRACT_EXTRACTFILES, got %d\n", session.Operation);
ok(!lstrcmpA(session.Destination, "dest"), "Expected dest, got %s\n", session.Destination);
ok(!lstrcmpA(session.CurrentFile, "dest\\testdir\\d.txt"),
"Expected dest\\testdir\\d.txt, got %s\n", session.CurrentFile);
ok(!*session.Reserved, "Expected empty string, got %s\n", session.Reserved);
ok(!session.FilterList, "Expected empty filter list\n");
ok(DeleteFileA("dest\\a.txt"), "Expected dest\\a.txt to exist\n"); ok(DeleteFileA("dest\\a.txt"), "Expected dest\\a.txt to exist\n");
ok(DeleteFileA("dest\\b.txt"), "Expected dest\\b.txt to exist\n"); ok(DeleteFileA("dest\\b.txt"), "Expected dest\\b.txt to exist\n");
ok(DeleteFileA("dest\\testdir\\c.txt"), "Expected dest\\testdir\\c.txt to exist\n"); ok(DeleteFileA("dest\\testdir\\c.txt"), "Expected dest\\testdir\\c.txt to exist\n");
ok(DeleteFileA("dest\\testdir\\d.txt"), "Expected dest\\testdir\\d.txt to exist\n"); ok(DeleteFileA("dest\\testdir\\d.txt"), "Expected dest\\testdir\\d.txt to exist\n");
ok(RemoveDirectoryA("dest\\testdir"), "Expected dest\\testdir to exist\n"); ok(RemoveDirectoryA("dest\\testdir"), "Expected dest\\testdir to exist\n");
ok(check_list(session.FileList, "testdir\\d.txt", FALSE), "list entry wrong\n");
ok(check_list(session.FileList, "testdir\\c.txt", FALSE), "list entry wrong\n");
ok(check_list(session.FileList, "b.txt", FALSE), "list entry wrong\n");
ok(check_list(session.FileList, "a.txt", FALSE), "list entry wrong\n");
/* try fill file list operation */ /* try fill file list operation */
ZeroMemory(&extractDest, sizeof(EXTRACTDEST)); ZeroMemory(&session, sizeof(SESSION));
lstrcpyA(extractDest.directory, "dest"); lstrcpyA(session.Destination, "dest");
extractDest.flags = EXTRACT_FILLFILELIST; session.Operation = EXTRACT_FILLFILELIST;
res = pExtract(&extractDest, "extract.cab"); res = pExtract(&session, "extract.cab");
ok(res == S_OK, "Expected S_OK, got %d\n", res); ok(res == S_OK, "Expected S_OK, got %d\n", res);
todo_wine
{
ok(session.FileSize == 40, "Expected 40, got %d\n", session.FileSize);
}
ok(session.Error.erfOper == FDIERROR_NONE,
"Expected FDIERROR_NONE, got %d\n", session.Error.erfOper);
ok(session.Error.erfType == 0, "Expected 0, got %d\n", session.Error.erfType);
ok(session.Error.fError == FALSE, "Expected FALSE, got %d\n", session.Error.fError);
ok(session.FileCount == 4, "Expected 4, got %d\n", session.FileCount);
ok(session.Operation == EXTRACT_FILLFILELIST,
"Expected EXTRACT_FILLFILELIST, got %d\n", session.Operation);
ok(!lstrcmpA(session.Destination, "dest"), "Expected dest, got %s\n", session.Destination);
ok(!lstrcmpA(session.CurrentFile, "dest\\testdir\\d.txt"),
"Expected dest\\testdir\\d.txt, got %s\n", session.CurrentFile);
ok(!*session.Reserved, "Expected empty string, got %s\n", session.Reserved);
ok(!session.FilterList, "Expected empty filter list\n");
ok(!DeleteFileA("dest\\a.txt"), "Expected dest\\a.txt to not exist\n"); ok(!DeleteFileA("dest\\a.txt"), "Expected dest\\a.txt to not exist\n");
ok(!DeleteFileA("dest\\testdir\\c.txt"), "Expected dest\\testdir\\c.txt to not exist\n"); ok(!DeleteFileA("dest\\testdir\\c.txt"), "Expected dest\\testdir\\c.txt to not exist\n");
ok(extractDest.filecount == 4, "Expected 4 files, got %ld\n", extractDest.filecount); todo_wine
ok(!lstrcmpA(extractDest.lastfile, "dest\\testdir\\d.txt"), {
"Expected last file to be dest\\testdir\\d.txt, got %s\n", extractDest.lastfile); ok(check_list(session.FileList, "testdir\\d.txt", TRUE), "list entry wrong\n");
ok(check_list(session.FileList, "testdir\\c.txt", TRUE), "list entry wrong\n");
ok(check_list(session.FileList, "b.txt", TRUE), "list entry wrong\n");
ok(check_list(session.FileList, "a.txt", TRUE), "list entry wrong\n");
}
/* try extract files operation once file list is filled */ /* try extract files operation once file list is filled */
extractDest.flags = EXTRACT_EXTRACTFILES; session.Operation = EXTRACT_EXTRACTFILES;
res = pExtract(&extractDest, "extract.cab"); res = pExtract(&session, "extract.cab");
ok(res == S_OK, "Expected S_OK, got %d\n", res); ok(res == S_OK, "Expected S_OK, got %d\n", res);
todo_wine
{
ok(session.FileSize == 40, "Expected 40, got %d\n", session.FileSize);
}
ok(session.Error.erfOper == FDIERROR_NONE,
"Expected FDIERROR_NONE, got %d\n", session.Error.erfOper);
ok(session.Error.erfType == 0, "Expected 0, got %d\n", session.Error.erfType);
ok(session.Error.fError == FALSE, "Expected FALSE, got %d\n", session.Error.fError);
ok(session.FileCount == 4, "Expected 4, got %d\n", session.FileCount);
ok(session.Operation == EXTRACT_EXTRACTFILES,
"Expected EXTRACT_EXTRACTFILES, got %d\n", session.Operation);
ok(!lstrcmpA(session.Destination, "dest"), "Expected dest, got %s\n", session.Destination);
ok(!lstrcmpA(session.CurrentFile, "dest\\testdir\\d.txt"),
"Expected dest\\testdir\\d.txt, got %s\n", session.CurrentFile);
ok(!*session.Reserved, "Expected empty string, got %s\n", session.Reserved);
ok(!session.FilterList, "Expected empty filter list\n");
ok(DeleteFileA("dest\\a.txt"), "Expected dest\\a.txt to exist\n"); ok(DeleteFileA("dest\\a.txt"), "Expected dest\\a.txt to exist\n");
ok(DeleteFileA("dest\\b.txt"), "Expected dest\\b.txt to exist\n"); ok(DeleteFileA("dest\\b.txt"), "Expected dest\\b.txt to exist\n");
ok(DeleteFileA("dest\\testdir\\c.txt"), "Expected dest\\testdir\\c.txt to exist\n"); ok(DeleteFileA("dest\\testdir\\c.txt"), "Expected dest\\testdir\\c.txt to exist\n");
ok(DeleteFileA("dest\\testdir\\d.txt"), "Expected dest\\testdir\\d.txt to exist\n"); ok(DeleteFileA("dest\\testdir\\d.txt"), "Expected dest\\testdir\\d.txt to exist\n");
ok(RemoveDirectoryA("dest\\testdir"), "Expected dest\\testdir to exist\n"); ok(RemoveDirectoryA("dest\\testdir"), "Expected dest\\testdir to exist\n");
ok(RemoveDirectoryA("dest"), "Expected dest to exist\n"); ok(RemoveDirectoryA("dest"), "Expected dest to exist\n");
ok(check_list(session.FileList, "testdir\\d.txt", FALSE), "list entry wrong\n");
ok(check_list(session.FileList, "testdir\\c.txt", FALSE), "list entry wrong\n");
ok(check_list(session.FileList, "b.txt", FALSE), "list entry wrong\n");
ok(check_list(session.FileList, "a.txt", FALSE), "list entry wrong\n");
/* Extract does not extract files if the dest dir does not exist */ /* Extract does not extract files if the dest dir does not exist */
res = pExtract(&extractDest, "extract.cab"); res = pExtract(&session, "extract.cab");
ok(res == S_OK, "Expected S_OK, got %d\n", res); ok(res == S_OK, "Expected S_OK, got %d\n", res);
todo_wine
{
ok(session.FileSize == 40, "Expected 40, got %d\n", session.FileSize);
}
ok(session.Error.erfOper == FDIERROR_NONE,
"Expected FDIERROR_NONE, got %d\n", session.Error.erfOper);
ok(session.Error.erfType == 0, "Expected 0, got %d\n", session.Error.erfType);
ok(session.Error.fError == FALSE, "Expected FALSE, got %d\n", session.Error.fError);
ok(session.FileCount == 4, "Expected 4, got %d\n", session.FileCount);
ok(session.Operation == EXTRACT_EXTRACTFILES,
"Expected EXTRACT_EXTRACTFILES, got %d\n", session.Operation);
ok(!lstrcmpA(session.Destination, "dest"), "Expected dest, got %s\n", session.Destination);
ok(!lstrcmpA(session.CurrentFile, "dest\\testdir\\d.txt"),
"Expected dest\\testdir\\d.txt, got %s\n", session.CurrentFile);
ok(!*session.Reserved, "Expected empty string, got %s\n", session.Reserved);
ok(!session.FilterList, "Expected empty filter list\n");
ok(!DeleteFileA("dest\\a.txt"), "Expected dest\\a.txt to not exist\n"); ok(!DeleteFileA("dest\\a.txt"), "Expected dest\\a.txt to not exist\n");
ok(!DeleteFileA("dest\\testdir\\c.txt"), "Expected dest\\testdir\\c.txt to not exist\n"); ok(!DeleteFileA("dest\\testdir\\c.txt"), "Expected dest\\testdir\\c.txt to not exist\n");
ok(check_list(session.FileList, "testdir\\d.txt", FALSE), "list entry wrong\n");
ok(check_list(&extractDest, "testdir\\d.txt", FALSE), "list entry wrong\n"); ok(check_list(session.FileList, "testdir\\c.txt", FALSE), "list entry wrong\n");
ok(check_list(&extractDest, "testdir\\c.txt", FALSE), "list entry wrong\n"); ok(check_list(session.FileList, "b.txt", FALSE), "list entry wrong\n");
ok(check_list(&extractDest, "b.txt", FALSE), "list entry wrong\n"); ok(check_list(session.FileList, "a.txt", FALSE), "list entry wrong\n");
ok(check_list(&extractDest, "a.txt", FALSE), "list entry wrong\n");
/* remove two of the files in the list */ /* remove two of the files in the list */
extractDest.filelist->next = extractDest.filelist->next->next; session.FileList->next = session.FileList->next->next;
extractDest.filelist->next->next = NULL; session.FileList->next->next = NULL;
extractDest.filterlist = NULL; session.FilterList = NULL;
CreateDirectoryA("dest", NULL); CreateDirectoryA("dest", NULL);
res = pExtract(&extractDest, "extract.cab"); res = pExtract(&session, "extract.cab");
ok(res == S_OK, "Expected S_OK, got %d\n", res); ok(res == S_OK, "Expected S_OK, got %d\n", res);
todo_wine
{
ok(session.FileSize == 40, "Expected 40, got %d\n", session.FileSize);
}
ok(session.Error.erfOper == FDIERROR_NONE,
"Expected FDIERROR_NONE, got %d\n", session.Error.erfOper);
ok(session.Error.erfType == 0, "Expected 0, got %d\n", session.Error.erfType);
ok(session.Error.fError == FALSE, "Expected FALSE, got %d\n", session.Error.fError);
ok(session.FileCount == 4, "Expected 4, got %d\n", session.FileCount);
ok(session.Operation == EXTRACT_EXTRACTFILES,
"Expected EXTRACT_EXTRACTFILES, got %d\n", session.Operation);
ok(!lstrcmpA(session.Destination, "dest"), "Expected dest, got %s\n", session.Destination);
ok(!lstrcmpA(session.CurrentFile, "dest\\testdir\\d.txt"),
"Expected dest\\testdir\\d.txt, got %s\n", session.CurrentFile);
ok(!*session.Reserved, "Expected empty string, got %s\n", session.Reserved);
ok(!session.FilterList, "Expected empty filter list\n");
ok(DeleteFileA("dest\\a.txt"), "Expected dest\\a.txt to exist\n"); ok(DeleteFileA("dest\\a.txt"), "Expected dest\\a.txt to exist\n");
ok(DeleteFileA("dest\\testdir\\c.txt"), "Expected dest\\testdir\\c.txt to exist\n"); ok(DeleteFileA("dest\\testdir\\c.txt"), "Expected dest\\testdir\\c.txt to exist\n");
ok(!DeleteFileA("dest\\b.txt"), "Expected dest\\b.txt to not exist\n"); ok(!DeleteFileA("dest\\b.txt"), "Expected dest\\b.txt to not exist\n");
ok(!DeleteFileA("dest\\testdir\\d.txt"), "Expected dest\\testdir\\d.txt to not exist\n"); ok(!DeleteFileA("dest\\testdir\\d.txt"), "Expected dest\\testdir\\d.txt to not exist\n");
todo_wine { todo_wine {
ok(check_list(&extractDest, "testdir\\d.txt", FALSE), "list entry wrong\n"); ok(check_list(session.FileList, "testdir\\d.txt", FALSE), "list entry wrong\n");
ok(!check_list(&extractDest, "testdir\\c.txt", FALSE), "list entry wrong\n"); ok(!check_list(session.FileList, "testdir\\c.txt", FALSE), "list entry wrong\n");
ok(check_list(&extractDest, "b.txt", FALSE), "list entry wrong\n"); ok(check_list(session.FileList, "b.txt", FALSE), "list entry wrong\n");
ok(!check_list(&extractDest, "a.txt", FALSE), "list entry wrong\n"); ok(!check_list(session.FileList, "a.txt", FALSE), "list entry wrong\n");
} }
extractDest.flags = 1; session.Operation = EXTRACT_FILLFILELIST;
extractDest.filelist = NULL; session.FileList = NULL;
res = pExtract(&extractDest, "extract.cab"); res = pExtract(&session, "extract.cab");
ok(res == S_OK, "Expected S_OK, got %d\n", res); ok(res == S_OK, "Expected S_OK, got %d\n", res);
todo_wine
{
ok(session.FileSize == 40, "Expected 40, got %d\n", session.FileSize);
}
ok(session.Error.erfOper == FDIERROR_NONE,
"Expected FDIERROR_NONE, got %d\n", session.Error.erfOper);
ok(session.Error.erfType == 0, "Expected 0, got %d\n", session.Error.erfType);
ok(session.Error.fError == FALSE, "Expected FALSE, got %d\n", session.Error.fError);
ok(session.FileCount == 8, "Expected 8, got %d\n", session.FileCount);
ok(session.Operation == EXTRACT_FILLFILELIST,
"Expected EXTRACT_FILLFILELIST, got %d\n", session.Operation);
ok(!lstrcmpA(session.Destination, "dest"), "Expected dest, got %s\n", session.Destination);
ok(!lstrcmpA(session.CurrentFile, "dest\\testdir\\d.txt"),
"Expected dest\\testdir\\d.txt, got %s\n", session.CurrentFile);
ok(!*session.Reserved, "Expected empty string, got %s\n", session.Reserved);
ok(!session.FilterList, "Expected empty filter list\n");
ok(!DeleteFileA("dest\\a.txt"), "Expected dest\\a.txt to not exist\n"); ok(!DeleteFileA("dest\\a.txt"), "Expected dest\\a.txt to not exist\n");
ok(!DeleteFileA("dest\\testdir\\c.txt"), "Expected dest\\testdir\\c.txt to not exist\n"); ok(!DeleteFileA("dest\\testdir\\c.txt"), "Expected dest\\testdir\\c.txt to not exist\n");
ok(!DeleteFileA("dest\\b.txt"), "Expected dest\\b.txt to not exist\n"); ok(!DeleteFileA("dest\\b.txt"), "Expected dest\\b.txt to not exist\n");
ok(!DeleteFileA("dest\\testdir\\d.txt"), "Expected dest\\testdir\\d.txt to not exist\n"); ok(!DeleteFileA("dest\\testdir\\d.txt"), "Expected dest\\testdir\\d.txt to not exist\n");
todo_wine { todo_wine {
ok(check_list(&extractDest, "testdir\\d.txt", TRUE), "list entry wrong\n"); ok(check_list(session.FileList, "testdir\\d.txt", TRUE), "list entry wrong\n");
ok(check_list(&extractDest, "testdir\\c.txt", TRUE), "list entry wrong\n"); ok(check_list(session.FileList, "testdir\\c.txt", TRUE), "list entry wrong\n");
ok(check_list(&extractDest, "b.txt", TRUE), "list entry wrong\n"); ok(check_list(session.FileList, "b.txt", TRUE), "list entry wrong\n");
ok(check_list(&extractDest, "a.txt", TRUE), "list entry wrong\n"); ok(check_list(session.FileList, "a.txt", TRUE), "list entry wrong\n");
} }
extractDest.flags = 0; session.Operation = 0;
res = pExtract(&extractDest, "extract.cab"); res = pExtract(&session, "extract.cab");
ok(res == S_OK, "Expected S_OK, got %d\n", res); ok(res == S_OK, "Expected S_OK, got %d\n", res);
todo_wine
{
ok(session.FileSize == 40, "Expected 40, got %d\n", session.FileSize);
}
ok(session.Error.erfOper == FDIERROR_NONE,
"Expected FDIERROR_NONE, got %d\n", session.Error.erfOper);
ok(session.Error.erfType == 0, "Expected 0, got %d\n", session.Error.erfType);
ok(session.Error.fError == FALSE, "Expected FALSE, got %d\n", session.Error.fError);
ok(session.FileCount == 8, "Expected 8, got %d\n", session.FileCount);
ok(session.Operation == 0, "Expected 0, got %d\n", session.Operation);
ok(!lstrcmpA(session.Destination, "dest"), "Expected dest, got %s\n", session.Destination);
ok(!lstrcmpA(session.CurrentFile, "dest\\testdir\\d.txt"),
"Expected dest\\testdir\\d.txt, got %s\n", session.CurrentFile);
ok(!*session.Reserved, "Expected empty string, got %s\n", session.Reserved);
ok(!session.FilterList, "Expected empty filter list\n");
ok(!DeleteFileA("dest\\a.txt"), "Expected dest\\a.txt to exist\n"); ok(!DeleteFileA("dest\\a.txt"), "Expected dest\\a.txt to exist\n");
ok(!DeleteFileA("dest\\testdir\\c.txt"), "Expected dest\\testdir\\c.txt to exist\n"); ok(!DeleteFileA("dest\\testdir\\c.txt"), "Expected dest\\testdir\\c.txt to exist\n");
ok(!DeleteFileA("dest\\b.txt"), "Expected dest\\b.txt to exist\n"); ok(!DeleteFileA("dest\\b.txt"), "Expected dest\\b.txt to exist\n");
ok(!DeleteFileA("dest\\testdir\\d.txt"), "Expected dest\\testdir\\d.txt to exist\n"); ok(!DeleteFileA("dest\\testdir\\d.txt"), "Expected dest\\testdir\\d.txt to exist\n");
todo_wine { todo_wine {
ok(check_list(&extractDest, "testdir\\d.txt", TRUE), "list entry wrong\n"); ok(check_list(session.FileList, "testdir\\d.txt", TRUE), "list entry wrong\n");
ok(check_list(&extractDest, "testdir\\c.txt", TRUE), "list entry wrong\n"); ok(check_list(session.FileList, "testdir\\c.txt", TRUE), "list entry wrong\n");
ok(check_list(&extractDest, "b.txt", TRUE), "list entry wrong\n"); ok(check_list(session.FileList, "b.txt", TRUE), "list entry wrong\n");
ok(check_list(&extractDest, "a.txt", TRUE), "list entry wrong\n"); ok(check_list(session.FileList, "a.txt", TRUE), "list entry wrong\n");
} }
extractDest.flags = 0; session.Operation = 0;
extractDest.filterlist = extractDest.filelist; session.FilterList = session.FileList;
res = pExtract(&extractDest, "extract.cab"); res = pExtract(&session, "extract.cab");
ok(res == S_OK, "Expected S_OK, got %d\n", res); ok(res == S_OK, "Expected S_OK, got %d\n", res);
todo_wine
{
ok(session.FileSize == 40, "Expected 40, got %d\n", session.FileSize);
}
ok(session.Error.erfOper == FDIERROR_NONE,
"Expected FDIERROR_NONE, got %d\n", session.Error.erfOper);
ok(session.Error.erfType == 0, "Expected 0, got %d\n", session.Error.erfType);
ok(session.Error.fError == FALSE, "Expected FALSE, got %d\n", session.Error.fError);
ok(session.FileCount == 8, "Expected 8, got %d\n", session.FileCount);
ok(session.Operation == 0, "Expected 0, got %d\n", session.Operation);
ok(!lstrcmpA(session.Destination, "dest"), "Expected dest, got %s\n", session.Destination);
ok(!lstrcmpA(session.CurrentFile, "dest\\testdir\\d.txt"),
"Expected dest\\testdir\\d.txt, got %s\n", session.CurrentFile);
ok(!*session.Reserved, "Expected empty string, got %s\n", session.Reserved);
ok(DeleteFileA("dest\\a.txt"), "Expected dest\\a.txt to exist\n"); ok(DeleteFileA("dest\\a.txt"), "Expected dest\\a.txt to exist\n");
ok(DeleteFileA("dest\\testdir\\c.txt"), "Expected dest\\testdir\\c.txt to exist\n"); ok(DeleteFileA("dest\\testdir\\c.txt"), "Expected dest\\testdir\\c.txt to exist\n");
ok(DeleteFileA("dest\\b.txt"), "Expected dest\\b.txt to exist\n"); ok(DeleteFileA("dest\\b.txt"), "Expected dest\\b.txt to exist\n");
ok(DeleteFileA("dest\\testdir\\d.txt"), "Expected dest\\testdir\\d.txt to exist\n"); ok(DeleteFileA("dest\\testdir\\d.txt"), "Expected dest\\testdir\\d.txt to exist\n");
ok(check_list(&extractDest, "testdir\\d.txt", FALSE), "list entry wrong\n"); ok(check_list(session.FileList, "testdir\\d.txt", FALSE), "list entry wrong\n");
ok(check_list(&extractDest, "testdir\\c.txt", FALSE), "list entry wrong\n"); ok(check_list(session.FileList, "testdir\\c.txt", FALSE), "list entry wrong\n");
ok(check_list(&extractDest, "b.txt", FALSE), "list entry wrong\n"); ok(check_list(session.FileList, "b.txt", FALSE), "list entry wrong\n");
ok(check_list(&extractDest, "a.txt", FALSE), "list entry wrong\n"); ok(check_list(session.FileList, "a.txt", FALSE), "list entry wrong\n");
ok(check_list(session.FilterList, "testdir\\d.txt", FALSE), "list entry wrong\n");
ok(check_list(session.FilterList, "testdir\\c.txt", FALSE), "list entry wrong\n");
ok(check_list(session.FilterList, "b.txt", FALSE), "list entry wrong\n");
ok(check_list(session.FilterList, "a.txt", FALSE), "list entry wrong\n");
/* cabinet does not exist */
ZeroMemory(&session, sizeof(SESSION));
lstrcpyA(session.Destination, "dest");
session.Operation = EXTRACT_FILLFILELIST | EXTRACT_EXTRACTFILES;
res = pExtract(&session, "nonexistent.cab");
todo_wine
{
ok(res == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND),
"Expected HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), got %08x\n", res);
ok(session.Error.erfOper == FDIERROR_CABINET_NOT_FOUND,
"Expected FDIERROR_CABINET_NOT_FOUND, got %d\n", session.Error.erfOper);
ok(session.Error.fError == TRUE, "Expected TRUE, got %d\n", session.Error.fError);
}
ok(session.FileSize == 0, "Expected 0, got %d\n", session.FileSize);
ok(session.Error.erfType == 0, "Expected 0, got %d\n", session.Error.erfType);
ok(session.FileCount == 0, "Expected 0, got %d\n", session.FileCount);
ok(session.Operation == (EXTRACT_FILLFILELIST | EXTRACT_EXTRACTFILES),
"Expected EXTRACT_FILLFILELIST | EXTRACT_EXTRACTFILES, got %d\n", session.Operation);
ok(!lstrcmpA(session.Destination, "dest"), "Expected dest, got %s\n", session.Destination);
ok(!*session.CurrentFile, "Expected empty string, got %s\n", session.CurrentFile);
ok(!*session.Reserved, "Expected empty string, got %s\n", session.Reserved);
ok(!session.FilterList, "Expected empty filter list\n");
ok(!DeleteFileA("dest\\a.txt"), "Expected dest\\a.txt to not exist\n");
ok(!DeleteFileA("dest\\b.txt"), "Expected dest\\b.txt to not exist\n");
ok(!DeleteFileA("dest\\testdir\\c.txt"), "Expected dest\\testdir\\c.txt to not exist\n");
ok(!DeleteFileA("dest\\testdir\\d.txt"), "Expected dest\\testdir\\d.txt to not exist\n");
ok(!check_list(session.FileList, "testdir\\d.txt", FALSE), "list entry should not exist\n");
ok(!check_list(session.FileList, "testdir\\c.txt", FALSE), "list entry should not exist\n");
ok(!check_list(session.FileList, "b.txt", FALSE), "list entry should not exist\n");
ok(!check_list(session.FileList, "a.txt", FALSE), "list entry should not exist\n");
/* first file exists */
createTestFile("dest\\a.txt");
SetFileAttributes("dest\\a.txt", FILE_ATTRIBUTE_READONLY);
ZeroMemory(&session, sizeof(SESSION));
lstrcpyA(session.Destination, "dest");
session.Operation = EXTRACT_FILLFILELIST | EXTRACT_EXTRACTFILES;
res = pExtract(&session, "extract.cab");
todo_wine
{
ok(res == HRESULT_FROM_WIN32(ERROR_ACCESS_DENIED),
"Expected HRESULT_FROM_WIN32(ERROR_ACCESS_DENIED), got %08x\n", res);
ok(session.FileSize == 6, "Expected 6, got %d\n", session.FileSize);
ok(session.Error.erfOper == FDIERROR_USER_ABORT,
"Expected FDIERROR_USER_ABORT, got %d\n", session.Error.erfOper);
ok(session.Error.fError == TRUE, "Expected TRUE, got %d\n", session.Error.fError);
ok(session.FileCount == 1, "Expected 1, got %d\n", session.FileCount);
ok(!lstrcmpA(session.CurrentFile, "dest\\a.txt"),
"Expected dest\\a.txt, got %s\n", session.CurrentFile);
}
ok(session.Error.erfType == 0, "Expected 0, got %d\n", session.Error.erfType);
ok(session.Operation == (EXTRACT_FILLFILELIST | EXTRACT_EXTRACTFILES),
"Expected EXTRACT_FILLFILELIST | EXTRACT_EXTRACTFILES, got %d\n", session.Operation);
ok(!lstrcmpA(session.Destination, "dest"), "Expected dest, got %s\n", session.Destination);
ok(!*session.Reserved, "Expected empty string, got %s\n", session.Reserved);
ok(!session.FilterList, "Expected empty filter list\n");
ok(!DeleteFileA("dest\\a.txt"), "Expected dest\\a.txt to not exist\n");
todo_wine
{
ok(!DeleteFileA("dest\\b.txt"), "Expected dest\\b.txt to not exist\n");
ok(!DeleteFileA("dest\\testdir\\c.txt"), "Expected dest\\testdir\\c.txt to not exist\n");
ok(!DeleteFileA("dest\\testdir\\d.txt"), "Expected dest\\testdir\\d.txt to not exist\n");
ok(!check_list(session.FileList, "testdir\\d.txt", FALSE), "list entry should not exist\n");
ok(!check_list(session.FileList, "testdir\\c.txt", FALSE), "list entry should not exist\n");
ok(!check_list(session.FileList, "b.txt", FALSE), "list entry should not exist\n");
ok(!check_list(session.FileList, "a.txt", FALSE), "list entry should not exist\n");
}
SetFileAttributesA("dest\\a.txt", FILE_ATTRIBUTE_NORMAL);
DeleteFileA("dest\\a.txt");
/* third file exists */
createTestFile("dest\\testdir\\c.txt");
SetFileAttributes("dest\\testdir\\c.txt", FILE_ATTRIBUTE_READONLY);
ZeroMemory(&session, sizeof(SESSION));
lstrcpyA(session.Destination, "dest");
session.Operation = EXTRACT_FILLFILELIST | EXTRACT_EXTRACTFILES;
res = pExtract(&session, "extract.cab");
todo_wine
{
ok(res == HRESULT_FROM_WIN32(ERROR_ACCESS_DENIED),
"Expected HRESULT_FROM_WIN32(ERROR_ACCESS_DENIED), got %08x\n", res);
ok(session.FileSize == 26, "Expected 26, got %d\n", session.FileSize);
ok(session.Error.erfOper == FDIERROR_USER_ABORT,
"Expected FDIERROR_USER_ABORT, got %d\n", session.Error.erfOper);
ok(session.Error.fError == TRUE, "Expected TRUE, got %d\n", session.Error.fError);
ok(session.FileCount == 3, "Expected 3, got %d\n", session.FileCount);
ok(!lstrcmpA(session.CurrentFile, "dest\\testdir\\c.txt"),
"Expected dest\\c.txt, got %s\n", session.CurrentFile);
}
ok(session.Error.erfType == 0, "Expected 0, got %d\n", session.Error.erfType);
ok(session.Operation == (EXTRACT_FILLFILELIST | EXTRACT_EXTRACTFILES),
"Expected EXTRACT_FILLFILELIST | EXTRACT_EXTRACTFILES, got %d\n", session.Operation);
ok(!lstrcmpA(session.Destination, "dest"), "Expected dest, got %s\n", session.Destination);
ok(!*session.Reserved, "Expected empty string, got %s\n", session.Reserved);
ok(!session.FilterList, "Expected empty filter list\n");
ok(DeleteFileA("dest\\a.txt"), "Expected dest\\a.txt to exist\n");
ok(DeleteFileA("dest\\b.txt"), "Expected dest\\b.txt to exist\n");
ok(!DeleteFileA("dest\\testdir\\c.txt"), "Expected dest\\testdir\\c.txt to not exist\n");
todo_wine
{
ok(!DeleteFileA("dest\\testdir\\d.txt"), "Expected dest\\testdir\\d.txt to not exist\n");
ok(!check_list(session.FileList, "testdir\\d.txt", FALSE), "list entry should not exist\n");
ok(check_list(session.FileList, "testdir\\c.txt", TRUE), "list entry wrong\n");
}
ok(check_list(session.FileList, "b.txt", FALSE), "list entry wrong\n");
ok(check_list(session.FileList, "a.txt", FALSE), "list entry wrong\n");
SetFileAttributesA("dest\\testdir\\c.txt", FILE_ATTRIBUTE_NORMAL);
DeleteFileA("dest\\testdir\\c.txt");
ok(RemoveDirectoryA("dest\\testdir"), "Expected dest\\testdir to exist\n"); ok(RemoveDirectoryA("dest\\testdir"), "Expected dest\\testdir to exist\n");
ok(RemoveDirectoryA("dest"), "Expected dest\\testdir to exist\n"); ok(RemoveDirectoryA("dest"), "Expected dest to exist\n");
} }
START_TEST(extract) START_TEST(extract)