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