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