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