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