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