From 0f60464b95950b041433af1ffcbfb28a7c651703 Mon Sep 17 00:00:00 2001 From: Robert Reif Date: Fri, 13 May 2005 13:57:17 +0000 Subject: [PATCH] Fix SetProperty error returned. Add EnumDevice joystick version check. Test multiple versions. --- dlls/dinput/dinput_main.c | 18 +++++++++-- dlls/dinput/dinput_private.h | 1 + dlls/dinput/joystick_linux.c | 2 +- dlls/dinput/tests/joystick.c | 58 ++++++++++++++++++++++++------------ 4 files changed, 57 insertions(+), 22 deletions(-) diff --git a/dlls/dinput/dinput_main.c b/dlls/dinput/dinput_main.c index 36288fdc5c4..2e2ef335835 100644 --- a/dlls/dinput/dinput_main.c +++ b/dlls/dinput/dinput_main.c @@ -95,6 +95,7 @@ HRESULT WINAPI DirectInputCreateEx( This->lpVtbl = &ddi7avt; This->ref = 1; This->version = 1; + This->dwVersion = dwVersion; *ppDI = This; return DI_OK; @@ -107,6 +108,7 @@ HRESULT WINAPI DirectInputCreateEx( This->lpVtbl = &ddi7wvt; This->ref = 1; This->version = 1; + This->dwVersion = dwVersion; *ppDI = This; return DI_OK; @@ -117,6 +119,7 @@ HRESULT WINAPI DirectInputCreateEx( This->lpVtbl = &ddi8avt; This->ref = 1; This->version = 8; + This->dwVersion = dwVersion; *ppDI = This; return DI_OK; @@ -127,6 +130,7 @@ HRESULT WINAPI DirectInputCreateEx( This->lpVtbl = &ddi8wvt; This->ref = 1; This->version = 8; + This->dwVersion = dwVersion; *ppDI = This; return DI_OK; @@ -145,6 +149,7 @@ HRESULT WINAPI DirectInputCreateA(HINSTANCE hinst, DWORD dwVersion, LPDIRECTINPU This = HeapAlloc(GetProcessHeap(),0,sizeof(IDirectInputImpl)); This->lpVtbl = &ddi7avt; This->ref = 1; + This->dwVersion = dwVersion; if (dwVersion >= 0x0800) { This->version = 8; } else { @@ -166,6 +171,7 @@ HRESULT WINAPI DirectInputCreateW(HINSTANCE hinst, DWORD dwVersion, LPDIRECTINPU This = HeapAlloc(GetProcessHeap(),0,sizeof(IDirectInputImpl)); This->lpVtbl = &ddi7wvt; This->ref = 1; + This->dwVersion = dwVersion; if (dwVersion >= 0x0800) { This->version = 8; } else { @@ -227,7 +233,11 @@ static HRESULT WINAPI IDirectInputAImpl_EnumDevices( This, dwDevType, _dump_DIDEVTYPE_value(dwDevType), lpCallback, pvRef, dwFlags); TRACE(" flags: "); _dump_EnumDevices_dwFlags(dwFlags); TRACE("\n"); - + + /* joysticks are not supported in version 0x0300 */ + if ((dwDevType == DIDEVTYPE_JOYSTICK) && (This->dwVersion <= 0x0300)) + return E_INVALIDARG; + for (i = 0; i < NB_DINPUT_DEVICES; i++) { if (!dinput_devices[i]->enum_deviceA) continue; for (j = 0, r = -1; r != 0; j++) { @@ -257,7 +267,11 @@ static HRESULT WINAPI IDirectInputWImpl_EnumDevices( This, dwDevType, _dump_DIDEVTYPE_value(dwDevType), lpCallback, pvRef, dwFlags); TRACE(" flags: "); _dump_EnumDevices_dwFlags(dwFlags); TRACE("\n"); - + + /* joysticks are not supported in version 0x0300 */ + if ((dwDevType == DIDEVTYPE_JOYSTICK) && (This->dwVersion <= 0x0300)) + return E_INVALIDARG; + for (i = 0; i < NB_DINPUT_DEVICES; i++) { if (!dinput_devices[i]->enum_deviceW) continue; for (j = 0, r = -1; r != 0; j++) { diff --git a/dlls/dinput/dinput_private.h b/dlls/dinput/dinput_private.h index 98e8add3eab..7c7b55a7d05 100644 --- a/dlls/dinput/dinput_private.h +++ b/dlls/dinput/dinput_private.h @@ -36,6 +36,7 @@ struct IDirectInputImpl DWORD evsequence; int version; + DWORD dwVersion; }; /* Function called by all devices that Wine supports */ diff --git a/dlls/dinput/joystick_linux.c b/dlls/dinput/joystick_linux.c index 01bce28441f..a3b164b2ffc 100644 --- a/dlls/dinput/joystick_linux.c +++ b/dlls/dinput/joystick_linux.c @@ -1125,7 +1125,7 @@ static HRESULT WINAPI JoystickAImpl_SetProperty( if (ph == NULL) { WARN("invalid pointer\n"); - return E_POINTER; + return E_INVALIDARG; } if (TRACE_ON(dinput)) diff --git a/dlls/dinput/tests/joystick.c b/dlls/dinput/tests/joystick.c index 798c8912c11..060da0bda6a 100644 --- a/dlls/dinput/tests/joystick.c +++ b/dlls/dinput/tests/joystick.c @@ -35,6 +35,11 @@ #define numObjects(x) (sizeof(x) / sizeof(x[0])) +typedef struct tagUserData { + LPDIRECTINPUT pDI; + DWORD version; +} UserData; + static const DIOBJECTDATAFORMAT dfDIJoystickTest[] = { { &GUID_XAxis,DIJOFS_X,DIDFT_OPTIONAL|DIDFT_AXIS|DIDFT_ANYINSTANCE,0}, { &GUID_YAxis,DIJOFS_Y,DIDFT_OPTIONAL|DIDFT_AXIS|DIDFT_ANYINSTANCE,0}, @@ -103,8 +108,8 @@ static BOOL CALLBACK EnumAxes( diprg.lMax = +1000; hr = IDirectInputDevice_SetProperty(info->pJoystick, DIPROP_RANGE, NULL); - ok(hr==E_POINTER,"IDirectInputDevice_SetProperty() should have returned " - "E_POINTER, returned: %s\n", DXGetErrorString8(hr)); + ok(hr==E_INVALIDARG,"IDirectInputDevice_SetProperty() should have returned " + "E_INVALIDARG, returned: %s\n", DXGetErrorString8(hr)); hr = IDirectInputDevice_SetProperty(info->pJoystick, DIPROP_RANGE, &diprg.diph); ok(hr==DI_OK,"IDirectInputDevice_SetProperty() failed: %s\n", DXGetErrorString8(hr)); @@ -123,7 +128,7 @@ static BOOL CALLBACK EnumJoysticks( LPVOID pvRef) { HRESULT hr; - LPDIRECTINPUT pDI = (LPDIRECTINPUT)pvRef; + UserData * data = (UserData *)pvRef; LPDIRECTINPUTDEVICE pJoystick; DIDATAFORMAT format; DIDEVCAPS caps; @@ -132,19 +137,20 @@ static BOOL CALLBACK EnumJoysticks( int i, count; ULONG ref; - hr = IDirectInput_CreateDevice(pDI, &lpddi->guidInstance, NULL, NULL); + hr = IDirectInput_CreateDevice(data->pDI, &lpddi->guidInstance, NULL, NULL); ok(hr==E_POINTER,"IDirectInput_CreateDevice() should have returned " "E_POINTER, returned: %s\n", DXGetErrorString8(hr)); - hr = IDirectInput_CreateDevice(pDI, NULL, &pJoystick, NULL); + hr = IDirectInput_CreateDevice(data->pDI, NULL, &pJoystick, NULL); ok(hr==E_POINTER,"IDirectInput_CreateDevice() should have returned " "E_POINTER, returned: %s\n", DXGetErrorString8(hr)); - hr = IDirectInput_CreateDevice(pDI, NULL, NULL, NULL); + hr = IDirectInput_CreateDevice(data->pDI, NULL, NULL, NULL); ok(hr==E_POINTER,"IDirectInput_CreateDevice() should have returned " "E_POINTER, returned: %s\n", DXGetErrorString8(hr)); - hr = IDirectInput_CreateDevice(pDI, &lpddi->guidInstance, &pJoystick, NULL); + hr = IDirectInput_CreateDevice(data->pDI, &lpddi->guidInstance, + &pJoystick, NULL); ok(hr==DI_OK,"IDirectInput_CreateDevice() failed: %s\n", DXGetErrorString8(hr)); if (hr!=DI_OK) @@ -260,22 +266,34 @@ DONE: return DIENUM_CONTINUE; } -static void joystick_tests() +static void joystick_tests(DWORD version) { HRESULT hr; LPDIRECTINPUT pDI; ULONG ref; - hr = DirectInputCreate(GetModuleHandle(NULL), DIRECTINPUT_VERSION, &pDI, NULL); - ok(hr==DI_OK, "DirectInputCreate() failed: %s\n", DXGetErrorString8(hr)); - if (hr!=DI_OK) - return; - - hr = IDirectInput_EnumDevices(pDI, DIDEVTYPE_JOYSTICK, EnumJoysticks, pDI, DIEDFL_ALLDEVICES); - ok(hr==DI_OK,"IDirectInput_EnumDevices() failed: %s\n", DXGetErrorString8(hr)); - - ref = IDirectInput_Release(pDI); - ok(ref==0,"IDirectInput_Release() reference count = %ld\n", ref); + trace("-- Testing Direct Input Version 0x%04lx --\n", version); + hr = DirectInputCreate(GetModuleHandle(NULL), version, &pDI, NULL); + ok(hr==DI_OK||hr==DIERR_OLDDIRECTINPUTVERSION, + "DirectInputCreate() failed: %s\n", DXGetErrorString8(hr)); + if (hr==DI_OK && pDI!=0) { + UserData data; + data.pDI = pDI; + data.version = version; + hr = IDirectInput_EnumDevices(pDI, DIDEVTYPE_JOYSTICK, EnumJoysticks, + &data, DIEDFL_ALLDEVICES); + if (version == 0x0300) { + trace(" Joysticks Not Supported\n"); + ok(hr==E_INVALIDARG,"IDirectInput_EnumDevices() should have " + "returned E_INVALIDARG, returned: %s\n", DXGetErrorString8(hr)); + } else { + ok(hr==DI_OK,"IDirectInput_EnumDevices() failed: %s\n", + DXGetErrorString8(hr)); + } + ref = IDirectInput_Release(pDI); + ok(ref==0,"IDirectInput_Release() reference count = %ld\n", ref); + } else if (hr==DIERR_OLDDIRECTINPUTVERSION) + trace(" Version Not Supported\n"); } START_TEST(joystick) @@ -284,7 +302,9 @@ START_TEST(joystick) trace("DLL Version: %s\n", get_file_version("dinput.dll")); - joystick_tests(); + joystick_tests(0x0700); + joystick_tests(0x0500); + joystick_tests(0x0300); CoUninitialize(); }