• 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 {
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