dpnet: Store DPN_SP_CAPS as part of the object

Alistair Leslie-Hughes leslie_alistair at hotmail.com
Fri May 2 00:58:43 CDT 2014


Hi,

Changelog:
       dpnet: Store DPN_SP_CAPS as part of the object


Best Regards
   Alistair Leslie-Hughes
-------------- next part --------------
>From d4ad1c6db5ec8c4050c9c1a975360470196ade63 Mon Sep 17 00:00:00 2001
From: Alistair Leslie-Hughes <leslie_alistair at hotmail.com>
Date: Fri, 14 Feb 2014 15:37:23 +1100
Subject: [PATCH] Store DPN_SP_CAPS as part of the object
To: wine-patches <wine-patches at winehq.org>

---
 dlls/dpnet/dpnet_private.h |  3 +++
 dlls/dpnet/peer.c          | 34 ++++++++++++++++++++++++----------
 dlls/dpnet/tests/peer.c    |  7 +++++++
 3 files changed, 34 insertions(+), 10 deletions(-)

diff --git a/dlls/dpnet/dpnet_private.h b/dlls/dpnet/dpnet_private.h
index 533d700..1b46995 100644
--- a/dlls/dpnet/dpnet_private.h
+++ b/dlls/dpnet/dpnet_private.h
@@ -124,6 +124,9 @@ extern HRESULT DPNET_CreateDirectPlay8Address(LPCLASSFACTORY iface, LPUNKNOWN pu
 extern HRESULT DPNET_CreateDirectPlay8LobbiedApp(LPCLASSFACTORY iface, LPUNKNOWN punkOuter, REFIID riid, LPVOID *ppobj) DECLSPEC_HIDDEN;
 extern HRESULT DPNET_CreateDirectPlay8ThreadPool(LPCLASSFACTORY iface, LPUNKNOWN punkOuter, REFIID riid, LPVOID *ppobj) DECLSPEC_HIDDEN;
 
+
+void init_dpn_sp_caps(DPN_SP_CAPS * pdpspCaps) DECLSPEC_HIDDEN;
+
 /* used for generic dumping (copied from ddraw) */
 typedef struct {
     DWORD val;
diff --git a/dlls/dpnet/peer.c b/dlls/dpnet/peer.c
index 2704647..1bb33ff 100644
--- a/dlls/dpnet/peer.c
+++ b/dlls/dpnet/peer.c
@@ -47,6 +47,8 @@ typedef struct IDirectPlay8PeerImpl
     PFNDPNMESSAGEHANDLER msghandler;
     DWORD flags;
     void *usercontext;
+
+    DPN_SP_CAPS spcaps;
 } IDirectPlay8PeerImpl;
 
 static inline IDirectPlay8PeerImpl *impl_from_IDirectPlay8Peer(IDirectPlay8Peer *iface)
@@ -467,22 +469,19 @@ static HRESULT WINAPI IDirectPlay8PeerImpl_SetSPCaps(IDirectPlay8Peer *iface, co
 static HRESULT WINAPI IDirectPlay8PeerImpl_GetSPCaps(IDirectPlay8Peer *iface, const GUID * const pguidSP,
         DPN_SP_CAPS * const pdpspCaps, const DWORD dwFlags)
 {
-    TRACE("(%p)->(%p,%p,%x)\n", iface, pguidSP, pdpspCaps, dwFlags);
+    IDirectPlay8PeerImpl* This = impl_from_IDirectPlay8Peer(iface);
+
+    TRACE("(%p)->(%p,%p,%x)\n", This, pguidSP, pdpspCaps, dwFlags);
+
+    if(!This->msghandler)
+        return DPNERR_UNINITIALIZED;
 
     if(pdpspCaps->dwSize != sizeof(DPN_SP_CAPS))
     {
         return DPNERR_INVALIDPARAM;
     }
 
-    pdpspCaps->dwFlags = DPNSPCAPS_SUPPORTSDPNSRV | DPNSPCAPS_SUPPORTSBROADCAST |
-                         DPNSPCAPS_SUPPORTSALLADAPTERS | DPNSPCAPS_SUPPORTSTHREADPOOL;
-    pdpspCaps->dwNumThreads = 3;
-    pdpspCaps->dwDefaultEnumCount = 5;
-    pdpspCaps->dwDefaultEnumRetryInterval = 1500;
-    pdpspCaps->dwDefaultEnumTimeout = 1500;
-    pdpspCaps->dwMaxEnumPayloadSize = 983;
-    pdpspCaps->dwBuffersPerThread = 1;
-    pdpspCaps->dwSystemBufferSize = 0x10000;
+    *pdpspCaps = This->spcaps;
 
     return DPN_OK;
 }
@@ -552,6 +551,19 @@ static const IDirectPlay8PeerVtbl DirectPlay8Peer_Vtbl =
     IDirectPlay8PeerImpl_TerminateSession
 };
 
+void init_dpn_sp_caps(DPN_SP_CAPS * pdpspCaps)
+{
+    pdpspCaps->dwFlags = DPNSPCAPS_SUPPORTSDPNSRV | DPNSPCAPS_SUPPORTSBROADCAST |
+                         DPNSPCAPS_SUPPORTSALLADAPTERS | DPNSPCAPS_SUPPORTSTHREADPOOL;
+    pdpspCaps->dwNumThreads = 3;
+    pdpspCaps->dwDefaultEnumCount = 5;
+    pdpspCaps->dwDefaultEnumRetryInterval = 1500;
+    pdpspCaps->dwDefaultEnumTimeout = 1500;
+    pdpspCaps->dwMaxEnumPayloadSize = 983;
+    pdpspCaps->dwBuffersPerThread = 1;
+    pdpspCaps->dwSystemBufferSize = 0x10000;
+};
+
 HRESULT DPNET_CreateDirectPlay8Peer(IClassFactory *iface, IUnknown *pUnkOuter, REFIID riid, LPVOID *ppobj)
 {
     IDirectPlay8PeerImpl* Client;
@@ -573,6 +585,8 @@ HRESULT DPNET_CreateDirectPlay8Peer(IClassFactory *iface, IUnknown *pUnkOuter, R
     Client->msghandler = NULL;
     Client->flags = 0;
 
+    init_dpn_sp_caps(&Client->spcaps);
+
     ret = IDirectPlay8Peer_QueryInterface(&Client->IDirectPlay8Peer_iface, riid, ppobj);
     IDirectPlay8Peer_Release(&Client->IDirectPlay8Peer_iface);
 
diff --git a/dlls/dpnet/tests/peer.c b/dlls/dpnet/tests/peer.c
index d1f3504..670b843 100644
--- a/dlls/dpnet/tests/peer.c
+++ b/dlls/dpnet/tests/peer.c
@@ -34,6 +34,7 @@ static HRESULT WINAPI DirectPlayMessageHandler(PVOID context, DWORD message_id,
 static void test_init_dp(void)
 {
     HRESULT hr;
+    DPN_SP_CAPS caps;
 
     hr = CoInitialize(0);
     ok(hr == S_OK, "CoInitialize failed with %x\n", hr);
@@ -41,6 +42,12 @@ static void test_init_dp(void)
     hr = CoCreateInstance(&CLSID_DirectPlay8Peer, NULL, CLSCTX_INPROC_SERVER, &IID_IDirectPlay8Peer, (void **)&peer);
     ok(hr == S_OK, "CoCreateInstance failed with 0x%x\n", hr);
 
+    memset(&caps, 0, sizeof(DPN_SP_CAPS));
+    caps.dwSize = sizeof(DPN_SP_CAPS);
+
+    hr = IDirectPlay8Peer_GetSPCaps(peer, &CLSID_DP8SP_TCPIP, &caps, 0);
+    ok(hr == DPNERR_UNINITIALIZED, "GetSPCaps failed with %x\n", hr);
+
     hr = IDirectPlay8Peer_Initialize(peer, NULL, NULL, 0);
     ok(hr == DPNERR_INVALIDPARAM, "got %x\n", hr);
 
-- 
1.9.1



More information about the wine-patches mailing list