• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2023 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 #include "locator_required_data_manager.h"
16 #include "location_log.h"
17 #ifdef WIFI_ENABLE
18 #include "wifi_errcode.h"
19 #endif
20 #include "iservice_registry.h"
21 
22 namespace OHOS {
23 namespace Location {
24 const uint32_t EVENT_START_SCAN = 0x0100;
25 const uint32_t EVENT_STOP_SCAN = 0x0200;
LocatorRequiredDataManager()26 LocatorRequiredDataManager::LocatorRequiredDataManager()
27 {
28 #ifdef WIFI_ENABLE
29     WifiInfoInit();
30 #endif
31 #ifdef BLUETOOTH_ENABLE
32     BleInfoInit();
33 #endif
34     scanHandler_ = std::make_shared<ScanHandler>(AppExecFwk::EventRunner::Create(true));
35 }
36 
~LocatorRequiredDataManager()37 LocatorRequiredDataManager::~LocatorRequiredDataManager()
38 {
39 }
40 
RegisterCallback(std::shared_ptr<LocatingRequiredDataConfig> & config,const sptr<IRemoteObject> & callback)41 __attribute__((no_sanitize("cfi"))) LocationErrCode LocatorRequiredDataManager::RegisterCallback(
42     std::shared_ptr<LocatingRequiredDataConfig>& config, const sptr<IRemoteObject>& callback)
43 {
44     sptr<ILocatingRequiredDataCallback> dataCallback = iface_cast<ILocatingRequiredDataCallback>(callback);
45     if (dataCallback == nullptr) {
46         LBSLOGE(LOCATOR, "%{public}s iface_cast ILocatingRequiredDataCallback failed!", __func__);
47         return ERRCODE_INVALID_PARAM;
48     }
49     if (config->GetType() == LocatingRequiredDataType::WIFI) {
50 #ifdef WIFI_ENABLE
51         if (!isWifiCallbackRegistered()) {
52             bool ret = RegisterWifiCallBack();
53             if (!ret) {
54                 LBSLOGE(LOCATOR, "%{public}s WifiScan RegisterCallBack failed!", __func__);
55                 return ERRCODE_SERVICE_UNAVAILABLE;
56             }
57         }
58         std::unique_lock<std::mutex> lock(mutex_, std::defer_lock);
59         lock.lock();
60         callbacks_.push_back(dataCallback);
61         LBSLOGD(LOCATOR, "after RegisterCallback, callback size:%{public}s", std::to_string(callbacks_.size()).c_str());
62         if (config->GetNeedStartScan() && callbacks_.size() == 1) {
63             timeInterval_ = config->GetScanIntervalMs();
64             if (scanHandler_ != nullptr) {
65                 scanHandler_->SendEvent(EVENT_START_SCAN, 0, 0);
66             }
67         }
68         lock.unlock();
69 #endif
70     } else if (config->GetType() == LocatingRequiredDataType::BLUE_TOOTH) {
71         return ERRCODE_NOT_SUPPORTED;
72     }
73     return ERRCODE_SUCCESS;
74 }
75 
UnregisterCallback(const sptr<IRemoteObject> & callback)76 LocationErrCode LocatorRequiredDataManager::UnregisterCallback(const sptr<IRemoteObject>& callback)
77 {
78     sptr<ILocatingRequiredDataCallback> dataCallback = iface_cast<ILocatingRequiredDataCallback>(callback);
79     if (dataCallback == nullptr) {
80         LBSLOGE(LOCATOR, "%{public}s iface_cast ILocatingRequiredDataCallback failed!", __func__);
81         return ERRCODE_SERVICE_UNAVAILABLE;
82     }
83     std::unique_lock<std::mutex> lock(mutex_);
84     size_t i = 0;
85     for (; i < callbacks_.size(); i++) {
86         sptr<IRemoteObject> remoteObject = callbacks_[i]->AsObject();
87         if (remoteObject == callback) {
88             break;
89         }
90     }
91     if (callbacks_.size() > 0) {
92         callbacks_.erase(callbacks_.begin() + i);
93     }
94     LBSLOGD(LOCATOR, "after UnregisterCallback,  callback size:%{public}s", std::to_string(callbacks_.size()).c_str());
95     if (scanHandler_ != nullptr && callbacks_.size() == 0) {
96         scanHandler_->SendEvent(EVENT_STOP_SCAN, 0, 0);
97     }
98     return ERRCODE_SUCCESS;
99 }
100 
101 #ifdef BLUETOOTH_ENABLE
BleInfoInit()102 void LocatorRequiredDataManager::BleInfoInit()
103 {
104     std::shared_ptr<LocatorBleCallbackWapper> callback = std::make_shared<LocatorBleCallbackWapper>();
105     bleCentralManager_ = std::make_shared<Bluetooth::BleCentralManager>(callback);
106     bluetoothHost_ = &Bluetooth::BluetoothHost::GetDefaultHost();
107 }
108 
GetLocatingRequiredDataByBtHost(const Bluetooth::BluetoothRemoteDevice & device)109 std::vector<std::shared_ptr<LocatingRequiredData>> LocatorBluetoothHost::GetLocatingRequiredDataByBtHost(
110     const Bluetooth::BluetoothRemoteDevice &device)
111 {
112     std::vector<std::shared_ptr<LocatingRequiredData>> result;
113     std::shared_ptr<LocatingRequiredData> info = std::make_shared<LocatingRequiredData>();
114     std::shared_ptr<BluetoothScanInfo> btData = std::make_shared<BluetoothScanInfo>();
115     btData->SetMac(device.GetDeviceAddr());
116     btData->SetDeviceName(device.GetDeviceName());
117     info->SetType(LocatingRequiredDataType::BLUE_TOOTH);
118     info->SetBluetoothScanInfo(btData);
119     result.push_back(info);
120     return result;
121 }
122 
GetLocatingRequiredDataByBle(const Bluetooth::BleScanResult & result)123 std::vector<std::shared_ptr<LocatingRequiredData>> LocatorBleCallbackWapper::GetLocatingRequiredDataByBle(
124     const Bluetooth::BleScanResult &result)
125 {
126     std::vector<std::shared_ptr<LocatingRequiredData>> res;
127     std::shared_ptr<LocatingRequiredData> info = std::make_shared<LocatingRequiredData>();
128     std::shared_ptr<BluetoothScanInfo> btData = std::make_shared<BluetoothScanInfo>();
129     btData->SetMac(result.GetPeripheralDevice().GetDeviceAddr());
130     btData->SetDeviceName(result.GetPeripheralDevice().GetDeviceName());
131     btData->SetRssi(result.GetRssi());
132     info->SetType(LocatingRequiredDataType::BLUE_TOOTH);
133     info->SetBluetoothScanInfo(btData);
134     res.push_back(info);
135     return res;
136 }
137 
OnStateChanged(const int transport,const int status)138 void LocatorBluetoothHost::OnStateChanged(const int transport, const int status) {}
139 
OnDiscoveryStateChanged(int status)140 void LocatorBluetoothHost::OnDiscoveryStateChanged(int status) {}
141 
OnDiscoveryResult(const Bluetooth::BluetoothRemoteDevice & device)142 void LocatorBluetoothHost::OnDiscoveryResult(const Bluetooth::BluetoothRemoteDevice &device)
143 {
144     std::vector<std::shared_ptr<LocatingRequiredData>> result = GetLocatingRequiredDataByBtHost(device);
145     auto dataManager = DelayedSingleton<LocatorRequiredDataManager>::GetInstance();
146     if (dataManager == nullptr) {
147         LBSLOGE(NETWORK, "ProcessEvent: dataManager is nullptr");
148         return;
149     }
150     dataManager->ReportData(result);
151 }
152 
OnPairRequested(const Bluetooth::BluetoothRemoteDevice & device)153 void LocatorBluetoothHost::OnPairRequested(const Bluetooth::BluetoothRemoteDevice &device) {}
154 
OnPairConfirmed(const Bluetooth::BluetoothRemoteDevice & device,int reqType,int number)155 void LocatorBluetoothHost::OnPairConfirmed(const Bluetooth::BluetoothRemoteDevice &device, int reqType, int number) {}
156 
OnScanModeChanged(int mode)157 void LocatorBluetoothHost::OnScanModeChanged(int mode) {}
158 
OnDeviceNameChanged(const std::string & deviceName)159 void LocatorBluetoothHost::OnDeviceNameChanged(const std::string &deviceName) {}
160 
OnDeviceAddrChanged(const std::string & address)161 void LocatorBluetoothHost::OnDeviceAddrChanged(const std::string &address) {}
162 
OnScanCallback(const Bluetooth::BleScanResult & result)163 void LocatorBleCallbackWapper::OnScanCallback(const Bluetooth::BleScanResult &result)
164 {
165     std::vector<std::shared_ptr<LocatingRequiredData>> res = GetLocatingRequiredDataByBle(result);
166     auto dataManager = DelayedSingleton<LocatorRequiredDataManager>::GetInstance();
167     if (dataManager == nullptr) {
168         LBSLOGE(NETWORK, "ProcessEvent: dataManager is nullptr");
169         return;
170     }
171     dataManager->ReportData(res);
172 }
173 
OnBleBatchScanResultsEvent(const std::vector<Bluetooth::BleScanResult> & results)174 void LocatorBleCallbackWapper::OnBleBatchScanResultsEvent(const std::vector<Bluetooth::BleScanResult> &results) {}
175 
OnStartOrStopScanEvent(int32_t resultCode,bool isStartScan)176 void LocatorBleCallbackWapper::OnStartOrStopScanEvent(int32_t resultCode, bool isStartScan) {}
177 
OnNotifyMsgReportFromLpDevice(const Bluetooth::UUID & btUuid,int msgType,const std::vector<uint8_t> & value)178 void LocatorBleCallbackWapper::OnNotifyMsgReportFromLpDevice(const Bluetooth::UUID &btUuid, int msgType,
179     const std::vector<uint8_t> &value) {}
180 #endif
181 
182 #ifdef WIFI_ENABLE
WifiInfoInit()183 void LocatorRequiredDataManager::WifiInfoInit()
184 {
185     wifiScanPtr_ = Wifi::WifiScan::GetInstance(WIFI_SCAN_ABILITY_ID);
186     wifiScanEventCallback_ =
187 		sptr<LocatorWifiScanEventCallback>(new (std::nothrow) LocatorWifiScanEventCallback());
188     bool ret = RegisterWifiCallBack();
189     if (!ret) {
190         LBSLOGE(LOCATOR, "%{public}s WifiScan RegisterCallBack failed!", __func__);
191     }
192     int32_t result;
193     auto samgrProxy = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
194     if (samgrProxy == nullptr) {
195         LBSLOGE(LOCATOR, "%{public}s samgrProxy is nullptr!", __func__);
196         return;
197     }
198     saStatusListener_ = sptr<WifiServiceStatusChange>(new WifiServiceStatusChange());
199     if (saStatusListener_ == nullptr) {
200         LBSLOGE(LOCATOR, "%{public}s saStatusListener_ is nullptr!", __func__);
201         return;
202     }
203     result = samgrProxy->SubscribeSystemAbility(static_cast<int32_t>(WIFI_SCAN_ABILITY_ID), saStatusListener_);
204     LBSLOGI(LOCATOR, "%{public}s SubcribeSystemAbility result is %{public}d!", __func__, result);
205 }
206 
isWifiCallbackRegistered()207 bool LocatorRequiredDataManager::isWifiCallbackRegistered()
208 {
209     std::unique_lock<std::mutex> lock(wifiRegisteredMutex_);
210     return isWifiCallbackRegistered_;
211 }
212 
ResetCallbackRegisteredStatus()213 void LocatorRequiredDataManager::ResetCallbackRegisteredStatus()
214 {
215     std::unique_lock<std::mutex> lock(wifiRegisteredMutex_);
216     isWifiCallbackRegistered_ = false;
217 }
218 
RegisterWifiCallBack()219 __attribute__((no_sanitize("cfi"))) bool LocatorRequiredDataManager::RegisterWifiCallBack()
220 {
221     LBSLOGD(LOCATOR, "%{public}s enter", __func__);
222     if (wifiScanPtr_ == nullptr || wifiScanEventCallback_ == nullptr) {
223         LBSLOGE(LOCATOR, "%{public}s param unexpected.", __func__);
224         return false;
225     }
226     std::vector<std::string> events = {EVENT_STA_SCAN_STATE_CHANGE};
227     std::unique_lock<std::mutex> lock(wifiRegisteredMutex_);
228     int ret = wifiScanPtr_->RegisterCallBack(wifiScanEventCallback_, events);
229     if (ret != Wifi::WIFI_OPT_SUCCESS) {
230         LBSLOGE(LOCATOR, "%{public}s WifiScan RegisterCallBack failed!", __func__);
231         return false;
232     }
233     isWifiCallbackRegistered_ = true;
234     return true;
235 }
236 
OnWifiScanStateChanged(int state)237 __attribute__((no_sanitize("cfi"))) void LocatorWifiScanEventCallback::OnWifiScanStateChanged(int state)
238 {
239     LBSLOGD(LOCATOR, "OnWifiScanStateChanged state=%{public}d", state);
240     if (state == 0) {
241         LBSLOGE(LOCATOR, "OnWifiScanStateChanged false");
242         return;
243     }
244     std::vector<Wifi::WifiScanInfo> wifiScanInfo;
245     std::shared_ptr<Wifi::WifiScan> ptrWifiScan = Wifi::WifiScan::GetInstance(WIFI_SCAN_ABILITY_ID);
246     if (ptrWifiScan == nullptr) {
247         LBSLOGE(LOCATOR, "%{public}s WifiScan get instance failed", __func__);
248         return;
249     }
250     int ret = ptrWifiScan->GetScanInfoList(wifiScanInfo);
251     if (ret != Wifi::WIFI_OPT_SUCCESS) {
252         LBSLOGE(LOCATOR, "GetScanInfoList failed");
253         return;
254     }
255     std::vector<std::shared_ptr<LocatingRequiredData>> result = GetLocatingRequiredDataByWifi(wifiScanInfo);
256     auto dataManager = DelayedSingleton<LocatorRequiredDataManager>::GetInstance();
257     if (dataManager == nullptr) {
258         LBSLOGE(NETWORK, "ProcessEvent: dataManager is nullptr");
259         return;
260     }
261     dataManager->ReportData(result);
262     return;
263 }
264 
GetLocatingRequiredDataByWifi(const std::vector<Wifi::WifiScanInfo> & wifiScanInfo)265 std::vector<std::shared_ptr<LocatingRequiredData>> LocatorWifiScanEventCallback::GetLocatingRequiredDataByWifi(
266     const std::vector<Wifi::WifiScanInfo>& wifiScanInfo)
267 {
268     std::vector<std::shared_ptr<LocatingRequiredData>> res;
269     for (size_t i = 0; i < wifiScanInfo.size(); i++) {
270         std::shared_ptr<LocatingRequiredData> info = std::make_shared<LocatingRequiredData>();
271         std::shared_ptr<WifiScanInfo> wifiData = std::make_shared<WifiScanInfo>();
272         wifiData->SetSsid(wifiScanInfo[i].ssid);
273         wifiData->SetBssid(wifiScanInfo[i].bssid);
274         wifiData->SetRssi(wifiScanInfo[i].rssi);
275         wifiData->SetFrequency(wifiScanInfo[i].frequency);
276         wifiData->SetTimestamp(wifiScanInfo[i].timestamp);
277         info->SetType(LocatingRequiredDataType::WIFI);
278         info->SetWifiScanInfo(wifiData);
279         res.push_back(info);
280     }
281     return res;
282 }
283 #endif
284 
ReportData(const std::vector<std::shared_ptr<LocatingRequiredData>> & result)285 void LocatorRequiredDataManager::ReportData(const std::vector<std::shared_ptr<LocatingRequiredData>>& result)
286 {
287     std::unique_lock<std::mutex> lock(mutex_);
288     for (size_t i = 0; i < callbacks_.size(); i++) {
289         callbacks_[i]->OnLocatingDataChange(result);
290     }
291 }
292 
StartWifiScan(bool flag)293 __attribute__((no_sanitize("cfi"))) void LocatorRequiredDataManager::StartWifiScan(bool flag)
294 {
295     if (!flag) {
296         if (scanHandler_ != nullptr) {
297             scanHandler_->RemoveEvent(EVENT_START_SCAN);
298         }
299         return;
300     }
301 #ifdef WIFI_ENABLE
302     if (wifiScanPtr_ == nullptr) {
303         return;
304     }
305     int ret = wifiScanPtr_->Scan();
306     if (ret != Wifi::WIFI_OPT_SUCCESS) {
307         LBSLOGE(LOCATOR, "%{public}s WifiScan failed, ret=%{public}d", __func__, ret);
308         return;
309     }
310 #endif
311     LBSLOGD(LOCATOR, "StartWifiScan timeInterval_=%{public}d", timeInterval_);
312     if (scanHandler_ != nullptr) {
313         scanHandler_->SendHighPriorityEvent(EVENT_START_SCAN, 0, timeInterval_);
314     }
315 }
316 
IsConnecting()317 bool LocatorRequiredDataManager::IsConnecting()
318 {
319     std::unique_lock<std::mutex> lock(mutex_);
320     if (callbacks_.size() > 0) {
321         return true;
322     }
323     return false;
324 }
325 
ScanHandler(const std::shared_ptr<AppExecFwk::EventRunner> & runner)326 ScanHandler::ScanHandler(const std::shared_ptr<AppExecFwk::EventRunner>& runner) : EventHandler(runner) {}
327 
~ScanHandler()328 ScanHandler::~ScanHandler() {}
329 
ProcessEvent(const AppExecFwk::InnerEvent::Pointer & event)330 void ScanHandler::ProcessEvent(const AppExecFwk::InnerEvent::Pointer& event)
331 {
332     auto dataManager = DelayedSingleton<LocatorRequiredDataManager>::GetInstance();
333     if (dataManager == nullptr) {
334         LBSLOGE(NETWORK, "ProcessEvent: dataManager is nullptr");
335         return;
336     }
337     uint32_t eventId = event->GetInnerEventId();
338     LBSLOGI(LOCATOR, "ScanHandler ProcessEvent event:%{public}d", eventId);
339     switch (eventId) {
340         case EVENT_START_SCAN: {
341             dataManager->StartWifiScan(true);
342             break;
343         }
344         case EVENT_STOP_SCAN: {
345             dataManager->StartWifiScan(false);
346             break;
347         }
348         default:
349             break;
350     }
351 }
352 
OnAddSystemAbility(int32_t systemAbilityId,const std::string & deviceId)353 void WifiServiceStatusChange::OnAddSystemAbility(int32_t systemAbilityId, const std::string& deviceId)
354 {
355     LBSLOGI(LOCATOR, "WifiServiceStatusChange::OnAddSystemAbility systemAbilityId :%{public}d", systemAbilityId);
356     DelayedSingleton<LocatorRequiredDataManager>::GetInstance()->RegisterWifiCallBack();
357 }
358 
OnRemoveSystemAbility(int32_t systemAbilityId,const std::string & deviceId)359 void WifiServiceStatusChange::OnRemoveSystemAbility(int32_t systemAbilityId, const std::string& deviceId)
360 {
361     LBSLOGI(LOCATOR, "WifiServiceStatusChange::OnRemoveSystemAbility systemAbilityId :%{public}d", systemAbilityId);
362     DelayedSingleton<LocatorRequiredDataManager>::GetInstance()->ResetCallbackRegisteredStatus();
363 }
364 } // namespace Location
365 } // namespace OHOS
366