Home | History | Annotate | Download | only in binder
      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 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 
     36 BluetoothGattServerBinderServer::BluetoothGattServerBinderServer(
     37     bluetooth::Adapter* adapter)
     38     : adapter_(adapter) {
     39   CHECK(adapter_);
     40 }
     41 
     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 
     53 Status BluetoothGattServerBinderServer::UnregisterServer(int server_id) {
     54   VLOG(2) << __func__;
     55   UnregisterInstanceBase(server_id);
     56   return Status::ok();
     57 }
     58 
     59 Status BluetoothGattServerBinderServer::UnregisterAll() {
     60   VLOG(2) << __func__;
     61   UnregisterAllBase();
     62   return Status::ok();
     63 }
     64 
     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 
    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 
    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 
    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 
    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>
    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>
    218 BluetoothGattServerBinderServer::GetGattServer(int server_id) {
    219   return std::static_pointer_cast<bluetooth::GattServer>(
    220       GetInstance(server_id));
    221 }
    222 
    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 
    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 
    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 
    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 
    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