• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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