bluetooth_advertisement_monitor_service_provider_impl.cc 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  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. #include "device/bluetooth/dbus/bluetooth_advertisement_monitor_service_provider_impl.h"
  5. #include "base/bind.h"
  6. #include "base/logging.h"
  7. #include "third_party/cros_system_api/dbus/service_constants.h"
  8. namespace {
  9. constexpr char kOrPatternsFilterType[] = "or_patterns";
  10. }
  11. namespace bluez {
  12. BluetoothAdvertisementMonitorServiceProviderImpl::
  13. BluetoothAdvertisementMonitorServiceProviderImpl(
  14. dbus::Bus* bus,
  15. const dbus::ObjectPath& object_path,
  16. std::unique_ptr<device::BluetoothLowEnergyScanFilter> filter,
  17. base::WeakPtr<BluetoothAdvertisementMonitorServiceProvider::Delegate>
  18. delegate)
  19. : origin_thread_id_(base::PlatformThread::CurrentId()),
  20. bus_(bus),
  21. object_path_(object_path),
  22. filter_(std::move(filter)),
  23. delegate_(delegate) {
  24. DVLOG(2)
  25. << "Created Bluetooth Bluetooth Advertisement Monitor Service Provider: "
  26. << object_path.value();
  27. DCHECK(bus_);
  28. DCHECK(object_path_.IsValid());
  29. exported_object_ = bus_->GetExportedObject(object_path_);
  30. if (!exported_object_) {
  31. LOG(WARNING) << "Invalid exported_object";
  32. return;
  33. }
  34. exported_object_->ExportMethod(
  35. bluetooth_advertisement_monitor::kBluetoothAdvertisementMonitorInterface,
  36. bluetooth_advertisement_monitor::kRelease,
  37. base::BindRepeating(
  38. &BluetoothAdvertisementMonitorServiceProviderImpl::Release,
  39. weak_ptr_factory_.GetWeakPtr()),
  40. base::BindOnce(
  41. &BluetoothAdvertisementMonitorServiceProviderImpl::OnExported,
  42. weak_ptr_factory_.GetWeakPtr()));
  43. exported_object_->ExportMethod(
  44. bluetooth_advertisement_monitor::kBluetoothAdvertisementMonitorInterface,
  45. bluetooth_advertisement_monitor::kActivate,
  46. base::BindRepeating(
  47. &BluetoothAdvertisementMonitorServiceProviderImpl::Activate,
  48. weak_ptr_factory_.GetWeakPtr()),
  49. base::BindOnce(
  50. &BluetoothAdvertisementMonitorServiceProviderImpl::OnExported,
  51. weak_ptr_factory_.GetWeakPtr()));
  52. exported_object_->ExportMethod(
  53. bluetooth_advertisement_monitor::kBluetoothAdvertisementMonitorInterface,
  54. bluetooth_advertisement_monitor::kDeviceFound,
  55. base::BindRepeating(
  56. &BluetoothAdvertisementMonitorServiceProviderImpl::DeviceFound,
  57. weak_ptr_factory_.GetWeakPtr()),
  58. base::BindOnce(
  59. &BluetoothAdvertisementMonitorServiceProviderImpl::OnExported,
  60. weak_ptr_factory_.GetWeakPtr()));
  61. exported_object_->ExportMethod(
  62. bluetooth_advertisement_monitor::kBluetoothAdvertisementMonitorInterface,
  63. bluetooth_advertisement_monitor::kDeviceLost,
  64. base::BindRepeating(
  65. &BluetoothAdvertisementMonitorServiceProviderImpl::DeviceLost,
  66. weak_ptr_factory_.GetWeakPtr()),
  67. base::BindOnce(
  68. &BluetoothAdvertisementMonitorServiceProviderImpl::OnExported,
  69. weak_ptr_factory_.GetWeakPtr()));
  70. }
  71. BluetoothAdvertisementMonitorServiceProviderImpl::
  72. ~BluetoothAdvertisementMonitorServiceProviderImpl() {
  73. DVLOG(2) << "Cleaning up Bluetooth Advertisement Monitor Service: "
  74. << object_path_.value();
  75. DCHECK(bus_);
  76. bus_->UnregisterExportedObject(object_path_);
  77. }
  78. bool BluetoothAdvertisementMonitorServiceProviderImpl::OnOriginThread() const {
  79. return base::PlatformThread::CurrentId() == origin_thread_id_;
  80. }
  81. void BluetoothAdvertisementMonitorServiceProviderImpl::Release(
  82. dbus::MethodCall* method_call,
  83. dbus::ExportedObject::ResponseSender response_sender) {
  84. if (!delegate_) {
  85. DVLOG(2) << "Could not forward D-Bus callback: Invalid delegate";
  86. return;
  87. }
  88. delegate_->OnRelease();
  89. }
  90. void BluetoothAdvertisementMonitorServiceProviderImpl::Activate(
  91. dbus::MethodCall* method_call,
  92. dbus::ExportedObject::ResponseSender response_sender) {
  93. if (!delegate_) {
  94. DVLOG(2) << "Could not forward D-Bus callback: Invalid delegate";
  95. return;
  96. }
  97. delegate_->OnActivate();
  98. }
  99. void BluetoothAdvertisementMonitorServiceProviderImpl::DeviceFound(
  100. dbus::MethodCall* method_call,
  101. dbus::ExportedObject::ResponseSender response_sender) {
  102. if (!delegate_) {
  103. DVLOG(2) << "Could not forward D-Bus callback: Invalid delegate";
  104. return;
  105. }
  106. dbus::MessageReader reader(method_call);
  107. dbus::ObjectPath device_path;
  108. if (!reader.PopObjectPath(&device_path)) {
  109. LOG(WARNING) << "DeviceFound called with incorrect parameters: "
  110. << method_call->ToString();
  111. return;
  112. }
  113. delegate_->OnDeviceFound(device_path);
  114. }
  115. void BluetoothAdvertisementMonitorServiceProviderImpl::DeviceLost(
  116. dbus::MethodCall* method_call,
  117. dbus::ExportedObject::ResponseSender response_sender) {
  118. if (!delegate_) {
  119. DVLOG(2) << "Could not forward D-Bus callback: Invalid delegate";
  120. return;
  121. }
  122. dbus::MessageReader reader(method_call);
  123. dbus::ObjectPath device_path;
  124. if (!reader.PopObjectPath(&device_path)) {
  125. LOG(WARNING) << "DeviceLost called with incorrect paramters: "
  126. << method_call->ToString();
  127. return;
  128. }
  129. delegate_->OnDeviceLost(device_path);
  130. }
  131. void BluetoothAdvertisementMonitorServiceProviderImpl::WriteProperties(
  132. dbus::MessageWriter* writer) {
  133. dbus::MessageWriter array_writer(nullptr);
  134. writer->OpenArray("{sv}", &array_writer);
  135. dbus::MessageWriter dict_entry_writer(nullptr);
  136. array_writer.OpenDictEntry(&dict_entry_writer);
  137. dict_entry_writer.AppendString(bluetooth_advertisement_monitor::kType);
  138. // or_patterns is the only supported type.
  139. dict_entry_writer.AppendVariantOfString(kOrPatternsFilterType);
  140. array_writer.CloseContainer(&dict_entry_writer);
  141. array_writer.OpenDictEntry(&dict_entry_writer);
  142. dict_entry_writer.AppendString(
  143. bluetooth_advertisement_monitor::kRSSIHighThreshold);
  144. dict_entry_writer.AppendVariantOfInt16(
  145. filter_->device_found_rssi_threshold());
  146. array_writer.CloseContainer(&dict_entry_writer);
  147. array_writer.OpenDictEntry(&dict_entry_writer);
  148. dict_entry_writer.AppendString(
  149. bluetooth_advertisement_monitor::kRSSIHighTimeout);
  150. dict_entry_writer.AppendVariantOfUint16(
  151. filter_->device_found_timeout().InSeconds());
  152. array_writer.CloseContainer(&dict_entry_writer);
  153. array_writer.OpenDictEntry(&dict_entry_writer);
  154. dict_entry_writer.AppendString(
  155. bluetooth_advertisement_monitor::kRSSILowThreshold);
  156. dict_entry_writer.AppendVariantOfInt16(filter_->device_lost_rssi_threshold());
  157. array_writer.CloseContainer(&dict_entry_writer);
  158. array_writer.OpenDictEntry(&dict_entry_writer);
  159. dict_entry_writer.AppendString(
  160. bluetooth_advertisement_monitor::kRSSILowTimeout);
  161. dict_entry_writer.AppendVariantOfUint16(
  162. filter_->device_lost_timeout().InSeconds());
  163. array_writer.CloseContainer(&dict_entry_writer);
  164. if (filter_->rssi_sampling_period().has_value()) {
  165. array_writer.OpenDictEntry(&dict_entry_writer);
  166. dict_entry_writer.AppendString(
  167. bluetooth_advertisement_monitor::kRSSISamplingPeriod);
  168. // Convert from ms to 100ms * N format.
  169. dict_entry_writer.AppendVariantOfUint16(
  170. filter_->rssi_sampling_period().value().InMilliseconds() / 100);
  171. array_writer.CloseContainer(&dict_entry_writer);
  172. }
  173. array_writer.OpenDictEntry(&dict_entry_writer);
  174. dict_entry_writer.AppendString(bluetooth_advertisement_monitor::kPatterns);
  175. dbus::MessageWriter variant_writer(nullptr);
  176. dict_entry_writer.OpenVariant("a(yyay)", &variant_writer);
  177. dbus::MessageWriter pattern_array_writer(nullptr);
  178. variant_writer.OpenArray("(yyay)", &pattern_array_writer);
  179. for (auto& pattern : filter_->patterns()) {
  180. WritePattern(&pattern_array_writer, pattern.start_position(),
  181. static_cast<uint8_t>(pattern.data_type()), &pattern.value()[0],
  182. pattern.value().size());
  183. }
  184. variant_writer.CloseContainer(&pattern_array_writer);
  185. dict_entry_writer.CloseContainer(&variant_writer);
  186. array_writer.CloseContainer(&dict_entry_writer);
  187. writer->CloseContainer(&array_writer);
  188. }
  189. void BluetoothAdvertisementMonitorServiceProviderImpl::OnExported(
  190. const std::string& interface_name,
  191. const std::string& method_name,
  192. bool success) {
  193. DVLOG_IF(1, !success) << "Failed to export " << interface_name << "."
  194. << method_name;
  195. }
  196. void BluetoothAdvertisementMonitorServiceProviderImpl::WritePattern(
  197. dbus::MessageWriter* pattern_array_writer,
  198. uint8_t start_pos,
  199. uint8_t ad_data_type,
  200. const uint8_t* content_of_pattern,
  201. size_t pattern_length) {
  202. dbus::MessageWriter struct_writer(nullptr);
  203. pattern_array_writer->OpenStruct(&struct_writer);
  204. struct_writer.AppendByte(start_pos);
  205. struct_writer.AppendByte(ad_data_type);
  206. struct_writer.AppendArrayOfBytes(content_of_pattern, pattern_length);
  207. pattern_array_writer->CloseContainer(&struct_writer);
  208. }
  209. const dbus::ObjectPath&
  210. BluetoothAdvertisementMonitorServiceProviderImpl::object_path() const {
  211. return object_path_;
  212. }
  213. } // namespace bluez