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