Module: wine Branch: master Commit: 7fb98bfba55ca7114d4c5ab352d6de4eff4050cc URL: http://source.winehq.org/git/wine.git/?a=commit;h=7fb98bfba55ca7114d4c5ab352...
Author: Konstantin Kondratyuk kondratyuk@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,