message_stream_lookup_impl.h 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. // Copyright 2021 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. #ifndef ASH_QUICK_PAIR_MESSAGE_STREAM_MESSAGE_STREAM_LOOKUP_IMPL_H_
  5. #define ASH_QUICK_PAIR_MESSAGE_STREAM_MESSAGE_STREAM_LOOKUP_IMPL_H_
  6. #include "ash/quick_pair/message_stream/message_stream_lookup.h"
  7. #include <string>
  8. #include "ash/quick_pair/message_stream/message_stream.h"
  9. #include "base/containers/flat_map.h"
  10. #include "base/containers/flat_set.h"
  11. #include "base/memory/scoped_refptr.h"
  12. #include "base/memory/weak_ptr.h"
  13. #include "base/scoped_observation.h"
  14. #include "base/time/time.h"
  15. #include "device/bluetooth/bluetooth_adapter.h"
  16. namespace device {
  17. class BluetoothDevice;
  18. class BluetoothSocket;
  19. } // namespace device
  20. namespace ash {
  21. namespace quick_pair {
  22. class MessageStreamLookupImpl : public MessageStreamLookup,
  23. public device::BluetoothAdapter::Observer {
  24. public:
  25. MessageStreamLookupImpl();
  26. MessageStreamLookupImpl(const MessageStreamLookupImpl&) = delete;
  27. MessageStreamLookupImpl& operator=(const MessageStreamLookupImpl&) = delete;
  28. ~MessageStreamLookupImpl() override;
  29. void AddObserver(MessageStreamLookup::Observer* observer) override;
  30. void RemoveObserver(MessageStreamLookup::Observer* observer) override;
  31. MessageStream* GetMessageStream(const std::string& device_address) override;
  32. private:
  33. // Enum class to bind to attempts to create RFCOMM channels for logging which
  34. // BluetoothAdapter API triggers succeeded and failed.
  35. enum class CreateMessageStreamAttemptType {
  36. kDeviceConnectedStateChanged = 0,
  37. kDeviceAdded = 1,
  38. kDevicePairedChanged = 2,
  39. kDeviceChanged = 3,
  40. };
  41. // Helper function to be used in log messages to understand success and errors
  42. // for creating RFCOMM channel to the device.
  43. std::string CreateMessageStreamAttemptTypeToString(
  44. const CreateMessageStreamAttemptType& type);
  45. // device::BluetoothAdapter::Observer
  46. void DeviceConnectedStateChanged(device::BluetoothAdapter* adapter,
  47. device::BluetoothDevice* device,
  48. bool is_now_connected) override;
  49. void DeviceRemoved(device::BluetoothAdapter* adapter,
  50. device::BluetoothDevice* device) override;
  51. void DeviceAdded(device::BluetoothAdapter* adapter,
  52. device::BluetoothDevice* device) override;
  53. void DevicePairedChanged(device::BluetoothAdapter* adapter,
  54. device::BluetoothDevice* device,
  55. bool new_paired_status) override;
  56. void DeviceChanged(device::BluetoothAdapter* adapter,
  57. device::BluetoothDevice* device) override;
  58. // Helper functions to create and remove message stream objects and open and
  59. // close RFCOMM channels based on whether the device is connected or
  60. // disconnected from the adapter.
  61. void AttemptCreateMessageStream(device::BluetoothDevice* device,
  62. const CreateMessageStreamAttemptType& type);
  63. void AttemptRemoveMessageStream(const std::string& device_address);
  64. // Create RFCOMM connection callbacks.
  65. void OnConnected(std::string device_address,
  66. base::TimeTicks connect_to_service_start_time,
  67. const CreateMessageStreamAttemptType& type,
  68. scoped_refptr<device::BluetoothSocket> socket);
  69. void OnConnectError(std::string device_address,
  70. const CreateMessageStreamAttemptType& type,
  71. const std::string& error_message);
  72. // Helper function to disconnect socket from a MessageStream instance and
  73. // destroy the MessageStream instance. Used by both |RemoveMessageStream| and
  74. // |DeviceRemoved|.
  75. void AttemptEraseMessageStream(const std::string& device_address);
  76. // Callback for disconnected the socket from the MessageStream.
  77. void OnSocketDisconnected(const std::string& device_address);
  78. // Internal method called by BluetoothAdapterFactory to provide the adapter
  79. // object.
  80. void OnGetAdapter(scoped_refptr<device::BluetoothAdapter> adapter);
  81. base::ObserverList<MessageStreamLookup::Observer> observers_;
  82. base::flat_map<std::string, std::unique_ptr<MessageStream>> message_streams_;
  83. scoped_refptr<device::BluetoothAdapter> adapter_;
  84. base::flat_set<std::string> pending_connect_requests_;
  85. base::ScopedObservation<device::BluetoothAdapter,
  86. device::BluetoothAdapter::Observer>
  87. adapter_observation_{this};
  88. base::WeakPtrFactory<MessageStreamLookupImpl> weak_ptr_factory_{this};
  89. };
  90. } // namespace quick_pair
  91. } // namespace ash
  92. #endif // ASH_QUICK_PAIR_MESSAGE_STREAM_MESSAGE_STREAM_LOOKUP_IMPL_H_