Rémi Bernon : dinput: Cleanup DllGetClassObject and IClassFactory implementation.

Alexandre Julliard julliard at winehq.org
Mon Feb 7 15:56:05 CST 2022


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

Author: Rémi Bernon <rbernon at codeweavers.com>
Date:   Mon Feb  7 09:23:26 2022 +0100

dinput: Cleanup DllGetClassObject and IClassFactory implementation.

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

---

 dlls/dinput/dinput_main.c  | 121 +++++++++++++++++++++++----------------------
 dlls/dinput/tests/dinput.c |   1 -
 2 files changed, 63 insertions(+), 59 deletions(-)

diff --git a/dlls/dinput/dinput_main.c b/dlls/dinput/dinput_main.c
index dbb727c3c43..2172eb32ee9 100644
--- a/dlls/dinput/dinput_main.c
+++ b/dlls/dinput/dinput_main.c
@@ -1089,90 +1089,95 @@ static const IDirectInputJoyConfig8Vtbl JoyConfig8vt =
     JoyConfig8Impl_OpenAppStatusKey
 };
 
-/*******************************************************************************
- * DirectInput ClassFactory
- */
-typedef struct
+struct class_factory
 {
-    /* IUnknown fields */
     IClassFactory IClassFactory_iface;
-    LONG          ref;
-} IClassFactoryImpl;
+};
 
-static inline IClassFactoryImpl *impl_from_IClassFactory(IClassFactory *iface)
+static inline struct class_factory *impl_from_IClassFactory( IClassFactory *iface )
 {
-        return CONTAINING_RECORD(iface, IClassFactoryImpl, IClassFactory_iface);
+    return CONTAINING_RECORD( iface, struct class_factory, IClassFactory_iface );
 }
 
-static HRESULT WINAPI DICF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj) {
-	IClassFactoryImpl *This = impl_from_IClassFactory(iface);
+static HRESULT WINAPI class_factory_QueryInterface( IClassFactory *iface, REFIID iid, void **out )
+{
+    struct class_factory *impl = impl_from_IClassFactory(iface);
+
+    TRACE("iface %p, iid %s, out %p.\n", iface, debugstr_guid(iid), out);
 
-	FIXME("(%p)->(%s,%p),stub!\n",This,debugstr_guid(riid),ppobj);
-	return E_NOINTERFACE;
+    if (IsEqualGUID(iid, &IID_IUnknown) ||
+        IsEqualGUID(iid, &IID_IClassFactory))
+        *out = &impl->IClassFactory_iface;
+    else
+    {
+        *out = NULL;
+        WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(iid));
+        return E_NOINTERFACE;
+    }
+
+    IUnknown_AddRef((IUnknown *)*out);
+    return S_OK;
 }
 
-static ULONG WINAPI DICF_AddRef(LPCLASSFACTORY iface) {
-	IClassFactoryImpl *This = impl_from_IClassFactory(iface);
-	return InterlockedIncrement(&(This->ref));
+static ULONG WINAPI class_factory_AddRef( IClassFactory *iface )
+{
+    return 2;
 }
 
-static ULONG WINAPI DICF_Release(LPCLASSFACTORY iface) {
-	IClassFactoryImpl *This = impl_from_IClassFactory(iface);
-	/* static class, won't be  freed */
-	return InterlockedDecrement(&(This->ref));
+static ULONG WINAPI class_factory_Release( IClassFactory *iface )
+{
+    return 1;
 }
 
-static HRESULT WINAPI DICF_CreateInstance(
-	LPCLASSFACTORY iface,LPUNKNOWN pOuter,REFIID riid,LPVOID *ppobj
-) {
-	IClassFactoryImpl *This = impl_from_IClassFactory(iface);
+static HRESULT WINAPI class_factory_CreateInstance( IClassFactory *iface, IUnknown *outer, REFIID iid, void **out )
+{
+    IUnknown *unknown;
+    HRESULT hr;
 
-	TRACE("(%p)->(%p,%s,%p)\n",This,pOuter,debugstr_guid(riid),ppobj);
-        if ( IsEqualGUID( &IID_IUnknown, riid ) ||
-             IsEqualGUID( &IID_IDirectInputA, riid ) ||
-	     IsEqualGUID( &IID_IDirectInputW, riid ) ||
-	     IsEqualGUID( &IID_IDirectInput2A, riid ) ||
-	     IsEqualGUID( &IID_IDirectInput2W, riid ) ||
-	     IsEqualGUID( &IID_IDirectInput7A, riid ) ||
-            IsEqualGUID( &IID_IDirectInput7W, riid ) ||
-            IsEqualGUID( &IID_IDirectInput8A, riid ) ||
-	     IsEqualGUID( &IID_IDirectInput8W, riid ) )
-        {
-		return create_directinput_instance(riid, ppobj, NULL);
-	}
+    TRACE( "iface %p, outer %p, iid %s, out %p.\n", iface, outer, debugstr_guid( iid ), out );
+
+    if (outer) return CLASS_E_NOAGGREGATION;
 
-	FIXME("(%p,%p,%s,%p) Interface not found!\n",This,pOuter,debugstr_guid(riid),ppobj);	
-	return E_NOINTERFACE;
+    if (FAILED(hr = create_directinput_instance( &IID_IUnknown, (void **)&unknown, NULL ))) return hr;
+    hr = IUnknown_QueryInterface( unknown, iid, out );
+    IUnknown_Release( unknown );
+
+    return hr;
 }
 
-static HRESULT WINAPI DICF_LockServer(LPCLASSFACTORY iface,BOOL dolock) {
-	IClassFactoryImpl *This = impl_from_IClassFactory(iface);
-	FIXME("(%p)->(%d),stub!\n",This,dolock);
-	return S_OK;
+static HRESULT WINAPI class_factory_LockServer( IClassFactory *iface, BOOL lock )
+{
+    FIXME( "iface %p, lock %d stub!\n", iface, lock );
+    return S_OK;
 }
 
-static const IClassFactoryVtbl DICF_Vtbl = {
-	DICF_QueryInterface,
-	DICF_AddRef,
-	DICF_Release,
-	DICF_CreateInstance,
-	DICF_LockServer
+static const IClassFactoryVtbl class_factory_vtbl =
+{
+    class_factory_QueryInterface,
+    class_factory_AddRef,
+    class_factory_Release,
+    class_factory_CreateInstance,
+    class_factory_LockServer,
 };
-static IClassFactoryImpl DINPUT_CF = {{&DICF_Vtbl}, 1 };
+
+static struct class_factory class_factory = {{&class_factory_vtbl}};
 
 /***********************************************************************
  *		DllGetClassObject (DINPUT.@)
  */
-HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv)
+HRESULT WINAPI DllGetClassObject( REFCLSID clsid, REFIID iid, void **out )
 {
-    TRACE("(%s,%s,%p)\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv);
-    if ( IsEqualCLSID( &IID_IClassFactory, riid ) ) {
-        *ppv = &DINPUT_CF;
-	IClassFactory_AddRef((IClassFactory*)*ppv);
-    return S_OK;
-    }
+    TRACE( "clsid %s, iid %s, out %p.\n", debugstr_guid( clsid ), debugstr_guid( iid ), out );
+
+#if DIRECTINPUT_VERSION == 0x0700
+    if (IsEqualCLSID( &CLSID_DirectInput, clsid ))
+        return IClassFactory_QueryInterface( &class_factory.IClassFactory_iface, iid, out );
+#else
+    if (IsEqualCLSID( &CLSID_DirectInput8, clsid ))
+        return IClassFactory_QueryInterface( &class_factory.IClassFactory_iface, iid, out );
+#endif
 
-    FIXME("(%s,%s,%p): no interface found.\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv);
+    WARN( "%s not implemented, returning CLASS_E_CLASSNOTAVAILABLE.\n", debugstr_guid( clsid ) );
     return CLASS_E_CLASSNOTAVAILABLE;
 }
 
diff --git a/dlls/dinput/tests/dinput.c b/dlls/dinput/tests/dinput.c
index a2c7f5dbd8d..0b3ce276e52 100644
--- a/dlls/dinput/tests/dinput.c
+++ b/dlls/dinput/tests/dinput.c
@@ -167,7 +167,6 @@ static void test_CoCreateInstance( DWORD version )
                                                 &IID_IDirectInputA, (void **)&unknown );
     else hr = CoCreateInstance( &CLSID_DirectInput8, &outer, CLSCTX_INPROC_SERVER,
                                 &IID_IDirectInput8A, (void **)&unknown );
-    todo_wine
     ok( hr == CLASS_E_NOAGGREGATION, "CoCreateInstance returned %#x\n", hr );
     if (SUCCEEDED( hr )) IUnknown_Release( unknown );
 




More information about the wine-cvs mailing list