Forward WNetGetUniversalNameA to WNetGetUniversalNameW

Maarten Lankhorst m.b.lankhorst at gmail.com
Mon May 21 15:40:59 CDT 2007


Unstub it by forwarding it to wide version.
-------------- next part --------------
>From d6b17583ffde951be159343c831ea8cd8eeebd88 Mon Sep 17 00:00:00 2001
From: Maarten Lankhorst <m.b.lankhorst at gmail.com>
Date: Mon, 21 May 2007 20:11:50 +0200
Subject: [PATCH] mpr: Forward WNetGetUniversalNameA to WNetGetUniversalNameW

---
 dlls/mpr/wnet.c |   75 ++++++++++++++++++++++++++++++++++++++----------------
 1 files changed, 53 insertions(+), 22 deletions(-)

diff --git a/dlls/mpr/wnet.c b/dlls/mpr/wnet.c
index 8999b74..356bf14 100644
--- a/dlls/mpr/wnet.c
+++ b/dlls/mpr/wnet.c
@@ -3,6 +3,7 @@
  *
  * Copyright 1999 Ulrich Weigand
  * Copyright 2004 Juan Lang
+ * Copyright 2007 Maarten Lankhorst
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -1701,37 +1702,67 @@ DWORD WINAPI WNetGetUniversalNameA ( LPCSTR lpLocalPath, DWORD dwInfoLevel,
                                      LPVOID lpBuffer, LPDWORD lpBufferSize )
 {
     DWORD err, size;
+    LPWSTR wLocalPath = NULL;
+    LPVOID wlpBuffer = NULL;
+    DWORD structsize;
 
-    FIXME( "(%s, 0x%08X, %p, %p): stub\n",
+    switch (dwInfoLevel)
+    {
+    case REMOTE_NAME_INFO_LEVEL: structsize = sizeof(UNIVERSAL_NAME_INFOA); break;
+    case UNIVERSAL_NAME_INFO_LEVEL: structsize = sizeof(REMOTE_NAME_INFOA); break;
+    default:
+        FIXME("Unhandled dwInfoLevel %d\n", dwInfoLevel);
+        err = WN_BAD_VALUE;
+        goto err;
+    }
+
+    TRACE( "(%s, 0x%08X, %p, %p)\n",
            debugstr_a(lpLocalPath), dwInfoLevel, lpBuffer, lpBufferSize);
 
-    switch (dwInfoLevel)
+    if (*lpBufferSize <= structsize)
     {
-    case UNIVERSAL_NAME_INFO_LEVEL:
+        err = WN_MORE_DATA;
+        goto err;
+    }
+
+    size = (*lpBufferSize - structsize) * sizeof(WCHAR);
+    size += structsize;
+
+    wlpBuffer = HeapAlloc(GetProcessHeap(), 0, size);
+    wLocalPath = HeapAlloc(GetProcessHeap(), 0, (lstrlenA(lpLocalPath) + 1) * sizeof(WCHAR));
+    if (!wLocalPath || !wlpBuffer)
     {
-        LPUNIVERSAL_NAME_INFOA info = (LPUNIVERSAL_NAME_INFOA)lpBuffer;
+        err = WN_OUT_OF_MEMORY;
+        goto err;
+    }
 
-        size = sizeof(*info) + lstrlenA(lpLocalPath) + 1;
-        if (*lpBufferSize < size)
-        {
-            err = WN_MORE_DATA;
+    MultiByteToWideChar(CP_ACP, 0, lpLocalPath, -1, wLocalPath, -1);
+    err = WNetGetUniversalNameW(wLocalPath, dwInfoLevel, wlpBuffer, &size);
+    if (err == WN_NO_ERROR)
+        switch (dwInfoLevel) {
+        case UNIVERSAL_NAME_INFO_LEVEL: {
+            LPUNIVERSAL_NAME_INFOA aInfo = lpBuffer;
+            LPUNIVERSAL_NAME_INFOW wInfo = wlpBuffer;
+            aInfo->lpUniversalName = (LPVOID)((DWORD_PTR)aInfo + sizeof(*aInfo));
+            WideCharToMultiByte(CP_ACP, 0, wInfo->lpUniversalName, -1, aInfo->lpUniversalName, -1, NULL, NULL);
+            *lpBufferSize = sizeof(*aInfo) + strlenW(wInfo->lpUniversalName) + 1;
             break;
+            }
+        case REMOTE_NAME_INFO_LEVEL: {
+            LPREMOTE_NAME_INFOA aInfo = lpBuffer;
+            LPREMOTE_NAME_INFOW wInfo = wlpBuffer;
+            aInfo->lpUniversalName = (LPVOID)((DWORD_PTR)aInfo + sizeof(*aInfo));
+            WideCharToMultiByte(CP_ACP, 0, wInfo->lpUniversalName, -1, aInfo->lpUniversalName, -1, NULL, NULL);
+            aInfo->lpConnectionName = (LPVOID)((DWORD_PTR)aInfo->lpUniversalName + 1 + strlenW(wInfo->lpUniversalName));
+            WideCharToMultiByte(CP_ACP, 0, wInfo->lpConnectionName, -1, aInfo->lpConnectionName, -1, NULL, NULL);
+            aInfo->lpRemainingPath = (LPVOID)((DWORD_PTR)aInfo->lpConnectionName + 1 + strlenW(wInfo->lpConnectionName));
+            WideCharToMultiByte(CP_ACP, 0, wInfo->lpRemainingPath, -1, aInfo->lpRemainingPath, -1, NULL, NULL);
+            }
         }
-        info->lpUniversalName = (char *)info + sizeof(*info);
-        lstrcpyA(info->lpUniversalName, lpLocalPath);
-        *lpBufferSize = size;
-        err = WN_NO_ERROR;
-        break;
-    }
-    case REMOTE_NAME_INFO_LEVEL:
-        err = WN_NO_NETWORK;
-        break;
-
-    default:
-        err = WN_BAD_VALUE;
-        break;
-    }
 
+    err:
+    HeapFree(GetProcessHeap(), 0, wLocalPath);
+    HeapFree(GetProcessHeap(), 0, wlpBuffer);
     SetLastError(err);
     return err;
 }
-- 
1.4.4.2



More information about the wine-patches mailing list