• 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 "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