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