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
24using android::IBinder;
25using android::Parcel;
26using android::sp;
27using android::status_t;
28
29using bluetooth::AdvertiseData;
30using bluetooth::AdvertiseSettings;
31
32namespace ipc {
33namespace binder {
34
35// static
36const char IBluetoothLowEnergyCallback::kServiceName[] =
37    "bluetooth-low-energy-callback-service";
38
39// BnBluetoothLowEnergyCallback (server) implementation
40// ========================================================
41
42status_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
97BpBluetoothLowEnergyCallback::BpBluetoothLowEnergyCallback(
98    const sp<IBinder>& impl)
99    : BpInterface<IBluetoothLowEnergyCallback>(impl) {
100}
101
102void 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
117void 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
135void 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
151void 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
165void 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
182IMPLEMENT_META_INTERFACE(BluetoothLowEnergyCallback,
183                         IBluetoothLowEnergyCallback::kServiceName);
184
185}  // namespace binder
186}  // namespace ipc
187