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