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