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