123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 |
- // Copyright 2020 The Chromium Authors. All rights reserved.
- // Use of this source code is governed by a BSD-style license that can be
- // found in the LICENSE file.
- #ifndef DEVICE_GAMEPAD_WGI_DATA_FETCHER_WIN_H_
- #define DEVICE_GAMEPAD_WGI_DATA_FETCHER_WIN_H_
- #include "device/gamepad/gamepad_data_fetcher.h"
- #include <Windows.Gaming.Input.h>
- #include <wrl/event.h>
- #include <memory>
- #include "base/callback_forward.h"
- #include "base/containers/flat_map.h"
- #include "base/memory/scoped_refptr.h"
- #include "base/no_destructor.h"
- #include "base/sequence_checker.h"
- #include "base/task/sequenced_task_runner.h"
- #include "device/gamepad/public/mojom/gamepad.mojom.h"
- #include "device/gamepad/wgi_gamepad_device.h"
- #include "third_party/abseil-cpp/absl/types/optional.h"
- namespace device {
- class DEVICE_GAMEPAD_EXPORT WgiDataFetcherWin final
- : public GamepadDataFetcher {
- public:
- enum class InitializationState {
- kUninitialized,
- kInitialized,
- kAddGamepadAddedFailed,
- kAddGamepadRemovedFailed,
- kRoGetActivationFactoryFailed,
- kCoreWinrtStringDelayLoadFailed,
- };
- using Factory =
- GamepadDataFetcherFactoryImpl<WgiDataFetcherWin, GAMEPAD_SOURCE_WIN_WGI>;
- // Define test hooks to use a fake WinRT RoGetActivationFactory
- // implementation to avoid dependencies on the OS for WGI testing.
- using GetActivationFactoryFunction = HRESULT (*)(HSTRING class_id,
- const IID& iid,
- void** out_factory);
- WgiDataFetcherWin();
- WgiDataFetcherWin(const WgiDataFetcherWin&) = delete;
- WgiDataFetcherWin& operator=(const WgiDataFetcherWin&) = delete;
- ~WgiDataFetcherWin() override;
- // GamepadDataFetcher implementation.
- GamepadSource source() override;
- void OnAddedToProvider() override;
- void GetGamepadData(bool devices_changed_hint) override;
- void PlayEffect(int source_id,
- mojom::GamepadHapticEffectType,
- mojom::GamepadEffectParametersPtr,
- mojom::GamepadHapticsManager::PlayVibrationEffectOnceCallback,
- scoped_refptr<base::SequencedTaskRunner>) override;
- void ResetVibration(
- int source_id,
- mojom::GamepadHapticsManager::ResetVibrationActuatorCallback,
- scoped_refptr<base::SequencedTaskRunner>) override;
- // Set fake ActivationFunction for test to avoid dependencies on the OS API.
- using ActivationFactoryFunctionCallback =
- base::RepeatingCallback<GetActivationFactoryFunction()>;
- static void OverrideActivationFactoryFunctionForTesting(
- ActivationFactoryFunctionCallback callback);
- // Used to store gamepad devices indexed by its source id.
- using DeviceMap = base::flat_map<int, std::unique_ptr<WgiGamepadDevice>>;
- const DeviceMap& GetGamepadsForTesting() const { return devices_; }
- InitializationState GetInitializationState() const;
- private:
- // Set the state of the new connected gamepad to initialized, update
- // gamepad state connection status, and add a new controller mapping for
- // `gamepad` to `gamepads_` on gamepad polling thread.
- void OnGamepadAdded(IInspectable* /* sender */,
- ABI::Windows::Gaming::Input::IGamepad* gamepad);
- // Remove the corresponding controller mapping of `gamepad` in `gamepads_`
- // on gamepad polling thread.
- void OnGamepadRemoved(IInspectable* /* sender */,
- ABI::Windows::Gaming::Input::IGamepad* gamepad);
- static ActivationFactoryFunctionCallback&
- GetActivationFactoryFunctionCallback();
- std::u16string GetGamepadDisplayName(
- ABI::Windows::Gaming::Input::IGamepad* gamepad);
- Microsoft::WRL::ComPtr<ABI::Windows::Gaming::Input::IRawGameController>
- GetRawGameController(ABI::Windows::Gaming::Input::IGamepad* gamepad);
- void UnregisterEventHandlers();
- int next_source_id_ = 0;
- InitializationState initialization_state_ =
- InitializationState::kUninitialized;
- DeviceMap devices_;
- Microsoft::WRL::ComPtr<ABI::Windows::Gaming::Input::IGamepadStatics>
- gamepad_statics_;
- GetActivationFactoryFunction get_activation_factory_function_;
- absl::optional<EventRegistrationToken> added_event_token_;
- absl::optional<EventRegistrationToken> removed_event_token_;
- SEQUENCE_CHECKER(sequence_checker_);
- base::WeakPtrFactory<WgiDataFetcherWin> weak_factory_{this};
- };
- } // namespace device
- #endif // DEVICE_GAMEPAD_WGI_DATA_FETCHER_WIN_H_
|