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