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