Andrew Nguyen : dinput: Improve the behavior of IDirectInput::CreateDevice.

Alexandre Julliard julliard at winehq.org
Wed Jul 6 13:31:05 CDT 2011


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

Author: Andrew Nguyen <anguyen at codeweavers.com>
Date:   Tue Jul  5 07:19:01 2011 -0500

dinput: Improve the behavior of IDirectInput::CreateDevice.

---

 dlls/dinput/dinput_main.c  |   67 +++++++++++++++++--------------------------
 dlls/dinput/tests/dinput.c |   40 ++++++++++++++++++++++++++
 2 files changed, 67 insertions(+), 40 deletions(-)

diff --git a/dlls/dinput/dinput_main.c b/dlls/dinput/dinput_main.c
index 583e143..bbaefec 100644
--- a/dlls/dinput/dinput_main.c
+++ b/dlls/dinput/dinput_main.c
@@ -581,61 +581,48 @@ static HRESULT WINAPI IDirectInput2WImpl_FindDevice(LPDIRECTINPUT7W iface, REFGU
     return DI_OK;
 }
 
-static HRESULT WINAPI IDirectInput7AImpl_CreateDeviceEx(LPDIRECTINPUT7A iface, REFGUID rguid,
-							REFIID riid, LPVOID* pvOut, LPUNKNOWN lpUnknownOuter)
+static HRESULT create_device(IDirectInputImpl *This, REFGUID rguid, REFIID riid, LPVOID *pvOut, BOOL unicode)
 {
-  IDirectInputImpl *This = impl_from_IDirectInput7A( iface );
-  HRESULT ret_value = DIERR_DEVICENOTREG;
-  unsigned int i;
-
-  TRACE("(%p)->(%s, %s, %p, %p)\n", This, debugstr_guid(rguid), debugstr_guid(riid), pvOut, lpUnknownOuter);
+    unsigned int i;
 
-  if (!rguid || !pvOut) return E_POINTER;
+    if (pvOut)
+        *pvOut = NULL;
 
-  /* Loop on all the devices to see if anyone matches the given GUID */
-  for (i = 0; i < NB_DINPUT_DEVICES; i++) {
-    HRESULT ret;
+    if (!rguid || !pvOut)
+        return E_POINTER;
 
-    if (!dinput_devices[i]->create_device) continue;
-    if ((ret = dinput_devices[i]->create_device(This, rguid, riid, pvOut, 0)) == DI_OK)
-      return DI_OK;
+    /* Loop on all the devices to see if anyone matches the given GUID */
+    for (i = 0; i < NB_DINPUT_DEVICES; i++)
+    {
+        HRESULT ret;
 
-    if (ret == DIERR_NOINTERFACE)
-      ret_value = DIERR_NOINTERFACE;
-  }
+        if (!dinput_devices[i]->create_device) continue;
+        if ((ret = dinput_devices[i]->create_device(This, rguid, riid, pvOut, unicode)) == DI_OK)
+            return DI_OK;
+    }
 
-  if (ret_value == DIERR_NOINTERFACE)
-  {
     WARN("invalid device GUID %s\n", debugstr_guid(rguid));
-  }
-
-  return ret_value;
+    return DIERR_DEVICENOTREG;
 }
 
-static HRESULT WINAPI IDirectInput7WImpl_CreateDeviceEx(LPDIRECTINPUT7W iface, REFGUID rguid,
-							REFIID riid, LPVOID* pvOut, LPUNKNOWN lpUnknownOuter)
+static HRESULT WINAPI IDirectInput7AImpl_CreateDeviceEx(LPDIRECTINPUT7A iface, REFGUID rguid,
+                                                        REFIID riid, LPVOID* pvOut, LPUNKNOWN lpUnknownOuter)
 {
-  IDirectInputImpl *This = impl_from_IDirectInput7W( iface );
-  HRESULT ret_value = DIERR_DEVICENOTREG;
-  unsigned int i;
-
-  TRACE("(%p)->(%s, %s, %p, %p)\n", This, debugstr_guid(rguid), debugstr_guid(riid), pvOut, lpUnknownOuter);
+    IDirectInputImpl *This = impl_from_IDirectInput7A( iface );
 
-  if (!rguid || !pvOut) return E_POINTER;
+    TRACE("(%p)->(%s, %s, %p, %p)\n", This, debugstr_guid(rguid), debugstr_guid(riid), pvOut, lpUnknownOuter);
 
-  /* Loop on all the devices to see if anyone matches the given GUID */
-  for (i = 0; i < NB_DINPUT_DEVICES; i++) {
-    HRESULT ret;
+    return create_device(This, rguid, riid, pvOut, FALSE);
+}
 
-    if (!dinput_devices[i]->create_device) continue;
-    if ((ret = dinput_devices[i]->create_device(This, rguid, riid, pvOut, 1)) == DI_OK)
-      return DI_OK;
+static HRESULT WINAPI IDirectInput7WImpl_CreateDeviceEx(LPDIRECTINPUT7W iface, REFGUID rguid,
+                                                        REFIID riid, LPVOID* pvOut, LPUNKNOWN lpUnknownOuter)
+{
+    IDirectInputImpl *This = impl_from_IDirectInput7W( iface );
 
-    if (ret == DIERR_NOINTERFACE)
-      ret_value = DIERR_NOINTERFACE;
-  }
+    TRACE("(%p)->(%s, %s, %p, %p)\n", This, debugstr_guid(rguid), debugstr_guid(riid), pvOut, lpUnknownOuter);
 
-  return ret_value;
+    return create_device(This, rguid, riid, pvOut, TRUE);
 }
 
 static HRESULT WINAPI IDirectInputAImpl_CreateDevice(LPDIRECTINPUT7A iface, REFGUID rguid,
diff --git a/dlls/dinput/tests/dinput.c b/dlls/dinput/tests/dinput.c
index c1bbd85..19b1819 100644
--- a/dlls/dinput/tests/dinput.c
+++ b/dlls/dinput/tests/dinput.c
@@ -129,6 +129,45 @@ static void test_QueryInterface(void)
     IDirectInput_Release(pDI);
 }
 
+static void test_CreateDevice(void)
+{
+    IDirectInputA *pDI;
+    HRESULT hr;
+    IDirectInputDeviceA *pDID;
+
+    hr = DirectInputCreateA(hInstance, DIRECTINPUT_VERSION, &pDI, NULL);
+    if (FAILED(hr))
+    {
+        win_skip("Failed to instantiate a IDirectInputA instance: 0x%08x\n", hr);
+        return;
+    }
+
+    hr = IDirectInput_CreateDevice(pDI, NULL, NULL, NULL);
+    ok(hr == E_POINTER, "IDirectInput_CreateDevice returned 0x%08x\n", hr);
+
+    pDID = (void *)0xdeadbeef;
+    hr = IDirectInput_CreateDevice(pDI, NULL, &pDID, NULL);
+    ok(hr == E_POINTER, "IDirectInput_CreateDevice returned 0x%08x\n", hr);
+    ok(pDID == NULL, "Output interface pointer is %p\n", pDID);
+
+    hr = IDirectInput_CreateDevice(pDI, &GUID_Unknown, NULL, NULL);
+    ok(hr == E_POINTER, "IDirectInput_CreateDevice returned 0x%08x\n", hr);
+
+    pDID = (void *)0xdeadbeef;
+    hr = IDirectInput_CreateDevice(pDI, &GUID_Unknown, &pDID, NULL);
+    ok(hr == DIERR_DEVICENOTREG, "IDirectInput_CreateDevice returned 0x%08x\n", hr);
+    ok(pDID == NULL, "Output interface pointer is %p\n", pDID);
+
+    hr = IDirectInput_CreateDevice(pDI, &GUID_SysMouse, NULL, NULL);
+    ok(hr == E_POINTER, "IDirectInput_CreateDevice returned 0x%08x\n", hr);
+
+    hr = IDirectInput_CreateDevice(pDI, &GUID_SysMouse, &pDID, NULL);
+    ok(hr == DI_OK, "IDirectInput_CreateDevice returned 0x%08x\n", hr);
+
+    IDirectInputDevice_Release(pDID);
+    IDirectInput_Release(pDI);
+}
+
 static void test_Initialize(void)
 {
     IDirectInputA *pDI;
@@ -211,6 +250,7 @@ START_TEST(dinput)
 
     CoInitialize(NULL);
     test_QueryInterface();
+    test_CreateDevice();
     test_Initialize();
     test_RunControlPanel();
     CoUninitialize();




More information about the wine-cvs mailing list