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/IBluetoothGattClient.h"
18
19 #include <base/logging.h>
20 #include <binder/Parcel.h>
21
22 using android::IBinder;
23 using android::interface_cast;
24 using android::Parcel;
25 using android::sp;
26 using android::status_t;
27
28 namespace ipc {
29 namespace binder {
30
31 // static
32 const char IBluetoothGattClient::kServiceName[] =
33 "bluetooth-gatt-client-service";
34
35 // BnBluetoothGattClient (server) implementation
36 // ========================================================
37
onTransact(uint32_t code,const Parcel & data,Parcel * reply,uint32_t flags)38 status_t BnBluetoothGattClient::onTransact(
39 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) {
40 VLOG(2) << "IBluetoothGattClient: " << code;
41 if (!data.checkInterface(this))
42 return android::PERMISSION_DENIED;
43
44 switch (code) {
45 case REGISTER_CLIENT_TRANSACTION: {
46 sp<IBinder> callback = data.readStrongBinder();
47 bool result = RegisterClient(
48 interface_cast<IBluetoothGattClientCallback>(callback));
49 reply->writeInt32(result);
50 return android::NO_ERROR;
51 }
52 case UNREGISTER_CLIENT_TRANSACTION: {
53 int client_id = data.readInt32();
54 UnregisterClient(client_id);
55 return android::NO_ERROR;
56 }
57 case UNREGISTER_ALL_TRANSACTION: {
58 UnregisterAll();
59 return android::NO_ERROR;
60 }
61 default:
62 return BBinder::onTransact(code, data, reply, flags);
63 }
64 }
65
66 // BpBluetoothGattClient (client) implementation
67 // ========================================================
68
BpBluetoothGattClient(const sp<IBinder> & impl)69 BpBluetoothGattClient::BpBluetoothGattClient(const sp<IBinder>& impl)
70 : BpInterface<IBluetoothGattClient>(impl) {
71 }
72
RegisterClient(const android::sp<IBluetoothGattClientCallback> & callback)73 bool BpBluetoothGattClient::RegisterClient(
74 const android::sp<IBluetoothGattClientCallback>& callback) {
75 Parcel data, reply;
76
77 data.writeInterfaceToken(IBluetoothGattClient::getInterfaceDescriptor());
78 data.writeStrongBinder(IInterface::asBinder(callback.get()));
79
80 remote()->transact(IBluetoothGattClient::REGISTER_CLIENT_TRANSACTION,
81 data, &reply);
82
83 return reply.readInt32();
84 }
85
UnregisterClient(int client_id)86 void BpBluetoothGattClient::UnregisterClient(int client_id) {
87 Parcel data, reply;
88
89 data.writeInterfaceToken(IBluetoothGattClient::getInterfaceDescriptor());
90 data.writeInt32(client_id);
91
92 remote()->transact(IBluetoothGattClient::UNREGISTER_CLIENT_TRANSACTION,
93 data, &reply);
94 }
95
UnregisterAll()96 void BpBluetoothGattClient::UnregisterAll() {
97 Parcel data, reply;
98
99 data.writeInterfaceToken(IBluetoothGattClient::getInterfaceDescriptor());
100
101 remote()->transact(IBluetoothGattClient::UNREGISTER_ALL_TRANSACTION,
102 data, &reply);
103 }
104
105 IMPLEMENT_META_INTERFACE(BluetoothGattClient,
106 IBluetoothGattClient::kServiceName);
107
108 } // namespace binder
109 } // namespace ipc
110