James Hawkins : advpack: Forward DelNodeA to its Unicode counterpart.
Alexandre Julliard
julliard at wine.codeweavers.com
Fri Mar 24 07:13:13 CST 2006
Module: wine
Branch: refs/heads/master
Commit: e28d5417577d09fecef68a979d0997da3d57949c
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=e28d5417577d09fecef68a979d0997da3d57949c
Author: James Hawkins <truiken at gmail.com>
Date: Thu Mar 23 23:11:00 2006 -0600
advpack: Forward DelNodeA to its Unicode counterpart.
---
dlls/advpack/advpack.spec | 2 +
dlls/advpack/files.c | 68 +++++++++++++++++++++++++++++++--------------
2 files changed, 48 insertions(+), 22 deletions(-)
diff --git a/dlls/advpack/advpack.spec b/dlls/advpack/advpack.spec
index 4c84cb3..252b779 100644
--- a/dlls/advpack/advpack.spec
+++ b/dlls/advpack/advpack.spec
@@ -6,7 +6,7 @@
@ stdcall AdvInstallFile(long str str str str long long) AdvInstallFileA
@ stdcall CloseINFEngine(long)
@ stdcall DelNodeA(str long)
-# stdcall DelNodeW(wstr long)
+@ stdcall DelNodeW(wstr long)
@ stdcall DelNode(str long) DelNodeA
@ stdcall DelNodeRunDLL32A(ptr ptr str long)
# stdcall DelNodeRunDLL32W(ptr ptr wstr long)
diff --git a/dlls/advpack/files.c b/dlls/advpack/files.c
index 8900193..072434f 100644
--- a/dlls/advpack/files.c
+++ b/dlls/advpack/files.c
@@ -323,36 +323,41 @@ done:
return HRESULT_FROM_WIN32(dwLastError);
}
-static HRESULT DELNODE_recurse_dirtree(LPSTR fname, DWORD flags)
+static HRESULT DELNODE_recurse_dirtree(LPWSTR fname, DWORD flags)
{
- DWORD fattrs = GetFileAttributesA(fname);
+ DWORD fattrs = GetFileAttributesW(fname);
HRESULT ret = E_FAIL;
+ static const WCHAR backslash[] = {'\\',0};
+ static const WCHAR asterisk[] = {'*',0};
+ static const WCHAR dot[] = {'.',0};
+ static const WCHAR dotdot[] = {'.','.',0};
+
if (fattrs & FILE_ATTRIBUTE_DIRECTORY)
{
HANDLE hFindFile;
- WIN32_FIND_DATAA w32fd;
+ WIN32_FIND_DATAW w32fd;
BOOL done = TRUE;
- int fname_len = lstrlenA(fname);
+ int fname_len = lstrlenW(fname);
/* Generate a path with wildcard suitable for iterating */
- if (CharPrevA(fname, fname + fname_len) != "\\")
+ if (lstrcmpW(CharPrevW(fname, fname + fname_len), backslash))
{
- lstrcpyA(fname + fname_len, "\\");
+ lstrcpyW(fname + fname_len, backslash);
++fname_len;
}
- lstrcpyA(fname + fname_len, "*");
+ lstrcpyW(fname + fname_len, asterisk);
- if ((hFindFile = FindFirstFileA(fname, &w32fd)) != INVALID_HANDLE_VALUE)
+ if ((hFindFile = FindFirstFileW(fname, &w32fd)) != INVALID_HANDLE_VALUE)
{
/* Iterate through the files in the directory */
- for (done = FALSE; !done; done = !FindNextFileA(hFindFile, &w32fd))
+ for (done = FALSE; !done; done = !FindNextFileW(hFindFile, &w32fd))
{
- TRACE("%s\n", w32fd.cFileName);
- if (lstrcmpA(".", w32fd.cFileName) != 0 &&
- lstrcmpA("..", w32fd.cFileName) != 0)
+ TRACE("%s\n", debugstr_w(w32fd.cFileName));
+ if (lstrcmpW(dot, w32fd.cFileName) != 0 &&
+ lstrcmpW(dotdot, w32fd.cFileName) != 0)
{
- lstrcpyA(fname + fname_len, w32fd.cFileName);
+ lstrcpyW(fname + fname_len, w32fd.cFileName);
if (DELNODE_recurse_dirtree(fname, flags) != S_OK)
{
break; /* Failure */
@@ -367,8 +372,8 @@ static HRESULT DELNODE_recurse_dirtree(L
if (done)
{
- TRACE("%s: directory\n", fname);
- if (SetFileAttributesA(fname, FILE_ATTRIBUTE_NORMAL) && RemoveDirectoryA(fname))
+ TRACE("%s: directory\n", debugstr_w(fname));
+ if (SetFileAttributesW(fname, FILE_ATTRIBUTE_NORMAL) && RemoveDirectoryW(fname))
{
ret = S_OK;
}
@@ -376,8 +381,8 @@ static HRESULT DELNODE_recurse_dirtree(L
}
else
{
- TRACE("%s: file\n", fname);
- if (SetFileAttributesA(fname, FILE_ATTRIBUTE_NORMAL) && DeleteFileA(fname))
+ TRACE("%s: file\n", debugstr_w(fname));
+ if (SetFileAttributesW(fname, FILE_ATTRIBUTE_NORMAL) && DeleteFileW(fname))
{
ret = S_OK;
}
@@ -389,6 +394,27 @@ static HRESULT DELNODE_recurse_dirtree(L
/***********************************************************************
* DelNodeA (ADVPACK.@)
*
+ * See DelNodeW.
+ */
+HRESULT WINAPI DelNodeA( LPCSTR pszFileOrDirName, DWORD dwFlags )
+{
+ UNICODE_STRING fileordirname;
+ HRESULT res;
+
+ TRACE("(%s, 0x%08lx)\n", debugstr_a(pszFileOrDirName), dwFlags);
+
+ RtlCreateUnicodeStringFromAsciiz(&fileordirname, pszFileOrDirName);
+
+ res = DelNodeW(fileordirname.Buffer, dwFlags);
+
+ RtlFreeUnicodeString(&fileordirname);
+
+ return res;
+}
+
+/***********************************************************************
+ * DelNodeW (ADVPACK.@)
+ *
* Deletes a file or directory
*
* PARAMS
@@ -404,19 +430,19 @@ static HRESULT DELNODE_recurse_dirtree(L
* - Native version apparently does a lot of checking to make sure
* we're not trying to delete a system directory etc.
*/
-HRESULT WINAPI DelNodeA( LPCSTR pszFileOrDirName, DWORD dwFlags )
+HRESULT WINAPI DelNodeW( LPCWSTR pszFileOrDirName, DWORD dwFlags )
{
- CHAR fname[MAX_PATH];
+ WCHAR fname[MAX_PATH];
HRESULT ret = E_FAIL;
- TRACE("(%s, 0x%08lx)\n", debugstr_a(pszFileOrDirName), dwFlags);
+ TRACE("(%s, 0x%08lx)\n", debugstr_w(pszFileOrDirName), dwFlags);
if (dwFlags)
FIXME("Flags ignored!\n");
if (pszFileOrDirName && *pszFileOrDirName)
{
- lstrcpyA(fname, pszFileOrDirName);
+ lstrcpyW(fname, pszFileOrDirName);
/* TODO: Should check for system directory deletion etc. here */
More information about the wine-cvs
mailing list