1 /*
2 * Copyright (C) 2021 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 #include "radio_info.h"
17
18 #include "core_service_hisysevent.h"
19 #include "network_search_manager.h"
20 #include "telephony_errors.h"
21 #include "telephony_log_wrapper.h"
22
23 namespace OHOS {
24 namespace Telephony {
25 const int32_t INVALID_SLOT_ID = -1;
26
RadioInfo(std::weak_ptr<NetworkSearchManager> networkSearchManager,int32_t slotId)27 RadioInfo::RadioInfo(std::weak_ptr<NetworkSearchManager> networkSearchManager, int32_t slotId)
28 : networkSearchManager_(networkSearchManager), slotId_(slotId)
29 {}
30
ProcessGetRadioState(const AppExecFwk::InnerEvent::Pointer & event) const31 void RadioInfo::ProcessGetRadioState(const AppExecFwk::InnerEvent::Pointer &event) const
32 {
33 if (event == nullptr) {
34 TELEPHONY_LOGE("RadioInfo::ProcessGetRadioState event is nullptr slotId:%{public}d", slotId_);
35 return;
36 }
37 std::unique_ptr<RadioStateInfo> object = event->GetUniqueObject<RadioStateInfo>();
38 std::shared_ptr<RadioResponseInfo> responseInfo = event->GetSharedObject<RadioResponseInfo>();
39 std::shared_ptr<NetworkSearchManager> nsm = networkSearchManager_.lock();
40 if ((responseInfo == nullptr && object == nullptr) || nsm == nullptr) {
41 TELEPHONY_LOGE("RadioInfo::ProcessGetRadioState object is nullptr slotId:%{public}d", slotId_);
42 return;
43 }
44 int64_t index = 0;
45 MessageParcel data;
46 data.WriteInterfaceToken(INetworkSearchCallback::GetDescriptor());
47 if (responseInfo != nullptr) {
48 TELEPHONY_LOGE("RadioInfo::ProcessGetRadioState false slotId:%{public}d", slotId_);
49 if (!WriteRadioStateResponseInfo(index, data, false, responseInfo)) {
50 return;
51 }
52 }
53 if (object != nullptr) {
54 TELEPHONY_LOGI("ProcessGetRadioState RadioState is:%{public}d slotId:%{public}d", object->state, slotId_);
55 bool state = (object->state == ModemPowerState::CORE_SERVICE_POWER_ON) ? true : false;
56 nsm->SetRadioStateValue(slotId_, static_cast<ModemPowerState>(object->state));
57 if (!WriteRadioStateObject(index, data, state, object)) {
58 return;
59 }
60 }
61 std::shared_ptr<NetworkSearchCallbackInfo> callbackInfo = NetworkUtils::FindNetworkSearchCallback(index);
62 if (callbackInfo != nullptr) {
63 sptr<INetworkSearchCallback> callback = callbackInfo->networkSearchItem_;
64 if (callback != nullptr && callback->OnNetworkSearchCallback(
65 INetworkSearchCallback::NetworkSearchCallback::GET_RADIO_STATUS_RESULT, data)) {
66 TELEPHONY_LOGE("RadioInfo::ProcessGetRadioState callback fail slotId:%{public}d", slotId_);
67 }
68 NetworkUtils::RemoveCallbackFromMap(index);
69 } else {
70 bool isAirplaneModeOn = false;
71 nsm->GetAirplaneMode(isAirplaneModeOn);
72 if (nsm->GetRadioState(slotId_) == ModemPowerState::CORE_SERVICE_POWER_OFF && !isAirplaneModeOn) {
73 nsm->SetRadioState(slotId_, static_cast<bool>(ModemPowerState::CORE_SERVICE_POWER_ON), 0);
74 }
75 if (nsm->GetRadioState(slotId_) == ModemPowerState::CORE_SERVICE_POWER_ON) {
76 nsm->TriggerSimRefresh(slotId_);
77 }
78 }
79 }
80
ProcessSetRadioState(const AppExecFwk::InnerEvent::Pointer & event) const81 void RadioInfo::ProcessSetRadioState(const AppExecFwk::InnerEvent::Pointer &event) const
82 {
83 if (event == nullptr) {
84 TELEPHONY_LOGE("RadioInfo::ProcessSetRadioState event is nullptr slotId:%{public}d", slotId_);
85 return;
86 }
87 std::unique_ptr<RadioStateInfo> object = event->GetUniqueObject<RadioStateInfo>();
88 std::shared_ptr<RadioResponseInfo> responseInfo = event->GetSharedObject<RadioResponseInfo>();
89 if (responseInfo == nullptr && object == nullptr) {
90 TELEPHONY_LOGE("RadioInfo::ProcessSetRadioState object is nullptr slotId:%{public}d", slotId_);
91 return;
92 }
93 MessageParcel data;
94 int64_t index = 0;
95 bool result = true;
96 ModemPowerState radioState = ModemPowerState::CORE_SERVICE_POWER_NOT_AVAILABLE;
97 data.WriteInterfaceToken(INetworkSearchCallback::GetDescriptor());
98 if (responseInfo != nullptr) {
99 TELEPHONY_LOGE("RadioInfo::ProcessSetRadioState false slotId:%{public}d", slotId_);
100 int32_t error = static_cast<int32_t>(responseInfo->error);
101 int32_t status = static_cast<int32_t>(ErrType::ERR_REPEAT_STATUS);
102 result = (error == status) ? true : false;
103 if (!WriteRadioStateResponseInfo(index, data, result, responseInfo)) {
104 return;
105 }
106 }
107 if (object != nullptr) {
108 TELEPHONY_LOGI("RadioInfo::ProcessSetRadioState ok slotId:%{public}d", slotId_);
109 radioState = static_cast<ModemPowerState>(object->flag);
110 result = true;
111 if (!WriteRadioStateObject(index, data, result, object)) {
112 return;
113 }
114 }
115 UpdateInfoOfSetRadioState(radioState, result, data, index);
116 }
117
RadioFirstPowerOn(std::shared_ptr<NetworkSearchManager> & nsm,ModemPowerState radioState) const118 void RadioInfo::RadioFirstPowerOn(std::shared_ptr<NetworkSearchManager> &nsm, ModemPowerState radioState) const
119 {
120 TELEPHONY_LOGI(
121 "RadioInfo::RadioFirstPowerOn radioState:%{public}d, slotId:%{public}d", static_cast<int>(radioState), slotId_);
122 if (radioState != ModemPowerState::CORE_SERVICE_POWER_ON) {
123 return;
124 }
125 if (!nsm->IsRadioFirstPowerOn(slotId_)) {
126 return;
127 }
128 nsm->SetRadioFirstPowerOn(slotId_, false);
129 }
130
ProcessGetImei(const AppExecFwk::InnerEvent::Pointer & event) const131 void RadioInfo::ProcessGetImei(const AppExecFwk::InnerEvent::Pointer &event) const
132 {
133 std::shared_ptr<NetworkSearchManager> nsm = networkSearchManager_.lock();
134 if (event == nullptr) {
135 TELEPHONY_LOGE("RadioInfo::ProcessGetImei event is nullptr slotId:%{public}d", slotId_);
136 return;
137 }
138 if (nsm == nullptr) {
139 TELEPHONY_LOGE("RadioInfo::ProcessGetImei nsm is nullptr slotId:%{public}d", slotId_);
140 return;
141 }
142
143 std::shared_ptr<StringParcel> imeiID = event->GetSharedObject<StringParcel>();
144 if (imeiID == nullptr) {
145 TELEPHONY_LOGE("RadioInfo::ProcessGetImei imei is nullptr slotId:%{public}d", slotId_);
146 nsm->SetImei(slotId_, u"");
147 return;
148 }
149 TELEPHONY_LOGI("RadioInfo::ProcessGetImei get imei success slotId:%{public}d", slotId_);
150 nsm->SetImei(slotId_, Str8ToStr16(imeiID->data));
151 }
152
ProcessGetImeiSv(const AppExecFwk::InnerEvent::Pointer & event) const153 void RadioInfo::ProcessGetImeiSv(const AppExecFwk::InnerEvent::Pointer &event) const
154 {
155 std::shared_ptr<NetworkSearchManager> nsm = networkSearchManager_.lock();
156 if (event == nullptr) {
157 TELEPHONY_LOGE("RadioInfo::ProcessGetImeiSv event is nullptr slotId:%{public}d", slotId_);
158 return;
159 }
160 if (nsm == nullptr) {
161 TELEPHONY_LOGE("RadioInfo::ProcessGetImeiSv nsm is nullptr slotId:%{public}d", slotId_);
162 return;
163 }
164
165 std::shared_ptr<StringParcel> imeiSvID = event->GetSharedObject<StringParcel>();
166 if (imeiSvID == nullptr) {
167 TELEPHONY_LOGE("RadioInfo::ProcessGetImeiSv imeiSv is nullptr slotId:%{public}d", slotId_);
168 nsm->SetImeiSv(slotId_, u"");
169 return;
170 }
171 TELEPHONY_LOGI("RadioInfo::ProcessGetImeiSv get imeiSv success slotId:%{public}d", slotId_);
172 nsm->SetImeiSv(slotId_, Str8ToStr16(imeiSvID->data));
173 }
174
ProcessGetMeid(const AppExecFwk::InnerEvent::Pointer & event) const175 void RadioInfo::ProcessGetMeid(const AppExecFwk::InnerEvent::Pointer &event) const
176 {
177 std::shared_ptr<NetworkSearchManager> nsm = networkSearchManager_.lock();
178 if (event == nullptr) {
179 TELEPHONY_LOGE("RadioInfo::ProcessGetMeid event is nullptr slotId:%{public}d", slotId_);
180 return;
181 }
182 if (nsm == nullptr) {
183 TELEPHONY_LOGE("RadioInfo::ProcessGetMeid nsm is nullptr slotId:%{public}d", slotId_);
184 return;
185 }
186
187 std::shared_ptr<StringParcel> meid = event->GetSharedObject<StringParcel>();
188 if (meid == nullptr) {
189 TELEPHONY_LOGE("RadioInfo::ProcessGetMeid meid is nullptr slotId:%{public}d", slotId_);
190 nsm->SetMeid(slotId_, u"");
191 return;
192 }
193 TELEPHONY_LOGI("RadioInfo::ProcessGetMeid success slotId:%{public}d", slotId_);
194 nsm->SetMeid(slotId_, Str8ToStr16(meid->data));
195 }
196
SetPhoneType(PhoneType phoneType)197 void RadioInfo::SetPhoneType(PhoneType phoneType)
198 {
199 phoneType_ = phoneType;
200 }
201
GetPhoneType() const202 PhoneType RadioInfo::GetPhoneType() const
203 {
204 return phoneType_;
205 }
206
UpdatePhone(RadioTech csRadioTech,const RadioTech & psRadioTech)207 void RadioInfo::UpdatePhone(RadioTech csRadioTech, const RadioTech &psRadioTech)
208 {
209 TELEPHONY_LOGI("RadioInfo::UpdatePhone");
210 std::shared_ptr<NetworkSearchManager> networkSearchManager = networkSearchManager_.lock();
211 if (networkSearchManager == nullptr) {
212 TELEPHONY_LOGE("RadioInfo::UpdatePhone networkSearchManager is nullptr");
213 return;
214 }
215 PhoneType phoneType = RadioTechToPhoneType(csRadioTech, psRadioTech);
216 if (phoneType_ == phoneType) {
217 TELEPHONY_LOGI("RadioInfo::UpdatePhone No Change");
218 return;
219 }
220 if (phoneType == PhoneType::PHONE_TYPE_IS_NONE) {
221 TELEPHONY_LOGE("RadioInfo::UpdatePhone phoneType is UNKNOWN");
222 return;
223 }
224 TELEPHONY_LOGI("RadioInfo::UpdatePhone SetPhoneType is success %{public}d", phoneType);
225 SetPhoneType(phoneType);
226
227 int radioState = networkSearchManager->GetRadioState(slotId_);
228 if (static_cast<ModemPowerState>(radioState) != CORE_SERVICE_POWER_NOT_AVAILABLE) {
229 networkSearchManager->InitSimRadioProtocol(slotId_);
230 networkSearchManager->UpdateDeviceId(slotId_);
231 if (static_cast<ModemPowerState>(radioState) == CORE_SERVICE_POWER_ON) {
232 networkSearchManager->GetVoiceTech(slotId_);
233 }
234 }
235 }
236
ProcessVoiceTechChange(const AppExecFwk::InnerEvent::Pointer & event)237 void RadioInfo::ProcessVoiceTechChange(const AppExecFwk::InnerEvent::Pointer &event)
238 {
239 if (event == nullptr) {
240 TELEPHONY_LOGE("RadioInfo::ProcessVoiceTechChange event is nullptr");
241 return;
242 }
243 std::shared_ptr<VoiceRadioTechnology> csRadioTech = event->GetSharedObject<VoiceRadioTechnology>();
244 if (csRadioTech == nullptr) {
245 TELEPHONY_LOGE("RadioInfo::ProcessVoiceTechChange csRadioTech is nullptr");
246 return;
247 }
248 std::shared_ptr<NetworkSearchManager> networkSearchManager = networkSearchManager_.lock();
249 if (networkSearchManager == nullptr) {
250 TELEPHONY_LOGE("RadioInfo::ProcessVoiceTechChange networkSearchManager is nullptr");
251 return;
252 }
253 int32_t psRadioTech = 0;
254 networkSearchManager->GetPsRadioTech(slotId_, psRadioTech);
255 UpdatePhone(static_cast<RadioTech>(csRadioTech->actType), static_cast<RadioTech>(psRadioTech));
256 }
257
RadioTechToPhoneType(RadioTech csRadioTech,const RadioTech & psRadioTech) const258 PhoneType RadioInfo::RadioTechToPhoneType(RadioTech csRadioTech, const RadioTech &psRadioTech) const
259 {
260 PhoneType phoneType = PhoneType::PHONE_TYPE_IS_NONE;
261 switch (csRadioTech) {
262 case RadioTech::RADIO_TECHNOLOGY_GSM:
263 case RadioTech::RADIO_TECHNOLOGY_WCDMA:
264 case RadioTech::RADIO_TECHNOLOGY_HSPA:
265 case RadioTech::RADIO_TECHNOLOGY_HSPAP:
266 case RadioTech::RADIO_TECHNOLOGY_TD_SCDMA:
267 case RadioTech::RADIO_TECHNOLOGY_LTE:
268 case RadioTech::RADIO_TECHNOLOGY_LTE_CA:
269 case RadioTech::RADIO_TECHNOLOGY_NR:
270 phoneType = PhoneType::PHONE_TYPE_IS_GSM;
271 break;
272 case RadioTech::RADIO_TECHNOLOGY_1XRTT:
273 case RadioTech::RADIO_TECHNOLOGY_EVDO:
274 case RadioTech::RADIO_TECHNOLOGY_EHRPD:
275 phoneType = PhoneType::PHONE_TYPE_IS_CDMA;
276 break;
277 case RadioTech::RADIO_TECHNOLOGY_UNKNOWN:
278 default:
279 if (psRadioTech == RadioTech::RADIO_TECHNOLOGY_LTE || psRadioTech == RadioTech::RADIO_TECHNOLOGY_LTE_CA ||
280 psRadioTech == RadioTech::RADIO_TECHNOLOGY_NR) {
281 phoneType = PhoneType::PHONE_TYPE_IS_GSM;
282 }
283 break;
284 }
285 return phoneType;
286 }
287
AirplaneModeChange()288 void RadioInfo::AirplaneModeChange()
289 {
290 std::shared_ptr<NetworkSearchManager> nsm = networkSearchManager_.lock();
291 if (nsm == nullptr) {
292 TELEPHONY_LOGE("networkSearchManager_ is nullptr slotId:%{public}d", slotId_);
293 return;
294 }
295 bool isAirplaneModeOn = false;
296 if (nsm->GetAirplaneMode(isAirplaneModeOn) != TELEPHONY_SUCCESS) {
297 TELEPHONY_LOGE("AirplaneModeChange GetAirplaneMode fail slotId:%{public}d", slotId_);
298 }
299 CoreServiceHiSysEvent::WriteAirplaneModeChangeEvent(isAirplaneModeOn);
300 bool lastAirplaneMode = false;
301 nsm->GetLocalAirplaneMode(slotId_, lastAirplaneMode);
302 if (isAirplaneModeOn == lastAirplaneMode) {
303 TELEPHONY_LOGE("airplaneMode is not change, slotId:%{public}d", slotId_);
304 return;
305 }
306 if (nsm->GetRadioState(slotId_) == ModemPowerState::CORE_SERVICE_POWER_OFF && isAirplaneModeOn == false) {
307 TELEPHONY_LOGI("radio is off, airplaneMode is closed, slotId:%{public}d", slotId_);
308 SetRadioOnIfNeeded();
309 }
310 if (nsm->GetRadioState(slotId_) == ModemPowerState::CORE_SERVICE_POWER_ON && isAirplaneModeOn == true) {
311 TELEPHONY_LOGI("radio is on, airplaneMode is opened, slotId:%{public}d", slotId_);
312 sptr<NetworkSearchCallBackBase> cellularData = nsm->GetCellularDataCallBack();
313 if (cellularData) {
314 cellularData->ClearCellularDataConnections(slotId_);
315 }
316 sptr<NetworkSearchCallBackBase> cellularCall = nsm->GetCellularCallCallBack();
317 if (cellularCall) {
318 cellularCall->ClearCellularCallList(slotId_);
319 }
320 nsm->SetRadioState(slotId_, static_cast<bool>(ModemPowerState::CORE_SERVICE_POWER_OFF), 0);
321 }
322 nsm->SetLocalAirplaneMode(slotId_, isAirplaneModeOn);
323 TELEPHONY_LOGI("airplaneMode:%{public}d, slotId:%{public}d", isAirplaneModeOn, slotId_);
324 }
325
SetRadioOnIfNeeded()326 void RadioInfo::SetRadioOnIfNeeded()
327 {
328 std::shared_ptr<NetworkSearchManager> nsm = networkSearchManager_.lock();
329 if (nsm == nullptr) {
330 TELEPHONY_LOGE("networkSearchManager_ is nullptr slotId:%{public}d", slotId_);
331 return;
332 }
333 auto simManager = nsm->GetSimManager();
334 if (simManager == nullptr) {
335 TELEPHONY_LOGE("get simManager failed");
336 return;
337 }
338 bool isActive = simManager->IsSimActive(slotId_);
339 bool hasSim = false;
340 simManager->HasSimCard(slotId_, hasSim);
341 int32_t primarySlot = INVALID_SLOT_ID;
342 simManager->GetPrimarySlotId(primarySlot);
343 if ((isActive || (!hasSim && slotId_ == primarySlot)) && !GetDynamicPowerOffModeSwitch()) {
344 TELEPHONY_LOGI("need set radio on. isActive:%{public}d, hasSim:%{public}d, primarySlot:%{public}d",
345 isActive, hasSim, primarySlot);
346 nsm->SetRadioState(slotId_, static_cast<bool>(ModemPowerState::CORE_SERVICE_POWER_ON), 0);
347 }
348 }
349
ProcessGetBasebandVersion(const AppExecFwk::InnerEvent::Pointer & event) const350 int32_t RadioInfo::ProcessGetBasebandVersion(const AppExecFwk::InnerEvent::Pointer &event) const
351 {
352 std::shared_ptr<NetworkSearchManager> nsm = networkSearchManager_.lock();
353 TELEPHONY_LOGD("RadioInfo::ProcessGetBasebandVersion slotId:%{public}d", slotId_);
354 if (event == nullptr) {
355 TELEPHONY_LOGE("RadioInfo::ProcessGetBasebandVersion event is nullptr slotId:%{public}d", slotId_);
356 return TELEPHONY_ERR_LOCAL_PTR_NULL;
357 }
358 if (nsm == nullptr) {
359 TELEPHONY_LOGE("RadioInfo::ProcessGetBasebandVersion nsm is nullptr slotId:%{public}d", slotId_);
360 return TELEPHONY_ERR_LOCAL_PTR_NULL;
361 }
362
363 std::shared_ptr<StringParcel> version = event->GetSharedObject<StringParcel>();
364 if (version == nullptr) {
365 TELEPHONY_LOGE("RadioInfo::ProcessGetBasebandVersion version is nullptr slotId:%{public}d", slotId_);
366 return TELEPHONY_ERR_LOCAL_PTR_NULL;
367 }
368 TELEPHONY_LOGD("RadioInfo::ProcessGetBasebandVersion success");
369 nsm->SetBasebandVersion(slotId_, version->data);
370 return TELEPHONY_ERR_SUCCESS;
371 }
372
ProcessGetRrcConnectionState(const AppExecFwk::InnerEvent::Pointer & event) const373 int32_t RadioInfo::ProcessGetRrcConnectionState(const AppExecFwk::InnerEvent::Pointer &event) const
374 {
375 TELEPHONY_LOGI("start slotId:%{public}d", slotId_);
376 if (event == nullptr) {
377 TELEPHONY_LOGE("RadioInfo::ProcessGetRrcConnectionState event is nullptr slotId:%{public}d", slotId_);
378 return TELEPHONY_ERR_LOCAL_PTR_NULL;
379 }
380 std::shared_ptr<NetworkSearchManager> nsm = networkSearchManager_.lock();
381 if (nsm == nullptr) {
382 TELEPHONY_LOGE("RadioInfo::ProcessGetRrcConnectionState nsm is nullptr slotId:%{public}d", slotId_);
383 return TELEPHONY_ERR_LOCAL_PTR_NULL;
384 }
385
386 auto object = event->GetSharedObject<Int32Parcel>();
387 if (object == nullptr) {
388 TELEPHONY_LOGE("RadioInfo::ProcessGetRrcConnectionState object is nullptr slotId:%{public}d", slotId_);
389 return TELEPHONY_ERR_LOCAL_PTR_NULL;
390 }
391 TELEPHONY_LOGI("rrc state[%{public}d] notify success, slotId:%{public}d", object->data, slotId_);
392 int32_t result = nsm->HandleRrcStateChanged(slotId_, object->data);
393 if (result != TELEPHONY_ERR_SUCCESS) {
394 TELEPHONY_LOGE("Do not need notify, result:%{public}d, slotId:%{public}d", result, slotId_);
395 return result;
396 }
397 nsm->ProcessNotifyStateChangeEvent(slotId_);
398 return TELEPHONY_ERR_SUCCESS;
399 }
400
ProcessSetNrOptionMode(const AppExecFwk::InnerEvent::Pointer & event) const401 int32_t RadioInfo::ProcessSetNrOptionMode(const AppExecFwk::InnerEvent::Pointer &event) const
402 {
403 TELEPHONY_LOGI("start slotId:%{public}d", slotId_);
404 if (event == nullptr) {
405 TELEPHONY_LOGE("RadioInfo::ProcessSetNrOptionMode event is nullptr slotId:%{public}d", slotId_);
406 return TELEPHONY_ERR_LOCAL_PTR_NULL;
407 }
408 std::shared_ptr<RadioResponseInfo> responseInfo = event->GetSharedObject<RadioResponseInfo>();
409 if (responseInfo == nullptr) {
410 TELEPHONY_LOGE("RadioInfo::ProcessSetNrOptionMode responseInfo is nullptr");
411 return TELEPHONY_ERR_LOCAL_PTR_NULL;
412 }
413 std::shared_ptr<NetworkSearchManager> nsm = networkSearchManager_.lock();
414 if (nsm == nullptr) {
415 TELEPHONY_LOGE("RadioInfo::ProcessSetNrOptionMode nsm is nullptr slotId:%{public}d", slotId_);
416 return TELEPHONY_ERR_LOCAL_PTR_NULL;
417 }
418 int64_t index = responseInfo->flag;
419 std::shared_ptr<NetworkSearchCallbackInfo> callbackInfo = NetworkUtils::FindNetworkSearchCallback(index);
420 if (callbackInfo == nullptr) {
421 TELEPHONY_LOGE("RadioInfo::ProcessSetNrOptionMode callbackInfo is nullptr slotId:%{public}d", slotId_);
422 return TELEPHONY_ERR_LOCAL_PTR_NULL;
423 }
424 bool success = responseInfo->error == ErrType::NONE;
425 if (success) {
426 nsm->UpdateNrOptionMode(slotId_, static_cast<NrMode>(callbackInfo->param_));
427 }
428 sptr<INetworkSearchCallback> callback = callbackInfo->networkSearchItem_;
429 if (callback == nullptr) {
430 TELEPHONY_LOGE("RadioInfo::ProcessSetNrOptionMode callback is nullptr slotId:%{public}d", slotId_);
431 return TELEPHONY_ERR_LOCAL_PTR_NULL;
432 }
433 MessageParcel data;
434 data.WriteInterfaceToken(INetworkSearchCallback::GetDescriptor());
435 if (!data.WriteBool(success) ||
436 !data.WriteInt32(success ? TELEPHONY_SUCCESS : static_cast<int32_t>(responseInfo->error))) {
437 TELEPHONY_LOGE("RadioInfo::ProcessSetNrOptionMode write date fail slotId:%{public}d", slotId_);
438 return TELEPHONY_ERR_WRITE_DATA_FAIL;
439 }
440 callback->OnNetworkSearchCallback(INetworkSearchCallback::NetworkSearchCallback::SET_NR_OPTION_MODE_RESULT, data);
441 NetworkUtils::RemoveCallbackFromMap(index);
442 return TELEPHONY_ERR_SUCCESS;
443 }
444
ProcessGetNrOptionMode(const AppExecFwk::InnerEvent::Pointer & event) const445 int32_t RadioInfo::ProcessGetNrOptionMode(const AppExecFwk::InnerEvent::Pointer &event) const
446 {
447 std::shared_ptr<NetworkSearchManager> nsm = networkSearchManager_.lock();
448 if (event == nullptr || nsm == nullptr) {
449 TELEPHONY_LOGE("event or nsm is nullptr slotId:%{public}d", slotId_);
450 return TELEPHONY_ERR_LOCAL_PTR_NULL;
451 }
452 std::shared_ptr<NrModeInfo> nrModeInfo = event->GetSharedObject<NrModeInfo>();
453 if (TELEPHONY_EXT_WRAPPER.getNrOptionModeExt_ != nullptr && nrModeInfo != nullptr) {
454 TELEPHONY_EXT_WRAPPER.getNrOptionModeExt_(slotId_, nrModeInfo->nrMode);
455 }
456 std::shared_ptr<RadioResponseInfo> responseInfo = event->GetSharedObject<RadioResponseInfo>();
457 if (responseInfo == nullptr && nrModeInfo == nullptr) {
458 TELEPHONY_LOGE("responseInfo and mode is nullptr slotId:%{public}d", slotId_);
459 return TELEPHONY_ERR_LOCAL_PTR_NULL;
460 }
461 MessageParcel data;
462 data.WriteInterfaceToken(INetworkSearchCallback::GetDescriptor());
463 int64_t index = -1;
464 int32_t nrMode = static_cast<int32_t>(NrMode::NR_MODE_UNKNOWN);
465 if (nrModeInfo != nullptr) {
466 nrMode = nrModeInfo->nrMode;
467 index = nrModeInfo->flag;
468 nsm->UpdateNrOptionMode(slotId_, static_cast<NrMode>(nrMode));
469 if (!data.WriteInt32(nrMode) || !data.WriteInt32(TELEPHONY_SUCCESS)) {
470 TELEPHONY_LOGE("RadioInfo::ProcessGetNrOptionMode WriteInt32 nrMode is false");
471 return TELEPHONY_ERR_WRITE_DATA_FAIL;
472 }
473 } else if (responseInfo != nullptr) {
474 index = responseInfo->flag;
475 if (!data.WriteInt32(nrMode) || !data.WriteInt32(static_cast<int32_t>(responseInfo->error))) {
476 TELEPHONY_LOGE("RadioInfo::ProcessGetNrOptionMode WriteInt32 nrMode is false");
477 return TELEPHONY_ERR_WRITE_DATA_FAIL;
478 }
479 }
480 std::shared_ptr<NetworkSearchCallbackInfo> callbackInfo = NetworkUtils::FindNetworkSearchCallback(index);
481 if (callbackInfo == nullptr) {
482 TELEPHONY_LOGE("RadioInfo::ProcessGetNrOptionMode callbackInfo is nullptr slotId:%{public}d", slotId_);
483 return TELEPHONY_ERR_LOCAL_PTR_NULL;
484 }
485 sptr<INetworkSearchCallback> callback = callbackInfo->networkSearchItem_;
486 if (callback == nullptr) {
487 TELEPHONY_LOGE("RadioInfo::ProcessGetNrOptionMode callback is nullptr slotId:%{public}d", slotId_);
488 NetworkUtils::RemoveCallbackFromMap(index);
489 return TELEPHONY_ERR_LOCAL_PTR_NULL;
490 }
491 callback->OnNetworkSearchCallback(INetworkSearchCallback::NetworkSearchCallback::GET_NR_OPTION_MODE_RESULT, data);
492 NetworkUtils::RemoveCallbackFromMap(index);
493 return TELEPHONY_ERR_SUCCESS;
494 }
495
WriteRadioStateResponseInfo(int64_t & index,MessageParcel & data,bool result,std::shared_ptr<RadioResponseInfo> & responseInfo) const496 bool RadioInfo::WriteRadioStateResponseInfo(
497 int64_t &index, MessageParcel &data, bool result, std::shared_ptr<RadioResponseInfo> &responseInfo) const
498 {
499 index = responseInfo->flag;
500 if (!data.WriteBool(result) || !data.WriteInt32(static_cast<int32_t>(responseInfo->error))) {
501 NetworkUtils::RemoveCallbackFromMap(index);
502 return false;
503 }
504 return true;
505 }
506
WriteRadioStateObject(int64_t & index,MessageParcel & data,bool state,std::unique_ptr<RadioStateInfo> & object) const507 bool RadioInfo::WriteRadioStateObject(
508 int64_t &index, MessageParcel &data, bool state, std::unique_ptr<RadioStateInfo> &object) const
509 {
510 index = object->flag;
511 if (!data.WriteBool(state) || !data.WriteInt32(TELEPHONY_SUCCESS)) {
512 NetworkUtils::RemoveCallbackFromMap(index);
513 return false;
514 }
515 return true;
516 }
517
UpdateInfoOfSetRadioState(ModemPowerState & radioState,bool result,MessageParcel & data,int64_t index) const518 void RadioInfo::UpdateInfoOfSetRadioState(
519 ModemPowerState &radioState, bool result, MessageParcel &data, int64_t index) const
520 {
521 std::shared_ptr<NetworkSearchManager> nsm = networkSearchManager_.lock();
522 if (nsm == nullptr) {
523 TELEPHONY_LOGE("RadioInfo::ProcessSetRadioState NetworkSearchManager is nullptr slotId:%{public}d", slotId_);
524 return;
525 }
526 std::shared_ptr<NetworkSearchCallbackInfo> callbackInfo = NetworkUtils::FindNetworkSearchCallback(index);
527 if (callbackInfo != nullptr) {
528 if (result) {
529 nsm->SetRadioStateValue(slotId_, static_cast<ModemPowerState>(callbackInfo->param_));
530 radioState = static_cast<ModemPowerState>(callbackInfo->param_);
531 }
532 sptr<INetworkSearchCallback> callback = callbackInfo->networkSearchItem_;
533 if (callback != nullptr && callback->OnNetworkSearchCallback(
534 INetworkSearchCallback::NetworkSearchCallback::SET_RADIO_STATUS_RESULT, data)) {
535 TELEPHONY_LOGE("RadioInfo::ProcessSetRadioState callback fail slotId:%{public}d", slotId_);
536 }
537 NetworkUtils::RemoveCallbackFromMap(index);
538 } else {
539 nsm->SetLocateUpdate(slotId_);
540 }
541 if (result) {
542 RadioFirstPowerOn(nsm, radioState);
543 }
544 }
545 } // namespace Telephony
546 } // namespace OHOS
547