Added initial version of Delnode plus some tests.
This commit is contained in:
parent
86be9f20da
commit
c7bd5fb16d
|
@ -2,6 +2,7 @@
|
||||||
* Advpack main
|
* Advpack main
|
||||||
*
|
*
|
||||||
* Copyright 2004 Huw D M Davies
|
* Copyright 2004 Huw D M Davies
|
||||||
|
* Copyright 2005 Sami Aario
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
@ -260,8 +261,71 @@ void WINAPI RegisterOCX( HWND hWnd, HINSTANCE hInst, LPCSTR cmdline, INT show )
|
||||||
FreeLibrary(hm);
|
FreeLibrary(hm);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static HRESULT DELNODE_recurse_dirtree(LPSTR fname, DWORD flags)
|
||||||
|
{
|
||||||
|
DWORD fattrs = GetFileAttributesA(fname);
|
||||||
|
HRESULT ret = E_FAIL;
|
||||||
|
|
||||||
|
if (fattrs & FILE_ATTRIBUTE_DIRECTORY)
|
||||||
|
{
|
||||||
|
HANDLE hFindFile;
|
||||||
|
WIN32_FIND_DATAA w32fd;
|
||||||
|
BOOL done = TRUE;
|
||||||
|
int fname_len = lstrlenA(fname);
|
||||||
|
|
||||||
|
/* Generate a path with wildcard suitable for iterating */
|
||||||
|
if (CharPrevA(fname, fname + fname_len) != "\\")
|
||||||
|
{
|
||||||
|
lstrcpyA(fname + fname_len, "\\");
|
||||||
|
++fname_len;
|
||||||
|
}
|
||||||
|
lstrcpyA(fname + fname_len, "*");
|
||||||
|
|
||||||
|
if ((hFindFile = FindFirstFileA(fname, &w32fd)) != INVALID_HANDLE_VALUE)
|
||||||
|
{
|
||||||
|
/* Iterate through the files in the directory */
|
||||||
|
for (done = FALSE; !done; done = !FindNextFileA(hFindFile, &w32fd))
|
||||||
|
{
|
||||||
|
TRACE("%s\n", w32fd.cFileName);
|
||||||
|
if (lstrcmpA(".", w32fd.cFileName) != 0 &&
|
||||||
|
lstrcmpA("..", w32fd.cFileName) != 0)
|
||||||
|
{
|
||||||
|
lstrcpyA(fname + fname_len, w32fd.cFileName);
|
||||||
|
if (DELNODE_recurse_dirtree(fname, flags) != S_OK)
|
||||||
|
{
|
||||||
|
break; /* Failure */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
FindClose(hFindFile);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* We're done with this directory, so restore the old path without wildcard */
|
||||||
|
*(fname + fname_len) = '\0';
|
||||||
|
|
||||||
|
if (done)
|
||||||
|
{
|
||||||
|
TRACE("%s: directory\n", fname);
|
||||||
|
if (SetFileAttributesA(fname, FILE_ATTRIBUTE_NORMAL) && RemoveDirectoryA(fname))
|
||||||
|
{
|
||||||
|
ret = S_OK;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
TRACE("%s: file\n", fname);
|
||||||
|
if (SetFileAttributesA(fname, FILE_ATTRIBUTE_NORMAL) && DeleteFileA(fname))
|
||||||
|
{
|
||||||
|
ret = S_OK;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* DelNode (ADVPACK.@)
|
* DelNode (ADVPACK.@)
|
||||||
*
|
*
|
||||||
* Deletes a file or directory
|
* Deletes a file or directory
|
||||||
*
|
*
|
||||||
|
@ -274,12 +338,26 @@ void WINAPI RegisterOCX( HWND hWnd, HINSTANCE hInst, LPCSTR cmdline, INT show )
|
||||||
* Failure: E_FAIL
|
* Failure: E_FAIL
|
||||||
*
|
*
|
||||||
* BUGS
|
* BUGS
|
||||||
* Unimplemented
|
* - Ignores flags
|
||||||
|
* - Native version apparently does a lot of checking to make sure
|
||||||
|
* we're not trying to delete a system directory etc.
|
||||||
*/
|
*/
|
||||||
HRESULT WINAPI DelNode( LPCSTR pszFileOrDirName, DWORD dwFlags )
|
HRESULT WINAPI DelNode( LPCSTR pszFileOrDirName, DWORD dwFlags )
|
||||||
{
|
{
|
||||||
FIXME("(%s, 0x%08lx): stub\n", debugstr_a(pszFileOrDirName), dwFlags);
|
CHAR fname[MAX_PATH];
|
||||||
return E_FAIL;
|
HRESULT ret = E_FAIL;
|
||||||
|
|
||||||
|
FIXME("(%s, 0x%08lx): flags ignored\n", debugstr_a(pszFileOrDirName), dwFlags);
|
||||||
|
if (pszFileOrDirName && *pszFileOrDirName)
|
||||||
|
{
|
||||||
|
lstrcpyA(fname, pszFileOrDirName);
|
||||||
|
|
||||||
|
/* TODO: Should check for system directory deletion etc. here */
|
||||||
|
|
||||||
|
ret = DELNODE_recurse_dirtree(fname, dwFlags);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
* Unit tests for advpack.dll
|
* Unit tests for advpack.dll
|
||||||
*
|
*
|
||||||
* Copyright (C) 2005 Robert Reif
|
* Copyright (C) 2005 Robert Reif
|
||||||
|
* Copyright (C) 2005 Sami Aario
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
@ -20,12 +21,11 @@
|
||||||
|
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include <advpub.h>
|
#include <advpub.h>
|
||||||
|
#include <assert.h>
|
||||||
#include "wine/test.h"
|
#include "wine/test.h"
|
||||||
|
|
||||||
|
|
||||||
static HRESULT (WINAPI *pGetVersionFromFile)(LPSTR,LPDWORD,LPDWORD,BOOL);
|
static HRESULT (WINAPI *pGetVersionFromFile)(LPSTR,LPDWORD,LPDWORD,BOOL);
|
||||||
|
static HRESULT (WINAPI *pDelNode)(LPCSTR,DWORD);
|
||||||
|
|
||||||
static void version_test()
|
static void version_test()
|
||||||
{
|
{
|
||||||
|
@ -49,6 +49,68 @@ static void version_test()
|
||||||
HIWORD(minor), LOWORD(minor));
|
HIWORD(minor), LOWORD(minor));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void delnode_test()
|
||||||
|
{
|
||||||
|
HRESULT hr;
|
||||||
|
HANDLE hn;
|
||||||
|
CHAR currDir[MAX_PATH];
|
||||||
|
int currDirLen;
|
||||||
|
|
||||||
|
/* Native DelNode apparently does not support relative paths, so we use
|
||||||
|
absolute paths for testing */
|
||||||
|
currDirLen = GetCurrentDirectoryA(sizeof(currDir) / sizeof(CHAR), currDir);
|
||||||
|
assert(currDirLen > 0 && currDirLen < sizeof(currDir) / sizeof(CHAR));
|
||||||
|
|
||||||
|
/* Simple tests; these should fail. */
|
||||||
|
hr = pDelNode(NULL, 0);
|
||||||
|
ok (hr == E_FAIL, "DelNode called with NULL pathname should return E_FAIL\n");
|
||||||
|
hr = pDelNode("", 0);
|
||||||
|
ok (hr == E_FAIL, "DelNode called with empty pathname should return E_FAIL\n");
|
||||||
|
|
||||||
|
/* Test deletion of a file. */
|
||||||
|
hn = CreateFile("DelNodeTestFile1", GENERIC_WRITE, 0, NULL,
|
||||||
|
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
|
||||||
|
assert(hn != INVALID_HANDLE_VALUE);
|
||||||
|
CloseHandle(hn);
|
||||||
|
hr = pDelNode(lstrcat(currDir, "\\DelNodeTestFile1"), 0);
|
||||||
|
ok (hr == S_OK, "DelNode failed deleting a single file\n");
|
||||||
|
currDir[currDirLen] = '\0';
|
||||||
|
|
||||||
|
/* Test deletion of an empty directory. */
|
||||||
|
CreateDirectoryA("DelNodeTestDir", NULL);
|
||||||
|
hr = pDelNode(lstrcat(currDir, "\\DelNodeTestDir"), 0);
|
||||||
|
ok (hr == S_OK, "DelNode failed deleting an empty directory\n");
|
||||||
|
currDir[currDirLen] = '\0';
|
||||||
|
|
||||||
|
/* Test deletion of a directory containing one file. */
|
||||||
|
CreateDirectoryA("DelNodeTestDir", NULL);
|
||||||
|
hn = CreateFile("DelNodeTestDir\\DelNodeTestFile1", GENERIC_WRITE, 0, NULL,
|
||||||
|
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
|
||||||
|
assert(hn != INVALID_HANDLE_VALUE);
|
||||||
|
CloseHandle(hn);
|
||||||
|
hr = pDelNode(lstrcat(currDir, "\\DelNodeTestDir"), 0);
|
||||||
|
ok (hr == S_OK, "DelNode failed deleting a directory containing one file\n");
|
||||||
|
currDir[currDirLen] = '\0';
|
||||||
|
|
||||||
|
/* Test deletion of a directory containing multiple files. */
|
||||||
|
CreateDirectoryA("DelNodeTestDir", NULL);
|
||||||
|
hn = CreateFile("DelNodeTestDir\\DelNodeTestFile1", GENERIC_WRITE, 0, NULL,
|
||||||
|
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
|
||||||
|
assert(hn != INVALID_HANDLE_VALUE);
|
||||||
|
CloseHandle(hn);
|
||||||
|
hn = CreateFile("DelNodeTestDir\\DelNodeTestFile2", GENERIC_WRITE, 0, NULL,
|
||||||
|
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
|
||||||
|
assert(hn != INVALID_HANDLE_VALUE);
|
||||||
|
CloseHandle(hn);
|
||||||
|
hn = CreateFile("DelNodeTestDir\\DelNodeTestFile3", GENERIC_WRITE, 0, NULL,
|
||||||
|
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
|
||||||
|
assert(hn != INVALID_HANDLE_VALUE);
|
||||||
|
CloseHandle(hn);
|
||||||
|
hr = pDelNode(lstrcat(currDir, "\\DelNodeTestDir"), 0);
|
||||||
|
ok (hr == S_OK, "DelNode failed deleting a directory containing multiple files\n");
|
||||||
|
currDir[currDirLen] = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
START_TEST(advpack)
|
START_TEST(advpack)
|
||||||
{
|
{
|
||||||
HMODULE hdll;
|
HMODULE hdll;
|
||||||
|
@ -56,9 +118,14 @@ START_TEST(advpack)
|
||||||
hdll = LoadLibraryA("advpack.dll");
|
hdll = LoadLibraryA("advpack.dll");
|
||||||
if (!hdll)
|
if (!hdll)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
pGetVersionFromFile = (void*)GetProcAddress(hdll, "GetVersionFromFile");
|
pGetVersionFromFile = (void*)GetProcAddress(hdll, "GetVersionFromFile");
|
||||||
if (!pGetVersionFromFile)
|
pDelNode = (void*)GetProcAddress(hdll, "DelNode");
|
||||||
|
if (!pGetVersionFromFile || !pDelNode)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
version_test();
|
version_test();
|
||||||
|
delnode_test();
|
||||||
|
|
||||||
|
FreeLibrary(hdll);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue