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