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_STOP_ADVERTISING,
38 std::bind(&BluetoothBleAdvertiserStub::StopAdvertisingInner, _1, _2, _3)},
39 {BluetoothBleAdvertiserInterfaceCode::BLE_CLOSE,
40 std::bind(&BluetoothBleAdvertiserStub::CloseInner, _1, _2, _3)},
41 {BluetoothBleAdvertiserInterfaceCode::BLE_GET_ADVERTISER_HANDLE,
42 std::bind(&BluetoothBleAdvertiserStub::GetAdvertiserHandleInner, _1, _2, _3)},
43 {BluetoothBleAdvertiserInterfaceCode::BLE_SET_ADVERTISING_DATA,
44 std::bind(&BluetoothBleAdvertiserStub::SetAdvertisingDataInner, _1, _2, _3)},
45 };
46
BluetoothBleAdvertiserStub()47 BluetoothBleAdvertiserStub::BluetoothBleAdvertiserStub()
48 {}
49
~BluetoothBleAdvertiserStub()50 BluetoothBleAdvertiserStub::~BluetoothBleAdvertiserStub()
51 {}
52
OnRemoteRequest(uint32_t code,MessageParcel & data,MessageParcel & reply,MessageOption & option)53 int BluetoothBleAdvertiserStub::OnRemoteRequest(
54 uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option)
55 {
56 if (BluetoothBleAdvertiserStub::GetDescriptor() != data.ReadInterfaceToken()) {
57 HILOGW("[OnRemoteRequest] fail: invalid interface token!");
58 return OBJECT_NULL;
59 }
60
61 auto it = interfaces_.find(code);
62 if (it == interfaces_.end()) {
63 HILOGW("[OnRemoteRequest] fail: unknown code!");
64 return IRemoteStub<IBluetoothBleAdvertiser>::OnRemoteRequest(code, data, reply, option);
65 }
66
67 auto fun = it->second;
68 if (fun == nullptr) {
69 HILOGW("[OnRemoteRequest] fail: not find function!");
70 return IRemoteStub<IBluetoothBleAdvertiser>::OnRemoteRequest(code, data, reply, option);
71 }
72
73 ErrCode result = fun(this, data, reply);
74 if (SUCCEEDED(result)) {
75 return NO_ERROR;
76 }
77
78 HILOGW("[OnRemoteRequest] fail: Failed to call interface %{public}u, err:%{public}d", code, result);
79 return result;
80 }
81
RegisterBleAdvertiserCallbackInner(MessageParcel & data,MessageParcel & reply)82 ErrCode BluetoothBleAdvertiserStub::RegisterBleAdvertiserCallbackInner(MessageParcel &data, MessageParcel &reply)
83 {
84 sptr<IRemoteObject> remote = data.ReadRemoteObject();
85 const sptr<IBluetoothBleAdvertiseCallback> callBack = OHOS::iface_cast<IBluetoothBleAdvertiseCallback>(remote);
86 RegisterBleAdvertiserCallback(callBack);
87 return NO_ERROR;
88 }
89
DeregisterBleAdvertiserCallbackInner(MessageParcel & data,MessageParcel & reply)90 ErrCode BluetoothBleAdvertiserStub::DeregisterBleAdvertiserCallbackInner(MessageParcel &data, MessageParcel &reply)
91 {
92 sptr<IRemoteObject> remote = data.ReadRemoteObject();
93 const sptr<IBluetoothBleAdvertiseCallback> callBack = OHOS::iface_cast<IBluetoothBleAdvertiseCallback>(remote);
94 DeregisterBleAdvertiserCallback(callBack);
95 return NO_ERROR;
96 }
97
StartAdvertisingInner(MessageParcel & data,MessageParcel & reply)98 ErrCode BluetoothBleAdvertiserStub::StartAdvertisingInner(MessageParcel &data, MessageParcel &reply)
99 {
100 std::shared_ptr<BluetoothBleAdvertiserSettings> settings(data.ReadParcelable<BluetoothBleAdvertiserSettings>());
101 if (settings == nullptr) {
102 HILOGW("[StartAdvertisingInner] fail: read settings failed");
103 return TRANSACTION_ERR;
104 }
105
106 std::shared_ptr<BluetoothBleAdvertiserData> advData(data.ReadParcelable<BluetoothBleAdvertiserData>());
107 if (advData == nullptr) {
108 HILOGW("[StartAdvertisingInner] fail: read advData failed");
109 return TRANSACTION_ERR;
110 }
111 std::shared_ptr<BluetoothBleAdvertiserData> scanResponse(data.ReadParcelable<BluetoothBleAdvertiserData>());
112 if (scanResponse == nullptr) {
113 HILOGW("[StartAdvertisingInner] fail: read scanResponse failed");
114 return TRANSACTION_ERR;
115 }
116
117 int32_t advHandle = data.ReadInt32();
118 bool isRawData = data.ReadBool();
119 int32_t ret = StartAdvertising(*settings, *advData, *scanResponse, advHandle, isRawData);
120 if (!reply.WriteInt32(ret)) {
121 HILOGE("reply writing failed.");
122 return ERR_INVALID_VALUE;
123 }
124 return NO_ERROR;
125 }
126
StopAdvertisingInner(MessageParcel & data,MessageParcel & reply)127 ErrCode BluetoothBleAdvertiserStub::StopAdvertisingInner(MessageParcel &data, MessageParcel &reply)
128 {
129 int32_t advHandle = data.ReadInt32();
130 int32_t ret = StopAdvertising(advHandle);
131 if (!reply.WriteInt32(ret)) {
132 HILOGE("reply writing failed.");
133 return ERR_INVALID_VALUE;
134 }
135 return NO_ERROR;
136 }
137
CloseInner(MessageParcel & data,MessageParcel & reply)138 ErrCode BluetoothBleAdvertiserStub::CloseInner(MessageParcel &data, MessageParcel &reply)
139 {
140 int32_t advHandle = data.ReadInt32();
141 Close(advHandle);
142 return NO_ERROR;
143 }
144
GetAdvertiserHandleInner(MessageParcel & data,MessageParcel & reply)145 ErrCode BluetoothBleAdvertiserStub::GetAdvertiserHandleInner(MessageParcel &data, MessageParcel &reply)
146 {
147 int advHandle = bluetooth::BLE_INVALID_ADVERTISING_HANDLE;
148 int result = GetAdvertiserHandle(advHandle);
149 bool resultRet = reply.WriteInt32(result);
150 bool advHandleRet = reply.WriteInt32(advHandle);
151 if (!(resultRet && advHandleRet)) {
152 HILOGE("GetAdvertiserHandleInner: reply writing failed in: %{public}s.", __func__);
153 return TRANSACTION_ERR;
154 }
155 return NO_ERROR;
156 }
157
SetAdvertisingDataInner(MessageParcel & data,MessageParcel & reply)158 ErrCode BluetoothBleAdvertiserStub::SetAdvertisingDataInner(MessageParcel &data, MessageParcel &reply)
159 {
160 return NO_ERROR;
161 }
162 } // namespace Bluetooth
163 } // namespace OHOS
164