windows.gaming.input: Implement IRawGameControllerStatics stubs.

Signed-off-by: Rémi Bernon <rbernon@codeweavers.com>
Signed-off-by: Jacek Caban <jacek@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Rémi Bernon 2021-03-22 11:17:32 +01:00 committed by Alexandre Julliard
parent 3728a81389
commit 21c8a30906
2 changed files with 289 additions and 0 deletions

View File

@ -174,6 +174,7 @@ struct windows_gaming_input
{
IActivationFactory IActivationFactory_iface;
IGamepadStatics IGamepadStatics_iface;
IRawGameControllerStatics IRawGameControllerStatics_iface;
LONG ref;
};
@ -187,6 +188,11 @@ static inline struct windows_gaming_input *impl_from_IGamepadStatics(IGamepadSta
return CONTAINING_RECORD(iface, struct windows_gaming_input, IGamepadStatics_iface);
}
static inline struct windows_gaming_input *impl_from_IRawGameControllerStatics(IRawGameControllerStatics *iface)
{
return CONTAINING_RECORD(iface, struct windows_gaming_input, IRawGameControllerStatics_iface);
}
static HRESULT STDMETHODCALLTYPE windows_gaming_input_QueryInterface(
IActivationFactory *iface, REFIID iid, void **out)
{
@ -211,6 +217,13 @@ static HRESULT STDMETHODCALLTYPE windows_gaming_input_QueryInterface(
return S_OK;
}
if (IsEqualGUID(iid, &IID_IRawGameControllerStatics))
{
IUnknown_AddRef(iface);
*out = &impl->IRawGameControllerStatics_iface;
return S_OK;
}
FIXME("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(iid));
*out = NULL;
return E_NOINTERFACE;
@ -375,10 +388,113 @@ static const struct IGamepadStaticsVtbl gamepad_statics_vtbl =
gamepad_statics_get_Gamepads,
};
static HRESULT STDMETHODCALLTYPE raw_game_controller_statics_QueryInterface(
IRawGameControllerStatics *iface, REFIID iid, void **out)
{
struct windows_gaming_input *impl = impl_from_IRawGameControllerStatics(iface);
return windows_gaming_input_QueryInterface(&impl->IActivationFactory_iface, iid, out);
}
static ULONG STDMETHODCALLTYPE raw_game_controller_statics_AddRef(
IRawGameControllerStatics *iface)
{
struct windows_gaming_input *impl = impl_from_IRawGameControllerStatics(iface);
return windows_gaming_input_AddRef(&impl->IActivationFactory_iface);
}
static ULONG STDMETHODCALLTYPE raw_game_controller_statics_Release(
IRawGameControllerStatics *iface)
{
struct windows_gaming_input *impl = impl_from_IRawGameControllerStatics(iface);
return windows_gaming_input_Release(&impl->IActivationFactory_iface);
}
static HRESULT STDMETHODCALLTYPE raw_game_controller_statics_GetIids(
IRawGameControllerStatics *iface, ULONG *iid_count, IID **iids)
{
FIXME("iface %p, iid_count %p, iids %p stub!\n", iface, iid_count, iids);
return E_NOTIMPL;
}
static HRESULT STDMETHODCALLTYPE raw_game_controller_statics_GetRuntimeClassName(
IRawGameControllerStatics *iface, HSTRING *class_name)
{
FIXME("iface %p, class_name %p stub!\n", iface, class_name);
return E_NOTIMPL;
}
static HRESULT STDMETHODCALLTYPE raw_game_controller_statics_GetTrustLevel(
IRawGameControllerStatics *iface, TrustLevel *trust_level)
{
FIXME("iface %p, trust_level %p stub!\n", iface, trust_level);
return E_NOTIMPL;
}
static HRESULT STDMETHODCALLTYPE raw_game_controller_statics_add_RawGameControllerAdded(
IRawGameControllerStatics *iface, IEventHandler_RawGameController *value, EventRegistrationToken* token)
{
FIXME("iface %p, value %p, token %p stub!\n", iface, value, token);
return E_NOTIMPL;
}
static HRESULT STDMETHODCALLTYPE raw_game_controller_statics_remove_RawGameControllerAdded(
IRawGameControllerStatics *iface, EventRegistrationToken token)
{
FIXME("iface %p, token %#I64x stub!\n", iface, token.value);
return E_NOTIMPL;
}
static HRESULT STDMETHODCALLTYPE raw_game_controller_statics_add_RawGameControllerRemoved(
IRawGameControllerStatics *iface, IEventHandler_RawGameController *value, EventRegistrationToken* token)
{
FIXME("iface %p, value %p, token %p stub!\n", iface, value, token);
return E_NOTIMPL;
}
static HRESULT STDMETHODCALLTYPE raw_game_controller_statics_remove_RawGameControllerRemoved(
IRawGameControllerStatics *iface, EventRegistrationToken token)
{
FIXME("iface %p, token %#I64x stub!\n", iface, token.value);
return E_NOTIMPL;
}
static HRESULT STDMETHODCALLTYPE raw_game_controller_statics_get_RawGameControllers(
IRawGameControllerStatics *iface, IVectorView_RawGameController **value)
{
FIXME("iface %p, value %p stub!\n", iface, value);
return E_NOTIMPL;
}
static HRESULT STDMETHODCALLTYPE raw_game_controller_statics_FromGameController(
IRawGameControllerStatics *iface, IGameController *game_controller, IRawGameController **value)
{
FIXME("iface %p, game_controller %p, value %p stub!\n", iface, game_controller, value);
return E_NOTIMPL;
}
static const struct IRawGameControllerStaticsVtbl raw_game_controller_statics_vtbl =
{
raw_game_controller_statics_QueryInterface,
raw_game_controller_statics_AddRef,
raw_game_controller_statics_Release,
/* IInspectable methods */
raw_game_controller_statics_GetIids,
raw_game_controller_statics_GetRuntimeClassName,
raw_game_controller_statics_GetTrustLevel,
/* IRawGameControllerStatics methods */
raw_game_controller_statics_add_RawGameControllerAdded,
raw_game_controller_statics_remove_RawGameControllerAdded,
raw_game_controller_statics_add_RawGameControllerRemoved,
raw_game_controller_statics_remove_RawGameControllerRemoved,
raw_game_controller_statics_get_RawGameControllers,
raw_game_controller_statics_FromGameController,
};
static struct windows_gaming_input windows_gaming_input =
{
{&activation_factory_vtbl},
{&gamepad_statics_vtbl},
{&raw_game_controller_statics_vtbl},
1
};

View File

@ -214,6 +214,178 @@ static void test_Gamepad(void)
pRoUninitialize();
}
struct controller_event_handler
{
IEventHandler_RawGameController IEventHandler_RawGameController_iface;
LONG ref;
};
static inline struct controller_event_handler *impl_from_IEventHandler_RawGameController(IEventHandler_RawGameController *iface)
{
return CONTAINING_RECORD(iface, struct controller_event_handler, IEventHandler_RawGameController_iface);
}
static HRESULT STDMETHODCALLTYPE controller_event_handler_QueryInterface(
IEventHandler_RawGameController *iface, REFIID iid, void **out)
{
if (IsEqualGUID(iid, &IID_IUnknown) ||
IsEqualGUID(iid, &IID_IEventHandler_RawGameController))
{
IUnknown_AddRef(iface);
*out = iface;
return S_OK;
}
trace("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(iid));
*out = NULL;
return E_NOINTERFACE;
}
static ULONG STDMETHODCALLTYPE controller_event_handler_AddRef(
IEventHandler_RawGameController *iface)
{
struct controller_event_handler *impl = impl_from_IEventHandler_RawGameController(iface);
ULONG ref = InterlockedIncrement(&impl->ref);
return ref;
}
static ULONG STDMETHODCALLTYPE controller_event_handler_Release(
IEventHandler_RawGameController *iface)
{
struct controller_event_handler *impl = impl_from_IEventHandler_RawGameController(iface);
ULONG ref = InterlockedDecrement(&impl->ref);
return ref;
}
static HRESULT STDMETHODCALLTYPE controller_event_handler_Invoke(
IEventHandler_RawGameController *iface, IInspectable *sender, IRawGameController *args)
{
trace("iface %p, sender %p, args %p\n", iface, sender, args);
return S_OK;
}
static const IEventHandler_RawGameControllerVtbl controller_event_handler_vtbl =
{
controller_event_handler_QueryInterface,
controller_event_handler_AddRef,
controller_event_handler_Release,
/*** IEventHandler<ABI::Windows::Gaming::Input::Gamepad* > methods ***/
controller_event_handler_Invoke,
};
static void test_RawGameController(void)
{
static const WCHAR *controller_name = L"Windows.Gaming.Input.RawGameController";
struct controller_event_handler controller_event_handler;
EventRegistrationToken token;
IVectorView_RawGameController *controllers = NULL;
IActivationFactory *factory = NULL;
IRawGameControllerStatics *controller_statics = NULL;
IInspectable *inspectable = NULL, *tmp_inspectable = NULL;
IAgileObject *agile_object = NULL, *tmp_agile_object = NULL;
IRawGameController *controller;
BOOLEAN found;
HSTRING str;
HRESULT hr;
ULONG size;
controller_event_handler.IEventHandler_RawGameController_iface.lpVtbl = &controller_event_handler_vtbl;
hr = pRoInitialize(RO_INIT_MULTITHREADED);
ok(hr == S_OK || hr == S_FALSE, "RoInitialize failed, hr %#x\n", hr);
hr = pWindowsCreateString(controller_name, wcslen(controller_name), &str);
ok(hr == S_OK, "WindowsCreateString failed, hr %#x\n", hr);
hr = pRoGetActivationFactory(str, &IID_IActivationFactory, (void **)&factory);
ok(hr == S_OK || broken(hr == REGDB_E_CLASSNOTREG), "RoGetActivationFactory failed, hr %#x\n", hr);
if (hr == REGDB_E_CLASSNOTREG)
{
win_skip("%s runtimeclass not registered, skipping tests.\n", wine_dbgstr_w(controller_name));
return;
}
hr = IActivationFactory_QueryInterface(factory, &IID_IInspectable, (void **)&inspectable);
ok(hr == S_OK, "IActivationFactory_QueryInterface IID_IInspectable failed, hr %#x\n", hr);
hr = IActivationFactory_QueryInterface(factory, &IID_IAgileObject, (void **)&agile_object);
ok(hr == S_OK, "IActivationFactory_QueryInterface IID_IAgileObject failed, hr %#x\n", hr);
hr = IActivationFactory_QueryInterface(factory, &IID_IRawGameControllerStatics, (void **)&controller_statics);
ok(hr == S_OK, "IActivationFactory_QueryInterface IID_IRawGameControllerStatics failed, hr %#x\n", hr);
hr = IRawGameControllerStatics_QueryInterface(controller_statics, &IID_IInspectable, (void **)&tmp_inspectable);
ok(hr == S_OK, "IRawGameControllerStatics_QueryInterface IID_IInspectable failed, hr %#x\n", hr);
ok(tmp_inspectable == inspectable, "IRawGameControllerStatics_QueryInterface IID_IInspectable returned %p, expected %p\n", tmp_inspectable, inspectable);
IInspectable_Release(tmp_inspectable);
hr = IRawGameControllerStatics_QueryInterface(controller_statics, &IID_IAgileObject, (void **)&tmp_agile_object);
ok(hr == S_OK, "IRawGameControllerStatics_QueryInterface IID_IAgileObject failed, hr %#x\n", hr);
ok(tmp_agile_object == agile_object, "IRawGameControllerStatics_QueryInterface IID_IAgileObject returned %p, expected %p\n", tmp_agile_object, agile_object);
IAgileObject_Release(tmp_agile_object);
hr = IRawGameControllerStatics_get_RawGameControllers(controller_statics, &controllers);
todo_wine ok(hr == S_OK, "IRawGameControllerStatics_get_RawGameControllers failed, hr %#x\n", hr);
if (FAILED(hr)) goto done;
hr = IVectorView_RawGameController_QueryInterface(controllers, &IID_IInspectable, (void **)&tmp_inspectable);
ok(hr == S_OK, "IVectorView_RawGameController_QueryInterface failed, hr %#x\n", hr);
ok(tmp_inspectable != inspectable, "IVectorView_RawGameController_QueryInterface returned %p, expected %p\n", tmp_inspectable, inspectable);
IInspectable_Release(tmp_inspectable);
hr = IVectorView_RawGameController_QueryInterface(controllers, &IID_IAgileObject, (void **)&tmp_agile_object);
ok(hr == S_OK, "IVectorView_RawGameController_QueryInterface failed, hr %#x\n", hr);
ok(tmp_agile_object != agile_object, "IVectorView_RawGameController_QueryInterface IID_IAgileObject returned agile_object\n");
IAgileObject_Release(tmp_agile_object);
size = 0xdeadbeef;
hr = IVectorView_RawGameController_get_Size(controllers, &size);
ok(hr == S_OK, "IVectorView_RawGameController_get_Size failed, hr %#x\n", hr);
ok(size != 0xdeadbeef, "IVectorView_RawGameController_get_Size returned %u\n", size);
controller = (IRawGameController *)0xdeadbeef;
hr = IVectorView_RawGameController_GetAt(controllers, size, &controller);
ok(hr == E_BOUNDS, "IVectorView_RawGameController_GetAt failed, hr %#x\n", hr);
ok(controller == NULL, "IVectorView_RawGameController_GetAt returned %p\n", controller);
size = 0xdeadbeef;
found = TRUE;
controller = (IRawGameController *)0xdeadbeef;
hr = IVectorView_RawGameController_IndexOf(controllers, controller, &size, &found);
ok(hr == S_OK, "IVectorView_RawGameController_IndexOf failed, hr %#x\n", hr);
ok(size == 0 && found == FALSE, "IVectorView_RawGameController_IndexOf returned size %d, found %d\n", size, found);
IVectorView_RawGameController_Release(controllers);
done:
token.value = 0xdeadbeef;
hr = IRawGameControllerStatics_add_RawGameControllerAdded(controller_statics, &controller_event_handler.IEventHandler_RawGameController_iface, &token);
todo_wine ok(hr == S_OK, "IRawGameControllerStatics_add_RawGameControllerAdded failed, hr %#x\n", hr);
todo_wine ok(token.value != 0xdeadbeef, "IRawGameControllerStatics_add_RawGameControllerAdded returned token %#I64x\n", token.value);
hr = IRawGameControllerStatics_remove_RawGameControllerAdded(controller_statics, token);
todo_wine ok(hr == S_OK, "IRawGameControllerStatics_add_RawGameControllerAdded failed, hr %#x\n", hr);
token.value = 0xdeadbeef;
IRawGameControllerStatics_add_RawGameControllerRemoved(controller_statics, &controller_event_handler.IEventHandler_RawGameController_iface, &token);
todo_wine ok(hr == S_OK, "IRawGameControllerStatics_add_RawGameControllerRemoved failed, hr %#x\n", hr);
todo_wine ok(token.value != 0xdeadbeef, "IRawGameControllerStatics_add_RawGameControllerRemoved returned token %#I64x\n", token.value);
hr = IRawGameControllerStatics_remove_RawGameControllerRemoved(controller_statics, token);
todo_wine ok(hr == S_OK, "IRawGameControllerStatics_add_RawGameControllerAdded failed, hr %#x\n", hr);
IRawGameControllerStatics_Release(controller_statics);
IAgileObject_Release(agile_object);
IInspectable_Release(inspectable);
IActivationFactory_Release(factory);
pWindowsDeleteString(str);
pRoUninitialize();
}
START_TEST(input)
{
HMODULE combase;
@ -240,4 +412,5 @@ START_TEST(input)
#undef LOAD_FUNCPTR
test_Gamepad();
test_RawGameController();
}