Pierre Schweitzer : mpr: Partially implement WNetUseConnectionW().
Alexandre Julliard
julliard at wine.codeweavers.com
Mon Feb 15 09:41:50 CST 2016
Module: wine
Branch: master
Commit: d070c263adf840cc14dde84eb8e73b04490d1900
URL: http://source.winehq.org/git/wine.git/?a=commit;h=d070c263adf840cc14dde84eb8e73b04490d1900
Author: Pierre Schweitzer <pierre at reactos.org>
Date: Fri Feb 12 14:03:44 2016 +0300
mpr: Partially implement WNetUseConnectionW().
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/mpr/wnet.c | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++-------
1 file changed, 71 insertions(+), 9 deletions(-)
diff --git a/dlls/mpr/wnet.c b/dlls/mpr/wnet.c
index 834a826..62e1479 100644
--- a/dlls/mpr/wnet.c
+++ b/dlls/mpr/wnet.c
@@ -1582,17 +1582,79 @@ DWORD WINAPI WNetUseConnectionA( HWND hwndOwner, LPNETRESOURCEA lpNetResource,
/*****************************************************************
* WNetUseConnectionW [MPR.@]
*/
-DWORD WINAPI WNetUseConnectionW( HWND hwndOwner, LPNETRESOURCEW lpNetResource,
- LPCWSTR lpPassword, LPCWSTR lpUserID, DWORD dwFlags,
- LPWSTR lpAccessName, LPDWORD lpBufferSize,
- LPDWORD lpResult )
+DWORD WINAPI WNetUseConnectionW( HWND hwndOwner, NETRESOURCEW *resource, LPCWSTR password,
+ LPCWSTR userid, DWORD flags, LPWSTR accessname, DWORD *buffer_size, DWORD *result )
{
- FIXME( "(%p, %p, %p, %s, 0x%08X, %s, %p, %p), stub\n",
- hwndOwner, lpNetResource, lpPassword, debugstr_w(lpUserID), dwFlags,
- debugstr_w(lpAccessName), lpBufferSize, lpResult );
+ WNetProvider *provider;
+ DWORD index, ret, caps;
- SetLastError(WN_NO_NETWORK);
- return WN_NO_NETWORK;
+ TRACE( "(%p, %p, %p, %s, 0x%08X, %p, %p, %p)\n",
+ hwndOwner, resource, password, debugstr_w(userid), flags,
+ accessname, buffer_size, result );
+
+ if (!providerTable || providerTable->numProviders == 0)
+ return WN_NO_NETWORK;
+
+ if (!resource)
+ return ERROR_INVALID_PARAMETER;
+
+ if (!resource->lpProvider)
+ {
+ FIXME("Networking provider selection is not implemented.\n");
+ return WN_NO_NETWORK;
+ }
+
+ if (!resource->lpLocalName && (flags & CONNECT_REDIRECT))
+ {
+ FIXME("Locale device selection is not implemented.\n");
+ return WN_NO_NETWORK;
+ }
+
+ if (flags & CONNECT_INTERACTIVE)
+ return ERROR_BAD_NET_NAME;
+
+ index = _findProviderIndexW(resource->lpProvider);
+ if (index == BAD_PROVIDER_INDEX)
+ return ERROR_BAD_PROVIDER;
+
+ provider = &providerTable->table[index];
+ caps = provider->getCaps(WNNC_CONNECTION);
+ if (!(caps & (WNNC_CON_ADDCONNECTION | WNNC_CON_ADDCONNECTION3)))
+ return ERROR_BAD_PROVIDER;
+
+ if (accessname && buffer_size && *buffer_size)
+ {
+ DWORD len;
+
+ if (resource->lpLocalName)
+ len = strlenW(resource->lpLocalName);
+ else
+ len = strlenW(resource->lpRemoteName);
+
+ if (++len > *buffer_size)
+ {
+ *buffer_size = len;
+ return ERROR_MORE_DATA;
+ }
+ }
+ else
+ accessname = NULL;
+
+ ret = WN_ACCESS_DENIED;
+ if ((caps & WNNC_CON_ADDCONNECTION3) && provider->addConnection3)
+ ret = provider->addConnection3(hwndOwner, resource, (LPWSTR)password, (LPWSTR)userid, flags);
+ else if ((caps & WNNC_CON_ADDCONNECTION) && provider->addConnection)
+ ret = provider->addConnection(resource, (LPWSTR)password, (LPWSTR)userid);
+
+ if (ret == WN_SUCCESS && accessname)
+ {
+ if (resource->lpLocalName)
+ strcpyW(accessname, resource->lpLocalName);
+ else
+ strcpyW(accessname, resource->lpRemoteName);
+ }
+
+ return ret;
}
/*********************************************************************
More information about the wine-cvs
mailing list