1 // 2 // Copyright (C) 2015 Google, Inc. 3 // 4 // Licensed under the Apache License, Version 2.0 (the "License"); 5 // you may not use this file except in compliance with the License. 6 // You may obtain a copy of the License at: 7 // 8 // http://www.apache.org/licenses/LICENSE-2.0 9 // 10 // Unless required by applicable law or agreed to in writing, software 11 // distributed under the License is distributed on an "AS IS" BASIS, 12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 // See the License for the specific language governing permissions and 14 // limitations under the License. 15 // 16 17 #include "service/hal/bluetooth_gatt_interface.h" 18 19 #include <mutex> 20 #define _LIBCPP_BUILDING_SHARED_MUTEX 21 #include <shared_mutex> 22 #undef _LIBCPP_BUILDING_SHARED_MUTEX 23 24 #include <base/logging.h> 25 #include <base/observer_list.h> 26 27 #include "service/hal/bluetooth_interface.h" 28 #include "service/logging_helpers.h" 29 30 using std::lock_guard; 31 using std::unique_lock; 32 using std::shared_lock; 33 using std::mutex; 34 using std::shared_timed_mutex; 35 36 namespace bluetooth { 37 namespace hal { 38 39 namespace { 40 41 // The global BluetoothGattInterface instance. 42 BluetoothGattInterface* g_interface = nullptr; 43 44 // Mutex used by callbacks to access |g_interface|. If we initialize or clean it 45 // use unique_lock. If only accessing |g_interface| use shared lock. 46 //TODO(jpawlowski): this should be just shared_mutex, as we currently don't use 47 // timed methods. Change to shared_mutex when we upgrade to C++14 48 shared_timed_mutex g_instance_lock; 49 50 // Helper for obtaining the observer lists. This is forward declared here 51 // and defined below since it depends on BluetoothInterfaceImpl. 52 base::ObserverList<BluetoothGattInterface::ClientObserver>* 53 GetClientObservers(); 54 base::ObserverList<BluetoothGattInterface::ServerObserver>* 55 GetServerObservers(); 56 57 #define FOR_EACH_CLIENT_OBSERVER(func) \ 58 FOR_EACH_OBSERVER(BluetoothGattInterface::ClientObserver, \ 59 *GetClientObservers(), func) 60 61 #define FOR_EACH_SERVER_OBSERVER(func) \ 62 FOR_EACH_OBSERVER(BluetoothGattInterface::ServerObserver, \ 63 *GetServerObservers(), func) 64 65 #define VERIFY_INTERFACE_OR_RETURN() \ 66 do { \ 67 if (!g_interface) { \ 68 LOG(WARNING) << "Callback received while |g_interface| is NULL"; \ 69 return; \ 70 } \ 71 } while (0) 72 73 void RegisterClientCallback(int status, int client_if, bt_uuid_t* app_uuid) { 74 shared_lock<shared_timed_mutex> lock(g_instance_lock); 75 VLOG(2) << __func__ << " - status: " << status << " client_if: " << client_if; 76 VERIFY_INTERFACE_OR_RETURN(); 77 CHECK(app_uuid); 78 79 FOR_EACH_CLIENT_OBSERVER( 80 RegisterClientCallback(g_interface, status, client_if, *app_uuid)); 81 } 82 83 void ScanResultCallback(bt_bdaddr_t* bda, int rssi, uint8_t* adv_data) { 84 shared_lock<shared_timed_mutex> lock(g_instance_lock); 85 VERIFY_INTERFACE_OR_RETURN(); 86 CHECK(bda); 87 CHECK(adv_data); 88 89 VLOG(2) << __func__ << " - BD_ADDR: " << BtAddrString(bda) 90 << " RSSI: " << rssi; 91 FOR_EACH_CLIENT_OBSERVER( 92 ScanResultCallback(g_interface, *bda, rssi, adv_data)); 93 } 94 95 void ConnectCallback(int conn_id, int status, int client_if, bt_bdaddr_t* bda) { 96 shared_lock<shared_timed_mutex> lock(g_instance_lock); 97 VERIFY_INTERFACE_OR_RETURN(); 98 CHECK(bda); 99 100 VLOG(2) << __func__ << " - status: " << status 101 << " client_if: " << client_if 102 << " - BD_ADDR: " << BtAddrString(bda) 103 << " - conn_id: " << conn_id; 104 105 FOR_EACH_CLIENT_OBSERVER( 106 ConnectCallback(g_interface, conn_id, status, client_if, *bda)); 107 } 108 109 void DisconnectCallback(int conn_id, int status, int client_if, 110 bt_bdaddr_t* bda) { 111 shared_lock<shared_timed_mutex> lock(g_instance_lock); 112 VERIFY_INTERFACE_OR_RETURN(); 113 CHECK(bda); 114 115 VLOG(2) << __func__ << " - conn_id: " << conn_id 116 << " - status: " << status 117 << " client_if: " << client_if 118 << " - BD_ADDR: " << BtAddrString(bda); 119 FOR_EACH_CLIENT_OBSERVER( 120 DisconnectCallback(g_interface, conn_id, status, client_if, *bda)); 121 } 122 123 void SearchCompleteCallback(int conn_id, int status) { 124 shared_lock<shared_timed_mutex> lock(g_instance_lock); 125 VERIFY_INTERFACE_OR_RETURN(); 126 127 VLOG(2) << __func__ << " - conn_id: " << conn_id 128 << " - status: " << status; 129 FOR_EACH_CLIENT_OBSERVER( 130 SearchCompleteCallback(g_interface, conn_id, status)); 131 } 132 133 void RegisterForNotificationCallback(int conn_id, int registered, int status, uint16_t handle) { 134 shared_lock<shared_timed_mutex> lock(g_instance_lock); 135 VERIFY_INTERFACE_OR_RETURN(); 136 137 LOG(INFO) << __func__ << " - conn_id: " << conn_id 138 << " - status: " << status 139 << " - registered: " << registered 140 << " - handle: " << handle; 141 FOR_EACH_CLIENT_OBSERVER( 142 RegisterForNotificationCallback(g_interface, conn_id, status, registered, handle)); 143 } 144 145 void NotifyCallback(int conn_id, btgatt_notify_params_t *p_data) { 146 shared_lock<shared_timed_mutex> lock(g_instance_lock); 147 VERIFY_INTERFACE_OR_RETURN(); 148 149 VLOG(2) << __func__ << " - conn_id: " << conn_id 150 << " - address: " << BtAddrString(&p_data->bda) 151 << " - handle: " << p_data->handle 152 << " - len: " << p_data->len 153 << " - is_notify: " << p_data->is_notify; 154 155 FOR_EACH_CLIENT_OBSERVER( 156 NotifyCallback(g_interface, conn_id, p_data)); 157 } 158 159 void WriteCharacteristicCallback(int conn_id, int status, uint16_t handle) { 160 shared_lock<shared_timed_mutex> lock(g_instance_lock); 161 VERIFY_INTERFACE_OR_RETURN(); 162 163 VLOG(2) << __func__ << " - conn_id: " << conn_id 164 << " - status: " << status; 165 166 FOR_EACH_CLIENT_OBSERVER( 167 WriteCharacteristicCallback(g_interface, conn_id, status, handle)); 168 } 169 170 void WriteDescriptorCallback(int conn_id, int status, 171 uint16_t handle) { 172 shared_lock<shared_timed_mutex> lock(g_instance_lock); 173 VERIFY_INTERFACE_OR_RETURN(); 174 175 VLOG(2) << __func__ << " - conn_id: " << conn_id 176 << " - status: " << status; 177 178 FOR_EACH_CLIENT_OBSERVER( 179 WriteDescriptorCallback(g_interface, conn_id, status, handle)); 180 } 181 182 void ListenCallback(int status, int client_if) { 183 shared_lock<shared_timed_mutex> lock(g_instance_lock); 184 VLOG(2) << __func__ << " - status: " << status << " client_if: " << client_if; 185 VERIFY_INTERFACE_OR_RETURN(); 186 187 FOR_EACH_CLIENT_OBSERVER(ListenCallback(g_interface, status, client_if)); 188 } 189 190 void MtuChangedCallback(int conn_id, int status, int mtu) { 191 shared_lock<shared_timed_mutex> lock(g_instance_lock); 192 VERIFY_INTERFACE_OR_RETURN(); 193 194 VLOG(2) << __func__ << " - conn_id: " << conn_id 195 << " status: " << status 196 << " mtu: " << mtu; 197 198 FOR_EACH_CLIENT_OBSERVER(MtuChangedCallback(g_interface, conn_id, status, mtu)); 199 } 200 201 void MultiAdvEnableCallback(int client_if, int status) { 202 shared_lock<shared_timed_mutex> lock(g_instance_lock); 203 VLOG(2) << __func__ << " - status: " << status << " client_if: " << client_if; 204 VERIFY_INTERFACE_OR_RETURN(); 205 206 FOR_EACH_CLIENT_OBSERVER( 207 MultiAdvEnableCallback(g_interface, client_if, status)); 208 } 209 210 void MultiAdvUpdateCallback(int client_if, int status) { 211 shared_lock<shared_timed_mutex> lock(g_instance_lock); 212 VLOG(2) << __func__ << " - status: " << status << " client_if: " << client_if; 213 VERIFY_INTERFACE_OR_RETURN(); 214 215 FOR_EACH_CLIENT_OBSERVER( 216 MultiAdvUpdateCallback(g_interface, client_if, status)); 217 } 218 219 void MultiAdvDataCallback(int client_if, int status) { 220 shared_lock<shared_timed_mutex> lock(g_instance_lock); 221 VLOG(2) << __func__ << " - status: " << status << " client_if: " << client_if; 222 VERIFY_INTERFACE_OR_RETURN(); 223 224 FOR_EACH_CLIENT_OBSERVER( 225 MultiAdvDataCallback(g_interface, client_if, status)); 226 } 227 228 void MultiAdvDisableCallback(int client_if, int status) { 229 shared_lock<shared_timed_mutex> lock(g_instance_lock); 230 VLOG(2) << __func__ << " - status: " << status << " client_if: " << client_if; 231 VERIFY_INTERFACE_OR_RETURN(); 232 233 FOR_EACH_CLIENT_OBSERVER( 234 MultiAdvDisableCallback(g_interface, client_if, status)); 235 } 236 237 void GetGattDbCallback(int conn_id, btgatt_db_element_t *db, int size) { 238 shared_lock<shared_timed_mutex> lock(g_instance_lock); 239 VLOG(2) << __func__ << " - conn_id: " << conn_id << " size: " << size; 240 VERIFY_INTERFACE_OR_RETURN(); 241 242 FOR_EACH_CLIENT_OBSERVER( 243 GetGattDbCallback(g_interface, conn_id, db, size)); 244 } 245 246 void ServicesRemovedCallback(int conn_id, uint16_t start_handle, uint16_t end_handle) { 247 shared_lock<shared_timed_mutex> lock(g_instance_lock); 248 VLOG(2) << __func__ << " - conn_id: " << conn_id 249 << " start_handle: " << start_handle 250 << " end_handle: " << end_handle; 251 VERIFY_INTERFACE_OR_RETURN(); 252 253 FOR_EACH_CLIENT_OBSERVER( 254 ServicesRemovedCallback(g_interface, conn_id, start_handle, end_handle)); 255 } 256 257 void ServicesAddedCallback(int conn_id, btgatt_db_element_t *added, int added_count) { 258 shared_lock<shared_timed_mutex> lock(g_instance_lock); 259 VLOG(2) << __func__ << " - conn_id: " << conn_id 260 << " added_count: " << added_count; 261 VERIFY_INTERFACE_OR_RETURN(); 262 263 FOR_EACH_CLIENT_OBSERVER( 264 ServicesAddedCallback(g_interface, conn_id, added, added_count)); 265 } 266 267 void RegisterServerCallback(int status, int server_if, bt_uuid_t* app_uuid) { 268 shared_lock<shared_timed_mutex> lock(g_instance_lock); 269 VLOG(2) << __func__ << " - status: " << status << " server_if: " << server_if; 270 VERIFY_INTERFACE_OR_RETURN(); 271 CHECK(app_uuid); 272 273 FOR_EACH_SERVER_OBSERVER( 274 RegisterServerCallback(g_interface, status, server_if, *app_uuid)); 275 } 276 277 void ConnectionCallback(int conn_id, int server_if, int connected, 278 bt_bdaddr_t* bda) { 279 shared_lock<shared_timed_mutex> lock(g_instance_lock); 280 VLOG(2) << __func__ << " - conn_id: " << conn_id 281 << " server_if: " << server_if << " connected: " << connected; 282 VERIFY_INTERFACE_OR_RETURN(); 283 CHECK(bda); 284 285 FOR_EACH_SERVER_OBSERVER( 286 ConnectionCallback(g_interface, conn_id, server_if, connected, *bda)); 287 } 288 289 void ServiceAddedCallback( 290 int status, 291 int server_if, 292 btgatt_srvc_id_t* srvc_id, 293 int srvc_handle) { 294 shared_lock<shared_timed_mutex> lock(g_instance_lock); 295 VLOG(2) << __func__ << " - status: " << status << " server_if: " << server_if 296 << " handle: " << srvc_handle; 297 VERIFY_INTERFACE_OR_RETURN(); 298 CHECK(srvc_id); 299 300 FOR_EACH_SERVER_OBSERVER(ServiceAddedCallback( 301 g_interface, status, server_if, *srvc_id, srvc_handle)); 302 } 303 304 void CharacteristicAddedCallback( 305 int status, int server_if, 306 bt_uuid_t* uuid, 307 int srvc_handle, 308 int char_handle) { 309 shared_lock<shared_timed_mutex> lock(g_instance_lock); 310 VLOG(2) << __func__ << " - status: " << status << " server_if: " << server_if 311 << " srvc_handle: " << srvc_handle << " char_handle: " << char_handle; 312 VERIFY_INTERFACE_OR_RETURN(); 313 CHECK(uuid); 314 315 FOR_EACH_SERVER_OBSERVER(CharacteristicAddedCallback( 316 g_interface, status, server_if, *uuid, srvc_handle, char_handle)); 317 } 318 319 void DescriptorAddedCallback( 320 int status, int server_if, 321 bt_uuid_t* uuid, 322 int srvc_handle, 323 int desc_handle) { 324 shared_lock<shared_timed_mutex> lock(g_instance_lock); 325 VLOG(2) << __func__ << " - status: " << status << " server_if: " << server_if 326 << " srvc_handle: " << srvc_handle << " desc_handle: " << desc_handle; 327 VERIFY_INTERFACE_OR_RETURN(); 328 CHECK(uuid); 329 330 FOR_EACH_SERVER_OBSERVER(DescriptorAddedCallback( 331 g_interface, status, server_if, *uuid, srvc_handle, desc_handle)); 332 } 333 334 void ServiceStartedCallback(int status, int server_if, int srvc_handle) { 335 shared_lock<shared_timed_mutex> lock(g_instance_lock); 336 VLOG(2) << __func__ << " - status: " << status << " server_if: " << server_if 337 << " handle: " << srvc_handle; 338 VERIFY_INTERFACE_OR_RETURN(); 339 340 FOR_EACH_SERVER_OBSERVER(ServiceStartedCallback( 341 g_interface, status, server_if, srvc_handle)); 342 } 343 344 void ServiceStoppedCallback(int status, int server_if, int srvc_handle) { 345 shared_lock<shared_timed_mutex> lock(g_instance_lock); 346 VLOG(2) << __func__ << " - status: " << status << " server_if: " << server_if 347 << " handle: " << srvc_handle; 348 VERIFY_INTERFACE_OR_RETURN(); 349 350 FOR_EACH_SERVER_OBSERVER(ServiceStoppedCallback( 351 g_interface, status, server_if, srvc_handle)); 352 } 353 354 void ServiceDeletedCallback(int status, int server_if, int srvc_handle) { 355 shared_lock<shared_timed_mutex> lock(g_instance_lock); 356 VLOG(2) << __func__ << " - status: " << status << " server_if: " << server_if 357 << " handle: " << srvc_handle; 358 VERIFY_INTERFACE_OR_RETURN(); 359 360 FOR_EACH_SERVER_OBSERVER(ServiceDeletedCallback( 361 g_interface, status, server_if, srvc_handle)); 362 } 363 364 void RequestReadCallback(int conn_id, int trans_id, bt_bdaddr_t* bda, 365 int attr_handle, int offset, bool is_long) { 366 shared_lock<shared_timed_mutex> lock(g_instance_lock); 367 VLOG(2) << __func__ << " - conn_id: " << conn_id << " trans_id: " << trans_id 368 << " attr_handle: " << attr_handle << " offset: " << offset 369 << " is_long: " << is_long; 370 VERIFY_INTERFACE_OR_RETURN(); 371 CHECK(bda); 372 373 FOR_EACH_SERVER_OBSERVER(RequestReadCallback( 374 g_interface, conn_id, trans_id, *bda, attr_handle, offset, is_long)); 375 } 376 377 void RequestWriteCallback(int conn_id, int trans_id, 378 bt_bdaddr_t* bda, 379 int attr_handle, int offset, int length, 380 bool need_rsp, bool is_prep, uint8_t* value) { 381 shared_lock<shared_timed_mutex> lock(g_instance_lock); 382 VLOG(2) << __func__ << " - conn_id: " << conn_id << " trans_id: " << trans_id 383 << " attr_handle: " << attr_handle << " offset: " << offset 384 << " length: " << length << " need_rsp: " << need_rsp 385 << " is_prep: " << is_prep; 386 VERIFY_INTERFACE_OR_RETURN(); 387 CHECK(bda); 388 389 FOR_EACH_SERVER_OBSERVER(RequestWriteCallback( 390 g_interface, conn_id, trans_id, *bda, attr_handle, offset, length, 391 need_rsp, is_prep, value)); 392 } 393 394 void RequestExecWriteCallback(int conn_id, int trans_id, 395 bt_bdaddr_t* bda, int exec_write) { 396 shared_lock<shared_timed_mutex> lock(g_instance_lock); 397 VLOG(2) << __func__ << " - conn_id: " << conn_id << " trans_id: " << trans_id 398 << " exec_write: " << exec_write; 399 VERIFY_INTERFACE_OR_RETURN(); 400 CHECK(bda); 401 402 FOR_EACH_SERVER_OBSERVER(RequestExecWriteCallback( 403 g_interface, conn_id, trans_id, *bda, exec_write)); 404 } 405 406 void ResponseConfirmationCallback(int status, int handle) { 407 shared_lock<shared_timed_mutex> lock(g_instance_lock); 408 VLOG(2) << __func__ << " - status: " << status << " handle: " << handle; 409 VERIFY_INTERFACE_OR_RETURN(); 410 411 FOR_EACH_SERVER_OBSERVER(ResponseConfirmationCallback( 412 g_interface, status, handle)); 413 } 414 415 void IndicationSentCallback(int conn_id, int status) { 416 shared_lock<shared_timed_mutex> lock(g_instance_lock); 417 VLOG(2) << __func__ << " - conn_id: " << conn_id << " status: " << status; 418 VERIFY_INTERFACE_OR_RETURN(); 419 420 FOR_EACH_SERVER_OBSERVER(IndicationSentCallback( 421 g_interface, conn_id, status)); 422 } 423 424 void MtuChangedCallback(int conn_id, int mtu) { 425 shared_lock<shared_timed_mutex> lock(g_instance_lock); 426 VLOG(2) << __func__ << " - conn_id: " << conn_id << " mtu: " << mtu; 427 VERIFY_INTERFACE_OR_RETURN(); 428 429 FOR_EACH_SERVER_OBSERVER(MtuChangedCallback(g_interface, conn_id, mtu)); 430 } 431 432 // The HAL Bluetooth GATT client interface callbacks. These signal a mixture of 433 // GATT client-role and GAP events. 434 const btgatt_client_callbacks_t gatt_client_callbacks = { 435 RegisterClientCallback, 436 ScanResultCallback, 437 ConnectCallback, 438 DisconnectCallback, 439 SearchCompleteCallback, 440 RegisterForNotificationCallback, 441 NotifyCallback, 442 nullptr, // read_characteristic_cb 443 WriteCharacteristicCallback, 444 nullptr, // read_descriptor_cb 445 WriteDescriptorCallback, 446 nullptr, // execute_write_cb 447 nullptr, // read_remote_rssi_cb 448 ListenCallback, 449 MtuChangedCallback, 450 nullptr, // scan_filter_cfg_cb 451 nullptr, // scan_filter_param_cb 452 nullptr, // scan_filter_status_cb 453 MultiAdvEnableCallback, 454 MultiAdvUpdateCallback, 455 MultiAdvDataCallback, 456 MultiAdvDisableCallback, 457 nullptr, // congestion_cb 458 nullptr, // batchscan_cfg_storage_cb 459 nullptr, // batchscan_enb_disable_cb 460 nullptr, // batchscan_reports_cb 461 nullptr, // batchscan_threshold_cb 462 nullptr, // track_adv_event_cb 463 nullptr, // scan_parameter_setup_completed_cb 464 GetGattDbCallback, 465 ServicesRemovedCallback, 466 ServicesAddedCallback, 467 }; 468 469 const btgatt_server_callbacks_t gatt_server_callbacks = { 470 RegisterServerCallback, 471 ConnectionCallback, 472 ServiceAddedCallback, 473 nullptr, // included_service_added_cb 474 CharacteristicAddedCallback, 475 DescriptorAddedCallback, 476 ServiceStartedCallback, 477 ServiceStoppedCallback, 478 ServiceDeletedCallback, 479 RequestReadCallback, 480 RequestWriteCallback, 481 RequestExecWriteCallback, 482 ResponseConfirmationCallback, 483 IndicationSentCallback, 484 nullptr, // congestion_cb 485 MtuChangedCallback, 486 }; 487 488 const btgatt_callbacks_t gatt_callbacks = { 489 sizeof(btgatt_callbacks_t), 490 &gatt_client_callbacks, 491 &gatt_server_callbacks 492 }; 493 494 } // namespace 495 496 // BluetoothGattInterface implementation for production. 497 class BluetoothGattInterfaceImpl : public BluetoothGattInterface { 498 public: 499 BluetoothGattInterfaceImpl() : hal_iface_(nullptr) { 500 } 501 502 ~BluetoothGattInterfaceImpl() override { 503 if (hal_iface_) 504 hal_iface_->cleanup(); 505 } 506 507 // BluetoothGattInterface overrides: 508 void AddClientObserver(ClientObserver* observer) override { 509 client_observers_.AddObserver(observer); 510 } 511 512 void RemoveClientObserver(ClientObserver* observer) override { 513 client_observers_.RemoveObserver(observer); 514 } 515 516 void AddServerObserver(ServerObserver* observer) override { 517 server_observers_.AddObserver(observer); 518 } 519 520 void RemoveServerObserver(ServerObserver* observer) override { 521 server_observers_.RemoveObserver(observer); 522 } 523 524 const btgatt_client_interface_t* GetClientHALInterface() const override { 525 return hal_iface_->client; 526 } 527 528 const btgatt_server_interface_t* GetServerHALInterface() const override { 529 return hal_iface_->server; 530 } 531 532 // Initialize the interface. 533 bool Initialize() { 534 const bt_interface_t* bt_iface = 535 BluetoothInterface::Get()->GetHALInterface(); 536 CHECK(bt_iface); 537 538 const btgatt_interface_t* gatt_iface = 539 reinterpret_cast<const btgatt_interface_t*>( 540 bt_iface->get_profile_interface(BT_PROFILE_GATT_ID)); 541 if (!gatt_iface) { 542 LOG(ERROR) << "Failed to obtain HAL GATT interface handle"; 543 return false; 544 } 545 546 bt_status_t status = gatt_iface->init(&gatt_callbacks); 547 if (status != BT_STATUS_SUCCESS) { 548 LOG(ERROR) << "Failed to initialize HAL GATT interface"; 549 return false; 550 } 551 552 hal_iface_ = gatt_iface; 553 554 return true; 555 } 556 557 base::ObserverList<ClientObserver>* client_observers() { 558 return &client_observers_; 559 } 560 561 base::ObserverList<ServerObserver>* server_observers() { 562 return &server_observers_; 563 } 564 565 private: 566 // List of observers that are interested in notifications from us. 567 // We're not using a base::ObserverListThreadSafe, which it posts observer 568 // events automatically on the origin threads, as we want to avoid that 569 // overhead and simply forward the events to the upper layer. 570 base::ObserverList<ClientObserver> client_observers_; 571 base::ObserverList<ServerObserver> server_observers_; 572 573 // The HAL handle obtained from the shared library. We hold a weak reference 574 // to this since the actual data resides in the shared Bluetooth library. 575 const btgatt_interface_t* hal_iface_; 576 577 DISALLOW_COPY_AND_ASSIGN(BluetoothGattInterfaceImpl); 578 }; 579 580 namespace { 581 582 base::ObserverList<BluetoothGattInterface::ClientObserver>* 583 GetClientObservers() { 584 CHECK(g_interface); 585 return static_cast<BluetoothGattInterfaceImpl*>( 586 g_interface)->client_observers(); 587 } 588 589 base::ObserverList<BluetoothGattInterface::ServerObserver>* 590 GetServerObservers() { 591 CHECK(g_interface); 592 return static_cast<BluetoothGattInterfaceImpl*>( 593 g_interface)->server_observers(); 594 } 595 596 } // namespace 597 598 // Default observer implementations. These are provided so that the methods 599 // themselves are optional. 600 void BluetoothGattInterface::ClientObserver::RegisterClientCallback( 601 BluetoothGattInterface* /* gatt_iface */, 602 int /* status */, 603 int /* client_if */, 604 const bt_uuid_t& /* app_uuid */) { 605 // Do nothing. 606 } 607 void BluetoothGattInterface::ClientObserver::ScanResultCallback( 608 BluetoothGattInterface* /* gatt_iface */, 609 const bt_bdaddr_t& /* bda */, 610 int /* rssi */, 611 uint8_t* /* adv_data */) { 612 // Do Nothing. 613 } 614 615 void BluetoothGattInterface::ClientObserver::ConnectCallback( 616 BluetoothGattInterface* /* gatt_iface */, 617 int /* conn_id */, 618 int /* status */, 619 int /* client_if */, 620 const bt_bdaddr_t& /* bda */) { 621 // Do nothing 622 } 623 624 void BluetoothGattInterface::ClientObserver::DisconnectCallback( 625 BluetoothGattInterface* /* gatt_iface */, 626 int /* conn_id */, 627 int /* status */, 628 int /* client_if */, 629 const bt_bdaddr_t& /* bda */) { 630 // Do nothing 631 } 632 633 void BluetoothGattInterface::ClientObserver::SearchCompleteCallback( 634 BluetoothGattInterface* /* gatt_iface */, 635 int /* conn_id */, 636 int /* status */) { 637 // Do nothing 638 } 639 640 void BluetoothGattInterface::ClientObserver::RegisterForNotificationCallback( 641 BluetoothGattInterface* /* gatt_iface */, 642 int /* conn_id */, 643 int /* status */, 644 int /* registered */, 645 uint16_t /* handle */) { 646 // Do nothing 647 } 648 649 void BluetoothGattInterface::ClientObserver::NotifyCallback( 650 BluetoothGattInterface* /* gatt_iface */, 651 int /* conn_id */, 652 btgatt_notify_params_t* /* p_data */) { 653 // Do nothing 654 } 655 656 void BluetoothGattInterface::ClientObserver::WriteCharacteristicCallback( 657 BluetoothGattInterface* /* gatt_iface */, 658 int /* conn_id */, 659 int /* status */, 660 uint16_t /* handle */) { 661 // Do nothing 662 } 663 664 void BluetoothGattInterface::ClientObserver::WriteDescriptorCallback( 665 BluetoothGattInterface* /* gatt_iface */, 666 int /* conn_id */, 667 int /* status */, 668 uint16_t /* handle */) { 669 // Do nothing 670 } 671 672 void BluetoothGattInterface::ClientObserver::ListenCallback( 673 BluetoothGattInterface* /* gatt_iface */, 674 int /* status */, 675 int /* client_if */) { 676 // Do nothing. 677 } 678 679 void BluetoothGattInterface::ClientObserver::MtuChangedCallback( 680 BluetoothGattInterface* /* gatt_iface */, 681 int /* conn_id */, 682 int /* statis*/, 683 int /* mtu */) { 684 // Do nothing. 685 } 686 687 void BluetoothGattInterface::ClientObserver::MultiAdvEnableCallback( 688 BluetoothGattInterface* /* gatt_iface */, 689 int /* status */, 690 int /* client_if */) { 691 // Do nothing. 692 } 693 void BluetoothGattInterface::ClientObserver::MultiAdvUpdateCallback( 694 BluetoothGattInterface* /* gatt_iface */, 695 int /* status */, 696 int /* client_if */) { 697 // Do nothing. 698 } 699 void BluetoothGattInterface::ClientObserver::MultiAdvDataCallback( 700 BluetoothGattInterface* /* gatt_iface */, 701 int /* status */, 702 int /* client_if */) { 703 // Do nothing. 704 } 705 void BluetoothGattInterface::ClientObserver::MultiAdvDisableCallback( 706 BluetoothGattInterface* /* gatt_iface */, 707 int /* status */, 708 int /* client_if */) { 709 // Do nothing. 710 } 711 712 void BluetoothGattInterface::ClientObserver::GetGattDbCallback( 713 BluetoothGattInterface* /* gatt_iface */, 714 int /* conn_id */, 715 btgatt_db_element_t* /* gatt_db */, 716 int /* size */) { 717 // Do nothing. 718 } 719 720 void BluetoothGattInterface::ClientObserver::ServicesRemovedCallback( 721 BluetoothGattInterface* /* gatt_iface */, 722 int /* conn_id */, 723 uint16_t /* start_handle */, 724 uint16_t /* end_handle */) { 725 // Do nothing. 726 } 727 728 void BluetoothGattInterface::ClientObserver::ServicesAddedCallback( 729 BluetoothGattInterface* /* gatt_iface */, 730 int /* conn_id */, 731 btgatt_db_element_t* /* added */, 732 int /* added_count */) { 733 // Do nothing. 734 } 735 736 void BluetoothGattInterface::ServerObserver::RegisterServerCallback( 737 BluetoothGattInterface* /* gatt_iface */, 738 int /* status */, 739 int /* server_if */, 740 const bt_uuid_t& /* app_uuid */) { 741 // Do nothing. 742 } 743 744 void BluetoothGattInterface::ServerObserver::ConnectionCallback( 745 BluetoothGattInterface* /* gatt_iface */, 746 int /* conn_id */, 747 int /* server_if */, 748 int /* connected */, 749 const bt_bdaddr_t& /* bda */) { 750 // Do nothing. 751 } 752 753 void BluetoothGattInterface::ServerObserver::ServiceAddedCallback( 754 BluetoothGattInterface* /* gatt_iface */, 755 int /* status */, 756 int /* server_if */, 757 const btgatt_srvc_id_t& /* srvc_id */, 758 int /* srvc_handle */) { 759 // Do nothing. 760 } 761 762 void BluetoothGattInterface::ServerObserver::CharacteristicAddedCallback( 763 BluetoothGattInterface* /* gatt_iface */, 764 int /* status */, 765 int /* server_if */, 766 const bt_uuid_t& /* uuid */, 767 int /* srvc_handle */, 768 int /* char_handle */) { 769 // Do nothing. 770 } 771 772 void BluetoothGattInterface::ServerObserver::DescriptorAddedCallback( 773 BluetoothGattInterface* /* gatt_iface */, 774 int /* status */, 775 int /* server_if */, 776 const bt_uuid_t& /* uuid */, 777 int /* srvc_handle */, 778 int /* desc_handle */) { 779 // Do nothing. 780 } 781 782 void BluetoothGattInterface::ServerObserver::ServiceStartedCallback( 783 BluetoothGattInterface* /* gatt_iface */, 784 int /* status */, 785 int /* server_if */, 786 int /* srvc_handle */) { 787 // Do nothing. 788 } 789 790 void BluetoothGattInterface::ServerObserver::ServiceStoppedCallback( 791 BluetoothGattInterface* /* gatt_iface */, 792 int /* status */, 793 int /* server_if */, 794 int /* srvc_handle */) { 795 // Do nothing. 796 } 797 798 void BluetoothGattInterface::ServerObserver::ServiceDeletedCallback( 799 BluetoothGattInterface* /* gatt_iface */, 800 int /* status */, 801 int /* server_if */, 802 int /* srvc_handle */) { 803 // Do nothing. 804 } 805 806 void BluetoothGattInterface::ServerObserver::RequestReadCallback( 807 BluetoothGattInterface* /* gatt_iface */, 808 int /* conn_id */, 809 int /* trans_id */, 810 const bt_bdaddr_t& /* bda */, 811 int /* attr_handle */, 812 int /* offset */, 813 bool /* is_long */) { 814 // Do nothing. 815 } 816 817 void BluetoothGattInterface::ServerObserver::RequestWriteCallback( 818 BluetoothGattInterface* /* gatt_iface */, 819 int /* conn_id */, 820 int /* trans_id */, 821 const bt_bdaddr_t& /* bda */, 822 int /* attr_handle */, 823 int /* offset */, 824 int /* length */, 825 bool /* need_rsp */, 826 bool /* is_prep */, 827 uint8_t* /* value */) { 828 // Do nothing. 829 } 830 831 void BluetoothGattInterface::ServerObserver::RequestExecWriteCallback( 832 BluetoothGattInterface* /* gatt_iface */, 833 int /* conn_id */, 834 int /* trans_id */, 835 const bt_bdaddr_t& /* bda */, 836 int /* exec_write */) { 837 // Do nothing. 838 } 839 840 void BluetoothGattInterface::ServerObserver::ResponseConfirmationCallback( 841 BluetoothGattInterface* /* gatt_iface */, 842 int /* status */, 843 int /* handle */) { 844 // Do nothing 845 } 846 847 void BluetoothGattInterface::ServerObserver::IndicationSentCallback( 848 BluetoothGattInterface* /* gatt_iface */, 849 int /* conn_id */, 850 int /* status */) { 851 // Do nothing. 852 } 853 854 void BluetoothGattInterface::ServerObserver::MtuChangedCallback( 855 BluetoothGattInterface* /* gatt_iface */, 856 int /* conn_id */, 857 int /* mtu */) { 858 // Do nothing. 859 } 860 861 // static 862 bool BluetoothGattInterface::Initialize() { 863 unique_lock<shared_timed_mutex> lock(g_instance_lock); 864 CHECK(!g_interface); 865 866 std::unique_ptr<BluetoothGattInterfaceImpl> impl( 867 new BluetoothGattInterfaceImpl()); 868 if (!impl->Initialize()) { 869 LOG(ERROR) << "Failed to initialize BluetoothGattInterface"; 870 return false; 871 } 872 873 g_interface = impl.release(); 874 875 return true; 876 } 877 878 // static 879 void BluetoothGattInterface::CleanUp() { 880 unique_lock<shared_timed_mutex> lock(g_instance_lock); 881 CHECK(g_interface); 882 883 delete g_interface; 884 g_interface = nullptr; 885 } 886 887 // static 888 bool BluetoothGattInterface::IsInitialized() { 889 shared_lock<shared_timed_mutex> lock(g_instance_lock); 890 891 return g_interface != nullptr; 892 } 893 894 // static 895 BluetoothGattInterface* BluetoothGattInterface::Get() { 896 shared_lock<shared_timed_mutex> lock(g_instance_lock); 897 CHECK(g_interface); 898 return g_interface; 899 } 900 901 // static 902 void BluetoothGattInterface::InitializeForTesting( 903 BluetoothGattInterface* test_instance) { 904 unique_lock<shared_timed_mutex> lock(g_instance_lock); 905 CHECK(test_instance); 906 CHECK(!g_interface); 907 908 g_interface = test_instance; 909 } 910 911 bt_status_t BluetoothGattInterface::StartScan(int client_id) { 912 lock_guard<mutex> lock(scan_clients_lock_); 913 914 // Scan already initiated for this client. 915 if (scan_client_set_.find(client_id) != scan_client_set_.end()) { 916 // Assume starting scan multiple times is not error, but warn user. 917 LOG(WARNING) << "Scan already initiated for client"; 918 return BT_STATUS_SUCCESS; 919 } 920 921 // If this is the first scan client, then make a call into the stack. We 922 // only do this when the reference count changes to or from 0. 923 if (scan_client_set_.empty()) { 924 bt_status_t status = GetClientHALInterface()->scan(true); 925 if (status != BT_STATUS_SUCCESS) { 926 LOG(ERROR) << "HAL call to scan failed"; 927 return status; 928 } 929 } 930 931 scan_client_set_.insert(client_id); 932 933 return BT_STATUS_SUCCESS; 934 } 935 936 bt_status_t BluetoothGattInterface::StopScan(int client_id) { 937 lock_guard<mutex> lock(scan_clients_lock_); 938 939 // Scan not initiated for this client. 940 auto iter = scan_client_set_.find(client_id); 941 if (iter == scan_client_set_.end()) { 942 // Assume stopping scan multiple times is not error, but warn user. 943 LOG(WARNING) << "Scan already stopped or not initiated for client"; 944 return BT_STATUS_SUCCESS; 945 } 946 947 if (scan_client_set_.size() == 1) { 948 bt_status_t status = GetClientHALInterface()->scan(false); 949 if (status != BT_STATUS_SUCCESS) { 950 LOG(ERROR) << "HAL call to stop scan failed"; 951 return status; 952 } 953 } 954 955 scan_client_set_.erase(iter); 956 return BT_STATUS_SUCCESS; 957 } 958 959 } // namespace hal 960 } // namespace bluetooth 961