[PATCH 41/54] dplayx: Merge the IDirectPlay4_EnumSessions helper.

Michael Stefaniuc mstefani at redhat.de
Fri Mar 29 11:04:20 CDT 2013


---
 dlls/dplayx/dplay.c | 276 +++++++++++++++++++++-------------------------------
 1 file changed, 111 insertions(+), 165 deletions(-)

diff --git a/dlls/dplayx/dplay.c b/dlls/dplayx/dplay.c
index ff08b0b..b4102ea 100644
--- a/dlls/dplayx/dplay.c
+++ b/dlls/dplayx/dplay.c
@@ -130,10 +130,6 @@ static HRESULT DP_SP_SendEx
 static HRESULT DP_IF_CancelMessage
           ( IDirectPlay4Impl* This, DWORD dwMsgID, DWORD dwFlags,
             DWORD dwMinPriority, DWORD dwMaxPriority, BOOL bAnsi );
-static HRESULT DP_IF_EnumSessions
-          ( IDirectPlay2Impl* This, LPDPSESSIONDESC2 lpsd, DWORD dwTimeout,
-            LPDPENUMSESSIONSCALLBACK2 lpEnumSessionsCallback2,
-            LPVOID lpContext, DWORD dwFlags, BOOL bAnsi );
 static BOOL CALLBACK cbDPCreateEnumConnections( LPCGUID lpguidSP,
     LPVOID lpConnection, DWORD dwConnectionSize, LPCDPNAME lpName,
     DWORD dwFlags, LPVOID lpContext );
@@ -1826,186 +1822,136 @@ static void DP_KillEnumSessionThread( IDirectPlay2Impl* This )
   }
 }
 
-static HRESULT DP_IF_EnumSessions
-          ( IDirectPlay2Impl* This, LPDPSESSIONDESC2 lpsd, DWORD dwTimeout,
-            LPDPENUMSESSIONSCALLBACK2 lpEnumSessionsCallback2,
-            LPVOID lpContext, DWORD dwFlags, BOOL bAnsi )
+static HRESULT WINAPI IDirectPlay4AImpl_EnumSessions( IDirectPlay4A *iface, DPSESSIONDESC2 *sdesc,
+        DWORD timeout, LPDPENUMSESSIONSCALLBACK2 enumsessioncb, void *context, DWORD flags )
 {
-  HRESULT hr = DP_OK;
-
-  TRACE( "(%p)->(%p,0x%08x,%p,%p,0x%08x,%u)\n",
-         This, lpsd, dwTimeout, lpEnumSessionsCallback2, lpContext, dwFlags,
-         bAnsi );
-  if( This->dp2->connectionInitialized == NO_PROVIDER )
-  {
-    return DPERR_UNINITIALIZED;
-  }
-
-  /* Can't enumerate if the interface is already open */
-  if( This->dp2->bConnectionOpen )
-  {
-    return DPERR_GENERIC;
-  }
-
-#if 1
-  /* The loading of a lobby provider _seems_ to require a backdoor loading
-   * of the service provider to also associate with this DP object. This is
-   * because the app doesn't seem to have to call EnumConnections and
-   * InitializeConnection for the SP before calling this method. As such
-   * we'll do their dirty work for them with a quick hack so as to always
-   * load the TCP/IP service provider.
-   *
-   * The correct solution would seem to involve creating a dialog box which
-   * contains the possible SPs. These dialog boxes most likely follow SDK
-   * examples.
-   */
-   if( This->dp2->bDPLSPInitialized && !This->dp2->bSPInitialized )
-   {
-     LPVOID lpConnection;
-     DWORD  dwSize;
-
-     WARN( "Hack providing TCP/IP SP for lobby provider activated\n" );
-
-     if( !DP_BuildSPCompoundAddr( (LPGUID)&DPSPGUID_TCPIP, &lpConnection, &dwSize ) )
-     {
-       ERR( "Can't build compound addr\n" );
-       return DPERR_GENERIC;
-     }
-
-     hr = IDirectPlayX_InitializeConnection( &This->IDirectPlay4_iface, lpConnection, 0 );
-     if( FAILED(hr) )
-     {
-       return hr;
-     }
-
-     /* Free up the address buffer */
-     HeapFree( GetProcessHeap(), 0, lpConnection );
-
-     /* The SP is now initialized */
-     This->dp2->bSPInitialized = TRUE;
-   }
-#endif
-
-
-  /* Use the service provider default? */
-  if( dwTimeout == 0 )
-  {
-    DPCAPS spCaps;
-    spCaps.dwSize = sizeof( spCaps );
-
-    IDirectPlayX_GetCaps( &This->IDirectPlay4_iface, &spCaps, 0 );
-    dwTimeout = spCaps.dwTimeout;
+    IDirectPlayImpl *This = impl_from_IDirectPlay4A( iface );
+    return IDirectPlayX_EnumSessions( &This->IDirectPlay4_iface, sdesc, timeout, enumsessioncb,
+            context, flags );
+}
 
-    /* The service provider doesn't provide one either! */
-    if( dwTimeout == 0 )
-    {
-      /* Provide the TCP/IP default */
-      dwTimeout = DPMSG_WAIT_5_SECS;
-    }
-  }
+static HRESULT WINAPI IDirectPlay4Impl_EnumSessions( IDirectPlay4 *iface, DPSESSIONDESC2 *sdesc,
+        DWORD timeout, LPDPENUMSESSIONSCALLBACK2 enumsessioncb, void *context, DWORD flags )
+{
+    IDirectPlayImpl *This = impl_from_IDirectPlay4( iface );
+    void *connection;
+    DWORD  size;
+    HRESULT hr = DP_OK;
 
-  if( dwFlags & DPENUMSESSIONS_STOPASYNC )
-  {
-    DP_KillEnumSessionThread( This );
-    return hr;
-  }
+    TRACE( "(%p)->(%p,0x%08x,%p,%p,0x%08x)\n", This, sdesc, timeout, enumsessioncb,
+            context, flags );
 
-  if( ( dwFlags & DPENUMSESSIONS_ASYNC ) )
-  {
-    /* Enumerate everything presently in the local session cache */
-    DP_InvokeEnumSessionCallbacks( lpEnumSessionsCallback2,
-                                   This->dp2->lpNameServerData, dwTimeout,
-                                   lpContext );
+    if ( This->dp2->connectionInitialized == NO_PROVIDER )
+        return DPERR_UNINITIALIZED;
 
-    if( This->dp2->dwEnumSessionLock != 0 )
-      return DPERR_CONNECTING;
+    /* Can't enumerate if the interface is already open */
+    if ( This->dp2->bConnectionOpen )
+        return DPERR_GENERIC;
 
-    /* See if we've already created a thread to service this interface */
-    if( This->dp2->hEnumSessionThread == INVALID_HANDLE_VALUE )
+    /* The loading of a lobby provider _seems_ to require a backdoor loading
+     * of the service provider to also associate with this DP object. This is
+     * because the app doesn't seem to have to call EnumConnections and
+     * InitializeConnection for the SP before calling this method. As such
+     * we'll do their dirty work for them with a quick hack so as to always
+     * load the TCP/IP service provider.
+     *
+     * The correct solution would seem to involve creating a dialog box which
+     * contains the possible SPs. These dialog boxes most likely follow SDK
+     * examples.
+     */
+    if ( This->dp2->bDPLSPInitialized && !This->dp2->bSPInitialized )
     {
-      DWORD dwThreadId;
-      This->dp2->dwEnumSessionLock++;
-
-      /* Send the first enum request inline since the user may cancel a dialog
-       * if one is presented. Also, may also have a connecting return code.
-       */
-      hr = NS_SendSessionRequestBroadcast( &lpsd->guidApplication,
-                                           dwFlags, &This->dp2->spData );
+        WARN( "Hack providing TCP/IP SP for lobby provider activated\n" );
 
-      if( SUCCEEDED(hr) )
-      {
-        EnumSessionAsyncCallbackData* lpData
-          = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof( *lpData ) );
-        /* FIXME: need to kill the thread on object deletion */
-        lpData->lpSpData  = &This->dp2->spData;
-
-        lpData->requestGuid = lpsd->guidApplication;
-        lpData->dwEnumSessionFlags = dwFlags;
-        lpData->dwTimeout = dwTimeout;
-
-        This->dp2->hKillEnumSessionThreadEvent =
-          CreateEventW( NULL, TRUE, FALSE, NULL );
-
-        if( !DuplicateHandle( GetCurrentProcess(),
-                              This->dp2->hKillEnumSessionThreadEvent,
-                              GetCurrentProcess(),
-                              &lpData->hSuicideRequest,
-                              0, FALSE, DUPLICATE_SAME_ACCESS )
-          )
+        if ( !DP_BuildSPCompoundAddr( (GUID*)&DPSPGUID_TCPIP, &connection, &size ) )
         {
-          ERR( "Can't duplicate thread killing handle\n" );
+            ERR( "Can't build compound addr\n" );
+            return DPERR_GENERIC;
         }
 
-        TRACE( ": creating EnumSessionsRequest thread\n" );
+        hr = IDirectPlayX_InitializeConnection( &This->IDirectPlay4_iface, connection, 0 );
+        if ( FAILED(hr) )
+            return hr;
 
-        This->dp2->hEnumSessionThread = CreateThread( NULL,
-                                                      0,
-                                                      DP_EnumSessionsSendAsyncRequestThread,
-                                                      lpData,
-                                                      0,
-                                                      &dwThreadId );
-      }
-      This->dp2->dwEnumSessionLock--;
+        HeapFree( GetProcessHeap(), 0, connection );
+        This->dp2->bSPInitialized = TRUE;
     }
-  }
-  else
-  {
-    /* Invalidate the session cache for the interface */
-    NS_InvalidateSessionCache( This->dp2->lpNameServerData );
 
-    /* Send the broadcast for session enumeration */
-    hr = NS_SendSessionRequestBroadcast( &lpsd->guidApplication,
-                                         dwFlags,
-                                         &This->dp2->spData );
 
+    /* Use the service provider default? */
+    if ( !timeout )
+    {
+        DPCAPS caps;
+        caps.dwSize = sizeof( caps );
 
-    SleepEx( dwTimeout, FALSE );
+        IDirectPlayX_GetCaps( &This->IDirectPlay4_iface, &caps, 0 );
+        timeout = caps.dwTimeout;
+        if ( !timeout )
+            timeout = DPMSG_WAIT_5_SECS; /* Provide the TCP/IP default */
+    }
 
-    DP_InvokeEnumSessionCallbacks( lpEnumSessionsCallback2,
-                                   This->dp2->lpNameServerData, dwTimeout,
-                                   lpContext );
-  }
+    if ( flags & DPENUMSESSIONS_STOPASYNC )
+    {
+        DP_KillEnumSessionThread( This );
+        return hr;
+    }
 
-  return hr;
-}
+    if ( flags & DPENUMSESSIONS_ASYNC )
+    {
+        /* Enumerate everything presently in the local session cache */
+        DP_InvokeEnumSessionCallbacks( enumsessioncb, This->dp2->lpNameServerData, timeout,
+                context );
 
-static HRESULT WINAPI IDirectPlay4AImpl_EnumSessions( IDirectPlay4A *iface, DPSESSIONDESC2 *lpsd,
-        DWORD dwTimeout, LPDPENUMSESSIONSCALLBACK2 lpEnumSessionsCallback2, void *lpContext,
-        DWORD dwFlags )
-{
-  IDirectPlayImpl *This = impl_from_IDirectPlay4A( iface );
-  return DP_IF_EnumSessions( This, lpsd, dwTimeout, lpEnumSessionsCallback2,
-                             lpContext, dwFlags, TRUE );
-}
+        if ( This->dp2->dwEnumSessionLock )
+            return DPERR_CONNECTING;
 
-static HRESULT WINAPI DirectPlay2WImpl_EnumSessions
-          ( LPDIRECTPLAY2 iface, LPDPSESSIONDESC2 lpsd, DWORD dwTimeout,
-            LPDPENUMSESSIONSCALLBACK2 lpEnumSessionsCallback2,
-            LPVOID lpContext, DWORD dwFlags )
-{
-  IDirectPlay2Impl *This = (IDirectPlay2Impl *)iface;
-  return DP_IF_EnumSessions( This, lpsd, dwTimeout, lpEnumSessionsCallback2,
-                             lpContext, dwFlags, FALSE );
+        /* See if we've already created a thread to service this interface */
+        if ( This->dp2->hEnumSessionThread == INVALID_HANDLE_VALUE )
+        {
+            DWORD tid;
+            This->dp2->dwEnumSessionLock++;
+
+            /* Send the first enum request inline since the user may cancel a dialog
+             * if one is presented. Also, may also have a connecting return code.
+             */
+            hr = NS_SendSessionRequestBroadcast( &sdesc->guidApplication, flags,
+                    &This->dp2->spData );
+
+            if ( SUCCEEDED(hr) )
+            {
+                EnumSessionAsyncCallbackData* data = HeapAlloc( GetProcessHeap(),
+                        HEAP_ZERO_MEMORY, sizeof( *data ) );
+                /* FIXME: need to kill the thread on object deletion */
+                data->lpSpData  = &This->dp2->spData;
+                data->requestGuid = sdesc->guidApplication;
+                data->dwEnumSessionFlags = flags;
+                data->dwTimeout = timeout;
+
+                This->dp2->hKillEnumSessionThreadEvent = CreateEventW( NULL, TRUE, FALSE, NULL );
+                if ( !DuplicateHandle( GetCurrentProcess(), This->dp2->hKillEnumSessionThreadEvent,
+                            GetCurrentProcess(), &data->hSuicideRequest, 0, FALSE,
+                            DUPLICATE_SAME_ACCESS ) )
+                    ERR( "Can't duplicate thread killing handle\n" );
+
+                TRACE( ": creating EnumSessionsRequest thread\n" );
+                This->dp2->hEnumSessionThread = CreateThread( NULL, 0,
+                        DP_EnumSessionsSendAsyncRequestThread, data, 0, &tid );
+            }
+            This->dp2->dwEnumSessionLock--;
+        }
+    }
+    else
+    {
+        /* Invalidate the session cache for the interface */
+        NS_InvalidateSessionCache( This->dp2->lpNameServerData );
+        /* Send the broadcast for session enumeration */
+        hr = NS_SendSessionRequestBroadcast( &sdesc->guidApplication, flags, &This->dp2->spData );
+        SleepEx( timeout, FALSE );
+        DP_InvokeEnumSessionCallbacks( enumsessioncb, This->dp2->lpNameServerData, timeout,
+                context );
+    }
+
+    return hr;
 }
 
 static HRESULT WINAPI IDirectPlay4AImpl_GetCaps( IDirectPlay4A *iface, DPCAPS *caps, DWORD flags )
@@ -4275,7 +4221,7 @@ static const IDirectPlay4Vtbl dp4_vt =
     IDirectPlay4Impl_EnumGroupPlayers,
     IDirectPlay4Impl_EnumGroups,
     IDirectPlay4Impl_EnumPlayers,
-  XCAST(EnumSessions)DirectPlay2WImpl_EnumSessions,
+    IDirectPlay4Impl_EnumSessions,
     IDirectPlay4Impl_GetCaps,
     IDirectPlay4Impl_GetGroupData,
   XCAST(GetGroupName)DirectPlay2WImpl_GetGroupName,
-- 
1.7.11.7



More information about the wine-patches mailing list