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