• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2022 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 #ifdef FEATURE_GNSS_SUPPORT
17 #include "gnss_ability.h"
18 
19 #include <file_ex.h>
20 #include <thread>
21 
22 #include "agnss_ni_manager.h"
23 #include "event_runner.h"
24 #include "idevmgr_hdi.h"
25 #include "ipc_skeleton.h"
26 #include "iproxy_broker.h"
27 #include "iservice_registry.h"
28 #include "system_ability_definition.h"
29 
30 #ifdef HDF_DRIVERS_INTERFACE_AGNSS_ENABLE
31 #include "agnss_event_callback.h"
32 #endif
33 #include "common_hisysevent.h"
34 #include "common_utils.h"
35 #include "gnss_event_callback.h"
36 #include "i_cached_locations_callback.h"
37 #include "location_config_manager.h"
38 #include "location_dumper.h"
39 #include "location_log.h"
40 #include "location_sa_load_manager.h"
41 #include "locationhub_ipc_interface_code.h"
42 #include "location_log_event_ids.h"
43 #include "location_data_rdb_manager.h"
44 #include "permission_manager.h"
45 #include "proxy_freeze_manager.h"
46 
47 #ifdef NOTIFICATION_ENABLE
48 #include "notification_request.h"
49 #include "notification_helper.h"
50 #endif
51 
52 #include "hook_utils.h"
53 #include "geofence_definition.h"
54 
55 #ifdef TIME_SERVICE_ENABLE
56 #include "time_service_client.h"
57 #include "ntp_time_check.h"
58 #endif
59 
60 #ifdef LOCATION_HICOLLIE_ENABLE
61 #include "xcollie/xcollie.h"
62 #include "xcollie/xcollie_define.h"
63 #endif
64 
65 #include "parameters.h"
66 
67 namespace OHOS {
68 namespace Location {
69 namespace {
70 constexpr uint32_t WAIT_MS = 200;
71 const uint32_t EVENT_INTERVAL_UNITE = 1000;
72 const int MAX_GNSS_STATUS_CALLBACK_NUM = 1000;
73 const int MAX_NMEA_CALLBACK_NUM = 1000;
74 const int MAX_GNSS_GEOFENCE_REQUEST_NUM = 1000;
75 #ifdef HDF_DRIVERS_INTERFACE_AGNSS_ENABLE
76 constexpr const char *AGNSS_SERVICE_NAME = "agnss_interface_service";
77 #endif
78 constexpr const char *LOCATION_HOST_NAME = "location_host";
79 constexpr const char *GNSS_SERVICE_NAME = "gnss_interface_service";
80 #ifdef HDF_DRIVERS_INTERFACE_GEOFENCE_ENABLE
81 constexpr const char *GEOFENCE_SERVICE_NAME = "geofence_interface_service";
82 #endif
83 constexpr const char *UNLOAD_GNSS_TASK = "gnss_sa_unload";
84 const uint32_t RETRY_INTERVAL_OF_UNLOAD_SA = 4 * 60 * EVENT_INTERVAL_UNITE;
85 constexpr int32_t FENCE_MAX_ID = 1000000;
86 constexpr int NLP_FIX_VALID_TIME = 2;
87 const int64_t INVALID_TIME = 0;
88 const int TIMEOUT_WATCHDOG = 60; // s
89 const int DEFAULT_FENCE_ID = -1;
90 const int64_t MILL_TO_NANOS = 1000000;
91 static const std::string SYSPARAM_GPS_SUPPORT = "const.location.gps.support";
92 static const std::string SYSPARAM_GEOFENCE_SUPPORT = "const.location.support_geofence";
93 }
94 
95 const bool REGISTER_RESULT = SystemAbility::MakeAndRegisterAbility(
96     GnssAbility::GetInstance());
97 
GetInstance()98 GnssAbility* GnssAbility::GetInstance()
99 {
100     static GnssAbility data;
101     return &data;
102 }
103 
GnssAbility()104 GnssAbility::GnssAbility() : SystemAbility(LOCATION_GNSS_SA_ID, true)
105 {
106     gnssCallback_ = nullptr;
107 #ifdef HDF_DRIVERS_INTERFACE_AGNSS_ENABLE
108     agnssCallback_ = nullptr;
109 #endif
110     gnssWorkingStatus_ = GNSS_WORKING_STATUS_NONE;
111     SetAbility(GNSS_ABILITY);
112 #ifndef TDD_CASES_ENABLED
113     gnssHandler_ = std::make_shared<GnssHandler>(AppExecFwk::EventRunner::Create(true, AppExecFwk::ThreadMode::FFRT));
114     if (gnssHandler_ != nullptr) {
115         AppExecFwk::InnerEvent::Pointer event = AppExecFwk::InnerEvent::Get(
116             static_cast<uint32_t>(GnssAbilityInterfaceCode::INIT_HDI), 0);
117         gnssHandler_->SendEvent(event);
118     }
119 #endif
120 
121     fenceId_ = 0;
122     auto agnssNiManager = AGnssNiManager::GetInstance();
123     if (agnssNiManager != nullptr) {
124         agnssNiManager->SubscribeSaStatusChangeListerner();
125     }
126     MonitorNetwork();
127     LBSLOGI(GNSS, "ability constructed.");
128 }
129 
~GnssAbility()130 GnssAbility::~GnssAbility()
131 {
132 #ifdef NET_MANAGER_ENABLE
133 #ifndef TDD_CASES_ENABLED
134     if (netWorkObserver_ != nullptr) {
135         NetManagerStandard::NetConnClient::GetInstance().UnregisterNetConnCallback(netWorkObserver_);
136     }
137 #endif
138 #endif
139 }
140 
CheckIfHdiConnected()141 bool GnssAbility::CheckIfHdiConnected()
142 {
143     if (!IsDeviceLoaded(GNSS_SERVICE_NAME)) {
144         return false;
145     }
146 #ifdef HDF_DRIVERS_INTERFACE_AGNSS_ENABLE
147     if (!IsDeviceLoaded(AGNSS_SERVICE_NAME)) {
148         return false;
149     }
150 #endif
151 #ifdef HDF_DRIVERS_INTERFACE_GEOFENCE_ENABLE
152     if (!IsDeviceLoaded(GEOFENCE_SERVICE_NAME)) {
153         return false;
154     }
155 #endif
156     return true;
157 }
158 
OnStart()159 void GnssAbility::OnStart()
160 {
161     if (state_ == ServiceRunningState::STATE_RUNNING) {
162         LBSLOGI(GNSS, "ability has already started.");
163         return;
164     }
165     if (!Init()) {
166         LBSLOGE(GNSS, "failed to init ability");
167         OnStop();
168         return;
169     }
170     state_ = ServiceRunningState::STATE_RUNNING;
171     LBSLOGI(GNSS, "OnStart start ability success.");
172 }
173 
OnStop()174 void GnssAbility::OnStop()
175 {
176     state_ = ServiceRunningState::STATE_NOT_START;
177     registerToAbility_ = false;
178     if (CheckIfHdiConnected()) {
179         auto startTime = CommonUtils::GetCurrentTimeStamp();
180         auto ret = false;
181 #ifndef TDD_CASES_ENABLED
182         ret = RemoveHdi();
183 #endif
184         auto endTime = CommonUtils::GetCurrentTimeStamp();
185         WriteLocationInnerEvent(HDI_EVENT, {"ret", std::to_string(ret), "type", "DisConnectHdi",
186             "startTime", std::to_string(startTime), "endTime", std::to_string(endTime)});
187     }
188     LBSLOGI(GNSS, "OnStop ability stopped.");
189 }
190 
Init()191 bool GnssAbility::Init()
192 {
193     if (!registerToAbility_) {
194         bool ret = Publish(AsObject());
195         if (!ret) {
196             LBSLOGE(GNSS, "Init Publish failed!");
197             return false;
198         }
199         registerToAbility_ = true;
200     }
201     return true;
202 }
203 
SendLocationRequest(WorkRecord & workrecord)204 LocationErrCode GnssAbility::SendLocationRequest(WorkRecord &workrecord)
205 {
206     LocationRequest(workrecord);
207     return ERRCODE_SUCCESS;
208 }
209 
SetEnable(bool state)210 LocationErrCode GnssAbility::SetEnable(bool state)
211 {
212     int gnssEnableState  = LocationConfigManager::GetInstance()->GetGnssEnableState();
213     if (state && gnssEnableState) {
214         EnableGnss();
215         StartGnss();
216     } else {
217         /*
218         * GNSS will not disable and stop, if there are location requests
219         * that are not restricted by the location switch state exist.
220         */
221         if (GetRequestNum() == 0 || !gnssEnableState) {
222             LBSLOGI(GNSS, "gnssEnableState: %{public}d", gnssEnableState);
223             StopGnss();
224             DisableGnss();
225         }
226     }
227     return ERRCODE_SUCCESS;
228 }
229 
CancelIdleState()230 bool GnssAbility::CancelIdleState()
231 {
232     SystemAbilityState state = GetAbilityState();
233     if (state != SystemAbilityState::IDLE) {
234         return true;
235     }
236     bool ret = CancelIdle();
237     if (!ret) {
238         LBSLOGE(GNSS, "%{public}s cancel idle failed!", __func__);
239         return false;
240     }
241     return true;
242 }
243 
UnloadGnssSystemAbility()244 void GnssAbility::UnloadGnssSystemAbility()
245 {
246     if (gnssHandler_ == nullptr) {
247         LBSLOGE(GNSS, "%{public}s gnssHandler is nullptr", __func__);
248         return;
249     }
250     gnssHandler_->RemoveTask(UNLOAD_GNSS_TASK);
251     auto task = [this]() {
252         if (CheckIfGnssConnecting()) {
253             return;
254         }
255         SaLoadWithStatistic::UnInitLocationSa(LOCATION_GNSS_SA_ID);
256     };
257     if (gnssHandler_ != nullptr) {
258         gnssHandler_->PostTask(task, UNLOAD_GNSS_TASK, RETRY_INTERVAL_OF_UNLOAD_SA);
259     }
260 }
261 
CheckIfGnssConnecting()262 bool GnssAbility::CheckIfGnssConnecting()
263 {
264     return IsMockEnabled() || GetRequestNum() != 0 || IsMockProcessing() || IsGnssfenceRequestMapExist();
265 }
266 
IsGnssfenceRequestMapExist()267 bool GnssAbility::IsGnssfenceRequestMapExist()
268 {
269     std::unique_lock<ffrt::mutex> lock(gnssGeofenceRequestMapMutex_);
270     return gnssGeofenceRequestMap_.size() != 0;
271 }
272 
RefrashRequirements()273 LocationErrCode GnssAbility::RefrashRequirements()
274 {
275     HandleRefrashRequirements();
276     return ERRCODE_SUCCESS;
277 }
278 
RegisterGnssStatusCallback(const sptr<IRemoteObject> & callback,AppIdentity & identity)279 LocationErrCode GnssAbility::RegisterGnssStatusCallback(const sptr<IRemoteObject>& callback,
280     AppIdentity &identity)
281 {
282     if (callback == nullptr) {
283         LBSLOGE(GNSS, "register an invalid gnssStatus callback");
284         return LOCATION_ERRCODE_INVALID_PARAM;
285     }
286     sptr<IRemoteObject::DeathRecipient> death(new (std::nothrow) GnssStatusCallbackDeathRecipient());
287     callback->AddDeathRecipient(death);
288     std::unique_lock<ffrt::mutex> lock(gnssMutex_);
289     if (gnssStatusCallbackMap_.size() <= MAX_GNSS_STATUS_CALLBACK_NUM) {
290         gnssStatusCallbackMap_[callback] = identity;
291     } else {
292         LBSLOGE(GNSS, "RegisterGnssStatusCallback num max");
293         return ERRCODE_SERVICE_UNAVAILABLE;
294     }
295     LBSLOGD(GNSS, "RegisterGnssStatusCallback uid:%{public}d register, gnssStatusCallback size:%{public}s",
296         identity.GetUid(), std::to_string(gnssStatusCallbackMap_.size()).c_str());
297     return ERRCODE_SUCCESS;
298 }
299 
UnregisterGnssStatusCallback(const sptr<IRemoteObject> & callback)300 LocationErrCode GnssAbility::UnregisterGnssStatusCallback(const sptr<IRemoteObject>& callback)
301 {
302     if (callback == nullptr) {
303         LBSLOGE(GNSS, "unregister an invalid gnssStatus callback");
304         return LOCATION_ERRCODE_INVALID_PARAM;
305     }
306     std::unique_lock<ffrt::mutex> lock(gnssMutex_);
307     auto iter = gnssStatusCallbackMap_.find(callback);
308     if (iter != gnssStatusCallbackMap_.end()) {
309         gnssStatusCallbackMap_.erase(iter);
310     }
311     LBSLOGD(GNSS, "after unregister, gnssStatus callback size:%{public}s",
312         std::to_string(gnssStatusCallbackMap_.size()).c_str());
313     return ERRCODE_SUCCESS;
314 }
315 
RegisterNmeaMessageCallback(const sptr<IRemoteObject> & callback,AppIdentity & identity)316 LocationErrCode GnssAbility::RegisterNmeaMessageCallback(const sptr<IRemoteObject>& callback,
317     AppIdentity &identity)
318 {
319     if (callback == nullptr) {
320         LBSLOGE(GNSS, "register an invalid nmea callback");
321         return LOCATION_ERRCODE_INVALID_PARAM;
322     }
323     sptr<IRemoteObject::DeathRecipient> death(new (std::nothrow) NmeaCallbackDeathRecipient());
324     callback->AddDeathRecipient(death);
325     std::unique_lock<ffrt::mutex> lock(nmeaMutex_);
326     if (nmeaCallbackMap_.size() <= MAX_NMEA_CALLBACK_NUM) {
327         nmeaCallbackMap_[callback] = identity;
328     } else {
329         LBSLOGE(GNSS, "RegisterNmeaMessageCallback num max");
330         return ERRCODE_SERVICE_UNAVAILABLE;
331     }
332     LBSLOGD(GNSS, "after uid:%{public}d register, nmeaCallback size:%{public}s",
333         identity.GetUid(), std::to_string(nmeaCallbackMap_.size()).c_str());
334     return ERRCODE_SUCCESS;
335 }
336 
UnregisterNmeaMessageCallback(const sptr<IRemoteObject> & callback)337 LocationErrCode GnssAbility::UnregisterNmeaMessageCallback(const sptr<IRemoteObject>& callback)
338 {
339     if (callback == nullptr) {
340         LBSLOGE(GNSS, "unregister an invalid nmea callback");
341         return LOCATION_ERRCODE_INVALID_PARAM;
342     }
343     std::unique_lock<ffrt::mutex> lock(nmeaMutex_);
344     auto iter = nmeaCallbackMap_.find(callback);
345     if (iter != nmeaCallbackMap_.end()) {
346         nmeaCallbackMap_.erase(iter);
347     }
348 
349     LBSLOGD(GNSS, "after unregister, nmea callback size:%{public}s",
350         std::to_string(nmeaCallbackMap_.size()).c_str());
351     return ERRCODE_SUCCESS;
352 }
353 
RegisterCachedCallback(const std::unique_ptr<CachedGnssLocationsRequest> & request,const sptr<IRemoteObject> & callback)354 LocationErrCode GnssAbility::RegisterCachedCallback(const std::unique_ptr<CachedGnssLocationsRequest>& request,
355     const sptr<IRemoteObject>& callback)
356 {
357     if (callback == nullptr) {
358         LBSLOGE(GNSS, "register an invalid cached location callback");
359         return LOCATION_ERRCODE_INVALID_PARAM;
360     }
361     sptr<IRemoteObject::DeathRecipient> death(new (std::nothrow) CachedLocationCallbackDeathRecipient());
362     callback->AddDeathRecipient(death);
363     sptr<ICachedLocationsCallback> cachedCallback = iface_cast<ICachedLocationsCallback>(callback);
364     if (cachedCallback == nullptr) {
365         LBSLOGE(GNSS, "cast cached location callback fail!");
366         return LOCATION_ERRCODE_INVALID_PARAM;
367     }
368     LBSLOGD(GNSS, "request:%{public}d %{public}d",
369         request->reportingPeriodSec, request->wakeUpCacheQueueFull ? 1 : 0);
370     return LOCATION_ERRCODE_NOT_SUPPORTED;
371 }
372 
UnregisterCachedCallback(const sptr<IRemoteObject> & callback)373 LocationErrCode GnssAbility::UnregisterCachedCallback(const sptr<IRemoteObject>& callback)
374 {
375     if (callback == nullptr) {
376         LBSLOGE(GNSS, "register an invalid cached location callback");
377         return LOCATION_ERRCODE_INVALID_PARAM;
378     }
379 
380     sptr<ICachedLocationsCallback> cachedCallback = iface_cast<ICachedLocationsCallback>(callback);
381     if (cachedCallback == nullptr) {
382         LBSLOGE(GNSS, "cast cached location callback fail!");
383         return LOCATION_ERRCODE_INVALID_PARAM;
384     }
385     return LOCATION_ERRCODE_NOT_SUPPORTED;
386 }
387 
RequestRecord(WorkRecord & workRecord,bool isAdded)388 void GnssAbility::RequestRecord(WorkRecord &workRecord, bool isAdded)
389 {
390     LBSLOGD(GNSS, "enter RequestRecord");
391     if (!IsSupportGps()) {
392         LBSLOGI(GNSS, "Is Not Support Gps");
393         return;
394     }
395     if (isAdded) {
396         int gnssEnableState  = LocationConfigManager::GetInstance()->GetGnssEnableState();
397         uint32_t tokenId = workRecord.GetTokenId(0);
398         uint32_t firstTokenId = workRecord.GetFirstTokenId(0);
399         bool ignoredSwitchPermission = PermissionManager::CheckLocationSwitchIgnoredPermission(tokenId, firstTokenId);
400         if (!gnssEnableState && !ignoredSwitchPermission) {
401             LBSLOGE(GNSS, "gnss enablestate false!");
402             return;
403         }
404         if (!CheckIfHdiConnected()) {
405             auto startTime = CommonUtils::GetCurrentTimeStamp();
406             auto ret = false;
407 #ifndef TDD_CASES_ENABLED
408             ret = ConnectHdi();
409 #endif
410             auto endTime = CommonUtils::GetCurrentTimeStamp();
411             WriteLocationInnerEvent(HDI_EVENT, {"ret", std::to_string(ret), "type", "ConnectHdi",
412                     "startTime", std::to_string(startTime), "endTime", std::to_string(endTime)});
413         }
414         EnableGnss();
415 #ifdef HDF_DRIVERS_INTERFACE_AGNSS_ENABLE
416         SetAgnssServer();
417 #endif
418         StartGnss();
419         LocatorRequestStruct locatorRequestStruct;
420         locatorRequestStruct.bundleName = workRecord.GetName(0);
421         LocationErrCode errorCode = HookUtils::ExecuteHook(LocationProcessStage::GNSS_REQUEST_RECORD_PROCESS,
422             (void *)&locatorRequestStruct, nullptr);
423     } else {
424         // GNSS will stop only if all requests have stopped
425         if (GetRequestNum() == 0) {
426             StopGnss();
427         }
428         // GNSS will disable if all requests have stopped and location switch is off
429         if (GetRequestNum() == 0 && LocationDataRdbManager::QuerySwitchState() != ENABLED) {
430             DisableGnss();
431         }
432     }
433     std::string state = isAdded ? "start" : "stop";
434     WriteGnssStateEvent(state, workRecord.GetPid(0), workRecord.GetUid(0));
435 }
436 
ReConnectHdi()437 void GnssAbility::ReConnectHdi()
438 {
439     if (gnssHandler_ != nullptr) {
440         AppExecFwk::InnerEvent::Pointer event = AppExecFwk::InnerEvent::Get(
441             static_cast<uint32_t>(GnssAbilityInterfaceCode::RECONNECT_HDI), 0);
442         gnssHandler_->SendEvent(event);
443     }
444 }
445 
ReConnectHdiImpl()446 void GnssAbility::ReConnectHdiImpl()
447 {
448     LBSLOGD(GNSS, "%{public}s called", __func__);
449 #ifndef TDD_CASES_ENABLED
450     ConnectHdi();
451 #endif
452     EnableGnss();
453 #ifdef HDF_DRIVERS_INTERFACE_AGNSS_ENABLE
454     SetAgnssCallback();
455     SetAgnssServer();
456 #endif
457     if (gnssWorkingStatus_ == GNSS_WORKING_STATUS_SESSION_BEGIN) {
458         StartGnss();
459     }
460 }
461 
GetCachedGnssLocationsSize(int & size)462 LocationErrCode GnssAbility::GetCachedGnssLocationsSize(int& size)
463 {
464     size = -1;
465     return LOCATION_ERRCODE_NOT_SUPPORTED;
466 }
467 
FlushCachedGnssLocations()468 LocationErrCode GnssAbility::FlushCachedGnssLocations()
469 {
470     LBSLOGE(GNSS, "%{public}s not support", __func__);
471     return LOCATION_ERRCODE_NOT_SUPPORTED;
472 }
473 
GetCommandFlags(std::unique_ptr<LocationCommand> & commands,GnssAuxiliaryDataType & flags)474 bool GnssAbility::GetCommandFlags(std::unique_ptr<LocationCommand>& commands, GnssAuxiliaryDataType& flags)
475 {
476     std::string cmd = commands->command;
477     if (cmd == "delete_auxiliary_data_ephemeris") {
478         flags = GnssAuxiliaryDataType::GNSS_AUXILIARY_DATA_EPHEMERIS;
479     } else if (cmd == "delete_auxiliary_data_almanac") {
480         flags = GnssAuxiliaryDataType::GNSS_AUXILIARY_DATA_ALMANAC;
481     } else if (cmd == "delete_auxiliary_data_position") {
482         flags = GnssAuxiliaryDataType::GNSS_AUXILIARY_DATA_POSITION;
483     } else if (cmd == "delete_auxiliary_data_time") {
484         flags = GnssAuxiliaryDataType::GNSS_AUXILIARY_DATA_TIME;
485     } else if (cmd == "delete_auxiliary_data_iono") {
486         flags = GnssAuxiliaryDataType::GNSS_AUXILIARY_DATA_IONO;
487     } else if (cmd == "delete_auxiliary_data_utc") {
488         flags = GnssAuxiliaryDataType::GNSS_AUXILIARY_DATA_UTC;
489     } else if (cmd == "delete_auxiliary_data_health") {
490         flags = GnssAuxiliaryDataType::GNSS_AUXILIARY_DATA_HEALTH;
491     } else if (cmd == "delete_auxiliary_data_svdir") {
492         flags = GnssAuxiliaryDataType::GNSS_AUXILIARY_DATA_SVDIR;
493     } else if (cmd == "delete_auxiliary_data_svsteer") {
494         flags = GnssAuxiliaryDataType::GNSS_AUXILIARY_DATA_SVSTEER;
495     } else if (cmd == "delete_auxiliary_data_sadata") {
496         flags = GnssAuxiliaryDataType::GNSS_AUXILIARY_DATA_SADATA;
497     } else if (cmd == "delete_auxiliary_data_rti") {
498         flags = GnssAuxiliaryDataType::GNSS_AUXILIARY_DATA_RTI;
499     } else if (cmd == "delete_auxiliary_data_celldb_info") {
500         flags = GnssAuxiliaryDataType::GNSS_AUXILIARY_DATA_CELLDB_INFO;
501     } else if (cmd == "delete_auxiliary_data_all") {
502         flags = GnssAuxiliaryDataType::GNSS_AUXILIARY_DATA_ALL;
503     } else {
504         LBSLOGE(GNSS, "unknow command %{public}s", cmd.c_str());
505         return false;
506     }
507     return true;
508 }
509 
SendCommand(std::unique_ptr<LocationCommand> & commands)510 LocationErrCode GnssAbility::SendCommand(std::unique_ptr<LocationCommand>& commands)
511 {
512     sptr<IGnssInterface> gnssInterface = IGnssInterface::Get();
513     if (gnssInterface == nullptr) {
514         LBSLOGE(GNSS, "gnssInterface is nullptr");
515         return ERRCODE_SERVICE_UNAVAILABLE;
516     }
517     GnssAuxiliaryDataType flags;
518     bool result = GetCommandFlags(commands, flags);
519     LBSLOGE(GNSS, "GetCommandFlags,flags = %{public}d", flags);
520     if (result) {
521         gnssInterface->DeleteAuxiliaryData(flags);
522     }
523     return ERRCODE_SUCCESS;
524 }
525 
SetPositionMode()526 LocationErrCode GnssAbility::SetPositionMode()
527 {
528     sptr<IGnssInterface> gnssInterface = IGnssInterface::Get();
529     if (gnssInterface == nullptr) {
530         LBSLOGE(GNSS, "gnssInterface is nullptr");
531         return ERRCODE_SERVICE_UNAVAILABLE;
532     }
533     GnssConfigPara para;
534     int suplMode = LocationConfigManager::GetInstance()->GetSuplMode();
535     if (suplMode == MODE_STANDALONE) {
536         para.gnssBasic.gnssMode = GnssWorkingMode::GNSS_WORKING_MODE_STANDALONE;
537     } else if (suplMode == MODE_MS_BASED) {
538         para.gnssBasic.gnssMode = GnssWorkingMode::GNSS_WORKING_MODE_MS_BASED;
539     } else if (suplMode == MODE_MS_ASSISTED) {
540         para.gnssBasic.gnssMode = GnssWorkingMode::GNSS_WORKING_MODE_MS_ASSISTED;
541     } else {
542         LBSLOGE(GNSS, "unknow mode");
543         return ERRCODE_SUCCESS;
544     }
545     int ret = gnssInterface->SetGnssConfigPara(para);
546     if (ret != ERRCODE_SUCCESS) {
547         LBSLOGE(GNSS, "SetGnssConfigPara failed , ret =%{public}d", ret);
548     }
549     return ERRCODE_SUCCESS;
550 }
551 
MonitorNetwork()552 void GnssAbility::MonitorNetwork()
553 {
554 #ifdef NET_MANAGER_ENABLE
555     NetManagerStandard::NetSpecifier netSpecifier;
556     NetManagerStandard::NetAllCapabilities netAllCapabilities;
557     netAllCapabilities.netCaps_.insert(NetManagerStandard::NetCap::NET_CAPABILITY_INTERNET);
558     netSpecifier.netCapabilities_ = netAllCapabilities;
559     sptr<NetManagerStandard::NetSpecifier> specifier(
560         new (std::nothrow) NetManagerStandard::NetSpecifier(netSpecifier));
561     if (specifier == nullptr) {
562         LBSLOGE(GNSS, "new operator error.specifier is nullptr");
563         return;
564     }
565     netWorkObserver_ = sptr<NetConnObserver>((new (std::nothrow) NetConnObserver()));
566     if (netWorkObserver_ == nullptr) {
567         LBSLOGE(GNSS, "new operator error.netWorkObserver_ is nullptr");
568         return;
569     }
570     int ret = NetManagerStandard::NetConnClient::GetInstance().RegisterNetConnCallback(specifier, netWorkObserver_, 0);
571     LBSLOGI(GNSS, "RegisterNetConnCallback retcode= %{public}d", ret);
572 #endif
573     return;
574 }
575 
InjectTime()576 LocationErrCode GnssAbility::InjectTime()
577 {
578 #ifdef TIME_SERVICE_ENABLE
579     LBSLOGD(GNSS, "InjectTime");
580     int64_t currentTime = ntpTime_.GetCurrentTime();
581     if (currentTime == INVALID_TIME) {
582         return ERRCODE_SERVICE_UNAVAILABLE;
583     }
584     auto elapsedTime = MiscServices::TimeServiceClient::GetInstance()->GetBootTimeMs();
585     if (elapsedTime < 0) {
586         LBSLOGE(GNSS, "get boot time failed");
587         return ERRCODE_SERVICE_UNAVAILABLE;
588     }
589     auto ntpTimeCheck = NtpTimeCheck::GetInstance();
590     if (ntpTimeCheck != nullptr && ntpTimeCheck->CheckNtpTime(currentTime, elapsedTime)) {
591         GnssRefInfo refInfo;
592         refInfo.type = GnssRefInfoType::GNSS_REF_INFO_TIME;
593         refInfo.time.time = currentTime;
594         refInfo.time.elapsedRealtime = elapsedTime;
595         refInfo.time.uncertaintyOfTime = ntpTimeCheck->GetUncertainty();
596         auto gnssInterface = IGnssInterface::Get();
597         if (gnssInterface != nullptr) {
598             LBSLOGI(GNSS, "inject ntp time: %{public}s unert %{public}d",
599                 std::to_string(currentTime).c_str(), ntpTimeCheck->GetUncertainty());
600             gnssInterface->SetGnssReferenceInfo(refInfo);
601         }
602     }
603 #endif
604     return ERRCODE_SUCCESS;
605 }
606 
UpdateNtpTime(int64_t ntpTime,int64_t elapsedTime)607 LocationErrCode GnssAbility::UpdateNtpTime(int64_t ntpTime, int64_t elapsedTime)
608 {
609 #ifdef TIME_SERVICE_ENABLE
610     if (ntpTime <= 0 || elapsedTime <= 0) {
611         LBSLOGE(GNSS, "failed to UpdateNtpTime");
612         return ERRCODE_SERVICE_UNAVAILABLE;
613     }
614     ntpTime_.SetCurrentTime(ntpTime, elapsedTime);
615 #endif
616     return ERRCODE_SUCCESS;
617 }
618 
SendNetworkLocation(const std::unique_ptr<Location> & location)619 LocationErrCode GnssAbility::SendNetworkLocation(const std::unique_ptr<Location>& location)
620 {
621     if (location == nullptr) {
622         LBSLOGE(GNSS, "location is nullptr");
623         return ERRCODE_SERVICE_UNAVAILABLE;
624     }
625     nlpLocation_ = *location;
626     return InjectLocation();
627 }
628 
InjectLocation()629 LocationErrCode GnssAbility::InjectLocation()
630 {
631     sptr<IGnssInterface> gnssInterface = IGnssInterface::Get();
632     if (gnssInterface == nullptr) {
633         LBSLOGE(GNSS, "gnssInterface or location is nullptr");
634         return ERRCODE_SERVICE_UNAVAILABLE;
635     }
636     if (nlpLocation_.GetAccuracy() < 1e-9 || nlpLocation_.GetTimeStamp() == 0) {
637         LBSLOGW(GNSS, "nlp locaton acc or timesatmp is invalid");
638         return LOCATION_ERRCODE_INVALID_PARAM;
639     }
640     int64_t diff = CommonUtils::GetCurrentTimeStamp() - nlpLocation_.GetTimeStamp() / MILLI_PER_SEC;
641     if (diff > NLP_FIX_VALID_TIME) {
642         LBSLOGI(GNSS, "nlp locaton is invalid");
643         return ERRCODE_SERVICE_UNAVAILABLE;
644     }
645     GnssRefInfo refInfo;
646     refInfo.type = GnssRefInfoType::GNSS_REF_INFO_LOCATION;
647     refInfo.gnssLocation.fieldValidity =
648         GnssLocationValidity::GNSS_LOCATION_LAT_VALID |
649         GnssLocationValidity::GNSS_LOCATION_LONG_VALID |
650         GnssLocationValidity::GNSS_LOCATION_HORIZONTAL_ACCURACY_VALID;
651     refInfo.gnssLocation.latitude = nlpLocation_.GetLatitude();
652     refInfo.gnssLocation.longitude = nlpLocation_.GetLongitude();
653     refInfo.gnssLocation.altitude = nlpLocation_.GetAltitude();
654     refInfo.gnssLocation.speed = nlpLocation_.GetSpeed();
655     refInfo.gnssLocation.bearing = nlpLocation_.GetDirection();
656     refInfo.gnssLocation.horizontalAccuracy = nlpLocation_.GetAccuracy();
657     refInfo.gnssLocation.verticalAccuracy = nlpLocation_.GetAltitudeAccuracy();
658     refInfo.gnssLocation.speedAccuracy = nlpLocation_.GetSpeedAccuracy();
659     refInfo.gnssLocation.bearingAccuracy = nlpLocation_.GetDirectionAccuracy();
660     refInfo.gnssLocation.timeForFix = nlpLocation_.GetTimeStamp();
661     refInfo.gnssLocation.timeSinceBoot = nlpLocation_.GetTimeSinceBoot();
662     refInfo.gnssLocation.timeUncertainty = nlpLocation_.GetUncertaintyOfTimeSinceBoot();
663     gnssInterface->SetGnssReferenceInfo(refInfo);
664     return ERRCODE_SUCCESS;
665 }
666 
IsSupportGeofence()667 bool GnssAbility::IsSupportGeofence()
668 {
669     return OHOS::system::GetBoolParameter(SYSPARAM_GEOFENCE_SUPPORT, true);
670 }
671 
AddFence(std::shared_ptr<GeofenceRequest> & request)672 LocationErrCode GnssAbility::AddFence(std::shared_ptr<GeofenceRequest>& request)
673 {
674     if (!IsSupportGeofence()) {
675         LBSLOGI(GNSS, "Is Not Support Geofence");
676         return LOCATION_ERRCODE_NOT_SUPPORTED;
677     }
678 
679     int fenceId = GenerateFenceId();
680     request->SetFenceId(fenceId);
681 #ifdef HDF_DRIVERS_INTERFACE_GEOFENCE_ENABLE
682     sptr<IGeofenceInterface> geofenceInterface = IGeofenceInterface::Get();
683     if (geofenceInterface == nullptr) {
684         LBSLOGE(GNSS, "geofenceInterface is nullptr");
685         return ERRCODE_SERVICE_UNAVAILABLE;
686     }
687     auto geofence = request->GetGeofence();
688     GeofenceInfo fenceInfo;
689     fenceInfo.fenceIndex = fenceId;
690     fenceInfo.latitude = geofence.latitude;
691     fenceInfo.longitude = geofence.longitude;
692     fenceInfo.radius = geofence.radius;
693     int monitorEvent = static_cast<int>(GeofenceTransitionEvent::GEOFENCE_TRANSITION_EVENT_ENTER) |
694         static_cast<int>(GeofenceTransitionEvent::GEOFENCE_TRANSITION_EVENT_EXIT);
695     int32_t ret = geofenceInterface->AddGnssGeofence(fenceInfo, monitorEvent);
696     LBSLOGD(GNSS, "Successfully AddFence!, %{public}d", ret);
697 #endif
698     if (ExecuteFenceProcess(GnssInterfaceCode::ADD_FENCE_INFO, request)) {
699         return ERRCODE_SUCCESS;
700     }
701     return LOCATION_ERRCODE_NOT_SUPPORTED;
702 }
703 
RemoveFence(std::shared_ptr<GeofenceRequest> & request)704 LocationErrCode GnssAbility::RemoveFence(std::shared_ptr<GeofenceRequest>& request)
705 {
706     if (request == nullptr) {
707         LBSLOGE(GNSS, "request is nullptr");
708         return ERRCODE_GEOFENCE_FAIL;
709     }
710 #ifdef HDF_DRIVERS_INTERFACE_GEOFENCE_ENABLE
711     sptr<IGeofenceInterface> geofenceInterface = IGeofenceInterface::Get();
712     if (geofenceInterface == nullptr) {
713         LBSLOGE(GNSS, "geofenceInterface is nullptr");
714         return ERRCODE_SERVICE_UNAVAILABLE;
715     }
716     int32_t ret = geofenceInterface->DeleteGnssGeofence(request->GetFenceId());
717     LBSLOGD(GNSS, "Successfully RemoveFence!, %{public}d", ret);
718 #endif
719     if (ExecuteFenceProcess(GnssInterfaceCode::REMOVE_FENCE_INFO, request)) {
720         return ERRCODE_SUCCESS;
721     }
722     return LOCATION_ERRCODE_NOT_SUPPORTED;
723 }
724 
GenerateFenceId()725 int32_t GnssAbility::GenerateFenceId()
726 {
727     LBSLOGD(GNSS, "GenerateFenceId");
728     std::lock_guard<ffrt::mutex> lock(fenceIdMutex_);
729     if (fenceId_ > FENCE_MAX_ID) {
730         fenceId_ = 0;
731     }
732     fenceId_++;
733     std::int32_t id = fenceId_;
734     return id;
735 }
736 
AddGnssGeofence(std::shared_ptr<GeofenceRequest> & request)737 LocationErrCode GnssAbility::AddGnssGeofence(std::shared_ptr<GeofenceRequest>& request)
738 {
739     if (!IsSupportGeofence()) {
740         LBSLOGI(GNSS, "Is Not Support Geofence");
741         return LOCATION_ERRCODE_NOT_SUPPORTED;
742     }
743 
744     int fenceId = GenerateFenceId();
745     request->SetFenceId(fenceId);
746     {
747         std::unique_lock<ffrt::mutex> lock(gnssGeofenceRequestMapMutex_);
748         if (gnssGeofenceRequestMap_.size() >= MAX_GNSS_GEOFENCE_REQUEST_NUM) {
749             LBSLOGE(GNSS, "RegisterGnssGeofenceCallback num max");
750             return ERRCODE_GEOFENCE_EXCEED_MAXIMUM;
751         }
752     }
753 #ifdef HDF_DRIVERS_INTERFACE_GEOFENCE_ENABLE
754     sptr<IGeofenceInterface> geofenceInterface = IGeofenceInterface::Get();
755     if (geofenceInterface == nullptr) {
756         LBSLOGE(GNSS, "geofenceInterface is nullptr");
757         return ERRCODE_SERVICE_UNAVAILABLE;
758     }
759     auto geofence = request->GetGeofence();
760     GeofenceInfo fenceInfo;
761     fenceInfo.fenceIndex = fenceId;
762     fenceInfo.latitude = geofence.latitude;
763     fenceInfo.longitude = geofence.longitude;
764     fenceInfo.radius = geofence.radius;
765     auto transitionList = request->GetGeofenceTransitionEventList();
766     uint32_t monitorEvent = 0;
767     for (size_t i = 0; i < transitionList.size(); i++) {
768         GeofenceTransitionEvent status = transitionList[i];
769         monitorEvent |= static_cast<uint32_t>(status);
770     }
771     int32_t ret = geofenceInterface->AddGnssGeofence(fenceInfo, monitorEvent);
772     LBSLOGI(GNSS, "Successfully AddGnssGeofence! ret:%{public}d,fenceId:%{public}s",
773         ret, std::to_string(fenceId).c_str());
774 #endif
775     RegisterGnssGeofenceCallback(request, request->GetGeofenceTransitionCallback());
776     if (ExecuteFenceProcess(GnssInterfaceCode::ADD_GNSS_GEOFENCE, request)) {
777         return ERRCODE_SUCCESS;
778     }
779     return LOCATION_ERRCODE_NOT_SUPPORTED;
780 }
781 
RegisterGnssGeofenceCallback(std::shared_ptr<GeofenceRequest> & request,const sptr<IRemoteObject> & callback)782 bool GnssAbility::RegisterGnssGeofenceCallback(std::shared_ptr<GeofenceRequest> &request,
783     const sptr<IRemoteObject>& callback)
784 {
785     if (request == nullptr) {
786         LBSLOGE(GNSS, "register an invalid request");
787         return false;
788     }
789     if (callback == nullptr) {
790         LBSLOGE(GNSS, "register an invalid callback");
791         return false;
792     }
793     auto geofence = request->GetGeofence();
794     request->SetRequestExpirationTime(CommonUtils::GetSinceBootTime() + geofence.expiration * MILL_TO_NANOS);
795     std::unique_lock<ffrt::mutex> lock(gnssGeofenceRequestMapMutex_);
796     sptr<IRemoteObject::DeathRecipient> death(new (std::nothrow) GnssGeofenceCallbackDeathRecipient());
797     callback->AddDeathRecipient(death);
798     gnssGeofenceRequestMap_.insert(std::make_pair(request, std::make_pair(callback, death)));
799     LBSLOGI(GNSS, "After RegisterGnssGeofenceCallback size %{public}zu",
800         gnssGeofenceRequestMap_.size());
801     return true;
802 }
803 
RemoveGnssGeofence(std::shared_ptr<GeofenceRequest> & request)804 LocationErrCode GnssAbility::RemoveGnssGeofence(std::shared_ptr<GeofenceRequest>& request)
805 {
806     if (request == nullptr) {
807         LBSLOGE(GNSS, "request is nullptr");
808         return ERRCODE_SERVICE_UNAVAILABLE;
809     }
810     if (!CheckBundleNameInGnssGeofenceRequestMap(request->GetBundleName(), request->GetFenceId())) {
811         LBSLOGE(GNSS, "bundleName is not registered");
812         return ERRCODE_GEOFENCE_INCORRECT_ID;
813     }
814 #ifdef HDF_DRIVERS_INTERFACE_GEOFENCE_ENABLE
815     sptr<IGeofenceInterface> geofenceInterface = IGeofenceInterface::Get();
816     if (geofenceInterface == nullptr) {
817         LBSLOGE(GNSS, "geofenceInterface is nullptr");
818         return ERRCODE_SERVICE_UNAVAILABLE;
819     }
820     int32_t ret = geofenceInterface->DeleteGnssGeofence(request->GetFenceId());
821     LBSLOGI(GNSS, "Successfully DeleteGnssGeofence! ret:%{public}d,fenceId:%{public}s",
822         ret, std::to_string(request->GetFenceId()).c_str());
823 #endif
824 
825     if (ExecuteFenceProcess(GnssInterfaceCode::REMOVE_GNSS_GEOFENCE, request)) {
826         return ERRCODE_SUCCESS;
827     }
828     return LOCATION_ERRCODE_NOT_SUPPORTED;
829 }
830 
UnregisterGnssGeofenceCallback(int fenceId)831 bool GnssAbility::UnregisterGnssGeofenceCallback(int fenceId)
832 {
833     for (auto iter = gnssGeofenceRequestMap_.begin(); iter != gnssGeofenceRequestMap_.end();) {
834         auto requestInMap = iter->first;
835         auto fenceIdInMap = requestInMap->GetFenceId();
836         auto callbackPair = iter->second;
837         auto callback = callbackPair.first;
838         if (fenceId == fenceIdInMap) {
839             if (callback != nullptr) {
840                 callback->RemoveDeathRecipient(callbackPair.second);
841             }
842             iter = gnssGeofenceRequestMap_.erase(iter);
843             break;
844         } else {
845             iter++;
846         }
847     }
848     LBSLOGI(GNSS, "After UnregisterGnssGeofenceCallback size:%{public}s",
849         std::to_string(gnssGeofenceRequestMap_.size()).c_str());
850     return true;
851 }
852 
ReportFailedOperationResult(std::shared_ptr<GeofenceRequest> & request,GnssGeofenceOperateType type,LocationErrCode code)853 void GnssAbility::ReportFailedOperationResult(std::shared_ptr<GeofenceRequest> &request, GnssGeofenceOperateType type,
854     LocationErrCode code)
855 {
856     sptr<IGnssGeofenceCallback> gnssGeofenceCallback =
857                 iface_cast<IGnssGeofenceCallback>(request->GetGeofenceTransitionCallback());
858     if (gnssGeofenceCallback == nullptr) {
859         LBSLOGE(GNSS, "gnssGeofenceCallback is nullptr");
860         return;
861     }
862     gnssGeofenceCallback->OnReportOperationResult(DEFAULT_FENCE_ID,
863         static_cast<int>(type), static_cast<int>(DealOperationResult(code)));
864 }
865 
CheckBundleNameInGnssGeofenceRequestMap(const std::string & bundleName,int fenceId)866 bool GnssAbility::CheckBundleNameInGnssGeofenceRequestMap(const std::string& bundleName, int fenceId)
867 {
868     std::unique_lock<ffrt::mutex> lock(gnssGeofenceRequestMapMutex_);
869     for (auto iter = gnssGeofenceRequestMap_.begin();
870         iter != gnssGeofenceRequestMap_.end(); iter++) {
871         auto requestInMap = iter->first;
872         auto packageName = requestInMap->GetBundleName();
873         auto fenceIdInMap = requestInMap->GetFenceId();
874         if (packageName.compare(bundleName) == 0 && fenceId == fenceIdInMap) {
875             return true;
876         }
877     }
878     return false;
879 }
880 
RemoveGnssGeofenceRequestByCallback(sptr<IRemoteObject> callbackObj)881 bool GnssAbility::RemoveGnssGeofenceRequestByCallback(sptr<IRemoteObject> callbackObj)
882 {
883     if (callbackObj == nullptr) {
884         return false;
885     }
886     std::unique_lock<ffrt::mutex> lock(gnssGeofenceRequestMapMutex_);
887     for (auto iter = gnssGeofenceRequestMap_.begin(); iter != gnssGeofenceRequestMap_.end();) {
888         auto callbackPair = iter->second;
889         auto callback = callbackPair.first;
890         if (callback == callbackObj) {
891             callback->RemoveDeathRecipient(callbackPair.second);
892             auto requestInMap = iter->first;
893             requestInMap->SetAppAliveStatus(false);
894             break;
895         } else {
896             iter++;
897         }
898     }
899     LBSLOGD(GNSS, "After RemoveGnssGeofenceRequestByCallback size:%{public}s",
900         std::to_string(gnssGeofenceRequestMap_.size()).c_str());
901     return true;
902 }
903 
904 #ifdef HDF_DRIVERS_INTERFACE_GEOFENCE_ENABLE
ReportGeofenceOperationResult(int fenceId,GeofenceOperateType type,GeofenceOperateResult result)905 void GnssAbility::ReportGeofenceOperationResult(
906     int fenceId, GeofenceOperateType type, GeofenceOperateResult result)
907 {
908     std::unique_lock<ffrt::mutex> lock(gnssGeofenceRequestMapMutex_);
909     auto geofenceRequest = GetGeofenceRequestByFenceId(fenceId);
910     if (geofenceRequest == nullptr) {
911         LBSLOGE(GNSS, "request is nullptr");
912         return;
913     }
914     auto callback = geofenceRequest->GetGeofenceTransitionCallback();
915     if (callback == nullptr) {
916         LBSLOGE(GNSS, "callback is nullptr");
917         return;
918     }
919     auto appAliveStatus = geofenceRequest->GetAppAliveStatus();
920     if (!appAliveStatus) {
921         LBSLOGE(GNSS, "app alive status is false");
922         return;
923     }
924     sptr<IGnssGeofenceCallback> gnssGeofenceCallback = iface_cast<IGnssGeofenceCallback>(callback);
925     gnssGeofenceCallback->OnReportOperationResult(
926         fenceId, static_cast<int>(type), static_cast<int>(result));
927     if (type == GeofenceOperateType::TYPE_DELETE) {
928         UnregisterGnssGeofenceCallback(fenceId);
929     }
930 }
931 #endif
932 
933 #ifdef HDF_DRIVERS_INTERFACE_GEOFENCE_ENABLE
ReportGeofenceEvent(int fenceIndex,GeofenceEvent event)934 void GnssAbility::ReportGeofenceEvent(int fenceIndex, GeofenceEvent event)
935 {
936     std::unique_lock<ffrt::mutex> lock(gnssGeofenceRequestMapMutex_);
937     auto request = GetGeofenceRequestByFenceId(fenceIndex);
938     if (request == nullptr) {
939         LBSLOGE(GNSS, "request is nullptr");
940         return;
941     }
942     if (CommonUtils::GetSinceBootTime() > request->GetRequestExpirationTime()) {
943         LBSLOGE(GNSS, "request is expiration");
944         if (gnssHandler_ != nullptr) {
945             AppExecFwk::InnerEvent::Pointer event = AppExecFwk::InnerEvent::Get(
946                 static_cast<uint32_t>(GnssAbilityInterfaceCode::REMOVE_GEOFENCE), request);
947             gnssHandler_->SendEvent(event);
948         }
949         return;
950     }
951     auto callback = request->GetGeofenceTransitionCallback();
952     if (callback == nullptr) {
953         LBSLOGE(GNSS, "callback is nullptr");
954         return;
955     }
956     sptr<IGnssGeofenceCallback> gnssGeofenceCallback = iface_cast<IGnssGeofenceCallback>(callback);
957     auto transitionStatusList = request->GetGeofenceTransitionEventList();
958     auto appAliveStatus = request->GetAppAliveStatus();
959     for (size_t i = 0; i < transitionStatusList.size(); i++) {
960         if (transitionStatusList[i] !=
961             static_cast<GeofenceTransitionEvent>(event)) {
962             continue;
963         }
964         if (appAliveStatus) {
965             GeofenceTransition geofenceTransition;
966             geofenceTransition.fenceId = fenceIndex;
967             geofenceTransition.event = transitionStatusList[i];
968             gnssGeofenceCallback->OnTransitionStatusChange(geofenceTransition);
969         }
970 #ifdef NOTIFICATION_ENABLE
971         auto notificationRequestList = request->GetNotificationRequestList();
972         if (transitionStatusList.size() == notificationRequestList.size()) {
973             auto notificationRequest = notificationRequestList[i];
974             notificationRequest->SetCreatorUid(request->GetUid());
975             Notification::NotificationHelper::PublishNotification(*notificationRequest);
976         } else {
977             LBSLOGE(GNSS, "transitionStatusList size does not equals to notificationRequestList size");
978         }
979 #endif
980     }
981 }
982 #endif
983 
GetGeofenceRequestByFenceId(int fenceId)984 std::shared_ptr<GeofenceRequest> GnssAbility::GetGeofenceRequestByFenceId(int fenceId)
985 {
986     for (auto iter = gnssGeofenceRequestMap_.begin(); iter != gnssGeofenceRequestMap_.end(); iter++) {
987         auto request = iter->first;
988         if (request->GetFenceId() == fenceId) {
989             return request;
990         }
991     }
992     LBSLOGE(GNSS, "can not get geofence request by fenceId, fenceId:%{public}d",
993         fenceId);
994     return nullptr;
995 }
996 
ExecuteFenceProcess(GnssInterfaceCode code,std::shared_ptr<GeofenceRequest> & request)997 bool GnssAbility::ExecuteFenceProcess(
998     GnssInterfaceCode code, std::shared_ptr<GeofenceRequest>& request)
999 {
1000     FenceStruct fenceStruct;
1001     fenceStruct.request = request;
1002     fenceStruct.requestCode = static_cast<int>(code);
1003     fenceStruct.retCode = true;
1004 #ifdef HDF_DRIVERS_INTERFACE_GEOFENCE_ENABLE
1005     std::unique_lock<ffrt::mutex> lock(hdiMutex_, std::defer_lock);
1006     lock.lock();
1007     fenceStruct.callback = geofenceCallback_;
1008     lock.unlock();
1009 #endif
1010     LocationErrCode errCode = HookUtils::ExecuteHook(
1011         LocationProcessStage::FENCE_REQUEST_PROCESS, (void *)&fenceStruct, nullptr);
1012     if (errCode != ERRCODE_SUCCESS) {
1013         return false;
1014     }
1015     return fenceStruct.retCode;
1016 }
1017 
1018 #ifdef HDF_DRIVERS_INTERFACE_GEOFENCE_ENABLE
SetGeofenceCallback()1019 bool GnssAbility::SetGeofenceCallback()
1020 {
1021     if (LocationDataRdbManager::QuerySwitchState() != ENABLED) {
1022         LBSLOGE(GNSS, "QuerySwitchState is DISABLED");
1023         return false;
1024     }
1025     sptr<IGeofenceInterface> geofenceInterface = IGeofenceInterface::Get();
1026     if (geofenceInterface == nullptr) {
1027         LBSLOGE(GNSS, "geofenceInterface get failed");
1028         return false;
1029     }
1030     int32_t ret = geofenceInterface->SetGeofenceCallback(geofenceCallback_);
1031     LBSLOGD(GNSS, "set geofence callback, ret:%{public}d", ret);
1032     if (!ret) {
1033         return false;
1034     }
1035     return true;
1036 }
1037 #endif
1038 
ReportGnssSessionStatus(int status)1039 void GnssAbility::ReportGnssSessionStatus(int status)
1040 {
1041 }
1042 
ReportNmea(int64_t timestamp,const std::string & nmea)1043 void GnssAbility::ReportNmea(int64_t timestamp, const std::string &nmea)
1044 {
1045     std::unique_lock<ffrt::mutex> lock(nmeaMutex_);
1046     for (const auto& pair : nmeaCallbackMap_) {
1047         auto callback = pair.first;
1048         sptr<INmeaMessageCallback> nmeaCallback = iface_cast<INmeaMessageCallback>(callback);
1049         AppIdentity nmeaIdentity = pair.second;
1050         if (CommonUtils::IsAppBelongCurrentAccount(nmeaIdentity) &&
1051             !ProxyFreezeManager::GetInstance()->IsProxyPid(nmeaIdentity.GetPid())) {
1052             nmeaCallback->OnMessageChange(timestamp, nmea);
1053         }
1054     }
1055 }
1056 
ReportSv(const std::unique_ptr<SatelliteStatus> & sv)1057 void GnssAbility::ReportSv(const std::unique_ptr<SatelliteStatus> &sv)
1058 {
1059     std::unique_lock<ffrt::mutex> lock(gnssMutex_);
1060     for (const auto& pair : gnssStatusCallbackMap_) {
1061         auto callback = pair.first;
1062         sptr<IGnssStatusCallback> gnssStatusCallback = iface_cast<IGnssStatusCallback>(callback);
1063         AppIdentity gnssStatusIdentity = pair.second;
1064         if (CommonUtils::IsAppBelongCurrentAccount(gnssStatusIdentity) &&
1065             !ProxyFreezeManager::GetInstance()->IsProxyPid(gnssStatusIdentity.GetPid())) {
1066             gnssStatusCallback->OnStatusChange(sv);
1067         }
1068     }
1069 }
1070 
IsSupportGps()1071 bool GnssAbility::IsSupportGps()
1072 {
1073     return OHOS::system::GetBoolParameter(SYSPARAM_GPS_SUPPORT, true);
1074 }
1075 
EnableGnss()1076 bool GnssAbility::EnableGnss()
1077 {
1078     if (!IsSupportGps()) {
1079         LBSLOGI(GNSS, "Is Not Support Gps");
1080         return false;
1081     }
1082 
1083     if (GetRequestNum() == 0 && LocationDataRdbManager::QuerySwitchState() != ENABLED) {
1084         LBSLOGE(GNSS, "QuerySwitchState is DISABLED");
1085         return false;
1086     }
1087     sptr<IGnssInterface> gnssInterface = IGnssInterface::Get();
1088     if (gnssInterface == nullptr) {
1089         LBSLOGE(GNSS, "gnssInterface is nullptr");
1090         return false;
1091     }
1092     if (IsGnssEnabled()) {
1093         LBSLOGE(GNSS, "gnss has been enabled");
1094         return false;
1095     }
1096     std::unique_lock<ffrt::mutex> lock(hdiMutex_, std::defer_lock);
1097     lock.lock();
1098     if (gnssCallback_ == nullptr) {
1099         LBSLOGE(GNSS, "gnssCallback_ is nullptr");
1100         lock.unlock();
1101         return false;
1102     }
1103     int32_t ret = gnssInterface->EnableGnss(gnssCallback_);
1104     lock.unlock();
1105     LBSLOGD(GNSS, "Successfully enable_gnss!, %{public}d", ret);
1106     if (ret == 0) {
1107         gnssWorkingStatus_ = GNSS_WORKING_STATUS_ENGINE_ON;
1108     } else {
1109         gnssWorkingStatus_ = GNSS_WORKING_STATUS_NONE;
1110         WriteLocationInnerEvent(HDI_EVENT, {"errCode", std::to_string(ret),
1111             "hdiName", "EnableGnss", "hdiType", "gnss"});
1112     }
1113     return true;
1114 }
1115 
DisableGnss()1116 void GnssAbility::DisableGnss()
1117 {
1118     sptr<IGnssInterface> gnssInterface = IGnssInterface::Get();
1119     if (gnssInterface == nullptr) {
1120         LBSLOGE(GNSS, "gnssInterface is nullptr");
1121         return;
1122     }
1123     if (!IsGnssEnabled()) {
1124         LBSLOGE(GNSS, "%{public}s gnss has been disabled", __func__);
1125         return;
1126     }
1127     int ret = gnssInterface->DisableGnss();
1128     if (ret == 0) {
1129         gnssWorkingStatus_ = GNSS_WORKING_STATUS_ENGINE_OFF;
1130     } else {
1131         WriteLocationInnerEvent(HDI_EVENT, {"errCode", std::to_string(ret),
1132             "hdiName", "DisableGnss", "hdiType", "gnss"});
1133     }
1134 }
1135 
IsGnssEnabled()1136 bool GnssAbility::IsGnssEnabled()
1137 {
1138     return (gnssWorkingStatus_ != GNSS_WORKING_STATUS_ENGINE_OFF &&
1139         gnssWorkingStatus_ != GNSS_WORKING_STATUS_NONE);
1140 }
1141 
RestGnssWorkStatus()1142 void GnssAbility::RestGnssWorkStatus()
1143 {
1144     std::unique_lock<ffrt::mutex> uniqueLock(statusMutex_);
1145     gnssWorkingStatus_ = GNSS_WORKING_STATUS_NONE;
1146 }
1147 
StartGnss()1148 void GnssAbility::StartGnss()
1149 {
1150     if (!IsSupportGps()) {
1151         LBSLOGI(GNSS, "Is Not Support Gps");
1152         return;
1153     }
1154 
1155     sptr<IGnssInterface> gnssInterface = IGnssInterface::Get();
1156     if (gnssInterface == nullptr) {
1157         LBSLOGE(GNSS, "gnssInterface is nullptr");
1158         return;
1159     }
1160     if (!IsGnssEnabled()) {
1161         LBSLOGE(GNSS, "%{public}s gnss has been disabled", __func__);
1162         return;
1163     }
1164     if (gnssWorkingStatus_ == GNSS_WORKING_STATUS_SESSION_BEGIN) {
1165         LBSLOGD(GNSS, "GNSS navigation started");
1166         return;
1167     }
1168     if (GetRequestNum() == 0) {
1169         return;
1170     }
1171     SetPositionMode();
1172     int ret = gnssInterface->StartGnss(GNSS_START_TYPE_NORMAL);
1173     if (ret == 0) {
1174         gnssWorkingStatus_ = GNSS_WORKING_STATUS_SESSION_BEGIN;
1175         WriteLocationInnerEvent(START_GNSS, {});
1176     } else {
1177         WriteLocationInnerEvent(HDI_EVENT, {"errCode", std::to_string(ret), "hdiName", "StartGnss", "hdiType", "gnss"});
1178     }
1179     LocationErrCode errCode =
1180         HookUtils::ExecuteHook(LocationProcessStage::START_GNSS_PROCESS, nullptr, nullptr);
1181     if (errCode != ERRCODE_SUCCESS) {
1182         LBSLOGE(GNSS, "%{public}s ExecuteHook failed err = %{public}d", __func__, (int)errCode);
1183     }
1184 }
1185 
StopGnss()1186 void GnssAbility::StopGnss()
1187 {
1188     sptr<IGnssInterface> gnssInterface = IGnssInterface::Get();
1189     if (gnssInterface == nullptr) {
1190         LBSLOGE(GNSS, "gnssInterface is nullptr");
1191         return;
1192     }
1193     if (!IsGnssEnabled()) {
1194         LBSLOGE(GNSS, "%{public}s gnss has been disabled", __func__);
1195         return;
1196     }
1197 
1198     int ret = gnssInterface->StopGnss(GNSS_START_TYPE_NORMAL);
1199     if (ret == 0) {
1200         gnssWorkingStatus_ = GNSS_WORKING_STATUS_SESSION_END;
1201         WriteLocationInnerEvent(STOP_GNSS, {});
1202     } else {
1203         WriteLocationInnerEvent(HDI_EVENT, {"errCode", std::to_string(ret), "hdiName", "StopGnss", "hdiType", "gnss"});
1204     }
1205     LocationErrCode errCode =
1206         HookUtils::ExecuteHook(LocationProcessStage::STOP_GNSS_PROCESS, nullptr, nullptr);
1207     if (errCode != ERRCODE_SUCCESS) {
1208         LBSLOGE(GNSS, "%{public}s ExecuteHook failed err = %{public}d", __func__, (int)errCode);
1209     }
1210 }
1211 
IsDeviceLoaded(const std::string & servName)1212 bool GnssAbility::IsDeviceLoaded(const std::string &servName)
1213 {
1214     auto devmgr = HDI::DeviceManager::V1_0::IDeviceManager::Get();
1215     if (devmgr == nullptr) {
1216         LBSLOGE(GNSS, "fail to get devmgr.");
1217         return false;
1218     }
1219     std::vector<OHOS::HDI::DeviceManager::V1_0::HdiDevHostInfo> deviceInfos;
1220     int ret = devmgr->ListAllDevice(deviceInfos);
1221     if (ret != HDF_SUCCESS) {
1222         LBSLOGE(GNSS, "get listAllDevice failed");
1223         return false;
1224     }
1225     auto itDevicesInfo = deviceInfos.begin();
1226     for (;itDevicesInfo != deviceInfos.end(); itDevicesInfo++) {
1227         if (itDevicesInfo->hostName == LOCATION_HOST_NAME) {
1228             break;
1229         }
1230     }
1231     if (itDevicesInfo == deviceInfos.end()) {
1232         LBSLOGE(GNSS, "The host is not found:%{public}s", LOCATION_HOST_NAME);
1233         return false;
1234     }
1235     auto itDevInfo = itDevicesInfo->devInfo.begin();
1236     for (;itDevInfo != itDevicesInfo->devInfo.end(); itDevInfo++) {
1237         if (itDevInfo->servName == servName) {
1238             break;
1239         }
1240     }
1241     if (itDevInfo == itDevicesInfo->devInfo.end()) {
1242         LBSLOGE(GNSS, "The devices is not found:%{public}s in host %{public}s", servName.c_str(), LOCATION_HOST_NAME);
1243         return false;
1244     }
1245     std::unique_lock<ffrt::mutex> lock(hdiMutex_, std::defer_lock);
1246     LBSLOGD(GNSS, "check host:%{public}s dev:%{public}s loaded",
1247         itDevicesInfo->hostName.c_str(), itDevInfo->servName.c_str());
1248     return true;
1249 }
1250 
ConnectGnssHdi()1251 bool GnssAbility::ConnectGnssHdi()
1252 {
1253     auto devmgr = HDI::DeviceManager::V1_0::IDeviceManager::Get();
1254     if (devmgr == nullptr) {
1255         LBSLOGE(GNSS, "fail to get devmgr.");
1256         return false;
1257     }
1258     if (!IsDeviceLoaded(GNSS_SERVICE_NAME)) {
1259         if (devmgr->LoadDevice(GNSS_SERVICE_NAME) != HDF_SUCCESS) {
1260             LBSLOGE(GNSS, "Load gnss service failed!");
1261             return false;
1262         }
1263     }
1264     sptr<IGnssInterface> gnssInterface = IGnssInterface::Get();
1265     if (gnssInterface == nullptr) {
1266         LBSLOGE(GNSS, "gnssInterface get failed");
1267         return false;
1268     }
1269     std::unique_lock<ffrt::mutex> lock(hdiMutex_, std::defer_lock);
1270     lock.lock();
1271     if (gnssCallback_ == nullptr) {
1272         gnssCallback_ = new (std::nothrow) GnssEventCallback();
1273     }
1274     lock.unlock();
1275     RegisterLocationHdiDeathRecipient();
1276     LBSLOGI(GNSS, "ConnectGnssHdi success");
1277     return true;
1278 }
1279 #ifdef HDF_DRIVERS_INTERFACE_AGNSS_ENABLE
ConnectAgnssHdi()1280 bool GnssAbility::ConnectAgnssHdi()
1281 {
1282     auto devmgr = HDI::DeviceManager::V1_0::IDeviceManager::Get();
1283     if (devmgr == nullptr) {
1284         LBSLOGE(GNSS, "fail to get devmgr.");
1285         return false;
1286     }
1287     if (!IsDeviceLoaded(AGNSS_SERVICE_NAME)) {
1288         if (devmgr->LoadDevice(AGNSS_SERVICE_NAME) != HDF_SUCCESS) {
1289             LBSLOGE(GNSS, "Load agnss service failed!");
1290             return false;
1291         }
1292     }
1293     sptr<IAGnssInterface> agnssInterface = IAGnssInterface::Get();
1294     if (agnssInterface == nullptr) {
1295         LBSLOGE(GNSS, "agnssInterface get failed");
1296         return false;
1297     }
1298     std::unique_lock<ffrt::mutex> lock(hdiMutex_);
1299     if (agnssCallback_ == nullptr) {
1300         agnssCallback_ = new (std::nothrow) AGnssEventCallback();
1301     }
1302     LBSLOGI(GNSS, "ConnectAgnssHdi success");
1303     return true;
1304 }
1305 #endif
1306 #ifdef HDF_DRIVERS_INTERFACE_GEOFENCE_ENABLE
ConnectGeofenceHdi()1307 bool GnssAbility::ConnectGeofenceHdi()
1308 {
1309     auto devmgr = HDI::DeviceManager::V1_0::IDeviceManager::Get();
1310     if (devmgr == nullptr) {
1311         LBSLOGE(GNSS, "fail to get devmgr.");
1312         return false;
1313     }
1314     if (!IsDeviceLoaded(GEOFENCE_SERVICE_NAME)) {
1315         if (devmgr->LoadDevice(GEOFENCE_SERVICE_NAME) != HDF_SUCCESS) {
1316             LBSLOGE(GNSS, "Load geofence service failed!");
1317             return false;
1318         }
1319     }
1320     std::unique_lock<ffrt::mutex> lock(hdiMutex_);
1321     if (geofenceCallback_ == nullptr) {
1322         geofenceCallback_ = sptr<GeofenceEventCallback>(new (std::nothrow) GeofenceEventCallback);
1323     }
1324     bool ret = SetGeofenceCallback();
1325     if (!ret) {
1326         LBSLOGE(GNSS, "ConnectGeofenceHdi fail");
1327         return false;
1328     }
1329     LBSLOGI(GNSS, "ConnectGeofenceHdi success");
1330     return true;
1331 }
1332 #endif
1333 
ConnectHdi()1334 bool GnssAbility::ConnectHdi()
1335 {
1336     if (!ConnectGnssHdi()) {
1337         return false;
1338     }
1339 #ifdef HDF_DRIVERS_INTERFACE_AGNSS_ENABLE
1340     if (!ConnectAgnssHdi()) {
1341         return false;
1342     }
1343 #endif
1344 #ifdef HDF_DRIVERS_INTERFACE_GEOFENCE_ENABLE
1345     if (!ConnectGeofenceHdi()) {
1346         return false;
1347     }
1348 #endif
1349     LBSLOGI(GNSS, "connect v2_0 hdi success.");
1350     return true;
1351 }
1352 
RemoveHdi()1353 bool GnssAbility::RemoveHdi()
1354 {
1355     std::unique_lock<ffrt::mutex> lock(hdiMutex_);
1356     auto devmgr = HDI::DeviceManager::V1_0::IDeviceManager::Get();
1357     if (devmgr == nullptr) {
1358         LBSLOGE(GNSS, "fail to get devmgr.");
1359         return false;
1360     }
1361     if (devmgr->UnloadDevice(GNSS_SERVICE_NAME) != 0) {
1362         LBSLOGE(GNSS, "Unload gnss service failed!");
1363         return false;
1364     }
1365     gnssCallback_ = nullptr;
1366 #ifdef HDF_DRIVERS_INTERFACE_AGNSS_ENABLE
1367     if (devmgr->UnloadDevice(AGNSS_SERVICE_NAME) != 0) {
1368         LBSLOGE(GNSS, "Unload agnss service failed!");
1369         return false;
1370     }
1371     agnssCallback_ = nullptr;
1372 #endif
1373 #ifdef HDF_DRIVERS_INTERFACE_GEOFENCE_ENABLE
1374     if (devmgr->UnloadDevice(GEOFENCE_SERVICE_NAME) != 0) {
1375         LBSLOGE(GNSS, "Unload geofence service failed!");
1376         return false;
1377     }
1378     geofenceCallback_ = nullptr;
1379 #endif
1380     LBSLOGI(GNSS, "RemoveHdi success.");
1381     return true;
1382 }
1383 
1384 #ifdef HDF_DRIVERS_INTERFACE_AGNSS_ENABLE
SetAgnssServer()1385 void GnssAbility::SetAgnssServer()
1386 {
1387     if (!IsGnssEnabled()) {
1388         LBSLOGE(GNSS, "%{public}s gnss has been disabled", __func__);
1389         return;
1390     }
1391     std::string addrName;
1392     bool result = LocationConfigManager::GetInstance()->GetAgnssServerAddr(addrName);
1393     if (!result || addrName.empty()) {
1394         LBSLOGE(GNSS, "get agnss server address failed!");
1395         return;
1396     }
1397     int port = LocationConfigManager::GetInstance()->GetAgnssServerPort();
1398     HookUtils::ExecuteHookWhenSetAgnssServer(addrName, port);
1399     sptr<IAGnssInterface> agnssInterface = IAGnssInterface::Get();
1400     if (agnssInterface == nullptr) {
1401         LBSLOGE(GNSS, "agnssInterface is nullptr");
1402         return;
1403     }
1404     AGnssServerInfo info;
1405     info.type = AGNSS_TYPE_SUPL;
1406     info.server = addrName;
1407     info.port = port;
1408     LBSLOGD(GNSS, "SetAgnssServer addrName: %{public}s port: %{public}d", addrName.c_str(), port);
1409     agnssInterface->SetAgnssServer(info);
1410 }
1411 
SetAgnssCallback()1412 void GnssAbility::SetAgnssCallback()
1413 {
1414     LBSLOGD(GNSS, "enter SetAgnssCallback");
1415     std::unique_lock<ffrt::mutex> lock(hdiMutex_);
1416     sptr<IAGnssInterface> agnssInterface = IAGnssInterface::Get();
1417     if (agnssInterface == nullptr || agnssCallback_ == nullptr) {
1418         LBSLOGE(GNSS, "agnssInterface or agnssCallback_ is nullptr");
1419         return;
1420     }
1421     if (!IsGnssEnabled()) {
1422         LBSLOGE(GNSS, "%{public}s gnss has been disabled", __func__);
1423         return;
1424     }
1425     agnssInterface->SetAgnssCallback(agnssCallback_);
1426 }
1427 
SetSetId(const SubscriberSetId & id)1428 void GnssAbility::SetSetId(const SubscriberSetId& id)
1429 {
1430     std::unique_ptr<SubscriberSetId> subscribeSetId = std::make_unique<SubscriberSetId>();
1431     subscribeSetId->type = id.type;
1432     subscribeSetId->id = id.id;
1433     if (gnssHandler_ != nullptr) {
1434         AppExecFwk::InnerEvent::Pointer event = AppExecFwk::InnerEvent::Get(
1435             static_cast<uint32_t>(GnssAbilityInterfaceCode::SET_SUBSCRIBER_SET_ID), subscribeSetId);
1436         gnssHandler_->SendEvent(event);
1437     }
1438 }
1439 
SetSetIdImpl(const SubscriberSetId & id)1440 void GnssAbility::SetSetIdImpl(const SubscriberSetId& id)
1441 {
1442     sptr<IAGnssInterface> agnssInterface = IAGnssInterface::Get();
1443     if (agnssInterface == nullptr) {
1444         LBSLOGE(GNSS, "agnssInterface is nullptr");
1445         return;
1446     }
1447     if (!IsGnssEnabled()) {
1448         LBSLOGE(GNSS, "%{public}s gnss has been disabled", __func__);
1449         return;
1450     }
1451     agnssInterface->SetSubscriberSetId(id);
1452 }
1453 
SetRefInfo(const AGnssRefInfo & refInfo)1454 void GnssAbility::SetRefInfo(const AGnssRefInfo& refInfo)
1455 {
1456     std::unique_ptr<AgnssRefInfoMessage> agnssRefInfoMessage = std::make_unique<AgnssRefInfoMessage>();
1457     if (gnssHandler_ != nullptr) {
1458         agnssRefInfoMessage->SetAgnssRefInfo(refInfo);
1459         AppExecFwk::InnerEvent::Pointer event = AppExecFwk::InnerEvent::Get(
1460             static_cast<uint32_t>(GnssAbilityInterfaceCode::SET_AGNSS_REF_INFO), agnssRefInfoMessage);
1461         gnssHandler_->SendEvent(event);
1462     }
1463 }
1464 
SetRefInfoImpl(const AGnssRefInfo & refInfo)1465 void GnssAbility::SetRefInfoImpl(const AGnssRefInfo &refInfo)
1466 {
1467     sptr<IAGnssInterface> agnssInterface = IAGnssInterface::Get();
1468     if (agnssInterface == nullptr) {
1469         LBSLOGE(GNSS, "agnssInterface is nullptr");
1470         return;
1471     }
1472     if (!IsGnssEnabled()) {
1473         LBSLOGE(GNSS, "%{public}s gnss has been disabled", __func__);
1474         return;
1475     }
1476     agnssInterface->SetAgnssRefInfo(refInfo);
1477 }
1478 
GetAgnssRefInfo()1479 AGnssRefInfo AgnssRefInfoMessage::GetAgnssRefInfo()
1480 {
1481     return agnssRefInfo_;
1482 }
1483 
SetAgnssRefInfo(const AGnssRefInfo & refInfo)1484 void AgnssRefInfoMessage::SetAgnssRefInfo(const AGnssRefInfo &refInfo)
1485 {
1486     agnssRefInfo_ = refInfo;
1487 }
1488 #endif
1489 
SaDumpInfo(std::string & result)1490 void GnssAbility::SaDumpInfo(std::string& result)
1491 {
1492     result += "Gnss Location enable status: true";
1493     result += "\n";
1494 }
1495 
Dump(int32_t fd,const std::vector<std::u16string> & args)1496 int32_t GnssAbility::Dump(int32_t fd, const std::vector<std::u16string>& args)
1497 {
1498     std::vector<std::string> vecArgs;
1499     std::transform(args.begin(), args.end(), std::back_inserter(vecArgs), [](const std::u16string &arg) {
1500         return Str16ToStr8(arg);
1501     });
1502 
1503     LocationDumper dumper;
1504     std::string result;
1505     dumper.GnssDump(SaDumpInfo, vecArgs, result);
1506     if (!SaveStringToFd(fd, result)) {
1507         LBSLOGE(GNSS, "Gnss save string to fd failed!");
1508         return ERR_OK;
1509     }
1510     return ERR_OK;
1511 }
1512 
EnableMock()1513 LocationErrCode GnssAbility::EnableMock()
1514 {
1515     if (!EnableLocationMock()) {
1516         return LOCATION_ERRCODE_NOT_SUPPORTED;
1517     }
1518     MockLocationStruct mockLocationStruct;
1519     mockLocationStruct.enableMock = true;
1520     HookUtils::ExecuteHook(LocationProcessStage::MOCK_LOCATION_PROCESS, (void *)&mockLocationStruct, nullptr);
1521     return ERRCODE_SUCCESS;
1522 }
1523 
DisableMock()1524 LocationErrCode GnssAbility::DisableMock()
1525 {
1526     if (!DisableLocationMock()) {
1527         return LOCATION_ERRCODE_NOT_SUPPORTED;
1528     }
1529     MockLocationStruct mockLocationStruct;
1530     mockLocationStruct.enableMock = false;
1531     HookUtils::ExecuteHook(LocationProcessStage::MOCK_LOCATION_PROCESS, (void *)&mockLocationStruct, nullptr);
1532     return ERRCODE_SUCCESS;
1533 }
1534 
SetMocked(const int timeInterval,const std::vector<std::shared_ptr<Location>> & location)1535 LocationErrCode GnssAbility::SetMocked(const int timeInterval,
1536     const std::vector<std::shared_ptr<Location>> &location)
1537 {
1538     if (!SetMockedLocations(timeInterval, location)) {
1539         return LOCATION_ERRCODE_NOT_SUPPORTED;
1540     }
1541     return ERRCODE_SUCCESS;
1542 }
1543 
QuerySupportCoordinateSystemType(std::vector<CoordinateSystemType> & coordinateSystemTypes)1544 LocationErrCode GnssAbility::QuerySupportCoordinateSystemType(
1545     std::vector<CoordinateSystemType>& coordinateSystemTypes)
1546 {
1547     std::vector<CoordinateSystemType> supportedTypes;
1548     supportedTypes.push_back(CoordinateSystemType::WGS84);
1549     FenceStruct fenceStruct;
1550     fenceStruct.requestCode =
1551         static_cast<int>(GnssInterfaceCode::GET_GEOFENCE_SUPPORT_COORDINATE_SYSTEM_TYPE);
1552     fenceStruct.coordinateSystemTypes = supportedTypes;
1553     HookUtils::ExecuteHook(
1554         LocationProcessStage::FENCE_REQUEST_PROCESS, (void *)&fenceStruct, nullptr);
1555     coordinateSystemTypes = fenceStruct.coordinateSystemTypes;
1556 
1557     return ERRCODE_SUCCESS;
1558 }
1559 
IsMockEnabled()1560 bool GnssAbility::IsMockEnabled()
1561 {
1562     return IsLocationMocked();
1563 }
1564 
IsMockProcessing()1565 bool GnssAbility::IsMockProcessing()
1566 {
1567     auto loc = GetLocationMock();
1568     return !loc.empty();
1569 }
1570 
ProcessReportLocationMock()1571 void GnssAbility::ProcessReportLocationMock()
1572 {
1573     std::vector<std::shared_ptr<Location>> mockLocationArray = GetLocationMock();
1574     if (mockLocationIndex_ < mockLocationArray.size()) {
1575         ReportMockedLocation(mockLocationArray[mockLocationIndex_++]);
1576         if (gnssHandler_ != nullptr) {
1577             gnssHandler_->SendHighPriorityEvent(
1578                 static_cast<uint32_t>(GnssAbilityInterfaceCode::EVENT_REPORT_MOCK_LOCATION),
1579                 0, GetTimeIntervalMock() * EVENT_INTERVAL_UNITE);
1580         }
1581     } else {
1582         ClearLocationMock();
1583         mockLocationIndex_ = 0;
1584     }
1585 }
1586 
SendReportMockLocationEvent()1587 void GnssAbility::SendReportMockLocationEvent()
1588 {
1589     if (gnssHandler_ != nullptr) {
1590         gnssHandler_->SendHighPriorityEvent(static_cast<uint32_t>(
1591             GnssAbilityInterfaceCode::EVENT_REPORT_MOCK_LOCATION), 0, 0);
1592     }
1593 }
1594 
ReportMockedLocation(const std::shared_ptr<Location> location)1595 int32_t GnssAbility::ReportMockedLocation(const std::shared_ptr<Location> location)
1596 {
1597     if ((IsLocationMocked() && !location->GetIsFromMock()) ||
1598         (!IsLocationMocked() && location->GetIsFromMock())) {
1599         LBSLOGE(GNSS, "location mock is enabled, do not report gnss location!");
1600         return ERR_OK;
1601     }
1602     location->SetTimeSinceBoot(CommonUtils::GetSinceBootTime());
1603     location->SetTimeStamp(CommonUtils::GetCurrentTimeStamp() * MICRO_PER_MILLI);
1604     location->SetLocationSourceType(LocationSourceType::GNSS_TYPE);
1605     ReportLocationInfo(GNSS_ABILITY, location);
1606 #ifdef FEATURE_PASSIVE_SUPPORT
1607     ReportLocationInfo(PASSIVE_ABILITY, location);
1608 #endif
1609     return ERR_OK;
1610 }
1611 
SendMessage(uint32_t code,MessageParcel & data,MessageParcel & reply)1612 void GnssAbility::SendMessage(uint32_t code, MessageParcel &data, MessageParcel &reply)
1613 {
1614     if (gnssHandler_ == nullptr) {
1615         reply.WriteInt32(ERRCODE_SERVICE_UNAVAILABLE);
1616         return;
1617     }
1618     switch (code) {
1619         case static_cast<uint32_t>(GnssInterfaceCode::SEND_LOCATION_REQUEST): {
1620             std::unique_ptr<WorkRecord> workrecord = WorkRecord::Unmarshalling(data);
1621             AppExecFwk::InnerEvent::Pointer event = AppExecFwk::InnerEvent::
1622                 Get(code, workrecord);
1623             SendEvent(event, reply);
1624             break;
1625         }
1626         case static_cast<uint32_t>(GnssInterfaceCode::SET_MOCKED_LOCATIONS): {
1627             if (!IsMockEnabled()) {
1628                 reply.WriteInt32(LOCATION_ERRCODE_NOT_SUPPORTED);
1629                 break;
1630             }
1631             int timeInterval = data.ReadInt32();
1632             int locationSize = data.ReadInt32();
1633             timeInterval = timeInterval < 0 ? 1 : timeInterval;
1634             locationSize = locationSize > INPUT_ARRAY_LEN_MAX ? INPUT_ARRAY_LEN_MAX :
1635                 locationSize;
1636             std::shared_ptr<std::vector<std::shared_ptr<Location>>> vcLoc =
1637                 std::make_shared<std::vector<std::shared_ptr<Location>>>();
1638             for (int i = 0; i < locationSize; i++) {
1639                 vcLoc->push_back(Location::UnmarshallingShared(data));
1640             }
1641             AppExecFwk::InnerEvent::Pointer event =
1642                 AppExecFwk::InnerEvent::Get(code, vcLoc, timeInterval);
1643             SendEvent(event, reply);
1644             break;
1645         }
1646         case static_cast<uint32_t>(GnssInterfaceCode::SEND_COMMANDS): {
1647             std::unique_ptr<LocationCommand> locationCommand = std::make_unique<LocationCommand>();
1648             locationCommand->scenario = data.ReadInt32();
1649             locationCommand->command = Str16ToStr8(data.ReadString16());
1650             AppExecFwk::InnerEvent::Pointer event = AppExecFwk::InnerEvent::Get(code, locationCommand);
1651             SendEvent(event, reply);
1652             break;
1653         }
1654         case static_cast<uint32_t>(GnssInterfaceCode::SET_ENABLE): {
1655             AppExecFwk::InnerEvent::Pointer event =
1656                 AppExecFwk::InnerEvent::Get(code, static_cast<int>(data.ReadBool()));
1657             SendEvent(event, reply);
1658             break;
1659         }
1660 #ifdef NOTIFICATION_ENABLE
1661         case static_cast<uint32_t>(GnssAbilityInterfaceCode::ADD_FENCE): {
1662             auto request = GeofenceRequest::UnmarshallingShared(data);
1663             AppExecFwk::InnerEvent::Pointer event = AppExecFwk::InnerEvent::Get(code, request);
1664             SendEvent(event, reply);
1665             break;
1666         }
1667         case static_cast<uint32_t>(GnssAbilityInterfaceCode::REMOVE_FENCE): {
1668             auto request = GeofenceRequest::UnmarshallingShared(data);
1669             AppExecFwk::InnerEvent::Pointer event = AppExecFwk::InnerEvent::Get(code, request);
1670             SendEvent(event, reply);
1671             break;
1672         }
1673         case static_cast<uint32_t>(GnssAbilityInterfaceCode::ADD_GEOFENCE): {
1674             auto request = GeofenceRequest::UnmarshallingShared(data);
1675             AppExecFwk::InnerEvent::Pointer event = AppExecFwk::InnerEvent::Get(code, request);
1676             SendEvent(event, reply);
1677             break;
1678         }
1679         case static_cast<uint32_t>(GnssAbilityInterfaceCode::REMOVE_GEOFENCE): {
1680             std::shared_ptr<GeofenceRequest> request = std::make_shared<GeofenceRequest>();
1681             request->SetFenceId(data.ReadInt32());
1682             request->SetBundleName(data.ReadString());
1683             AppExecFwk::InnerEvent::Pointer event = AppExecFwk::InnerEvent::Get(code, request);
1684             SendEvent(event, reply);
1685             break;
1686         }
1687 #endif
1688         case static_cast<uint32_t>(GnssInterfaceCode::SEND_NETWORK_LOCATION): {
1689             LBSLOGD(GNSS, "%{public}s: send network location", __func__);
1690             auto request = Location::UnmarshallingMakeUnique(data);
1691             AppExecFwk::InnerEvent::Pointer event = AppExecFwk::InnerEvent::Get(code, request);
1692             SendEvent(event, reply);
1693             break;
1694         }
1695         default:
1696             break;
1697     }
1698 }
1699 
SendEvent(AppExecFwk::InnerEvent::Pointer & event,MessageParcel & reply)1700 void GnssAbility::SendEvent(AppExecFwk::InnerEvent::Pointer& event, MessageParcel &reply)
1701 {
1702     if (gnssHandler_ == nullptr) {
1703         reply.WriteInt32(ERRCODE_SERVICE_UNAVAILABLE);
1704         return;
1705     }
1706     if (gnssHandler_->SendEvent(event)) {
1707         reply.WriteInt32(ERRCODE_SUCCESS);
1708     } else {
1709         reply.WriteInt32(ERRCODE_SERVICE_UNAVAILABLE);
1710     }
1711 }
1712 
RegisterLocationHdiDeathRecipient()1713 void GnssAbility::RegisterLocationHdiDeathRecipient()
1714 {
1715     sptr<IGnssInterface> gnssInterface = IGnssInterface::Get();
1716     if (gnssInterface == nullptr) {
1717         LBSLOGE(GNSS, "%{public}s: gnssInterface is nullptr", __func__);
1718         return;
1719     }
1720     sptr<IRemoteObject> obj = OHOS::HDI::hdi_objcast<IGnssInterface>(gnssInterface);
1721     if (obj == nullptr) {
1722         LBSLOGE(GNSS, "%{public}s: hdi obj is nullptr", __func__);
1723         return;
1724     }
1725     sptr<IRemoteObject::DeathRecipient> death(new (std::nothrow) LocationHdiDeathRecipient());
1726     obj->AddDeathRecipient(death);
1727 }
1728 
DealOperationResult(LocationErrCode code)1729 GnssGeofenceOperateResult GnssAbility::DealOperationResult(LocationErrCode code)
1730 {
1731     GnssGeofenceOperateResult result = GnssGeofenceOperateResult::GNSS_GEOFENCE_OPERATION_ERROR_UNKNOWN;
1732     switch (code) {
1733         case ERRCODE_GEOFENCE_EXCEED_MAXIMUM:
1734             result = GnssGeofenceOperateResult::GNSS_GEOFENCE_OPERATION_ERROR_TOO_MANY_GEOFENCES;
1735             break;
1736         case LOCATION_ERRCODE_NOT_SUPPORTED:
1737             result = GnssGeofenceOperateResult::GNSS_GEOFENCE_OPERATION_ERROR_NOT_SUPPORTED;
1738             break;
1739         case ERRCODE_SERVICE_UNAVAILABLE:
1740             result = GnssGeofenceOperateResult::GNSS_GEOFENCE_OPERATION_ERROR_UNKNOWN;
1741             break;
1742         case ERRCODE_GEOFENCE_INCORRECT_ID:
1743             result = GnssGeofenceOperateResult::GNSS_GEOFENCE_OPERATION_ERROR_GEOFENCE_ID_UNKNOWN;
1744             break;
1745         case ERRCODE_GEOFENCE_FAIL:
1746             result = GnssGeofenceOperateResult::GNSS_GEOFENCE_OPERATION_ERROR_OPERATE_FAILED;
1747             break;
1748         default:
1749             break;
1750     }
1751     return result;
1752 }
1753 
GnssHandler(const std::shared_ptr<AppExecFwk::EventRunner> & runner)1754 GnssHandler::GnssHandler(const std::shared_ptr<AppExecFwk::EventRunner>& runner) : EventHandler(runner)
1755 {
1756     InitGnssEventProcessMap();
1757 }
1758 
InitGnssEventProcessMap()1759 void GnssHandler::InitGnssEventProcessMap()
1760 {
1761     if (gnssEventProcessMap_.size() != 0) {
1762         return;
1763     }
1764     gnssEventProcessMap_[static_cast<uint32_t>(GnssAbilityInterfaceCode::EVENT_REPORT_MOCK_LOCATION)] =
1765         [this](const AppExecFwk::InnerEvent::Pointer& event) { HandleReportMockLocation(event); };
1766     gnssEventProcessMap_[static_cast<uint32_t>(GnssInterfaceCode::SEND_LOCATION_REQUEST)] =
1767         [this](const AppExecFwk::InnerEvent::Pointer& event) { HandleSendLocationRequest(event); };
1768     gnssEventProcessMap_[static_cast<uint32_t>(GnssInterfaceCode::SET_MOCKED_LOCATIONS)] =
1769         [this](const AppExecFwk::InnerEvent::Pointer& event) { HandleSetMockedLocations(event); };
1770     gnssEventProcessMap_[static_cast<uint32_t>(GnssInterfaceCode::SEND_COMMANDS)] =
1771         [this](const AppExecFwk::InnerEvent::Pointer& event) { HandleSendCommands(event); };
1772 #ifdef HDF_DRIVERS_INTERFACE_AGNSS_ENABLE
1773     gnssEventProcessMap_[static_cast<uint32_t>(GnssAbilityInterfaceCode::SET_SUBSCRIBER_SET_ID)] =
1774         [this](const AppExecFwk::InnerEvent::Pointer& event) { HandleSetSubscriberSetId(event); };
1775     gnssEventProcessMap_[static_cast<uint32_t>(GnssAbilityInterfaceCode::SET_AGNSS_REF_INFO)] =
1776         [this](const AppExecFwk::InnerEvent::Pointer& event) { HandleSetAgnssRefInfo(event); };
1777 #endif
1778     gnssEventProcessMap_[static_cast<uint32_t>(GnssAbilityInterfaceCode::RECONNECT_HDI)] =
1779         [this](const AppExecFwk::InnerEvent::Pointer& event) { HandleReconnectHdi(event); };
1780     gnssEventProcessMap_[static_cast<uint32_t>(GnssInterfaceCode::SET_ENABLE)] =
1781         [this](const AppExecFwk::InnerEvent::Pointer& event) { HandleSetEnable(event); };
1782     gnssEventProcessMap_[static_cast<uint32_t>(GnssAbilityInterfaceCode::INIT_HDI)] =
1783         [this](const AppExecFwk::InnerEvent::Pointer& event) { HandleInitHdi(event); };
1784     gnssEventProcessMap_[static_cast<uint32_t>(GnssAbilityInterfaceCode::ADD_FENCE)] =
1785         [this](const AppExecFwk::InnerEvent::Pointer& event) { HandleAddFence(event); };
1786     gnssEventProcessMap_[static_cast<uint32_t>(GnssAbilityInterfaceCode::REMOVE_FENCE)] =
1787         [this](const AppExecFwk::InnerEvent::Pointer& event) { HandleRemoveFence(event); };
1788     gnssEventProcessMap_[static_cast<uint32_t>(GnssAbilityInterfaceCode::ADD_GEOFENCE)] =
1789         [this](const AppExecFwk::InnerEvent::Pointer& event) { HandleAddGeofence(event); };
1790     gnssEventProcessMap_[static_cast<uint32_t>(GnssAbilityInterfaceCode::REMOVE_GEOFENCE)] =
1791         [this](const AppExecFwk::InnerEvent::Pointer& event) { HandleRemoveGeofence(event); };
1792     gnssEventProcessMap_[static_cast<uint32_t>(GnssInterfaceCode::SEND_NETWORK_LOCATION)] =
1793         [this](const AppExecFwk::InnerEvent::Pointer& event) { HandleSendNetworkLocation(event); };
1794 }
1795 
~GnssHandler()1796 GnssHandler::~GnssHandler() {}
1797 
ProcessEvent(const AppExecFwk::InnerEvent::Pointer & event)1798 void GnssHandler::ProcessEvent(const AppExecFwk::InnerEvent::Pointer& event)
1799 {
1800     auto gnssAbility = GnssAbility::GetInstance();
1801     uint32_t eventId = event->GetInnerEventId();
1802     LBSLOGD(GNSS, "ProcessEvent event:%{public}d", eventId);
1803     auto handleFunc = gnssEventProcessMap_.find(eventId);
1804     if (handleFunc != gnssEventProcessMap_.end() && handleFunc->second != nullptr) {
1805         auto memberFunc = handleFunc->second;
1806 #ifdef LOCATION_HICOLLIE_ENABLE
1807         int tid = gettid();
1808         std::string moduleName = "GnssHandler";
1809         XCollieCallback callbackFunc = [moduleName, eventId, tid](void *) {
1810             LBSLOGE(GNSS, "TimeoutCallback tid:%{public}d moduleName:%{public}s excute eventId:%{public}u timeout.",
1811                 tid, moduleName.c_str(), eventId);
1812         };
1813         std::string dfxInfo = moduleName + "_" + std::to_string(eventId) + "_" + std::to_string(tid);
1814         int timerId = HiviewDFX::XCollie::GetInstance().SetTimer(dfxInfo, TIMEOUT_WATCHDOG, callbackFunc, nullptr,
1815             HiviewDFX::XCOLLIE_FLAG_LOG|HiviewDFX::XCOLLIE_FLAG_RECOVERY);
1816         memberFunc(event);
1817         HiviewDFX::XCollie::GetInstance().CancelTimer(timerId);
1818 #else
1819         memberFunc(event);
1820 #endif
1821     }
1822     gnssAbility->UnloadGnssSystemAbility();
1823 }
1824 
HandleReportMockLocation(const AppExecFwk::InnerEvent::Pointer & event)1825 void GnssHandler::HandleReportMockLocation(const AppExecFwk::InnerEvent::Pointer& event)
1826 {
1827     auto gnssAbility = GnssAbility::GetInstance();
1828     gnssAbility->ProcessReportLocationMock();
1829 }
1830 
HandleSendLocationRequest(const AppExecFwk::InnerEvent::Pointer & event)1831 void GnssHandler::HandleSendLocationRequest(const AppExecFwk::InnerEvent::Pointer& event)
1832 {
1833     auto gnssAbility = GnssAbility::GetInstance();
1834     std::unique_ptr<WorkRecord> workrecord = event->GetUniqueObject<WorkRecord>();
1835     if (workrecord != nullptr) {
1836         gnssAbility->LocationRequest(*workrecord);
1837     }
1838 }
1839 
HandleSetMockedLocations(const AppExecFwk::InnerEvent::Pointer & event)1840 void GnssHandler::HandleSetMockedLocations(const AppExecFwk::InnerEvent::Pointer& event)
1841 {
1842     auto gnssAbility = GnssAbility::GetInstance();
1843     int timeInterval = event->GetParam();
1844     auto vcLoc = event->GetSharedObject<std::vector<std::shared_ptr<Location>>>();
1845     if (vcLoc != nullptr) {
1846         std::vector<std::shared_ptr<Location>> mockLocations;
1847         for (auto it = vcLoc->begin(); it != vcLoc->end(); ++it) {
1848             mockLocations.push_back(*it);
1849         }
1850         gnssAbility->SetMocked(timeInterval, mockLocations);
1851     }
1852 }
1853 
HandleSendCommands(const AppExecFwk::InnerEvent::Pointer & event)1854 void GnssHandler::HandleSendCommands(const AppExecFwk::InnerEvent::Pointer& event)
1855 {
1856     auto gnssAbility = GnssAbility::GetInstance();
1857     std::unique_ptr<LocationCommand> locationCommand = event->GetUniqueObject<LocationCommand>();
1858     if (locationCommand != nullptr) {
1859         gnssAbility->SendCommand(locationCommand);
1860     }
1861 }
1862 #ifdef HDF_DRIVERS_INTERFACE_AGNSS_ENABLE
HandleSetSubscriberSetId(const AppExecFwk::InnerEvent::Pointer & event)1863 void GnssHandler::HandleSetSubscriberSetId(const AppExecFwk::InnerEvent::Pointer& event)
1864 {
1865     auto gnssAbility = GnssAbility::GetInstance();
1866     std::unique_ptr<SubscriberSetId> subscriberSetId = event->GetUniqueObject<SubscriberSetId>();
1867     if (subscriberSetId != nullptr) {
1868         gnssAbility->SetSetIdImpl(*subscriberSetId);
1869     }
1870 }
1871 
HandleSetAgnssRefInfo(const AppExecFwk::InnerEvent::Pointer & event)1872 void GnssHandler::HandleSetAgnssRefInfo(const AppExecFwk::InnerEvent::Pointer& event)
1873 {
1874     auto gnssAbility = GnssAbility::GetInstance();
1875     std::unique_ptr<AgnssRefInfoMessage> agnssRefInfoMessage = event->GetUniqueObject<AgnssRefInfoMessage>();
1876     if (agnssRefInfoMessage != nullptr) {
1877         AGnssRefInfo refInfo = agnssRefInfoMessage->GetAgnssRefInfo();
1878         gnssAbility->SetRefInfoImpl(refInfo);
1879     }
1880 }
1881 #endif
1882 
HandleReconnectHdi(const AppExecFwk::InnerEvent::Pointer & event)1883 void GnssHandler::HandleReconnectHdi(const AppExecFwk::InnerEvent::Pointer& event)
1884 {
1885     auto gnssAbility = GnssAbility::GetInstance();
1886     gnssAbility->ReConnectHdiImpl();
1887 }
1888 
HandleSetEnable(const AppExecFwk::InnerEvent::Pointer & event)1889 void GnssHandler::HandleSetEnable(const AppExecFwk::InnerEvent::Pointer& event)
1890 {
1891     auto gnssAbility = GnssAbility::GetInstance();
1892     int state = event->GetParam();
1893     gnssAbility->SetEnable(state != 0);
1894 }
1895 
HandleInitHdi(const AppExecFwk::InnerEvent::Pointer & event)1896 void GnssHandler::HandleInitHdi(const AppExecFwk::InnerEvent::Pointer& event)
1897 {
1898     auto gnssAbility = GnssAbility::GetInstance();
1899 #ifndef TDD_CASES_ENABLED
1900     gnssAbility->ConnectHdi();
1901 #endif
1902     gnssAbility->EnableGnss();
1903 #ifdef HDF_DRIVERS_INTERFACE_AGNSS_ENABLE
1904     gnssAbility->SetAgnssCallback();
1905 #endif
1906 }
1907 
HandleAddFence(const AppExecFwk::InnerEvent::Pointer & event)1908 void GnssHandler::HandleAddFence(const AppExecFwk::InnerEvent::Pointer& event)
1909 {
1910     auto gnssAbility = GnssAbility::GetInstance();
1911     std::shared_ptr<GeofenceRequest> request = event->GetSharedObject<GeofenceRequest>();
1912     if (request != nullptr) {
1913         LocationErrCode code = gnssAbility->AddFence(request);
1914         if (code != ERRCODE_SUCCESS) {
1915             gnssAbility->ReportFailedOperationResult(request,
1916                 GnssGeofenceOperateType::GNSS_GEOFENCE_OPT_TYPE_ADD, code);
1917         }
1918     }
1919 }
1920 
HandleRemoveFence(const AppExecFwk::InnerEvent::Pointer & event)1921 void GnssHandler::HandleRemoveFence(const AppExecFwk::InnerEvent::Pointer& event)
1922 {
1923     auto gnssAbility = GnssAbility::GetInstance();
1924     std::shared_ptr<GeofenceRequest> request = event->GetSharedObject<GeofenceRequest>();
1925     if (request != nullptr) {
1926         LocationErrCode code = gnssAbility->RemoveFence(request);
1927         if (code != ERRCODE_SUCCESS) {
1928             gnssAbility->ReportFailedOperationResult(request,
1929                 GnssGeofenceOperateType::GNSS_GEOFENCE_OPT_TYPE_DELETE, code);
1930         }
1931     }
1932 }
1933 
HandleAddGeofence(const AppExecFwk::InnerEvent::Pointer & event)1934 void GnssHandler::HandleAddGeofence(const AppExecFwk::InnerEvent::Pointer& event)
1935 {
1936     auto gnssAbility = GnssAbility::GetInstance();
1937     std::shared_ptr<GeofenceRequest> request = event->GetSharedObject<GeofenceRequest>();
1938     if (request != nullptr) {
1939         LocationErrCode code = gnssAbility->AddGnssGeofence(request);
1940         if (code != ERRCODE_SUCCESS) {
1941             gnssAbility->ReportFailedOperationResult(request,
1942                 GnssGeofenceOperateType::GNSS_GEOFENCE_OPT_TYPE_ADD, code);
1943         }
1944     }
1945 }
1946 
HandleRemoveGeofence(const AppExecFwk::InnerEvent::Pointer & event)1947 void GnssHandler::HandleRemoveGeofence(const AppExecFwk::InnerEvent::Pointer& event)
1948 {
1949     auto gnssAbility = GnssAbility::GetInstance();
1950     std::shared_ptr<GeofenceRequest> request = event->GetSharedObject<GeofenceRequest>();
1951     if (request != nullptr) {
1952         LocationErrCode code = gnssAbility->RemoveGnssGeofence(request);
1953         if (code != ERRCODE_SUCCESS) {
1954             gnssAbility->ReportFailedOperationResult(request,
1955                 GnssGeofenceOperateType::GNSS_GEOFENCE_OPT_TYPE_DELETE, code);
1956         }
1957     }
1958 }
1959 
HandleSendNetworkLocation(const AppExecFwk::InnerEvent::Pointer & event)1960 void GnssHandler::HandleSendNetworkLocation(const AppExecFwk::InnerEvent::Pointer& event)
1961 {
1962     auto gnssAbility = GnssAbility::GetInstance();
1963     std::unique_ptr<Location> location = event->GetUniqueObject<Location>();
1964     if (location != nullptr) {
1965         int64_t time = location->GetTimeStamp();
1966         int64_t timeSinceBoot = location->GetTimeSinceBoot();
1967         double acc = location->GetAccuracy();
1968         LBSLOGI(GNSS,
1969             "receive network location from locator: [ time=%{public}s timeSinceBoot=%{public}s acc=%{public}f]",
1970             std::to_string(time).c_str(), std::to_string(timeSinceBoot).c_str(), acc);
1971             gnssAbility->SendNetworkLocation(location);
1972     }
1973 }
1974 
LocationHdiDeathRecipient()1975 LocationHdiDeathRecipient::LocationHdiDeathRecipient()
1976 {
1977 }
1978 
~LocationHdiDeathRecipient()1979 LocationHdiDeathRecipient::~LocationHdiDeathRecipient()
1980 {
1981 }
1982 
OnRemoteDied(const wptr<IRemoteObject> & remote)1983 void LocationHdiDeathRecipient::OnRemoteDied(const wptr<IRemoteObject> &remote)
1984 {
1985     auto gnssAbility = GnssAbility::GetInstance();
1986     if (gnssAbility != nullptr) {
1987         LBSLOGI(LOCATOR, "hdi reconnecting");
1988         // wait for device unloaded
1989         std::this_thread::sleep_for(std::chrono::milliseconds(WAIT_MS));
1990         gnssAbility->RestGnssWorkStatus();
1991         gnssAbility->ReConnectHdi();
1992         LBSLOGI(LOCATOR, "hdi connected finish");
1993     }
1994 }
1995 } // namespace Location
1996 } // namespace OHOS
1997 #endif
1998