From 8c3af5c263724837ef4598bb1fd2c0047dd84a12 Mon Sep 17 00:00:00 2001 From: Louis Lenders Date: Sun, 18 Sep 2011 22:26:49 +0200 Subject: dpnet: return a TCP/IP provider in IDirectPlay8PeerImpl_EnumServiceProviders --- dlls/dpnet/peer.c | 49 +++++++++++++++++++++++++++++++++++++++++++++- dlls/dpnet/tests/peer.c | 17 ++++++++------- 2 files changed, 56 insertions(+), 10 deletions(-) diff --git a/dlls/dpnet/peer.c b/dlls/dpnet/peer.c index f4d238a..d08eda2 100644 --- a/dlls/dpnet/peer.c +++ b/dlls/dpnet/peer.c @@ -95,8 +95,53 @@ static HRESULT WINAPI IDirectPlay8PeerImpl_EnumServiceProviders(IDirectPlay8Peer DPN_SERVICE_PROVIDER_INFO * const pSPInfoBuffer, DWORD * const pcbEnumData, DWORD * const pcReturned, const DWORD dwFlags) { - FIXME("(%p)->(%p,%p,%p,%p,%p,%x): stub\n", iface, pguidServiceProvider, pguidApplication, pSPInfoBuffer, pcbEnumData, pcReturned, dwFlags); - return DPNERR_GENERIC; + WCHAR dp_providerW[] = {'D','i','r','e','c','t','P','l','a','y','8',' ','T','C','P','/','I','P',' ', + 'S','e','r','v','i','c','e',' ','P','r','o','v','i','d','e','r','\0'}; + WCHAR dp_adapterW[] = {'L','o','c','a','l',' ','A','r','e','a',' ','C','o','n','n','e','c','t','i','o','n', + ' ','-',' ','I','P','v','4','\0'}; + + const GUID adapter_guid = {0x4ce725f6, 0xd3c0, 0xdade, {0xba, 0x6f, 0x11, 0xf9, 0x65, 0xbc, 0x42, 0x99}}; + DWORD req_size; + + TRACE("(%p)->(%p,%p,%p,%p,%p,%x): stub\n", iface, pguidServiceProvider, pguidApplication, pSPInfoBuffer, + pcbEnumData, pcReturned, dwFlags); + + if(!pguidServiceProvider) + { + req_size = sizeof(DPN_SERVICE_PROVIDER_INFO) + sizeof(dp_providerW); + } + else if(IsEqualGUID(pguidServiceProvider, &CLSID_DP8SP_TCPIP)) + { + req_size = sizeof(DPN_SERVICE_PROVIDER_INFO) + sizeof(dp_adapterW); + } + else + { + FIXME("Application requested a provider we don't handle (yet)\n"); + *pcReturned = 0; + return DPNERR_DOESNOTEXIST; + } + + if(*pcbEnumData < req_size) + { + *pcbEnumData = req_size; + return DPNERR_BUFFERTOOSMALL; + } + + pSPInfoBuffer->pwszName = (LPWSTR)(pSPInfoBuffer + sizeof(DPN_SERVICE_PROVIDER_INFO)); + + if(!pguidServiceProvider) + { + lstrcpyW(pSPInfoBuffer->pwszName, dp_providerW); + pSPInfoBuffer->guid = CLSID_DP8SP_TCPIP; + } + else + { + lstrcpyW(pSPInfoBuffer->pwszName, dp_adapterW); + pSPInfoBuffer->guid = adapter_guid; + } + + *pcReturned = 1; + return DPN_OK; } static HRESULT WINAPI IDirectPlay8PeerImpl_CancelAsyncOperation(IDirectPlay8Peer *iface, diff --git a/dlls/dpnet/tests/peer.c b/dlls/dpnet/tests/peer.c index 1d6dfc9..67e0ace 100644 --- a/dlls/dpnet/tests/peer.c +++ b/dlls/dpnet/tests/peer.c @@ -67,14 +67,14 @@ static void test_enum_service_providers(void) items = 0; hr = IDirectPlay8Peer_EnumServiceProviders(peer, NULL, NULL, NULL, &size, &items, 0); - todo_wine ok(hr == DPNERR_BUFFERTOOSMALL, "IDirectPlay8Peer_EnumServiceProviders failed with %x\n", hr); - todo_wine ok(size != 0, "size is unexpectedly 0\n"); + ok(hr == DPNERR_BUFFERTOOSMALL, "IDirectPlay8Peer_EnumServiceProviders failed with %x\n", hr); + ok(size != 0, "size is unexpectedly 0\n"); serv_prov_info = (DPN_SERVICE_PROVIDER_INFO*) HeapAlloc(GetProcessHeap(), 0, size); hr = IDirectPlay8Peer_EnumServiceProviders(peer, NULL, NULL, serv_prov_info, &size, &items, 0); - todo_wine ok(hr == S_OK, "IDirectPlay8Peer_EnumServiceProviders failed with %x\n", hr); - todo_wine ok(items != 0, "Found unexpectedly no service providers\n"); + ok(hr == S_OK, "IDirectPlay8Peer_EnumServiceProviders failed with %x\n", hr); + ok(items != 0, "Found unexpectedly no service providers\n"); trace("number of items found: %d\n", items); @@ -93,14 +93,15 @@ static void test_enum_service_providers(void) items = 0; hr = IDirectPlay8Peer_EnumServiceProviders(peer, &CLSID_DP8SP_TCPIP, NULL, NULL, &size, &items, 0); - todo_wine ok(hr == DPNERR_BUFFERTOOSMALL, "IDirectPlay8Peer_EnumServiceProviders failed with %x\n", hr); - todo_wine ok(size != 0, "size is unexpectedly 0\n"); + ok(hr == DPNERR_BUFFERTOOSMALL, "IDirectPlay8Peer_EnumServiceProviders failed with %x\n", hr); + ok(size != 0, "size is unexpectedly 0\n"); serv_prov_info = (DPN_SERVICE_PROVIDER_INFO*) HeapAlloc(GetProcessHeap(), 0, size); hr = IDirectPlay8Peer_EnumServiceProviders(peer, &CLSID_DP8SP_TCPIP, NULL, serv_prov_info, &size, &items, 0); - todo_wine ok(hr == S_OK, "IDirectPlay8Peer_EnumServiceProviders failed with %x\n", hr); - todo_wine ok(items != 0, "Found unexpectedly no adapter\n"); + ok(hr == S_OK, "IDirectPlay8Peer_EnumServiceProviders failed with %x\n", hr); + ok(items != 0, "Found unexpectedly no adapter\n"); + for (i=0;i