gamepad_monitor.cc 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. // Copyright (c) 2011 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "device/gamepad/gamepad_monitor.h"
  5. #include <utility>
  6. #include "base/memory/ptr_util.h"
  7. #include "device/gamepad/gamepad_service.h"
  8. #include "device/gamepad/gamepad_shared_buffer.h"
  9. #include "mojo/public/cpp/bindings/message.h"
  10. #include "mojo/public/cpp/bindings/self_owned_receiver.h"
  11. namespace device {
  12. GamepadMonitor::GamepadMonitor() = default;
  13. GamepadMonitor::~GamepadMonitor() {
  14. if (is_registered_consumer_)
  15. GamepadService::GetInstance()->RemoveConsumer(this);
  16. }
  17. // static
  18. void GamepadMonitor::Create(
  19. mojo::PendingReceiver<mojom::GamepadMonitor> receiver) {
  20. mojo::MakeSelfOwnedReceiver(std::make_unique<GamepadMonitor>(),
  21. std::move(receiver));
  22. }
  23. void GamepadMonitor::OnGamepadConnected(uint32_t index,
  24. const Gamepad& gamepad) {
  25. if (gamepad_observer_remote_)
  26. gamepad_observer_remote_->GamepadConnected(index, gamepad);
  27. }
  28. void GamepadMonitor::OnGamepadDisconnected(uint32_t index,
  29. const Gamepad& gamepad) {
  30. if (gamepad_observer_remote_)
  31. gamepad_observer_remote_->GamepadDisconnected(index, gamepad);
  32. }
  33. void GamepadMonitor::OnGamepadChanged(const mojom::GamepadChanges& changes) {
  34. if (gamepad_observer_remote_)
  35. gamepad_observer_remote_->GamepadChanged(changes.Clone());
  36. }
  37. void GamepadMonitor::GamepadStartPolling(GamepadStartPollingCallback callback) {
  38. DCHECK(!is_started_);
  39. is_started_ = true;
  40. is_registered_consumer_ = true;
  41. GamepadService* service = GamepadService::GetInstance();
  42. if (!service->ConsumerBecameActive(this)) {
  43. mojo::ReportBadMessage("GamepadMonitor::GamepadStartPolling failed");
  44. // On error, invoke `callback` with a default-initialized memory region
  45. // instead of the real memory region.
  46. std::move(callback).Run(base::ReadOnlySharedMemoryRegion());
  47. return;
  48. }
  49. std::move(callback).Run(service->DuplicateSharedMemoryRegion());
  50. }
  51. void GamepadMonitor::GamepadStopPolling(GamepadStopPollingCallback callback) {
  52. DCHECK(is_started_);
  53. is_started_ = false;
  54. if (!GamepadService::GetInstance()->ConsumerBecameInactive(this)) {
  55. mojo::ReportBadMessage("GamepadMonitor::GamepadStopPolling failed");
  56. }
  57. // Invoke `callback` regardless of whether an error was encountered.
  58. std::move(callback).Run();
  59. }
  60. void GamepadMonitor::SetObserver(
  61. mojo::PendingRemote<mojom::GamepadObserver> gamepad_observer) {
  62. gamepad_observer_remote_.Bind(std::move(gamepad_observer));
  63. }
  64. } // namespace device