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