Konstantin Kondratyuk : mpr: Implement WNetGetResourceInformation functions .
Alexandre Julliard
julliard at winehq.org
Mon Oct 1 07:55:05 CDT 2007
Module: wine
Branch: master
Commit: 7fb98bfba55ca7114d4c5ab352d6de4eff4050cc
URL: http://source.winehq.org/git/wine.git/?a=commit;h=7fb98bfba55ca7114d4c5ab352d6de4eff4050cc
Author: Konstantin Kondratyuk <kondratyuk at etersoft.ru>
Date: Mon Oct 1 11:58:59 2007 +0400
mpr: Implement WNetGetResourceInformation functions.
---
dlls/mpr/wnet.c | 146 ++++++++++++++++++++++++++++++++++++++++++++++++++++---
include/npapi.h | 2 +
2 files changed, 141 insertions(+), 7 deletions(-)
diff --git a/dlls/mpr/wnet.c b/dlls/mpr/wnet.c
index 6d08692..16ac984 100644
--- a/dlls/mpr/wnet.c
+++ b/dlls/mpr/wnet.c
@@ -52,6 +52,7 @@ typedef struct _WNetProvider
PF_NPOpenEnum openEnum;
PF_NPEnumResource enumResource;
PF_NPCloseEnum closeEnum;
+ PF_NPGetResourceInformation getResourceInformation;
} WNetProvider, *PWNetProvider;
typedef struct _WNetProviderTable
@@ -182,6 +183,10 @@ static void _tryLoadProvider(PCWSTR provider)
provider->closeEnum = (PF_NPCloseEnum)
GetProcAddress(hLib, "NPCloseEnum");
TRACE("closeEnum is %p\n", provider->closeEnum);
+ provider->getResourceInformation = (PF_NPGetResourceInformation)
+ GetProcAddress(hLib, "NPGetResourceInformation");
+ TRACE("getResourceInformation is %p\n",
+ provider->getResourceInformation);
if (!provider->openEnum || !provider->enumResource
|| !provider->closeEnum)
{
@@ -1281,30 +1286,157 @@ DWORD WINAPI WNetCloseEnum( HANDLE hEnum )
/*********************************************************************
* WNetGetResourceInformationA [MPR.@]
+ *
+ * See WNetGetResourceInformationW
*/
DWORD WINAPI WNetGetResourceInformationA( LPNETRESOURCEA lpNetResource,
LPVOID lpBuffer, LPDWORD cbBuffer,
LPSTR *lplpSystem )
{
- FIXME( "(%p, %p, %p, %p): stub\n",
+ DWORD ret;
+
+ TRACE( "(%p, %p, %p, %p)\n",
lpNetResource, lpBuffer, cbBuffer, lplpSystem );
- SetLastError(WN_NO_NETWORK);
- return WN_NO_NETWORK;
+ if (!providerTable || providerTable->numProviders == 0)
+ ret = WN_NO_NETWORK;
+ else if (lpNetResource)
+ {
+ LPNETRESOURCEW lpNetResourceW = NULL;
+ DWORD size = 1024, count = 1;
+ DWORD len;
+
+ lpNetResourceW = HeapAlloc(GetProcessHeap(), 0, size);
+ ret = _thunkNetResourceArrayAToW(lpNetResource, &count, lpNetResourceW, &size);
+ if (ret == WN_MORE_DATA)
+ {
+ lpNetResourceW = HeapAlloc(GetProcessHeap(), 0, size);
+ if (lpNetResourceW)
+ ret = _thunkNetResourceArrayAToW(lpNetResource,
+ &count, lpNetResourceW, &size);
+ else
+ ret = WN_OUT_OF_MEMORY;
+ }
+ if (ret == WN_SUCCESS)
+ {
+ LPWSTR lpSystemW;
+ LPVOID lpBufferW;
+ size = 1024;
+ lpBufferW = HeapAlloc(GetProcessHeap(), 0, size);
+ if (lpBufferW)
+ {
+ ret = WNetGetResourceInformationW(lpNetResourceW,
+ lpBufferW, &size, &lpSystemW);
+ if (ret == WN_MORE_DATA)
+ {
+ HeapFree(GetProcessHeap(), 0, lpBufferW);
+ lpBufferW = HeapAlloc(GetProcessHeap(), 0, size);
+ if (lpBufferW)
+ ret = WNetGetResourceInformationW(lpNetResourceW,
+ lpBufferW, &size, &lpSystemW);
+ else
+ ret = WN_OUT_OF_MEMORY;
+ }
+ if (ret == WN_SUCCESS)
+ {
+ ret = _thunkNetResourceArrayWToA(lpBufferW,
+ &count, lpBuffer, cbBuffer);
+ lpNetResourceW = lpBufferW;
+ size = sizeof(NETRESOURCEA);
+ size += WideCharToMultiByte(CP_ACP, 0, lpNetResourceW->lpRemoteName,
+ -1, NULL, 0, NULL, NULL);
+ size += WideCharToMultiByte(CP_ACP, 0, lpNetResourceW->lpProvider,
+ -1, NULL, 0, NULL, NULL);
+
+ len = WideCharToMultiByte(CP_ACP, 0, lpSystemW,
+ -1, NULL, 0, NULL, NULL);
+ if ((len) && ( size + len < *cbBuffer))
+ {
+ *lplpSystem = (char*)lpBuffer + *cbBuffer - len;
+ WideCharToMultiByte(CP_ACP, 0, lpSystemW, -1,
+ *lplpSystem, len, NULL, NULL);
+ ret = WN_SUCCESS;
+ }
+ else
+ ret = WN_MORE_DATA;
+ }
+ else
+ ret = WN_OUT_OF_MEMORY;
+ HeapFree(GetProcessHeap(), 0, lpBufferW);
+ }
+ else
+ ret = WN_OUT_OF_MEMORY;
+ HeapFree(GetProcessHeap(), 0, lpSystemW);
+ }
+ HeapFree(GetProcessHeap(), 0, lpNetResourceW);
+ }
+ else
+ ret = WN_NO_NETWORK;
+
+ if (ret)
+ SetLastError(ret);
+ TRACE("Returning %d\n", ret);
+ return ret;
}
/*********************************************************************
* WNetGetResourceInformationW [MPR.@]
+ *
+ * WNetGetResourceInformationW function identifies the network provider
+ * that owns the resource and gets information about the type of the resource.
+ *
+ * PARAMS:
+ * lpNetResource [ I] the pointer to NETRESOURCEW structure, that
+ * defines a network resource.
+ * lpBuffer [ O] the pointer to buffer, containing result. It
+ * contains NETRESOURCEW structure and strings to
+ * which the members of the NETRESOURCEW structure
+ * point.
+ * cbBuffer [I/O] the pointer to DWORD number - size of buffer
+ * in bytes.
+ * lplpSystem [ O] the pointer to string in the output buffer,
+ * containing the part of the resource name without
+ * names of the server and share.
+ *
+ * RETURNS:
+ * NO_ERROR if the function succeeds. System error code if the function fails.
*/
+
DWORD WINAPI WNetGetResourceInformationW( LPNETRESOURCEW lpNetResource,
LPVOID lpBuffer, LPDWORD cbBuffer,
LPWSTR *lplpSystem )
{
- FIXME( "(%p, %p, %p, %p): stub\n",
- lpNetResource, lpBuffer, cbBuffer, lplpSystem );
+ DWORD ret = WN_NO_NETWORK;
+ DWORD index;
- SetLastError(WN_NO_NETWORK);
- return WN_NO_NETWORK;
+ TRACE( "(%p, %p, %p, %p): stub\n",
+ lpNetResource, lpBuffer, cbBuffer, lplpSystem);
+
+ if (!(lpBuffer))
+ ret = WN_OUT_OF_MEMORY;
+ else
+ {
+ /* FIXME: For function value of a variable is indifferent, it does
+ * search of all providers in a network.
+ */
+ for (index = 0; index < providerTable->numProviders; index++)
+ {
+ if(providerTable->table[index].getCaps(WNNC_DIALOG) &
+ WNNC_DLG_GETRESOURCEINFORMATION)
+ {
+ if (providerTable->table[index].getResourceInformation)
+ ret = providerTable->table[index].getResourceInformation(
+ lpNetResource, lpBuffer, cbBuffer, lplpSystem);
+ else
+ ret = WN_NO_NETWORK;
+ if (ret == WN_SUCCESS)
+ break;
+ }
+ }
+ }
+ if (ret)
+ SetLastError(ret);
+ return ret;
}
/*********************************************************************
diff --git a/include/npapi.h b/include/npapi.h
index e84bfe4..47aa2e3 100644
--- a/include/npapi.h
+++ b/include/npapi.h
@@ -70,6 +70,8 @@ typedef DWORD (APIENTRY *PF_NPOpenEnum)(DWORD dwScope, DWORD dwType, DWORD dwUsa
typedef DWORD (APIENTRY *PF_NPEnumResource)(HANDLE hEnum, LPDWORD lpcCount,
LPVOID lpBuffer, LPDWORD lpBufferSize);
typedef DWORD (APIENTRY *PF_NPCloseEnum)(HANDLE hEnum);
+typedef DWORD (APIENTRY *PF_NPGetResourceInformation)(LPNETRESOURCEW lpNetResource,
+ LPVOID lpBuffer, LPDWORD lpcbBuffer, LPWSTR* lplpSystem);
/* connection-related */
typedef DWORD (APIENTRY *PF_NPAddConnection)(LPNETRESOURCEW lpNetResource,
More information about the wine-cvs
mailing list