Rémi Bernon : windows.gaming.input: Introduce a new type-pruning WineAsyncOperationCompletedHandler.

Alexandre Julliard julliard at winehq.org
Thu May 5 15:56:02 CDT 2022


Module: wine
Branch: master
Commit: d99ee0273bc90a92378e514755904fc7b875e9e9
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=d99ee0273bc90a92378e514755904fc7b875e9e9

Author: Rémi Bernon <rbernon at codeweavers.com>
Date:   Wed May  4 11:21:05 2022 +0200

windows.gaming.input: Introduce a new type-pruning WineAsyncOperationCompletedHandler.

Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/windows.gaming.input/async.c      | 23 +++++++++++++----------
 dlls/windows.gaming.input/provider.idl |  3 +++
 2 files changed, 16 insertions(+), 10 deletions(-)

diff --git a/dlls/windows.gaming.input/async.c b/dlls/windows.gaming.input/async.c
index 91ecdeb9550..6afbca96831 100644
--- a/dlls/windows.gaming.input/async.c
+++ b/dlls/windows.gaming.input/async.c
@@ -19,6 +19,7 @@
  */
 
 #include "private.h"
+#include "provider.h"
 
 #include "wine/debug.h"
 
@@ -33,7 +34,6 @@ struct async_bool
     IAsyncInfo IAsyncInfo_iface;
     LONG ref;
 
-    IAsyncOperationCompletedHandler_boolean *handler;
     BOOLEAN result;
 
     async_operation_boolean_callback callback;
@@ -41,6 +41,7 @@ struct async_bool
     IInspectable *invoker;
 
     CRITICAL_SECTION cs;
+    IWineAsyncOperationCompletedHandler *handler;
     AsyncStatus status;
     HRESULT hr;
 };
@@ -195,7 +196,7 @@ static ULONG WINAPI async_bool_Release( IAsyncOperation_boolean *iface )
     if (!ref)
     {
         IAsyncInfo_Close( &impl->IAsyncInfo_iface );
-        if (impl->handler && impl->handler != HANDLER_NOT_SET) IAsyncOperationCompletedHandler_boolean_Release( impl->handler );
+        if (impl->handler && impl->handler != HANDLER_NOT_SET) IWineAsyncOperationCompletedHandler_Release( impl->handler );
         IInspectable_Release( impl->invoker );
         DeleteCriticalSection( &impl->cs );
         free( impl );
@@ -223,8 +224,9 @@ static HRESULT WINAPI async_bool_GetTrustLevel( IAsyncOperation_boolean *iface,
     return E_NOTIMPL;
 }
 
-static HRESULT WINAPI async_bool_put_Completed( IAsyncOperation_boolean *iface, IAsyncOperationCompletedHandler_boolean *handler )
+static HRESULT WINAPI async_bool_put_Completed( IAsyncOperation_boolean *iface, IAsyncOperationCompletedHandler_boolean *bool_handler )
 {
+    IWineAsyncOperationCompletedHandler *handler = (IWineAsyncOperationCompletedHandler *)bool_handler;
     struct async_bool *impl = impl_from_IAsyncOperation_boolean( iface );
     HRESULT hr = S_OK;
 
@@ -235,7 +237,7 @@ static HRESULT WINAPI async_bool_put_Completed( IAsyncOperation_boolean *iface,
     else if (impl->handler != HANDLER_NOT_SET) hr = E_ILLEGAL_DELEGATE_ASSIGNMENT;
     else if ((impl->handler = handler))
     {
-        IAsyncOperationCompletedHandler_boolean_AddRef( impl->handler );
+        IWineAsyncOperationCompletedHandler_AddRef( impl->handler );
 
         if (impl->status > Started)
         {
@@ -244,8 +246,8 @@ static HRESULT WINAPI async_bool_put_Completed( IAsyncOperation_boolean *iface,
             impl->handler = NULL; /* Prevent concurrent invoke. */
             LeaveCriticalSection( &impl->cs );
 
-            IAsyncOperationCompletedHandler_boolean_Invoke( handler, operation, status );
-            IAsyncOperationCompletedHandler_boolean_Release( handler );
+            IWineAsyncOperationCompletedHandler_Invoke( handler, (IInspectable *)operation, status );
+            IWineAsyncOperationCompletedHandler_Release( handler );
 
             return S_OK;
         }
@@ -255,8 +257,9 @@ static HRESULT WINAPI async_bool_put_Completed( IAsyncOperation_boolean *iface,
     return hr;
 }
 
-static HRESULT WINAPI async_bool_get_Completed( IAsyncOperation_boolean *iface, IAsyncOperationCompletedHandler_boolean **handler )
+static HRESULT WINAPI async_bool_get_Completed( IAsyncOperation_boolean *iface, IAsyncOperationCompletedHandler_boolean **bool_handler )
 {
+    IWineAsyncOperationCompletedHandler **handler = (IWineAsyncOperationCompletedHandler **)bool_handler;
     struct async_bool *impl = impl_from_IAsyncOperation_boolean( iface );
     HRESULT hr = S_OK;
 
@@ -321,13 +324,13 @@ static void CALLBACK async_run_cb( TP_CALLBACK_INSTANCE *instance, void *data, T
 
     if (impl->handler != NULL && impl->handler != HANDLER_NOT_SET)
     {
-        IAsyncOperationCompletedHandler_boolean *handler = impl->handler;
+        IWineAsyncOperationCompletedHandler *handler = impl->handler;
         AsyncStatus status = impl->status;
         impl->handler = NULL; /* Prevent concurrent invoke. */
         LeaveCriticalSection( &impl->cs );
 
-        IAsyncOperationCompletedHandler_boolean_Invoke( handler, operation, status );
-        IAsyncOperationCompletedHandler_boolean_Release( handler );
+        IWineAsyncOperationCompletedHandler_Invoke( handler, (IInspectable *)operation, status );
+        IWineAsyncOperationCompletedHandler_Release( handler );
     }
     else LeaveCriticalSection( &impl->cs );
 
diff --git a/dlls/windows.gaming.input/provider.idl b/dlls/windows.gaming.input/provider.idl
index 60eaab34506..5f718cb167b 100644
--- a/dlls/windows.gaming.input/provider.idl
+++ b/dlls/windows.gaming.input/provider.idl
@@ -38,6 +38,9 @@ namespace Windows.Gaming.Input.Custom {
     interface IWineGameControllerProvider;
     runtimeclass WineGameControllerProvider;
 
+    /* type-pruning version of AsyncOperationCompletedHandler<T> */
+    delegate HRESULT WineAsyncOperationCompletedHandler([in] IInspectable *async, [in] AsyncStatus status);
+
     enum WineGameControllerType
     {
         Joystick = 0,




More information about the wine-cvs mailing list