Alistair Leslie-Hughes : dpwsockx: Implementation of GetCaps callback.

Alexandre Julliard julliard at winehq.org
Wed Mar 1 16:45:10 CST 2017


Module: wine
Branch: master
Commit: 8952040a0e46bc531bbc18a0c045584ca2bbedd0
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=8952040a0e46bc531bbc18a0c045584ca2bbedd0

Author: Alistair Leslie-Hughes <leslie_alistair at hotmail.com>
Date:   Tue Feb 28 23:17:17 2017 +0000

dpwsockx: Implementation of GetCaps callback.

Based on patch by Ismael Barros.

Signed-off-by: Alistair Leslie-Hughes <leslie_alistair at hotmail.com>
Signed-off-by: Bruno Jesus <bjesus at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/dplayx/dplay.c           |  6 +++++
 dlls/dplayx/tests/dplayx.c    | 56 ++++++++++++++++++++-----------------------
 dlls/dpwsockx/dpwsockx_dll.h  |  9 +++++++
 dlls/dpwsockx/dpwsockx_main.c | 27 +++++++++++++++++++--
 4 files changed, 66 insertions(+), 32 deletions(-)

diff --git a/dlls/dplayx/dplay.c b/dlls/dplayx/dplay.c
index f4d934f..4a80f1c 100644
--- a/dlls/dplayx/dplay.c
+++ b/dlls/dplayx/dplay.c
@@ -2891,9 +2891,15 @@ static HRESULT WINAPI IDirectPlay4Impl_GetPlayerCaps( IDirectPlay4 *iface, DPID
 
     TRACE( "(%p)->(0x%08x,%p,0x%08x)\n", This, player, caps, flags);
 
+    if ( !caps )
+        return DPERR_INVALIDPARAMS;
+
     if ( This->dp2->connectionInitialized == NO_PROVIDER )
         return DPERR_UNINITIALIZED;
 
+    if( caps->dwSize != sizeof(DPCAPS) )
+        return DPERR_INVALIDPARAMS;
+
     /* Query the service provider */
     data.idPlayer = player;
     data.dwFlags = flags;
diff --git a/dlls/dplayx/tests/dplayx.c b/dlls/dplayx/tests/dplayx.c
index de392aa..4c68873 100644
--- a/dlls/dplayx/tests/dplayx.c
+++ b/dlls/dplayx/tests/dplayx.c
@@ -1088,7 +1088,7 @@ static void test_GetCaps(void)
 
     /* dpcaps not ininitialized */
     hr = IDirectPlayX_GetCaps( pDP, &dpcaps, 0 );
-    todo_wine checkHR( DPERR_INVALIDPARAMS, hr );
+    checkHR( DPERR_INVALIDPARAMS, hr );
 
     dpcaps.dwSize = sizeof(DPCAPS);
 
@@ -1098,35 +1098,30 @@ static void test_GetCaps(void)
     {
 
         hr = IDirectPlayX_GetCaps( pDP, &dpcaps, dwFlags );
-        todo_wine checkHR( DP_OK, hr );
-
-
-        if ( hr == DP_OK )
+        checkHR( DP_OK, hr );
+        check( sizeof(DPCAPS), dpcaps.dwSize );
+        check( DPCAPS_ASYNCSUPPORTED |
+               DPCAPS_GUARANTEEDOPTIMIZED |
+               DPCAPS_GUARANTEEDSUPPORTED,
+               dpcaps.dwFlags );
+        check( 0,     dpcaps.dwMaxQueueSize );
+        check( 0,     dpcaps.dwHundredBaud );
+        check( 500,   dpcaps.dwLatency );
+        check( 65536, dpcaps.dwMaxLocalPlayers );
+        check( 20,    dpcaps.dwHeaderLength );
+        check( 5000,  dpcaps.dwTimeout );
+
+        switch (dwFlags)
         {
-            check( sizeof(DPCAPS), dpcaps.dwSize );
-            check( DPCAPS_ASYNCSUPPORTED |
-                   DPCAPS_GUARANTEEDOPTIMIZED |
-                   DPCAPS_GUARANTEEDSUPPORTED,
-                   dpcaps.dwFlags );
-            check( 0,     dpcaps.dwMaxQueueSize );
-            check( 0,     dpcaps.dwHundredBaud );
-            check( 500,   dpcaps.dwLatency );
-            check( 65536, dpcaps.dwMaxLocalPlayers );
-            check( 20,    dpcaps.dwHeaderLength );
-            check( 5000,  dpcaps.dwTimeout );
-
-            switch (dwFlags)
-            {
-            case 0:
-                check( 65479,   dpcaps.dwMaxBufferSize );
-                check( 65536,   dpcaps.dwMaxPlayers );
-                break;
-            case DPGETCAPS_GUARANTEED:
-                check( 1048547, dpcaps.dwMaxBufferSize );
-                check( 64,      dpcaps.dwMaxPlayers );
-                break;
-            default: break;
-            }
+        case 0:
+            check( 65479,   dpcaps.dwMaxBufferSize );
+            check( 65536,   dpcaps.dwMaxPlayers );
+            break;
+        case DPGETCAPS_GUARANTEED:
+            check( 1048547, dpcaps.dwMaxBufferSize );
+            check( 64,      dpcaps.dwMaxPlayers );
+            break;
+        default: break;
         }
     }
 
@@ -2189,7 +2184,6 @@ static void test_GetPlayerCaps(void)
     hr = IDirectPlayX_GetPlayerCaps( pDP[0], dpid[0], &playerCaps, 0 );
     checkHR( DPERR_INVALIDPARAMS, hr );
 
-
     /* Invalid player */
     playerCaps.dwSize = sizeof(DPCAPS);
 
@@ -2202,6 +2196,8 @@ static void test_GetPlayerCaps(void)
     hr = IDirectPlayX_GetPlayerCaps( pDP[0], dpid[0], &playerCaps, 0 );
     checkHR( DP_OK, hr );
 
+    hr = IDirectPlayX_GetPlayerCaps( pDP[0], dpid[0], NULL, 0 );
+    checkHR( DPERR_INVALIDPARAMS, hr );
 
     /* Regular parameters */
     for (i=0; i<2; i++)
diff --git a/dlls/dpwsockx/dpwsockx_dll.h b/dlls/dpwsockx/dpwsockx_dll.h
index 1a6ad6c..ea3780f 100644
--- a/dlls/dpwsockx/dpwsockx_dll.h
+++ b/dlls/dpwsockx/dpwsockx_dll.h
@@ -25,6 +25,15 @@
 #include "winnt.h"
 #include "wine/dplaysp.h"
 
+#define DPWS_MAXQUEUESIZE             0
+#define DPWS_HUNDREDBAUD              0
+#define DPWS_LATENCY                  500
+#define DPWS_MAXLOCALPLAYERS          65536
+#define DPWS_TIMEOUT                  5000
+#define DPWS_MAXBUFFERSIZE            65479
+#define DPWS_MAXPLAYERS               65536
+#define DPWS_GUARANTEED_MAXBUFFERSIZE 1048547
+#define DPWS_GUARANTEED_MAXPLAYERS    64
 
 typedef struct tagDPWS_THREADDATA
 {
diff --git a/dlls/dpwsockx/dpwsockx_main.c b/dlls/dpwsockx/dpwsockx_main.c
index 548f37e..9606d73 100644
--- a/dlls/dpwsockx/dpwsockx_main.c
+++ b/dlls/dpwsockx/dpwsockx_main.c
@@ -100,9 +100,32 @@ static HRESULT WINAPI DPWSCB_GetAddress( LPDPSP_GETADDRESSDATA data )
 
 static HRESULT WINAPI DPWSCB_GetCaps( LPDPSP_GETCAPSDATA data )
 {
-    FIXME( "(%d,%p,0x%08x,%p)\n",
+    TRACE( "(%d,%p,0x%08x,%p)\n",
            data->idPlayer, data->lpCaps, data->dwFlags, data->lpISP );
-    return DPERR_UNSUPPORTED;
+
+    data->lpCaps->dwFlags = ( DPCAPS_ASYNCSUPPORTED |
+                              DPCAPS_GUARANTEEDOPTIMIZED |
+                              DPCAPS_GUARANTEEDSUPPORTED );
+
+    data->lpCaps->dwMaxQueueSize    = DPWS_MAXQUEUESIZE;
+    data->lpCaps->dwHundredBaud     = DPWS_HUNDREDBAUD;
+    data->lpCaps->dwLatency         = DPWS_LATENCY;
+    data->lpCaps->dwMaxLocalPlayers = DPWS_MAXLOCALPLAYERS;
+    data->lpCaps->dwHeaderLength    = sizeof(DPSP_MSG_HEADER);
+    data->lpCaps->dwTimeout         = DPWS_TIMEOUT;
+
+    if ( data->dwFlags & DPGETCAPS_GUARANTEED )
+    {
+        data->lpCaps->dwMaxBufferSize = DPWS_GUARANTEED_MAXBUFFERSIZE;
+        data->lpCaps->dwMaxPlayers    = DPWS_GUARANTEED_MAXPLAYERS;
+    }
+    else
+    {
+        data->lpCaps->dwMaxBufferSize = DPWS_MAXBUFFERSIZE;
+        data->lpCaps->dwMaxPlayers    = DPWS_MAXPLAYERS;
+    }
+
+    return DP_OK;
 }
 
 static HRESULT WINAPI DPWSCB_Open( LPDPSP_OPENDATA data )




More information about the wine-cvs mailing list