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