1 /*
2 * Copyright (C) 2021 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include <map>
17
18 #include "bluetooth_ble_advertiser_stub.h"
19 #include "bluetooth_log.h"
20 #include "ipc_types.h"
21 #include "parcel_bt_uuid.h"
22 #include "bt_def.h"
23
24 using std::placeholders::_1;
25 using std::placeholders::_2;
26 using std::placeholders::_3;
27 namespace OHOS {
28 namespace Bluetooth {
29 const std::map<uint32_t, std::function<ErrCode(BluetoothBleAdvertiserStub *, MessageParcel &, MessageParcel &)>>
30 BluetoothBleAdvertiserStub::interfaces_ = {
31 {BluetoothBleAdvertiserInterfaceCode::BLE_REGISTER_BLE_ADVERTISER_CALLBACK,
32 std::bind(&BluetoothBleAdvertiserStub::RegisterBleAdvertiserCallbackInner, _1, _2, _3)},
33 {BluetoothBleAdvertiserInterfaceCode::BLE_DE_REGISTER_BLE_ADVERTISER_CALLBACK,
34 std::bind(&BluetoothBleAdvertiserStub::DeregisterBleAdvertiserCallbackInner, _1, _2, _3)},
35 {BluetoothBleAdvertiserInterfaceCode::BLE_START_ADVERTISING,
36 std::bind(&BluetoothBleAdvertiserStub::StartAdvertisingInner, _1, _2, _3)},
37 {BluetoothBleAdvertiserInterfaceCode::BLE_ENABLE_ADVERTISING,
38 std::bind(&BluetoothBleAdvertiserStub::EnableAdvertisingInner, _1, _2, _3)},
39 {BluetoothBleAdvertiserInterfaceCode::BLE_DISABLE_ADVERTISING,
40 std::bind(&BluetoothBleAdvertiserStub::DisableAdvertisingInner, _1, _2, _3)},
41 {BluetoothBleAdvertiserInterfaceCode::BLE_STOP_ADVERTISING,
42 std::bind(&BluetoothBleAdvertiserStub::StopAdvertisingInner, _1, _2, _3)},
43 {BluetoothBleAdvertiserInterfaceCode::BLE_CLOSE,
44 std::bind(&BluetoothBleAdvertiserStub::CloseInner, _1, _2, _3)},
45 {BluetoothBleAdvertiserInterfaceCode::BLE_GET_ADVERTISER_HANDLE,
46 std::bind(&BluetoothBleAdvertiserStub::GetAdvertiserHandleInner, _1, _2, _3)},
47 {BluetoothBleAdvertiserInterfaceCode::BLE_SET_ADVERTISING_DATA,
48 std::bind(&BluetoothBleAdvertiserStub::SetAdvertisingDataInner, _1, _2, _3)},
49 };
50
BluetoothBleAdvertiserStub()51 BluetoothBleAdvertiserStub::BluetoothBleAdvertiserStub()
52 {}
53
~BluetoothBleAdvertiserStub()54 BluetoothBleAdvertiserStub::~BluetoothBleAdvertiserStub()
55 {}
56
OnRemoteRequest(uint32_t code,MessageParcel & data,MessageParcel & reply,MessageOption & option)57 int BluetoothBleAdvertiserStub::OnRemoteRequest(
58 uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option)
59 {
60 if (BluetoothBleAdvertiserStub::GetDescriptor() != data.ReadInterfaceToken()) {
61 HILOGW("[OnRemoteRequest] fail: invalid interface token!");
62 return OBJECT_NULL;
63 }
64
65 auto it = interfaces_.find(code);
66 if (it == interfaces_.end()) {
67 HILOGW("[OnRemoteRequest] fail: unknown code!");
68 return IRemoteStub<IBluetoothBleAdvertiser>::OnRemoteRequest(code, data, reply, option);
69 }
70
71 auto fun = it->second;
72 if (fun == nullptr) {
73 HILOGW("[OnRemoteRequest] fail: not find function!");
74 return IRemoteStub<IBluetoothBleAdvertiser>::OnRemoteRequest(code, data, reply, option);
75 }
76
77 ErrCode result = fun(this, data, reply);
78 if (SUCCEEDED(result)) {
79 return NO_ERROR;
80 }
81
82 HILOGW("[OnRemoteRequest] fail: Failed to call interface %{public}u, err:%{public}d", code, result);
83 return result;
84 }
85
RegisterBleAdvertiserCallbackInner(MessageParcel & data,MessageParcel & reply)86 ErrCode BluetoothBleAdvertiserStub::RegisterBleAdvertiserCallbackInner(MessageParcel &data, MessageParcel &reply)
87 {
88 sptr<IRemoteObject> remote = data.ReadRemoteObject();
89 const sptr<IBluetoothBleAdvertiseCallback> callBack = OHOS::iface_cast<IBluetoothBleAdvertiseCallback>(remote);
90 RegisterBleAdvertiserCallback(callBack);
91 return NO_ERROR;
92 }
93
DeregisterBleAdvertiserCallbackInner(MessageParcel & data,MessageParcel & reply)94 ErrCode BluetoothBleAdvertiserStub::DeregisterBleAdvertiserCallbackInner(MessageParcel &data, MessageParcel &reply)
95 {
96 sptr<IRemoteObject> remote = data.ReadRemoteObject();
97 const sptr<IBluetoothBleAdvertiseCallback> callBack = OHOS::iface_cast<IBluetoothBleAdvertiseCallback>(remote);
98 DeregisterBleAdvertiserCallback(callBack);
99 return NO_ERROR;
100 }
101
StartAdvertisingInner(MessageParcel & data,MessageParcel & reply)102 ErrCode BluetoothBleAdvertiserStub::StartAdvertisingInner(MessageParcel &data, MessageParcel &reply)
103 {
104 std::shared_ptr<BluetoothBleAdvertiserSettings> settings(data.ReadParcelable<BluetoothBleAdvertiserSettings>());
105 if (settings == nullptr) {
106 HILOGW("[StartAdvertisingInner] fail: read settings failed");
107 return TRANSACTION_ERR;
108 }
109
110 std::shared_ptr<BluetoothBleAdvertiserData> advData(data.ReadParcelable<BluetoothBleAdvertiserData>());
111 if (advData == nullptr) {
112 HILOGW("[StartAdvertisingInner] fail: read advData failed");
113 return TRANSACTION_ERR;
114 }
115 std::shared_ptr<BluetoothBleAdvertiserData> scanResponse(data.ReadParcelable<BluetoothBleAdvertiserData>());
116 if (scanResponse == nullptr) {
117 HILOGW("[StartAdvertisingInner] fail: read scanResponse failed");
118 return TRANSACTION_ERR;
119 }
120
121 int32_t advHandle = data.ReadInt32();
122 uint16_t duration = data.ReadUint16();
123 bool isRawData = data.ReadBool();
124 int32_t ret = StartAdvertising(*settings, *advData, *scanResponse, advHandle, duration, isRawData);
125 if (!reply.WriteInt32(ret)) {
126 HILOGE("reply writing failed.");
127 return ERR_INVALID_VALUE;
128 }
129 return NO_ERROR;
130 }
131
EnableAdvertisingInner(MessageParcel & data,MessageParcel & reply)132 ErrCode BluetoothBleAdvertiserStub::EnableAdvertisingInner(MessageParcel &data, MessageParcel &reply)
133 {
134 uint8_t advHandle = data.ReadUint8();
135 uint16_t duration = data.ReadUint16();
136 int32_t ret = EnableAdvertising(advHandle, duration);
137 if (!reply.WriteInt32(ret)) {
138 HILOGE("reply writing failed.");
139 return ERR_INVALID_VALUE;
140 }
141 return NO_ERROR;
142 }
143
DisableAdvertisingInner(MessageParcel & data,MessageParcel & reply)144 ErrCode BluetoothBleAdvertiserStub::DisableAdvertisingInner(MessageParcel &data, MessageParcel &reply)
145 {
146 uint8_t advHandle = data.ReadUint8();
147 int32_t ret = DisableAdvertising(advHandle);
148 if (!reply.WriteInt32(ret)) {
149 HILOGE("reply writing failed.");
150 return ERR_INVALID_VALUE;
151 }
152 return NO_ERROR;
153 }
154
StopAdvertisingInner(MessageParcel & data,MessageParcel & reply)155 ErrCode BluetoothBleAdvertiserStub::StopAdvertisingInner(MessageParcel &data, MessageParcel &reply)
156 {
157 int32_t advHandle = data.ReadInt32();
158 int32_t ret = StopAdvertising(advHandle);
159 if (!reply.WriteInt32(ret)) {
160 HILOGE("reply writing failed.");
161 return ERR_INVALID_VALUE;
162 }
163 return NO_ERROR;
164 }
165
CloseInner(MessageParcel & data,MessageParcel & reply)166 ErrCode BluetoothBleAdvertiserStub::CloseInner(MessageParcel &data, MessageParcel &reply)
167 {
168 int32_t advHandle = data.ReadInt32();
169 Close(advHandle);
170 return NO_ERROR;
171 }
172
GetAdvertiserHandleInner(MessageParcel & data,MessageParcel & reply)173 ErrCode BluetoothBleAdvertiserStub::GetAdvertiserHandleInner(MessageParcel &data, MessageParcel &reply)
174 {
175 int advHandle = bluetooth::BLE_INVALID_ADVERTISING_HANDLE;
176 int result = GetAdvertiserHandle(advHandle);
177 bool resultRet = reply.WriteInt32(result);
178 bool advHandleRet = reply.WriteInt32(advHandle);
179 if (!(resultRet && advHandleRet)) {
180 HILOGE("GetAdvertiserHandleInner: reply writing failed in: %{public}s.", __func__);
181 return TRANSACTION_ERR;
182 }
183 return NO_ERROR;
184 }
185
SetAdvertisingDataInner(MessageParcel & data,MessageParcel & reply)186 ErrCode BluetoothBleAdvertiserStub::SetAdvertisingDataInner(MessageParcel &data, MessageParcel &reply)
187 {
188 return NO_ERROR;
189 }
190 } // namespace Bluetooth
191 } // namespace OHOS
192