• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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         {BluetoothBleAdvertiserInterfaceCode::BLE_CHANGE_ADVERTISING_PARAMS,
50             std::bind(&BluetoothBleAdvertiserStub::ChangeAdvertisingParamsInner, _1, _2, _3)},
51 };
52 
BluetoothBleAdvertiserStub()53 BluetoothBleAdvertiserStub::BluetoothBleAdvertiserStub()
54 {}
55 
~BluetoothBleAdvertiserStub()56 BluetoothBleAdvertiserStub::~BluetoothBleAdvertiserStub()
57 {}
58 
OnRemoteRequest(uint32_t code,MessageParcel & data,MessageParcel & reply,MessageOption & option)59 int BluetoothBleAdvertiserStub::OnRemoteRequest(
60     uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option)
61 {
62     if (BluetoothBleAdvertiserStub::GetDescriptor() != data.ReadInterfaceToken()) {
63         HILOGW("[OnRemoteRequest] fail: invalid interface token!");
64         return OBJECT_NULL;
65     }
66 
67     auto it = interfaces_.find(code);
68     if (it == interfaces_.end()) {
69         HILOGW("[OnRemoteRequest] fail: unknown code!");
70         return IRemoteStub<IBluetoothBleAdvertiser>::OnRemoteRequest(code, data, reply, option);
71     }
72 
73     auto fun = it->second;
74     if (fun == nullptr) {
75         HILOGW("[OnRemoteRequest] fail: not find function!");
76         return IRemoteStub<IBluetoothBleAdvertiser>::OnRemoteRequest(code, data, reply, option);
77     }
78 
79     ErrCode result = fun(this, data, reply);
80     if (SUCCEEDED(result)) {
81         return NO_ERROR;
82     }
83 
84     HILOGW("[OnRemoteRequest] fail: Failed to call interface %{public}u, err:%{public}d", code, result);
85     return result;
86 }
87 
RegisterBleAdvertiserCallbackInner(MessageParcel & data,MessageParcel & reply)88 ErrCode BluetoothBleAdvertiserStub::RegisterBleAdvertiserCallbackInner(MessageParcel &data, MessageParcel &reply)
89 {
90     sptr<IRemoteObject> remote = data.ReadRemoteObject();
91     const sptr<IBluetoothBleAdvertiseCallback> callBack = OHOS::iface_cast<IBluetoothBleAdvertiseCallback>(remote);
92     RegisterBleAdvertiserCallback(callBack);
93     return NO_ERROR;
94 }
95 
DeregisterBleAdvertiserCallbackInner(MessageParcel & data,MessageParcel & reply)96 ErrCode BluetoothBleAdvertiserStub::DeregisterBleAdvertiserCallbackInner(MessageParcel &data, MessageParcel &reply)
97 {
98     sptr<IRemoteObject> remote = data.ReadRemoteObject();
99     const sptr<IBluetoothBleAdvertiseCallback> callBack = OHOS::iface_cast<IBluetoothBleAdvertiseCallback>(remote);
100     DeregisterBleAdvertiserCallback(callBack);
101     return NO_ERROR;
102 }
103 
StartAdvertisingInner(MessageParcel & data,MessageParcel & reply)104 ErrCode BluetoothBleAdvertiserStub::StartAdvertisingInner(MessageParcel &data, MessageParcel &reply)
105 {
106     std::shared_ptr<BluetoothBleAdvertiserSettings> settings(data.ReadParcelable<BluetoothBleAdvertiserSettings>());
107     if (settings == nullptr) {
108         HILOGW("[StartAdvertisingInner] fail: read settings failed");
109         return TRANSACTION_ERR;
110     }
111 
112     std::shared_ptr<BluetoothBleAdvertiserData> advData(data.ReadParcelable<BluetoothBleAdvertiserData>());
113     if (advData == nullptr) {
114         HILOGW("[StartAdvertisingInner] fail: read advData failed");
115         return TRANSACTION_ERR;
116     }
117     std::shared_ptr<BluetoothBleAdvertiserData> scanResponse(data.ReadParcelable<BluetoothBleAdvertiserData>());
118     if (scanResponse == nullptr) {
119         HILOGW("[StartAdvertisingInner] fail: read scanResponse failed");
120         return TRANSACTION_ERR;
121     }
122 
123     int32_t advHandle = data.ReadInt32();
124     uint16_t duration = data.ReadUint16();
125     bool isRawData = data.ReadBool();
126     int32_t ret = StartAdvertising(*settings, *advData, *scanResponse, advHandle, duration, isRawData);
127     if (!reply.WriteInt32(ret)) {
128         HILOGE("reply writing failed.");
129         return ERR_INVALID_VALUE;
130     }
131     return NO_ERROR;
132 }
133 
EnableAdvertisingInner(MessageParcel & data,MessageParcel & reply)134 ErrCode BluetoothBleAdvertiserStub::EnableAdvertisingInner(MessageParcel &data, MessageParcel &reply)
135 {
136     uint8_t advHandle = data.ReadUint8();
137     uint16_t duration = data.ReadUint16();
138     int32_t ret = EnableAdvertising(advHandle, duration);
139     if (!reply.WriteInt32(ret)) {
140         HILOGE("reply writing failed.");
141         return ERR_INVALID_VALUE;
142     }
143     return NO_ERROR;
144 }
145 
DisableAdvertisingInner(MessageParcel & data,MessageParcel & reply)146 ErrCode BluetoothBleAdvertiserStub::DisableAdvertisingInner(MessageParcel &data, MessageParcel &reply)
147 {
148     uint8_t advHandle = data.ReadUint8();
149     int32_t ret = DisableAdvertising(advHandle);
150     if (!reply.WriteInt32(ret)) {
151         HILOGE("reply writing failed.");
152         return ERR_INVALID_VALUE;
153     }
154     return NO_ERROR;
155 }
156 
StopAdvertisingInner(MessageParcel & data,MessageParcel & reply)157 ErrCode BluetoothBleAdvertiserStub::StopAdvertisingInner(MessageParcel &data, MessageParcel &reply)
158 {
159     int32_t advHandle = data.ReadInt32();
160     int32_t ret = StopAdvertising(advHandle);
161     if (!reply.WriteInt32(ret)) {
162         HILOGE("reply writing failed.");
163         return ERR_INVALID_VALUE;
164     }
165     return NO_ERROR;
166 }
167 
CloseInner(MessageParcel & data,MessageParcel & reply)168 ErrCode BluetoothBleAdvertiserStub::CloseInner(MessageParcel &data, MessageParcel &reply)
169 {
170     int32_t advHandle = data.ReadInt32();
171     Close(advHandle);
172     return NO_ERROR;
173 }
174 
GetAdvertiserHandleInner(MessageParcel & data,MessageParcel & reply)175 ErrCode BluetoothBleAdvertiserStub::GetAdvertiserHandleInner(MessageParcel &data, MessageParcel &reply)
176 {
177     sptr<IRemoteObject> remote = data.ReadRemoteObject();
178     const sptr<IBluetoothBleAdvertiseCallback> callBack = OHOS::iface_cast<IBluetoothBleAdvertiseCallback>(remote);
179     int advHandle = bluetooth::BLE_INVALID_ADVERTISING_HANDLE;
180     int result = GetAdvertiserHandle(advHandle, callBack);
181     bool resultRet = reply.WriteInt32(result);
182     bool advHandleRet = reply.WriteInt32(advHandle);
183     if (!(resultRet && advHandleRet)) {
184         HILOGE("GetAdvertiserHandleInner: reply writing failed in: %{public}s.", __func__);
185         return TRANSACTION_ERR;
186     }
187     return NO_ERROR;
188 }
189 
SetAdvertisingDataInner(MessageParcel & data,MessageParcel & reply)190 ErrCode BluetoothBleAdvertiserStub::SetAdvertisingDataInner(MessageParcel &data, MessageParcel &reply)
191 {
192     return NO_ERROR;
193 }
194 
ChangeAdvertisingParamsInner(MessageParcel & data,MessageParcel & reply)195 ErrCode BluetoothBleAdvertiserStub::ChangeAdvertisingParamsInner(MessageParcel &data, MessageParcel &reply)
196 {
197     int advHandle = data.ReadUint8();
198     std::shared_ptr<BluetoothBleAdvertiserSettings> settings(data.ReadParcelable<BluetoothBleAdvertiserSettings>());
199     if (settings == nullptr) {
200         HILOGE("Read settings failed.");
201         return TRANSACTION_ERR;
202     }
203     ChangeAdvertisingParams(advHandle, *settings);
204     return NO_ERROR;
205 }
206 }  // namespace Bluetooth
207 }  // namespace OHOS
208