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/common/bluetooth/binder/IBluetoothLowEnergyCallback.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 using bluetooth::AdvertiseData;
     30 using bluetooth::AdvertiseSettings;
     31 
     32 namespace ipc {
     33 namespace binder {
     34 
     35 // static
     36 const char IBluetoothLowEnergyCallback::kServiceName[] =
     37     "bluetooth-low-energy-callback-service";
     38 
     39 // BnBluetoothLowEnergyCallback (server) implementation
     40 // ========================================================
     41 
     42 status_t BnBluetoothLowEnergyCallback::onTransact(
     43     uint32_t code,
     44     const Parcel& data,
     45     Parcel* reply,
     46     uint32_t flags) {
     47   VLOG(2) << "IBluetoothLowEnergyCallback: " << code;
     48   if (!data.checkInterface(this))
     49     return android::PERMISSION_DENIED;
     50 
     51   switch (code) {
     52   case ON_CLIENT_REGISTERED_TRANSACTION: {
     53     int status = data.readInt32();
     54     int client_if = data.readInt32();
     55     OnClientRegistered(status, client_if);
     56     return android::NO_ERROR;
     57   }
     58   case ON_CONNECTION_STATE_TRANSACTION: {
     59     int status = data.readInt32();
     60     int client_id = data.readInt32();
     61     const char* address = data.readCString();
     62     bool connected = data.readBool();
     63 
     64     OnConnectionState(status, client_id, address, connected);
     65     return android::NO_ERROR;
     66   }
     67   case ON_MTU_CHANGED_TRANSACTION: {
     68     int status = data.readInt32();
     69     const char *address = data.readCString();
     70     int mtu = data.readInt32();
     71 
     72     OnMtuChanged(status, address, mtu);
     73     return android::NO_ERROR;
     74   }
     75   case ON_SCAN_RESULT_TRANSACTION: {
     76     auto scan_result = CreateScanResultFromParcel(data);
     77     CHECK(scan_result.get());
     78     OnScanResult(*scan_result);
     79     return android::NO_ERROR;
     80   }
     81   case ON_MULTI_ADVERTISE_CALLBACK_TRANSACTION: {
     82     int status = data.readInt32();
     83     bool is_start = data.readInt32();
     84     std::unique_ptr<AdvertiseSettings> settings =
     85         CreateAdvertiseSettingsFromParcel(data);
     86     OnMultiAdvertiseCallback(status, is_start, *settings);
     87     return android::NO_ERROR;
     88   }
     89   default:
     90     return BBinder::onTransact(code, data, reply, flags);
     91   }
     92 }
     93 
     94 // BpBluetoothLowEnergyCallback (client) implementation
     95 // ========================================================
     96 
     97 BpBluetoothLowEnergyCallback::BpBluetoothLowEnergyCallback(
     98     const sp<IBinder>& impl)
     99     : BpInterface<IBluetoothLowEnergyCallback>(impl) {
    100 }
    101 
    102 void BpBluetoothLowEnergyCallback::OnClientRegistered(
    103     int status, int client_if) {
    104   Parcel data, reply;
    105 
    106   data.writeInterfaceToken(
    107       IBluetoothLowEnergyCallback::getInterfaceDescriptor());
    108   data.writeInt32(status);
    109   data.writeInt32(client_if);
    110 
    111   remote()->transact(
    112       IBluetoothLowEnergyCallback::ON_CLIENT_REGISTERED_TRANSACTION,
    113       data, &reply,
    114       IBinder::FLAG_ONEWAY);
    115 }
    116 
    117 void BpBluetoothLowEnergyCallback::OnConnectionState(
    118     int status, int client_id, const char* address, bool connected) {
    119 
    120   Parcel data;
    121 
    122   data.writeInterfaceToken(
    123       IBluetoothLowEnergyCallback::getInterfaceDescriptor());
    124   data.writeInt32(status);
    125   data.writeInt32(client_id);
    126   data.writeCString(address);
    127   data.writeBool(connected);
    128 
    129   remote()->transact(
    130       IBluetoothLowEnergyCallback::ON_CONNECTION_STATE_TRANSACTION,
    131       data, NULL,
    132       IBinder::FLAG_ONEWAY);
    133 }
    134 
    135 void BpBluetoothLowEnergyCallback::OnMtuChanged(
    136     int status, const char* address, int mtu) {
    137   Parcel data;
    138 
    139   data.writeInterfaceToken(
    140       IBluetoothLowEnergyCallback::getInterfaceDescriptor());
    141   data.writeInt32(status);
    142   data.writeCString(address);
    143   data.writeInt32(mtu);
    144 
    145   remote()->transact(
    146       IBluetoothLowEnergyCallback::ON_MTU_CHANGED_TRANSACTION,
    147       data, NULL,
    148       IBinder::FLAG_ONEWAY);
    149 }
    150 
    151 void BpBluetoothLowEnergyCallback::OnScanResult(
    152     const bluetooth::ScanResult& scan_result) {
    153   Parcel data, reply;
    154 
    155   data.writeInterfaceToken(
    156       IBluetoothLowEnergyCallback::getInterfaceDescriptor());
    157   WriteScanResultToParcel(scan_result, &data);
    158 
    159   remote()->transact(
    160       IBluetoothLowEnergyCallback::ON_SCAN_RESULT_TRANSACTION,
    161       data, &reply,
    162       IBinder::FLAG_ONEWAY);
    163 }
    164 
    165 void BpBluetoothLowEnergyCallback::OnMultiAdvertiseCallback(
    166     int status, bool is_start,
    167     const AdvertiseSettings& settings) {
    168   Parcel data, reply;
    169 
    170   data.writeInterfaceToken(
    171       IBluetoothLowEnergyCallback::getInterfaceDescriptor());
    172   data.writeInt32(status);
    173   data.writeInt32(is_start);
    174   WriteAdvertiseSettingsToParcel(settings, &data);
    175 
    176   remote()->transact(
    177       IBluetoothLowEnergyCallback::ON_MULTI_ADVERTISE_CALLBACK_TRANSACTION,
    178       data, &reply,
    179       IBinder::FLAG_ONEWAY);
    180 }
    181 
    182 IMPLEMENT_META_INTERFACE(BluetoothLowEnergyCallback,
    183                          IBluetoothLowEnergyCallback::kServiceName);
    184 
    185 }  // namespace binder
    186 }  // namespace ipc
    187