Module: wine Branch: master Commit: 324c76f3867cb4fb9e0f38af46d89af346011f7f URL: http://source.winehq.org/git/wine.git/?a=commit;h=324c76f3867cb4fb9e0f38af46...
Author: Andrew Nguyen anguyen@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();