mpr: Implement WNetGetUniversalNameW using WNetGetConnectionW, try 2

Maarten Lankhorst m.b.lankhorst at gmail.com
Tue May 22 15:00:26 CDT 2007


Try 2
-------------- next part --------------
>From 2fa726a1fc50817259b6114fa77a4e1d2334798b Mon Sep 17 00:00:00 2001
From: Maarten Lankhorst <m.b.lankhorst at gmail.com>
Date: Tue, 22 May 2007 21:59:28 +0200
Subject: [PATCH] mpr: Implement WNetGetUniversalNameW using WNetGetConnectionW

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

diff --git a/dlls/mpr/wnet.c b/dlls/mpr/wnet.c
index 371f192..0a88af7 100644
--- a/dlls/mpr/wnet.c
+++ b/dlls/mpr/wnet.c
@@ -1796,38 +1796,86 @@ DWORD WINAPI WNetGetUniversalNameA ( LPCSTR lpLocalPath, DWORD dwInfoLevel,
 DWORD WINAPI WNetGetUniversalNameW ( LPCWSTR lpLocalPath, DWORD dwInfoLevel,
                                      LPVOID lpBuffer, LPDWORD lpBufferSize )
 {
-    DWORD err, size;
+    DWORD err, size, nsize, bufsize;
+    LPWSTR fullName = NULL;
+    WCHAR station[] = { 'A', ':', 0 };
 
-    FIXME( "(%s, 0x%08X, %p, %p): stub\n",
+    TRACE( "(%s, 0x%08X, %p, %p)\n",
            debugstr_w(lpLocalPath), dwInfoLevel, lpBuffer, lpBufferSize);
 
-    switch (dwInfoLevel)
+    if (!lpBufferSize || !lpLocalPath || (!lpBuffer && *lpBufferSize))
     {
-    case UNIVERSAL_NAME_INFO_LEVEL:
-    {
-        LPUNIVERSAL_NAME_INFOW info = (LPUNIVERSAL_NAME_INFOW)lpBuffer;
+       err = WN_BAD_POINTER;
+       goto err;
+    }
 
-        size = sizeof(*info) + (lstrlenW(lpLocalPath) + 1) * sizeof(WCHAR);
-        if (*lpBufferSize < size)
-        {
-            err = WN_MORE_DATA;
-            break;
-        }
-        info->lpUniversalName = (LPWSTR)((char *)info + sizeof(*info));
-        lstrcpyW(info->lpUniversalName, lpLocalPath);
-        *lpBufferSize = size;
-        err = WN_NO_ERROR;
-        break;
+    if (!lpLocalPath[0] || lpLocalPath[1] != ':')
+    {
+        err = WN_BAD_LOCALNAME;
+        goto err;
     }
-    case REMOTE_NAME_INFO_LEVEL:
-        err = WN_NO_NETWORK;
-        break;
 
-    default:
+    station[0] = lpLocalPath[0];
+
+    if (dwInfoLevel == UNIVERSAL_NAME_INFO_LEVEL) {
+        LPUNIVERSAL_NAME_INFOW info = lpBuffer;
+        size = sizeof(*info);
+
+        if (*lpBufferSize > size)
+            fullName = info->lpUniversalName = (LPVOID)((DWORD_PTR)info + size);
+    } else if (dwInfoLevel == REMOTE_NAME_INFO_LEVEL) {
+        LPREMOTE_NAME_INFOW info = lpBuffer;
+        size = sizeof(*info);
+
+        if (*lpBufferSize > size)
+            fullName = info->lpUniversalName = (LPVOID)((DWORD_PTR)info + size);
+    } else {
+        FIXME("Unhandled dwInfoLevel %d\n", dwInfoLevel);
         err = WN_BAD_VALUE;
-        break;
+        goto err;
     }
 
+    if (fullName)
+        nsize = *lpBufferSize - size;
+    else
+        nsize = 0;
+
+    /* Determine if it's a local path or not */
+    err = WNetGetConnectionW(station, fullName, &nsize);
+
+    /* Append local path to nsize */
+    nsize += sizeof(WCHAR) * strlenW(&lpLocalPath[2]);
+
+    /* Calculate buffer size and set it */
+    bufsize = size + nsize;
+    if (dwInfoLevel == REMOTE_NAME_INFO_LEVEL)
+        bufsize += nsize + sizeof(WCHAR);
+    if (*lpBufferSize < bufsize)
+        err = WN_MORE_DATA;
+    *lpBufferSize = bufsize;
+    if (err == WN_MORE_DATA)
+        goto err;
+
+    if (dwInfoLevel == REMOTE_NAME_INFO_LEVEL) {
+        LPREMOTE_NAME_INFOW info = lpBuffer;
+        if (err != WN_SUCCESS)
+            goto err;
+
+        strcpyW(info->lpConnectionName, fullName);
+        strcpyW(info->lpRemainingPath, &lpLocalPath[2]);
+    }
+
+    if (err == WN_SUCCESS) {
+        strcpyW(&fullName[strlenW(fullName)], &lpLocalPath[2]);
+    }
+    else if (err == WN_NOT_CONNECTED) {
+        err = WN_SUCCESS;
+        strcpyW(fullName, lpLocalPath);
+    }
+
+    TRACE("Returning path %s\n", debugstr_w(fullName));
+
+    err:
     SetLastError(err);
     return err;
 }
-- 
1.4.4.2



More information about the wine-patches mailing list