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