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
30using std::lock_guard;
31using std::unique_lock;
32using std::shared_lock;
33using std::mutex;
34using std::shared_timed_mutex;
35
36namespace bluetooth {
37namespace hal {
38
39namespace {
40
41// The global BluetoothGattInterface instance.
42BluetoothGattInterface* 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
48shared_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.
52base::ObserverList<BluetoothGattInterface::ClientObserver>*
53    GetClientObservers();
54base::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
73void 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
83void 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
95void 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
109void 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
123void 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
133void 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
145void 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
159void 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
170void 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
182void 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
190void 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
201void 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
210void 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
219void 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
228void 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
237void 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
246void 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
257void 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
267void 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
277void 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
289void 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
304void 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
319void 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
334void 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
344void 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
354void 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
364void 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
377void 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
394void 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
406void 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
415void 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
424void 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.
434const 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
469const 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
488const 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.
497class 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
580namespace {
581
582base::ObserverList<BluetoothGattInterface::ClientObserver>*
583GetClientObservers() {
584  CHECK(g_interface);
585  return static_cast<BluetoothGattInterfaceImpl*>(
586      g_interface)->client_observers();
587}
588
589base::ObserverList<BluetoothGattInterface::ServerObserver>*
590GetServerObservers() {
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.
600void 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}
607void 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
615void 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
624void 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
633void BluetoothGattInterface::ClientObserver::SearchCompleteCallback(
634    BluetoothGattInterface* /* gatt_iface */,
635    int /* conn_id */,
636    int /* status */) {
637  // Do nothing
638}
639
640void 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
649void BluetoothGattInterface::ClientObserver::NotifyCallback(
650    BluetoothGattInterface* /* gatt_iface */,
651    int /* conn_id */,
652    btgatt_notify_params_t* /* p_data */) {
653  // Do nothing
654}
655
656void BluetoothGattInterface::ClientObserver::WriteCharacteristicCallback(
657    BluetoothGattInterface* /* gatt_iface */,
658    int /* conn_id */,
659    int /* status */,
660    uint16_t /* handle */) {
661  // Do nothing
662}
663
664void BluetoothGattInterface::ClientObserver::WriteDescriptorCallback(
665    BluetoothGattInterface* /* gatt_iface */,
666    int /* conn_id */,
667    int /* status */,
668    uint16_t /* handle */) {
669  // Do nothing
670}
671
672void BluetoothGattInterface::ClientObserver::ListenCallback(
673    BluetoothGattInterface* /* gatt_iface */,
674    int /* status */,
675    int /* client_if */) {
676  // Do nothing.
677}
678
679void BluetoothGattInterface::ClientObserver::MtuChangedCallback(
680    BluetoothGattInterface* /* gatt_iface */,
681    int /* conn_id */,
682    int /* statis*/,
683    int /* mtu */) {
684  // Do nothing.
685}
686
687void BluetoothGattInterface::ClientObserver::MultiAdvEnableCallback(
688    BluetoothGattInterface* /* gatt_iface */,
689    int /* status */,
690    int /* client_if */) {
691  // Do nothing.
692}
693void BluetoothGattInterface::ClientObserver::MultiAdvUpdateCallback(
694    BluetoothGattInterface* /* gatt_iface */,
695    int /* status */,
696    int /* client_if */) {
697  // Do nothing.
698}
699void BluetoothGattInterface::ClientObserver::MultiAdvDataCallback(
700    BluetoothGattInterface* /* gatt_iface */,
701    int /* status */,
702    int /* client_if */) {
703  // Do nothing.
704}
705void BluetoothGattInterface::ClientObserver::MultiAdvDisableCallback(
706    BluetoothGattInterface* /* gatt_iface */,
707    int /* status */,
708    int /* client_if */) {
709  // Do nothing.
710}
711
712void 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
720void 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
728void 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
736void 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
744void 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
753void 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
762void 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
772void 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
782void BluetoothGattInterface::ServerObserver::ServiceStartedCallback(
783    BluetoothGattInterface* /* gatt_iface */,
784    int /* status */,
785    int /* server_if */,
786    int /* srvc_handle */) {
787  // Do nothing.
788}
789
790void BluetoothGattInterface::ServerObserver::ServiceStoppedCallback(
791    BluetoothGattInterface* /* gatt_iface */,
792    int /* status */,
793    int /* server_if */,
794    int /* srvc_handle */) {
795  // Do nothing.
796}
797
798void BluetoothGattInterface::ServerObserver::ServiceDeletedCallback(
799    BluetoothGattInterface* /* gatt_iface */,
800    int /* status */,
801    int /* server_if */,
802    int /* srvc_handle */) {
803  // Do nothing.
804}
805
806void 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
817void 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
831void 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
840void BluetoothGattInterface::ServerObserver::ResponseConfirmationCallback(
841    BluetoothGattInterface* /* gatt_iface */,
842    int /* status */,
843    int /* handle */) {
844  // Do nothing
845}
846
847void BluetoothGattInterface::ServerObserver::IndicationSentCallback(
848    BluetoothGattInterface* /* gatt_iface */,
849    int /* conn_id */,
850    int /* status */) {
851  // Do nothing.
852}
853
854void BluetoothGattInterface::ServerObserver::MtuChangedCallback(
855    BluetoothGattInterface* /* gatt_iface */,
856    int /* conn_id */,
857    int /* mtu */) {
858  // Do nothing.
859}
860
861// static
862bool 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
879void 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
888bool BluetoothGattInterface::IsInitialized() {
889  shared_lock<shared_timed_mutex> lock(g_instance_lock);
890
891  return g_interface != nullptr;
892}
893
894// static
895BluetoothGattInterface* BluetoothGattInterface::Get() {
896  shared_lock<shared_timed_mutex> lock(g_instance_lock);
897  CHECK(g_interface);
898  return g_interface;
899}
900
901// static
902void 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
911bt_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
936bt_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