cabinet 3: Append new file nodes to the front of the file list
James Hawkins
truiken at gmail.com
Thu Aug 23 16:22:32 CDT 2007
Hi,
Changelog:
* Append new file nodes to the front of the file list.
dlls/cabinet/cabinet_main.c | 30 +++++---
dlls/cabinet/tests/extract.c | 157 ++++++++++++++++++++++-------------------
2 files changed, 102 insertions(+), 85 deletions(-)
--
James Hawkins
-------------- next part --------------
diff --git a/dlls/cabinet/cabinet_main.c b/dlls/cabinet/cabinet_main.c
index 933b85a..24be376 100644
--- a/dlls/cabinet/cabinet_main.c
+++ b/dlls/cabinet/cabinet_main.c
@@ -163,12 +163,18 @@ static void fill_file_node(struct FILELIST *pNode, LPCSTR szFilename)
lstrcpyA(pNode->FileName, szFilename);
}
-static BOOL file_in_list(const struct FILELIST *pNode, LPCSTR szFilename)
+static BOOL file_in_list(struct FILELIST *pNode, LPCSTR szFilename,
+ struct FILELIST **pOut)
{
while (pNode)
{
if (!lstrcmpiA(pNode->FileName, szFilename))
+ {
+ if (pOut)
+ *pOut = pNode;
+
return TRUE;
+ }
pNode = pNode->next;
}
@@ -182,7 +188,7 @@ static INT_PTR fdi_notify_extract(FDINOTIFICATIONTYPE fdint, PFDINOTIFICATION pf
{
case fdintCOPY_FILE:
{
- struct FILELIST **fileList;
+ struct FILELIST *fileList, *node;
SESSION *pDestination = pfdin->pv;
LPSTR szFullPath, szDirectory;
HANDLE hFile = 0;
@@ -205,24 +211,22 @@ static INT_PTR fdi_notify_extract(FDINOTIFICATIONTYPE fdint, PFDINOTIFICATION pf
if (pDestination->Operation & EXTRACT_FILLFILELIST)
{
- fileList = &pDestination->FileList;
-
- while (*fileList)
- fileList = &((*fileList)->next);
-
- *fileList = HeapAlloc(GetProcessHeap(), 0,
- sizeof(struct FILELIST));
+ fileList = HeapAlloc(GetProcessHeap(), 0,
+ sizeof(struct FILELIST));
- fill_file_node(*fileList, pfdin->psz1);
+ fill_file_node(fileList, pfdin->psz1);
+ fileList->Extracted = TRUE;
+ fileList->next = pDestination->FileList;
+ pDestination->FileList = fileList;
lstrcpyA(pDestination->CurrentFile, szFullPath);
pDestination->FileCount++;
}
if ((pDestination->Operation & EXTRACT_EXTRACTFILES) ||
- file_in_list(pDestination->FilterList, pfdin->psz1))
+ file_in_list(pDestination->FilterList, pfdin->psz1, NULL))
{
/* skip this file if it is not in the file list */
- if (!file_in_list(pDestination->FileList, pfdin->psz1))
+ if (!file_in_list(pDestination->FileList, pfdin->psz1, &node))
return 0;
/* create the destination directory if it doesn't exist */
@@ -234,6 +238,8 @@ static INT_PTR fdi_notify_extract(FDINOTIFICATIONTYPE fdint, PFDINOTIFICATION pf
if (hFile == INVALID_HANDLE_VALUE)
hFile = 0;
+ else
+ node->Extracted = FALSE;
}
HeapFree(GetProcessHeap(), 0, szFullPath);
diff --git a/dlls/cabinet/tests/extract.c b/dlls/cabinet/tests/extract.c
index f622b4e..60a6d8a 100644
--- a/dlls/cabinet/tests/extract.c
+++ b/dlls/cabinet/tests/extract.c
@@ -314,21 +314,26 @@ static void create_cab_file(void)
ok(res, "Failed to destroy the cabinet\n");
}
-static BOOL check_list(struct FILELIST *filelist, const char *filename, BOOL extracted)
+static BOOL check_list(struct FILELIST **node, const char *filename, BOOL extracted)
{
- struct FILELIST *fl;
+ if (!*node)
+ return FALSE;
- for (fl = filelist; fl; fl = fl->next)
- if (!lstrcmp(filename, fl->FileName))
- return (extracted == fl->Extracted);
+ if (lstrcmpA((*node)->FileName, filename))
+ return FALSE;
- return FALSE;
+ if ((*node)->Extracted != extracted)
+ return FALSE;
+
+ *node = (*node)->next;
+ return TRUE;
}
static void test_Extract(void)
{
SESSION session;
HRESULT res;
+ struct FILELIST *node;
/* native windows crashes if
* - invalid parameters are sent in
@@ -341,6 +346,7 @@ static void test_Extract(void)
lstrcpyA(session.Destination, "dest");
session.Operation = EXTRACT_FILLFILELIST | EXTRACT_EXTRACTFILES;
res = pExtract(&session, "extract.cab");
+ node = session.FileList;
ok(res == S_OK, "Expected S_OK, got %d\n", res);
ok(session.FileSize == 40, "Expected 40, got %d\n", session.FileSize);
ok(session.Error.erfOper == FDIERROR_NONE,
@@ -360,16 +366,20 @@ static void test_Extract(void)
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(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");
+ todo_wine
+ {
+ ok(check_list(&node, "testdir\\d.txt", FALSE), "list entry wrong\n");
+ ok(check_list(&node, "testdir\\c.txt", FALSE), "list entry wrong\n");
+ ok(check_list(&node, "b.txt", FALSE), "list entry wrong\n");
+ ok(check_list(&node, "a.txt", FALSE), "list entry wrong\n");
+ }
/* try fill file list operation */
ZeroMemory(&session, sizeof(SESSION));
lstrcpyA(session.Destination, "dest");
session.Operation = EXTRACT_FILLFILELIST;
res = pExtract(&session, "extract.cab");
+ node = session.FileList;
ok(res == S_OK, "Expected S_OK, got %d\n", res);
ok(session.FileSize == 40, "Expected 40, got %d\n", session.FileSize);
ok(session.Error.erfOper == FDIERROR_NONE,
@@ -386,17 +396,15 @@ static void test_Extract(void)
ok(!session.FilterList, "Expected empty filter list\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");
- todo_wine
- {
- 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");
- }
+ ok(check_list(&node, "testdir\\d.txt", TRUE), "list entry wrong\n");
+ ok(check_list(&node, "testdir\\c.txt", TRUE), "list entry wrong\n");
+ ok(check_list(&node, "b.txt", TRUE), "list entry wrong\n");
+ ok(check_list(&node, "a.txt", TRUE), "list entry wrong\n");
/* try extract files operation once file list is filled */
session.Operation = EXTRACT_EXTRACTFILES;
res = pExtract(&session, "extract.cab");
+ node = session.FileList;
ok(res == S_OK, "Expected S_OK, got %d\n", res);
ok(session.FileSize == 40, "Expected 40, got %d\n", session.FileSize);
ok(session.Error.erfOper == FDIERROR_NONE,
@@ -417,13 +425,14 @@ static void test_Extract(void)
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"), "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");
+ ok(check_list(&node, "testdir\\d.txt", FALSE), "list entry wrong\n");
+ ok(check_list(&node, "testdir\\c.txt", FALSE), "list entry wrong\n");
+ ok(check_list(&node, "b.txt", FALSE), "list entry wrong\n");
+ ok(check_list(&node, "a.txt", FALSE), "list entry wrong\n");
/* Extract does not extract files if the dest dir does not exist */
res = pExtract(&session, "extract.cab");
+ node = session.FileList;
ok(res == S_OK, "Expected S_OK, got %d\n", res);
ok(session.FileSize == 40, "Expected 40, got %d\n", session.FileSize);
ok(session.Error.erfOper == FDIERROR_NONE,
@@ -440,10 +449,10 @@ static void test_Extract(void)
ok(!session.FilterList, "Expected empty filter list\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(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");
+ ok(check_list(&node, "testdir\\d.txt", FALSE), "list entry wrong\n");
+ ok(check_list(&node, "testdir\\c.txt", FALSE), "list entry wrong\n");
+ ok(check_list(&node, "b.txt", FALSE), "list entry wrong\n");
+ ok(check_list(&node, "a.txt", FALSE), "list entry wrong\n");
/* remove two of the files in the list */
session.FileList->next = session.FileList->next->next;
@@ -451,6 +460,7 @@ static void test_Extract(void)
session.FilterList = NULL;
CreateDirectoryA("dest", NULL);
res = pExtract(&session, "extract.cab");
+ node = session.FileList;
ok(res == S_OK, "Expected S_OK, got %d\n", res);
ok(session.FileSize == 40, "Expected 40, got %d\n", session.FileSize);
ok(session.Error.erfOper == FDIERROR_NONE,
@@ -465,21 +475,22 @@ static void test_Extract(void)
"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\\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\\testdir\\d.txt"), "Expected dest\\testdir\\d.txt to not exist\n");
-
- todo_wine {
- 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");
+ todo_wine
+ {
+ 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\\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(check_list(&node, "testdir\\d.txt", FALSE), "list entry wrong\n");
+ ok(!check_list(&node, "testdir\\c.txt", FALSE), "list entry wrong\n");
+ ok(check_list(&node, "b.txt", FALSE), "list entry wrong\n");
+ ok(!check_list(&node, "a.txt", FALSE), "list entry wrong\n");
session.Operation = EXTRACT_FILLFILELIST;
session.FileList = NULL;
res = pExtract(&session, "extract.cab");
+ node = session.FileList;
ok(res == S_OK, "Expected S_OK, got %d\n", res);
ok(session.FileSize == 40, "Expected 40, got %d\n", session.FileSize);
ok(session.Error.erfOper == FDIERROR_NONE,
@@ -498,16 +509,14 @@ static void test_Extract(void)
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\\testdir\\d.txt"), "Expected dest\\testdir\\d.txt to not exist\n");
-
- todo_wine {
- 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");
- }
+ ok(check_list(&node, "testdir\\d.txt", TRUE), "list entry wrong\n");
+ ok(!check_list(&node, "testdir\\c.txt", FALSE), "list entry wrong\n");
+ ok(!check_list(&node, "b.txt", FALSE), "list entry wrong\n");
+ ok(!check_list(&node, "a.txt", FALSE), "list entry wrong\n");
session.Operation = 0;
res = pExtract(&session, "extract.cab");
+ node = session.FileList;
ok(res == S_OK, "Expected S_OK, got %d\n", res);
ok(session.FileSize == 40, "Expected 40, got %d\n", session.FileSize);
ok(session.Error.erfOper == FDIERROR_NONE,
@@ -525,17 +534,15 @@ static void test_Extract(void)
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\\testdir\\d.txt"), "Expected dest\\testdir\\d.txt to exist\n");
-
- todo_wine {
- 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");
- }
+ ok(check_list(&node, "testdir\\d.txt", TRUE), "list entry wrong\n");
+ ok(check_list(&node, "testdir\\c.txt", TRUE), "list entry wrong\n");
+ ok(check_list(&node, "b.txt", TRUE), "list entry wrong\n");
+ ok(check_list(&node, "a.txt", TRUE), "list entry wrong\n");
session.Operation = 0;
session.FilterList = session.FileList;
res = pExtract(&session, "extract.cab");
+ node = session.FileList;
ok(res == S_OK, "Expected S_OK, got %d\n", res);
ok(session.FileSize == 40, "Expected 40, got %d\n", session.FileSize);
ok(session.Error.erfOper == FDIERROR_NONE,
@@ -552,21 +559,22 @@ static void test_Extract(void)
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\\testdir\\d.txt"), "Expected dest\\testdir\\d.txt 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");
- 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");
+ ok(check_list(&node, "testdir\\d.txt", FALSE), "list entry wrong\n");
+ ok(check_list(&node, "testdir\\c.txt", FALSE), "list entry wrong\n");
+ ok(check_list(&node, "b.txt", FALSE), "list entry wrong\n");
+ ok(check_list(&node, "a.txt", FALSE), "list entry wrong\n");
+ node = session.FilterList;
+ ok(check_list(&node, "testdir\\d.txt", FALSE), "list entry wrong\n");
+ ok(check_list(&node, "testdir\\c.txt", FALSE), "list entry wrong\n");
+ ok(check_list(&node, "b.txt", FALSE), "list entry wrong\n");
+ ok(check_list(&node, "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");
+ node = session.FileList;
todo_wine
{
ok(res == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND),
@@ -588,10 +596,10 @@ static void test_Extract(void)
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");
+ ok(!check_list(&node, "testdir\\d.txt", FALSE), "list entry should not exist\n");
+ ok(!check_list(&node, "testdir\\c.txt", FALSE), "list entry should not exist\n");
+ ok(!check_list(&node, "b.txt", FALSE), "list entry should not exist\n");
+ ok(!check_list(&node, "a.txt", FALSE), "list entry should not exist\n");
/* first file exists */
createTestFile("dest\\a.txt");
@@ -600,6 +608,7 @@ static void test_Extract(void)
lstrcpyA(session.Destination, "dest");
session.Operation = EXTRACT_FILLFILELIST | EXTRACT_EXTRACTFILES;
res = pExtract(&session, "extract.cab");
+ node = session.FileList;
todo_wine
{
ok(res == HRESULT_FROM_WIN32(ERROR_ACCESS_DENIED),
@@ -624,11 +633,11 @@ static void test_Extract(void)
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");
+ ok(!check_list(&node, "testdir\\d.txt", FALSE), "list entry should not exist\n");
+ ok(!check_list(&node, "testdir\\c.txt", FALSE), "list entry should not exist\n");
+ ok(!check_list(&node, "b.txt", FALSE), "list entry should not exist\n");
}
+ ok(!check_list(&node, "a.txt", FALSE), "list entry should not exist\n");
SetFileAttributesA("dest\\a.txt", FILE_ATTRIBUTE_NORMAL);
DeleteFileA("dest\\a.txt");
@@ -661,20 +670,22 @@ static void test_Extract(void)
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");
+ ok(!check_list(&node, "testdir\\d.txt", FALSE), "list entry should 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(&node, "testdir\\c.txt", TRUE), "list entry wrong\n");
+ ok(check_list(&node, "b.txt", FALSE), "list entry wrong\n");
+ ok(check_list(&node, "a.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");
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"), "Expected dest to exist\n");
+ todo_wine
+ {
+ ok(RemoveDirectoryA("dest\\testdir"), "Expected dest\\testdir to exist\n");
+ ok(RemoveDirectoryA("dest"), "Expected dest to exist\n");
+ }
}
START_TEST(extract)
--
1.4.4.2
More information about the wine-patches
mailing list