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/common/bluetooth/binder/IBluetoothGattServerCallback.h" 18 19 #include <base/logging.h> 20 #include <binder/Parcel.h> 21 22 #include "service/common/bluetooth/binder/parcel_helpers.h" 23 24 using android::IBinder; 25 using android::Parcel; 26 using android::sp; 27 using android::status_t; 28 29 namespace ipc { 30 namespace binder { 31 32 // static 33 const char IBluetoothGattServerCallback::kServiceName[] = 34 "bluetooth-gatt-server-callback-service"; 35 36 // BnBluetoothGattServerCallback (server) implementation 37 // ======================================================== 38 39 status_t BnBluetoothGattServerCallback::onTransact( 40 uint32_t code, 41 const Parcel& data, 42 Parcel* reply, 43 uint32_t flags) { 44 VLOG(2) << "IBluetoothGattServerCallback: " << code; 45 if (!data.checkInterface(this)) 46 return android::PERMISSION_DENIED; 47 48 switch (code) { 49 case ON_SERVER_REGISTERED_TRANSACTION: { 50 int status = data.readInt32(); 51 int server_if = data.readInt32(); 52 OnServerRegistered(status, server_if); 53 return android::NO_ERROR; 54 } 55 case ON_SERVICE_ADDED_TRANSACTION: { 56 int status = data.readInt32(); 57 auto gatt_id = CreateGattIdentifierFromParcel(data); 58 CHECK(gatt_id); 59 OnServiceAdded(status, *gatt_id); 60 return android::NO_ERROR; 61 } 62 case ON_CHARACTERISTIC_READ_REQUEST_TRANSACTION: { 63 std::string device_address = data.readCString(); 64 int request_id = data.readInt32(); 65 int offset = data.readInt32(); 66 bool is_long = data.readInt32(); 67 auto char_id = CreateGattIdentifierFromParcel(data); 68 CHECK(char_id); 69 OnCharacteristicReadRequest(device_address, request_id, offset, is_long, 70 *char_id); 71 return android::NO_ERROR; 72 } 73 case ON_DESCRIPTOR_READ_REQUEST_TRANSACTION: { 74 std::string device_address = data.readCString(); 75 int request_id = data.readInt32(); 76 int offset = data.readInt32(); 77 bool is_long = data.readInt32(); 78 auto desc_id = CreateGattIdentifierFromParcel(data); 79 CHECK(desc_id); 80 OnDescriptorReadRequest(device_address, request_id, offset, is_long, 81 *desc_id); 82 return android::NO_ERROR; 83 } 84 case ON_CHARACTERISTIC_WRITE_REQUEST_TRANSACTION: { 85 std::string device_address = data.readCString(); 86 int request_id = data.readInt32(); 87 int offset = data.readInt32(); 88 bool is_prep = data.readInt32(); 89 bool need_rsp = data.readInt32(); 90 91 std::unique_ptr<std::vector<uint8_t>> value; 92 data.readByteVector(&value); 93 CHECK(value.get()); 94 95 auto char_id = CreateGattIdentifierFromParcel(data); 96 CHECK(char_id); 97 98 OnCharacteristicWriteRequest(device_address, request_id, offset, is_prep, 99 need_rsp, *value, *char_id); 100 return android::NO_ERROR; 101 } 102 case ON_DESCRIPTOR_WRITE_REQUEST_TRANSACTION: { 103 std::string device_address = data.readCString(); 104 int request_id = data.readInt32(); 105 int offset = data.readInt32(); 106 bool is_prep = data.readInt32(); 107 bool need_rsp = data.readInt32(); 108 109 std::unique_ptr<std::vector<uint8_t>> value; 110 data.readByteVector(&value); 111 CHECK(value.get()); 112 113 auto desc_id = CreateGattIdentifierFromParcel(data); 114 CHECK(desc_id); 115 116 OnDescriptorWriteRequest(device_address, request_id, offset, is_prep, 117 need_rsp, *value, *desc_id); 118 return android::NO_ERROR; 119 } 120 case ON_EXECUTE_WRITE_REQUEST_TRANSACTION: { 121 std::string device_address = data.readCString(); 122 int request_id = data.readInt32(); 123 bool is_exec = data.readInt32(); 124 125 OnExecuteWriteRequest(device_address, request_id, is_exec); 126 return android::NO_ERROR; 127 } 128 case ON_NOTIFICATION_SENT_TRANSACTION: { 129 std::string device_address = data.readCString(); 130 int status = data.readInt32(); 131 132 OnNotificationSent(device_address, status); 133 return android::NO_ERROR; 134 } 135 default: 136 return BBinder::onTransact(code, data, reply, flags); 137 } 138 } 139 140 // BpBluetoothGattServerCallback (client) implementation 141 // ======================================================== 142 143 BpBluetoothGattServerCallback::BpBluetoothGattServerCallback( 144 const sp<IBinder>& impl) 145 : BpInterface<IBluetoothGattServerCallback>(impl) { 146 } 147 148 void BpBluetoothGattServerCallback::OnServerRegistered( 149 int status, int server_if) { 150 Parcel data, reply; 151 152 data.writeInterfaceToken( 153 IBluetoothGattServerCallback::getInterfaceDescriptor()); 154 data.writeInt32(status); 155 data.writeInt32(server_if); 156 157 remote()->transact( 158 IBluetoothGattServerCallback::ON_SERVER_REGISTERED_TRANSACTION, 159 data, &reply, 160 IBinder::FLAG_ONEWAY); 161 } 162 163 void BpBluetoothGattServerCallback::OnServiceAdded( 164 int status, 165 const bluetooth::GattIdentifier& service_id) { 166 Parcel data, reply; 167 168 data.writeInterfaceToken( 169 IBluetoothGattServerCallback::getInterfaceDescriptor()); 170 data.writeInt32(status); 171 WriteGattIdentifierToParcel(service_id, &data); 172 173 remote()->transact(IBluetoothGattServerCallback::ON_SERVICE_ADDED_TRANSACTION, 174 data, &reply, 175 IBinder::FLAG_ONEWAY); 176 } 177 178 void BpBluetoothGattServerCallback::OnCharacteristicReadRequest( 179 const std::string& device_address, 180 int request_id, int offset, bool is_long, 181 const bluetooth::GattIdentifier& characteristic_id) { 182 Parcel data, reply; 183 184 data.writeInterfaceToken( 185 IBluetoothGattServerCallback::getInterfaceDescriptor()); 186 data.writeCString(device_address.c_str()); 187 data.writeInt32(request_id); 188 data.writeInt32(offset); 189 data.writeInt32(is_long); 190 WriteGattIdentifierToParcel(characteristic_id, &data); 191 192 remote()->transact( 193 IBluetoothGattServerCallback::ON_CHARACTERISTIC_READ_REQUEST_TRANSACTION, 194 data, &reply, 195 IBinder::FLAG_ONEWAY); 196 } 197 198 void BpBluetoothGattServerCallback::OnDescriptorReadRequest( 199 const std::string& device_address, 200 int request_id, int offset, bool is_long, 201 const bluetooth::GattIdentifier& descriptor_id) { 202 Parcel data, reply; 203 204 data.writeInterfaceToken( 205 IBluetoothGattServerCallback::getInterfaceDescriptor()); 206 data.writeCString(device_address.c_str()); 207 data.writeInt32(request_id); 208 data.writeInt32(offset); 209 data.writeInt32(is_long); 210 WriteGattIdentifierToParcel(descriptor_id, &data); 211 212 remote()->transact( 213 IBluetoothGattServerCallback::ON_DESCRIPTOR_READ_REQUEST_TRANSACTION, 214 data, &reply, 215 IBinder::FLAG_ONEWAY); 216 } 217 218 void BpBluetoothGattServerCallback::OnCharacteristicWriteRequest( 219 const std::string& device_address, 220 int request_id, int offset, bool is_prepare_write, bool need_response, 221 const std::vector<uint8_t>& value, 222 const bluetooth::GattIdentifier& characteristic_id) { 223 Parcel data, reply; 224 225 data.writeInterfaceToken( 226 IBluetoothGattServerCallback::getInterfaceDescriptor()); 227 data.writeCString(device_address.c_str()); 228 data.writeInt32(request_id); 229 data.writeInt32(offset); 230 data.writeInt32(is_prepare_write); 231 data.writeInt32(need_response); 232 data.writeByteVector(value); 233 WriteGattIdentifierToParcel(characteristic_id, &data); 234 235 remote()->transact( 236 IBluetoothGattServerCallback::ON_CHARACTERISTIC_WRITE_REQUEST_TRANSACTION, 237 data, &reply, 238 IBinder::FLAG_ONEWAY); 239 } 240 241 void BpBluetoothGattServerCallback::OnDescriptorWriteRequest( 242 const std::string& device_address, 243 int request_id, int offset, bool is_prepare_write, bool need_response, 244 const std::vector<uint8_t>& value, 245 const bluetooth::GattIdentifier& descriptor_id) { 246 Parcel data, reply; 247 248 data.writeInterfaceToken( 249 IBluetoothGattServerCallback::getInterfaceDescriptor()); 250 data.writeCString(device_address.c_str()); 251 data.writeInt32(request_id); 252 data.writeInt32(offset); 253 data.writeInt32(is_prepare_write); 254 data.writeInt32(need_response); 255 data.writeByteVector(value); 256 WriteGattIdentifierToParcel(descriptor_id, &data); 257 258 remote()->transact( 259 IBluetoothGattServerCallback::ON_DESCRIPTOR_WRITE_REQUEST_TRANSACTION, 260 data, &reply, 261 IBinder::FLAG_ONEWAY); 262 } 263 264 void BpBluetoothGattServerCallback::OnExecuteWriteRequest( 265 const std::string& device_address, 266 int request_id, bool is_execute) { 267 Parcel data, reply; 268 269 data.writeInterfaceToken( 270 IBluetoothGattServerCallback::getInterfaceDescriptor()); 271 data.writeCString(device_address.c_str()); 272 data.writeInt32(request_id); 273 data.writeInt32(is_execute); 274 275 remote()->transact( 276 IBluetoothGattServerCallback::ON_EXECUTE_WRITE_REQUEST_TRANSACTION, 277 data, &reply, 278 IBinder::FLAG_ONEWAY); 279 } 280 281 void BpBluetoothGattServerCallback::OnNotificationSent( 282 const std::string& device_address, 283 int status) { 284 Parcel data, reply; 285 286 data.writeInterfaceToken( 287 IBluetoothGattServerCallback::getInterfaceDescriptor()); 288 data.writeCString(device_address.c_str()); 289 data.writeInt32(status); 290 291 remote()->transact( 292 IBluetoothGattServerCallback::ON_NOTIFICATION_SENT_TRANSACTION, 293 data, &reply, 294 IBinder::FLAG_ONEWAY); 295 } 296 297 IMPLEMENT_META_INTERFACE(BluetoothGattServerCallback, 298 IBluetoothGattServerCallback::kServiceName); 299 300 } // namespace binder 301 } // namespace ipc 302