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 "bluetooth_ble_advertiser_server.h"
17
18 #include "bluetooth_ble_central_manager_server.h"
19 #include "bluetooth_errorcode.h"
20 #include "bluetooth_log.h"
21 #include "interface_adapter_ble.h"
22 #include "interface_adapter_manager.h"
23 #include "ipc_skeleton.h"
24 #include "remote_observer_list.h"
25 #include "permission_utils.h"
26
27 namespace OHOS {
28 namespace Bluetooth {
29 using namespace OHOS::bluetooth;
30 class BleAdvertiserCallback : public IBleAdvertiserCallback {
31 public:
32 BleAdvertiserCallback() = default;
33 ~BleAdvertiserCallback() override = default;
34
OnStartResultEvent(int result,uint8_t advHandle,int opcode)35 void OnStartResultEvent(int result, uint8_t advHandle, int opcode) override
36 {
37 HILOGI("result: %{public}d, advHandle: %{public}d, opcode: %{public}d", result, advHandle, opcode);
38
39 observers_->ForEach([this, result, advHandle, opcode](IBluetoothBleAdvertiseCallback *observer) {
40 int32_t uid = observersUid_[observer->AsObject()];
41 if (BluetoothBleCentralManagerServer::IsProxyUid(uid)) {
42 HILOGD("uid:%{public}d is proxy uid, not callback.", uid);
43 return;
44 }
45 observer->OnStartResultEvent(result, advHandle, opcode);
46 });
47 }
48
OnEnableResultEvent(int result,uint8_t advHandle)49 void OnEnableResultEvent(int result, uint8_t advHandle) override
50 {}
51
OnDisableResultEvent(int result,uint8_t advHandle)52 void OnDisableResultEvent(int result, uint8_t advHandle) override
53 {}
54
OnStopResultEvent(int result,uint8_t advHandle)55 void OnStopResultEvent(int result, uint8_t advHandle) override
56 {
57 HILOGI("result: %{public}d, advHandle: %{public}d", result, advHandle);
58
59 observers_->ForEach([this, result, advHandle](IBluetoothBleAdvertiseCallback *observer) {
60 int32_t uid = observersUid_[observer->AsObject()];
61 if (BluetoothBleCentralManagerServer::IsProxyUid(uid)) {
62 HILOGD("uid:%{public}d is proxy uid, not callback.", uid);
63 return;
64 }
65 observer->OnStopResultEvent(result, advHandle);
66 });
67 }
68
OnAutoStopAdvEvent(uint8_t advHandle)69 void OnAutoStopAdvEvent(uint8_t advHandle) override
70 {
71 HILOGI("advHandle: %{public}d", advHandle);
72
73 observers_->ForEach(
74 [advHandle](IBluetoothBleAdvertiseCallback *observer) { observer->OnAutoStopAdvEvent(advHandle); });
75 }
76
OnSetAdvDataEvent(int32_t result,int32_t advHandle)77 void OnSetAdvDataEvent(int32_t result, int32_t advHandle) override
78 {
79 return;
80 }
81
SetObserver(RemoteObserverList<IBluetoothBleAdvertiseCallback> * observers)82 void SetObserver(RemoteObserverList<IBluetoothBleAdvertiseCallback> *observers)
83 {
84 observers_ = observers;
85 }
86
87 std::map<sptr<IRemoteObject>, int32_t> observersUid_;
88
89 private:
90 RemoteObserverList<IBluetoothBleAdvertiseCallback> *observers_;
91 };
92
93 struct BluetoothBleAdvertiserServer::impl {
94 impl();
95 ~impl();
96
97 BleAdvertiserDataImpl ConvertAdvertisingData(const BluetoothBleAdvertiserData &data) const;
98
99 /// sys state observer
100 class SystemStateObserver;
101 std::unique_ptr<SystemStateObserver> systemStateObserver_ = nullptr;
102
103 RemoteObserverList<IBluetoothBleAdvertiseCallback> observers_;
104 std::unique_ptr<BleAdvertiserCallback> observerImp_ = std::make_unique<BleAdvertiserCallback>();
105 std::vector<sptr<IBluetoothBleAdvertiseCallback>> advCallBack_;
106 };
107
108 class BluetoothBleAdvertiserServer::impl::SystemStateObserver : public ISystemStateObserver {
109 public:
SystemStateObserver(BluetoothBleAdvertiserServer::impl * pimpl)110 explicit SystemStateObserver(BluetoothBleAdvertiserServer::impl *pimpl) : pimpl_(pimpl) {};
OnSystemStateChange(const BTSystemState state)111 void OnSystemStateChange(const BTSystemState state) override
112 {
113 auto bleService = IAdapterManager::GetInstance()->GetBleAdapterInterface();
114 switch (state) {
115 case BTSystemState::ON:
116 if (bleService != nullptr) {
117 bleService->RegisterBleAdvertiserCallback(*pimpl_->observerImp_.get());
118 }
119 break;
120 default:
121 break;
122 }
123 };
124
125 private:
126 BluetoothBleAdvertiserServer::impl *pimpl_ = nullptr;
127 };
128
impl()129 BluetoothBleAdvertiserServer::impl::impl()
130 {}
131
~impl()132 BluetoothBleAdvertiserServer::impl::~impl()
133 {
134 auto bleService = IAdapterManager::GetInstance()->GetBleAdapterInterface();
135 if (bleService != nullptr) {
136 bleService->DeregisterBleAdvertiserCallback();
137 }
138 }
139
BluetoothBleAdvertiserServer()140 BluetoothBleAdvertiserServer::BluetoothBleAdvertiserServer()
141 {
142 pimpl = std::make_unique<impl>();
143 pimpl->observerImp_->SetObserver(&(pimpl->observers_));
144 pimpl->systemStateObserver_ = std::make_unique<impl::SystemStateObserver>(pimpl.get());
145 IAdapterManager::GetInstance()->RegisterSystemStateObserver(*(pimpl->systemStateObserver_));
146
147 auto bleService = IAdapterManager::GetInstance()->GetBleAdapterInterface();
148 if (bleService != nullptr) {
149 bleService->RegisterBleAdvertiserCallback(*pimpl->observerImp_.get());
150 }
151 }
152
~BluetoothBleAdvertiserServer()153 BluetoothBleAdvertiserServer::~BluetoothBleAdvertiserServer()
154 {
155 IAdapterManager::GetInstance()->DeregisterSystemStateObserver(*(pimpl->systemStateObserver_));
156 }
157
ConvertAdvertisingData(const BluetoothBleAdvertiserData & data) const158 BleAdvertiserDataImpl BluetoothBleAdvertiserServer::impl::ConvertAdvertisingData(
159 const BluetoothBleAdvertiserData &data) const
160 {
161 BleAdvertiserDataImpl outData;
162
163 std::map<uint16_t, std::string> manufacturerData = data.GetManufacturerData();
164 for (auto iter = manufacturerData.begin(); iter != manufacturerData.end(); iter++) {
165 outData.AddManufacturerData(iter->first, iter->second);
166 }
167 std::map<Uuid, std::string> serviceData = data.GetServiceData();
168 for (auto it = serviceData.begin(); it != serviceData.end(); it++) {
169 outData.AddServiceData(it->first, it->second);
170 }
171 std::vector<Uuid> serviceUuids = data.GetServiceUuids();
172 for (auto it = serviceUuids.begin(); it != serviceUuids.end(); it++) {
173 outData.AddServiceUuid(*it);
174 }
175 outData.AddData(data.GetPayload());
176
177 return outData;
178 }
179
StartAdvertising(const BluetoothBleAdvertiserSettings & settings,const BluetoothBleAdvertiserData & advData,const BluetoothBleAdvertiserData & scanResponse,int32_t advHandle,uint16_t duration,bool isRawData)180 int BluetoothBleAdvertiserServer::StartAdvertising(const BluetoothBleAdvertiserSettings &settings,
181 const BluetoothBleAdvertiserData &advData, const BluetoothBleAdvertiserData &scanResponse, int32_t advHandle,
182 uint16_t duration, bool isRawData)
183 {
184 HILOGI("enter");
185 if (PermissionUtils::VerifyDiscoverBluetoothPermission() == PERMISSION_DENIED) {
186 HILOGE("check permission failed");
187 return BT_ERR_PERMISSION_FAILED;
188 }
189
190 auto bleService = IAdapterManager::GetInstance()->GetBleAdapterInterface();
191 if (bleService != nullptr) {
192 BleAdvertiserSettingsImpl settingsImpl;
193 settingsImpl.SetConnectable(settings.IsConnectable());
194 settingsImpl.SetInterval(settings.GetInterval());
195 settingsImpl.SetLegacyMode(settings.IsLegacyMode());
196 settingsImpl.SetTxPower(settings.GetTxPower());
197
198 BleAdvertiserDataImpl bleAdvertiserData = pimpl->ConvertAdvertisingData(advData);
199 if (!isRawData) {
200 bleAdvertiserData.SetFlags(advData.GetAdvFlag());
201 }
202 BleAdvertiserDataImpl bleScanResponse = pimpl->ConvertAdvertisingData(scanResponse);
203 HILOGI("NOT support duration now");
204 bleService->StartAdvertising(settingsImpl, bleAdvertiserData, bleScanResponse, advHandle);
205 }
206 return NO_ERROR;
207 }
208
EnableAdvertising(uint8_t advHandle,uint16_t duration)209 int BluetoothBleAdvertiserServer::EnableAdvertising(uint8_t advHandle, uint16_t duration)
210 {
211 HILOGI("NOT SUPPORT NOW");
212 return NO_ERROR;
213 }
214
DisableAdvertising(uint8_t advHandle)215 int BluetoothBleAdvertiserServer::DisableAdvertising(uint8_t advHandle)
216 {
217 HILOGI("NOT SUPPORT NOW");
218 return NO_ERROR;
219 }
220
StopAdvertising(int32_t advHandle)221 int BluetoothBleAdvertiserServer::StopAdvertising(int32_t advHandle)
222 {
223 HILOGI("enter, advHandle: %{public}d", advHandle);
224 if (PermissionUtils::VerifyDiscoverBluetoothPermission() == PERMISSION_DENIED) {
225 HILOGE("check permission failed");
226 return BT_ERR_PERMISSION_FAILED;
227 }
228
229 auto bleService = IAdapterManager::GetInstance()->GetBleAdapterInterface();
230 if (bleService != nullptr) {
231 bleService->StopAdvertising(advHandle);
232 }
233 pimpl->observerImp_->OnStopResultEvent(NO_ERROR, advHandle);
234 return NO_ERROR;
235 }
236
Close(int32_t advHandle)237 void BluetoothBleAdvertiserServer::Close(int32_t advHandle)
238 {
239 HILOGI("enter, advHandle: %{public}d", advHandle);
240
241 auto bleService = IAdapterManager::GetInstance()->GetBleAdapterInterface();
242 if (bleService != nullptr) {
243 bleService->Close(advHandle);
244 }
245 }
246
RegisterBleAdvertiserCallback(const sptr<IBluetoothBleAdvertiseCallback> & callback)247 void BluetoothBleAdvertiserServer::RegisterBleAdvertiserCallback(const sptr<IBluetoothBleAdvertiseCallback> &callback)
248 {
249 HILOGI("enter");
250
251 if (callback == nullptr) {
252 HILOGE("callback is null");
253 return;
254 }
255 std::lock_guard<std::recursive_mutex> lock(mutex_);
256 if (pimpl != nullptr) {
257 pimpl->observerImp_->observersUid_[callback->AsObject()] = IPCSkeleton::GetCallingUid();
258 auto func = std::bind(&BluetoothBleAdvertiserServer::DeregisterBleAdvertiserCallback,
259 this, std::placeholders::_1);
260 pimpl->observers_.Register(callback, func);
261 pimpl->advCallBack_.push_back(callback);
262 }
263 }
264
DeregisterBleAdvertiserCallback(const sptr<IBluetoothBleAdvertiseCallback> & callback)265 void BluetoothBleAdvertiserServer::DeregisterBleAdvertiserCallback(const sptr<IBluetoothBleAdvertiseCallback> &callback)
266 {
267 HILOGI("enter");
268
269 if (callback == nullptr || pimpl == nullptr) {
270 HILOGE("callback is null, or pimpl is null");
271 return;
272 }
273 std::lock_guard<std::recursive_mutex> lock(mutex_);
274 for (auto iter = pimpl->advCallBack_.begin(); iter != pimpl->advCallBack_.end(); ++iter) {
275 if ((*iter)->AsObject() == callback->AsObject()) {
276 HILOGI("Deregister observer");
277 pimpl->observers_.Deregister(*iter);
278 pimpl->advCallBack_.erase(iter);
279 break;
280 }
281 }
282 for (auto iter = pimpl->observerImp_->observersUid_.begin(); iter != pimpl->observerImp_->observersUid_.end();
283 ++iter) {
284 if (iter->first == callback->AsObject()) {
285 pimpl->observerImp_->observersUid_.erase(iter);
286 break;
287 }
288 }
289 }
290
GetAdvertiserHandle(int32_t & advHandle)291 int32_t BluetoothBleAdvertiserServer::GetAdvertiserHandle(int32_t &advHandle)
292 {
293 HILOGI("enter");
294
295 auto bleService = IAdapterManager::GetInstance()->GetBleAdapterInterface();
296 if (bleService == nullptr) {
297 return BT_ERR_INTERNAL_ERROR;
298 }
299 advHandle = bleService->GetAdvertiserHandle();
300 if (advHandle == BLE_INVALID_ADVERTISING_HANDLE) {
301 return BT_ERR_INTERNAL_ERROR;
302 }
303
304 return NO_ERROR;
305 }
306
SetAdvertisingData(const BluetoothBleAdvertiserData & advData,const BluetoothBleAdvertiserData & scanResponse,int32_t advHandle)307 void BluetoothBleAdvertiserServer::SetAdvertisingData(const BluetoothBleAdvertiserData &advData,
308 const BluetoothBleAdvertiserData &scanResponse, int32_t advHandle)
309 {
310 HILOGI("NOT SUPPORT NOW");
311 return;
312 }
313 } // namespace Bluetooth
314 } // namespace OHOS
315