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