• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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/ipc/binder/bluetooth_gatt_server_binder_server.h"
18 
19 #include <base/logging.h>
20 
21 #include "service/adapter.h"
22 
23 namespace ipc {
24 namespace binder {
25 
26 namespace {
27 const int kInvalidInstanceId = -1;
28 }  // namespace
29 
BluetoothGattServerBinderServer(bluetooth::Adapter * adapter)30 BluetoothGattServerBinderServer::BluetoothGattServerBinderServer(
31     bluetooth::Adapter* adapter) : adapter_(adapter) {
32   CHECK(adapter_);
33 }
34 
RegisterServer(const android::sp<IBluetoothGattServerCallback> & callback)35 bool BluetoothGattServerBinderServer::RegisterServer(
36     const android::sp<IBluetoothGattServerCallback>& callback) {
37   VLOG(2) << __func__;
38   bluetooth::GattServerFactory* gatt_server_factory =
39       adapter_->GetGattServerFactory();
40 
41   return RegisterInstanceBase(callback, gatt_server_factory);
42 }
43 
UnregisterServer(int server_id)44 void BluetoothGattServerBinderServer::UnregisterServer(int server_id) {
45   VLOG(2) << __func__;
46   UnregisterInstanceBase(server_id);
47 }
48 
UnregisterAll()49 void BluetoothGattServerBinderServer::UnregisterAll() {
50   VLOG(2) << __func__;
51   UnregisterAllBase();
52 }
53 
BeginServiceDeclaration(int server_id,bool is_primary,const bluetooth::UUID & uuid,std::unique_ptr<bluetooth::GattIdentifier> * out_id)54 bool BluetoothGattServerBinderServer::BeginServiceDeclaration(
55     int server_id, bool is_primary, const bluetooth::UUID& uuid,
56     std::unique_ptr<bluetooth::GattIdentifier>* out_id) {
57   VLOG(2) << __func__;
58   CHECK(out_id);
59   std::lock_guard<std::mutex> lock(*maps_lock());
60 
61   auto gatt_server = GetGattServer(server_id);
62   if (!gatt_server) {
63     LOG(ERROR) << "Unknown server_id: " << server_id;
64     return false;
65   }
66 
67   auto service_id = gatt_server->BeginServiceDeclaration(uuid, is_primary);
68   if (!service_id) {
69     LOG(ERROR) << "Failed to begin service declaration - server_id: "
70                << server_id << " UUID: " << uuid.ToString();
71     return false;
72   }
73 
74   out_id->swap(service_id);
75 
76   return true;
77 }
78 
AddCharacteristic(int server_id,const bluetooth::UUID & uuid,int properties,int permissions,std::unique_ptr<bluetooth::GattIdentifier> * out_id)79 bool BluetoothGattServerBinderServer::AddCharacteristic(
80     int server_id, const bluetooth::UUID& uuid,
81     int properties, int permissions,
82     std::unique_ptr<bluetooth::GattIdentifier>* out_id) {
83   VLOG(2) << __func__;
84   CHECK(out_id);
85   std::lock_guard<std::mutex> lock(*maps_lock());
86 
87   auto gatt_server = GetGattServer(server_id);
88   if (!gatt_server) {
89     LOG(ERROR) << "Unknown server_id: " << server_id;
90     return false;
91   }
92 
93   auto char_id = gatt_server->AddCharacteristic(uuid, properties, permissions);
94   if (!char_id) {
95     LOG(ERROR) << "Failed to add characteristic - server_id: "
96                << server_id << " UUID: " << uuid.ToString();
97     return false;
98   }
99 
100   out_id->swap(char_id);
101 
102   return true;
103 }
104 
AddDescriptor(int server_id,const bluetooth::UUID & uuid,int permissions,std::unique_ptr<bluetooth::GattIdentifier> * out_id)105 bool BluetoothGattServerBinderServer::AddDescriptor(
106     int server_id, const bluetooth::UUID& uuid, int permissions,
107     std::unique_ptr<bluetooth::GattIdentifier>* out_id) {
108   VLOG(2) << __func__;
109   CHECK(out_id);
110   std::lock_guard<std::mutex> lock(*maps_lock());
111 
112   auto gatt_server = GetGattServer(server_id);
113   if (!gatt_server) {
114     LOG(ERROR) << "Unknown server_id: " << server_id;
115     return false;
116   }
117 
118   auto desc_id = gatt_server->AddDescriptor(uuid, permissions);
119   if (!desc_id) {
120     LOG(ERROR) << "Failed to add descriptor - server_id: "
121                << server_id << " UUID: " << uuid.ToString();
122     return false;
123   }
124 
125   out_id->swap(desc_id);
126 
127   return true;
128 }
129 
EndServiceDeclaration(int server_id)130 bool BluetoothGattServerBinderServer::EndServiceDeclaration(int server_id) {
131   VLOG(2) << __func__;
132   std::lock_guard<std::mutex> lock(*maps_lock());
133 
134   auto gatt_server = GetGattServer(server_id);
135   if (!gatt_server) {
136     LOG(ERROR) << "Unknown server_id: " << server_id;
137     return false;
138   }
139 
140   // Create a weak pointer and pass that to the callback to prevent a potential
141   // use after free.
142   android::wp<BluetoothGattServerBinderServer> weak_ptr_to_this(this);
143   auto callback = [=](
144       bluetooth::BLEStatus status,
145       const bluetooth::GattIdentifier& service_id) {
146     auto sp_to_this = weak_ptr_to_this.promote();
147     if (!sp_to_this.get()) {
148       VLOG(2) << "BluetoothLowEnergyBinderServer was deleted";
149       return;
150     }
151 
152     std::lock_guard<std::mutex> lock(*maps_lock());
153 
154     auto gatt_cb = GetGattServerCallback(server_id);
155     if (!gatt_cb.get()) {
156       VLOG(2) << "The callback was deleted";
157       return;
158     }
159 
160     gatt_cb->OnServiceAdded(status, service_id);
161   };
162 
163   if (!gatt_server->EndServiceDeclaration(callback)) {
164     LOG(ERROR) << "Failed to end service declaration";
165     return false;
166   }
167 
168   return true;
169 }
170 
SendResponse(int server_id,const std::string & device_address,int request_id,int status,int offset,const std::vector<uint8_t> & value)171 bool BluetoothGattServerBinderServer::SendResponse(
172     int server_id, const std::string& device_address,
173     int request_id, int status, int offset,
174     const std::vector<uint8_t>& value) {
175   VLOG(2) << __func__;
176   std::lock_guard<std::mutex> lock(*maps_lock());
177 
178   auto gatt_server = GetGattServer(server_id);
179   if (!gatt_server) {
180     LOG(ERROR) << "Unknown server_id: " << server_id;
181     return false;
182   }
183 
184   return gatt_server->SendResponse(
185       device_address, request_id, static_cast<bluetooth::GATTError>(status),
186       offset, value);
187 }
188 
SendNotification(int server_id,const std::string & device_address,const bluetooth::GattIdentifier & characteristic_id,bool confirm,const std::vector<uint8_t> & value)189 bool BluetoothGattServerBinderServer::SendNotification(
190     int server_id,
191     const std::string& device_address,
192     const bluetooth::GattIdentifier& characteristic_id,
193     bool confirm,
194     const std::vector<uint8_t>& value) {
195   VLOG(2) << __func__;
196   std::lock_guard<std::mutex> lock(*maps_lock());
197 
198   auto gatt_server = GetGattServer(server_id);
199   if (!gatt_server) {
200     LOG(ERROR) << "Unknown server_id: " << server_id;
201     return false;
202   }
203 
204   // Create a weak pointer and pass that to the callback to prevent a potential
205   // use after free.
206   android::wp<BluetoothGattServerBinderServer> weak_ptr_to_this(this);
207   auto callback = [=](bluetooth::GATTError error) {
208     auto sp_to_this = weak_ptr_to_this.promote();
209     if (!sp_to_this.get()) {
210       VLOG(2) << "BluetoothLowEnergyBinderServer was deleted";
211       return;
212     }
213 
214     std::lock_guard<std::mutex> lock(*maps_lock());
215 
216     auto gatt_cb = GetGattServerCallback(server_id);
217     if (!gatt_cb.get()) {
218       VLOG(2) << "The callback was deleted";
219       return;
220     }
221 
222     gatt_cb->OnNotificationSent(device_address, error);
223   };
224 
225   if (!gatt_server->SendNotification(device_address, characteristic_id,
226                                      confirm, value, callback)) {
227     LOG(ERROR) << "Failed to send notification";
228     return false;
229   }
230 
231   return true;
232 }
233 
OnCharacteristicReadRequest(bluetooth::GattServer * gatt_server,const std::string & device_address,int request_id,int offset,bool is_long,const bluetooth::GattIdentifier & characteristic_id)234 void BluetoothGattServerBinderServer::OnCharacteristicReadRequest(
235     bluetooth::GattServer* gatt_server,
236     const std::string& device_address,
237     int request_id, int offset, bool is_long,
238     const bluetooth::GattIdentifier& characteristic_id) {
239   VLOG(2) << __func__;
240   std::lock_guard<std::mutex> lock(*maps_lock());
241 
242   auto gatt_cb = GetGattServerCallback(gatt_server->GetInstanceId());
243   if (!gatt_cb.get()) {
244     LOG(WARNING) << "Callback for this GattServer was deleted.";
245     return;
246   }
247 
248   gatt_cb->OnCharacteristicReadRequest(
249       device_address, request_id, offset, is_long, characteristic_id);
250 }
251 
OnDescriptorReadRequest(bluetooth::GattServer * gatt_server,const std::string & device_address,int request_id,int offset,bool is_long,const bluetooth::GattIdentifier & descriptor_id)252 void BluetoothGattServerBinderServer::OnDescriptorReadRequest(
253     bluetooth::GattServer* gatt_server,
254     const std::string& device_address,
255     int request_id, int offset, bool is_long,
256     const bluetooth::GattIdentifier& descriptor_id) {
257   VLOG(2) << __func__;
258   std::lock_guard<std::mutex> lock(*maps_lock());
259 
260   auto gatt_cb = GetGattServerCallback(gatt_server->GetInstanceId());
261   if (!gatt_cb.get()) {
262     LOG(WARNING) << "Callback for this GattServer was deleted.";
263     return;
264   }
265 
266   gatt_cb->OnDescriptorReadRequest(
267       device_address, request_id, offset, is_long, descriptor_id);
268 }
269 
270 android::sp<IBluetoothGattServerCallback>
GetGattServerCallback(int server_id)271 BluetoothGattServerBinderServer::GetGattServerCallback(int server_id) {
272   auto cb = GetCallback(server_id);
273   return android::sp<IBluetoothGattServerCallback>(
274       static_cast<IBluetoothGattServerCallback*>(cb.get()));
275 }
276 
277 std::shared_ptr<bluetooth::GattServer>
GetGattServer(int server_id)278 BluetoothGattServerBinderServer::GetGattServer(int server_id) {
279   return std::static_pointer_cast<bluetooth::GattServer>(
280       GetInstance(server_id));
281 }
282 
OnRegisterInstanceImpl(bluetooth::BLEStatus status,android::sp<IInterface> callback,bluetooth::BluetoothInstance * instance)283 void BluetoothGattServerBinderServer::OnRegisterInstanceImpl(
284     bluetooth::BLEStatus status,
285     android::sp<IInterface> callback,
286     bluetooth::BluetoothInstance* instance) {
287   VLOG(1) << __func__ << " instance ID: " << instance->GetInstanceId()
288           << " status: " << status;
289   bluetooth::GattServer* gatt_server =
290       static_cast<bluetooth::GattServer*>(instance);
291   gatt_server->SetDelegate(this);
292 
293   android::sp<IBluetoothGattServerCallback> cb(
294       static_cast<IBluetoothGattServerCallback*>(callback.get()));
295   cb->OnServerRegistered(
296       status,
297       (status == bluetooth::BLE_STATUS_SUCCESS) ?
298           instance->GetInstanceId() : kInvalidInstanceId);
299 }
300 
OnCharacteristicWriteRequest(bluetooth::GattServer * gatt_server,const std::string & device_address,int request_id,int offset,bool is_prepare_write,bool need_response,const std::vector<uint8_t> & value,const bluetooth::GattIdentifier & characteristic_id)301 void BluetoothGattServerBinderServer::OnCharacteristicWriteRequest(
302     bluetooth::GattServer* gatt_server,
303     const std::string& device_address,
304     int request_id, int offset, bool is_prepare_write, bool need_response,
305     const std::vector<uint8_t>& value,
306     const bluetooth::GattIdentifier& characteristic_id) {
307   VLOG(2) << __func__;
308   std::lock_guard<std::mutex> lock(*maps_lock());
309 
310   auto gatt_cb = GetGattServerCallback(gatt_server->GetInstanceId());
311   if (!gatt_cb.get()) {
312     LOG(WARNING) << "Callback for this GattServer was deleted.";
313     return;
314   }
315 
316   gatt_cb->OnCharacteristicWriteRequest(
317       device_address, request_id, offset, is_prepare_write, need_response,
318       value, characteristic_id);
319 }
320 
OnDescriptorWriteRequest(bluetooth::GattServer * gatt_server,const std::string & device_address,int request_id,int offset,bool is_prepare_write,bool need_response,const std::vector<uint8_t> & value,const bluetooth::GattIdentifier & descriptor_id)321 void BluetoothGattServerBinderServer::OnDescriptorWriteRequest(
322     bluetooth::GattServer* gatt_server,
323     const std::string& device_address,
324     int request_id, int offset, bool is_prepare_write, bool need_response,
325     const std::vector<uint8_t>& value,
326     const bluetooth::GattIdentifier& descriptor_id) {
327   VLOG(2) << __func__;
328   std::lock_guard<std::mutex> lock(*maps_lock());
329 
330   auto gatt_cb = GetGattServerCallback(gatt_server->GetInstanceId());
331   if (!gatt_cb.get()) {
332     LOG(WARNING) << "Callback for this GattServer was deleted.";
333     return;
334   }
335 
336   gatt_cb->OnDescriptorWriteRequest(
337       device_address, request_id, offset, is_prepare_write, need_response,
338       value, descriptor_id);
339 }
340 
OnExecuteWriteRequest(bluetooth::GattServer * gatt_server,const std::string & device_address,int request_id,bool is_execute)341 void BluetoothGattServerBinderServer::OnExecuteWriteRequest(
342     bluetooth::GattServer* gatt_server,
343     const std::string& device_address,
344     int request_id, bool is_execute) {
345   VLOG(2) << __func__;
346   std::lock_guard<std::mutex> lock(*maps_lock());
347 
348   auto gatt_cb = GetGattServerCallback(gatt_server->GetInstanceId());
349   if (!gatt_cb.get()) {
350     LOG(WARNING) << "Callback for this GattServer was deleted.";
351     return;
352   }
353 
354   gatt_cb->OnExecuteWriteRequest(device_address, request_id, is_execute);
355 }
356 
357 }  // namespace binder
358 }  // namespace ipc
359