• 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 "cellular_data_handler.h"
17 
18 #include "cellular_data_constant.h"
19 #include "cellular_data_error.h"
20 #include "cellular_data_hisysevent.h"
21 #include "cellular_data_service.h"
22 #include "cellular_data_settings_rdb_helper.h"
23 #include "cellular_data_types.h"
24 #include "cellular_data_utils.h"
25 #include "common_event_manager.h"
26 #include "common_event_support.h"
27 #include "core_manager_inner.h"
28 #include "hitrace_meter.h"
29 #include "tel_ril_call_parcel.h"
30 #include "net_specifier.h"
31 #include "net_all_capabilities.h"
32 #include "radio_event.h"
33 #include "str_convert.h"
34 #include "string_ex.h"
35 #include "telephony_log_wrapper.h"
36 #include "telephony_ext_wrapper.h"
37 #include "telephony_permission.h"
38 #include "ipc_skeleton.h"
39 #include "connection_retry_policy.h"
40 namespace OHOS {
41 namespace Telephony {
42 using namespace AppExecFwk;
43 using namespace OHOS::EventFwk;
44 using namespace NetManagerStandard;
45 static const int32_t ESM_FLAG_INVALID = -1;
46 const std::string DEFAULT_DATA_ROAMING = "persist.telephony.defaultdataroaming";
CellularDataHandler(const EventFwk::CommonEventSubscribeInfo & sp,int32_t slotId)47 CellularDataHandler::CellularDataHandler(const EventFwk::CommonEventSubscribeInfo &sp, int32_t slotId)
48     : TelEventHandler("CellularDataHandler"), CommonEventSubscriber(sp), slotId_(slotId)
49 {}
50 
Init()51 void CellularDataHandler::Init()
52 {
53     lastApnItem_ = new ApnItem();
54     apnManager_ = std::make_unique<ApnManager>().release();
55     dataSwitchSettings_ = std::make_unique<DataSwitchSettings>(slotId_);
56     connectionManager_ = std::make_unique<DataConnectionManager>(slotId_).release();
57     settingObserver_ = new (std::nothrow) CellularDataSettingObserver(
58         std::weak_ptr<TelEventHandler>(std::static_pointer_cast<TelEventHandler>(shared_from_this())));
59     roamingObserver_ = new (std::nothrow) CellularDataRoamingObserver(
60         std::weak_ptr<TelEventHandler>(std::static_pointer_cast<TelEventHandler>(shared_from_this())), slotId_);
61     incallObserver_ = new (std::nothrow) CellularDataIncallObserver(
62         std::weak_ptr<TelEventHandler>(std::static_pointer_cast<TelEventHandler>(shared_from_this())));
63     cellularDataRdbObserver_ = new (std::nothrow) CellularDataRdbObserver(
64         std::weak_ptr<TelEventHandler>(std::static_pointer_cast<TelEventHandler>(shared_from_this())));
65     airplaneObserver_ = new (std::nothrow) CellularDataAirplaneObserver();
66     if ((apnManager_ == nullptr) || (dataSwitchSettings_ == nullptr) || (connectionManager_ == nullptr)) {
67         TELEPHONY_LOGE("Slot%{public}d: apnManager_ or dataSwitchSettings_ or connectionManager_ is null", slotId_);
68         return;
69     }
70     connectionManager_->Init();
71     apnManager_->InitApnHolders();
72     dataSwitchSettings_->LoadSwitchValue();
73     GetConfigurationFor5G();
74     SetRilLinkBandwidths();
75 }
76 
~CellularDataHandler()77 CellularDataHandler::~CellularDataHandler() {}
78 
ReleaseNet(const NetRequest & request)79 bool CellularDataHandler::ReleaseNet(const NetRequest &request)
80 {
81     std::unique_ptr<NetRequest> netRequest = std::make_unique<NetRequest>();
82     if (netRequest == nullptr) {
83         TELEPHONY_LOGE("Netrequest is null");
84         return false;
85     }
86     netRequest->capability = ApnManager::FindBestCapability(request.capability);
87     netRequest->ident = request.ident;
88     AppExecFwk::InnerEvent::Pointer event =
89         InnerEvent::Get(CellularDataEventCode::MSG_REQUEST_NETWORK, netRequest, TYPE_RELEASE_NET);
90     if (event == nullptr) {
91         TELEPHONY_LOGE("event is null");
92         return false;
93     }
94     return SendEvent(event);
95 }
96 
RequestNet(const NetRequest & request)97 bool CellularDataHandler::RequestNet(const NetRequest &request)
98 {
99     std::unique_ptr<NetRequest> netRequest = std::make_unique<NetRequest>();
100     if (netRequest == nullptr) {
101         TELEPHONY_LOGE("Netrequest is null");
102         return false;
103     }
104     netRequest->capability = ApnManager::FindBestCapability(request.capability);
105     netRequest->ident = request.ident;
106     netRequest->registerType = request.registerType;
107     netRequest->bearTypes = request.bearTypes;
108     netRequest->uid = request.uid;
109     AppExecFwk::InnerEvent::Pointer event =
110         InnerEvent::Get(CellularDataEventCode::MSG_REQUEST_NETWORK, netRequest, TYPE_REQUEST_NET);
111     return SendEvent(event);
112 }
113 
AddUid(const NetRequest & request)114 bool CellularDataHandler::AddUid(const NetRequest &request)
115 {
116     int32_t id = ApnManager::FindApnIdByCapability(ApnManager::FindBestCapability(request.capability));
117 
118     if (!apnManager_) {
119         TELEPHONY_LOGE("apnManager_ is nullptr");
120         return false;
121     }
122 
123     sptr<ApnHolder> apnHolder = apnManager_->FindApnHolderById(id);
124     if (apnHolder == nullptr) {
125         TELEPHONY_LOGE("apnHolder is nullptr");
126         return false;
127     }
128     apnHolder->AddUid(request.uid);
129 
130     return true;
131 }
132 
RemoveUid(const NetRequest & request)133 bool CellularDataHandler::RemoveUid(const NetRequest &request)
134 {
135     int32_t id = ApnManager::FindApnIdByCapability(ApnManager::FindBestCapability(request.capability));
136 
137     if (!apnManager_) {
138         TELEPHONY_LOGE("apnManager_ is nullptr");
139         return false;
140     }
141 
142     sptr<ApnHolder> apnHolder = apnManager_->FindApnHolderById(id);
143     if (apnHolder == nullptr) {
144         TELEPHONY_LOGE("apnHolder is nullptr");
145         return false;
146     }
147     apnHolder->RemoveUid(request.uid);
148     return true;
149 }
150 
SetCellularDataEnable(bool userDataOn)151 int32_t CellularDataHandler::SetCellularDataEnable(bool userDataOn)
152 {
153     if (dataSwitchSettings_ == nullptr) {
154         TELEPHONY_LOGE("Slot%{public}d: dataSwitchSettings_ is null.", slotId_);
155         return TELEPHONY_ERR_LOCAL_PTR_NULL;
156     }
157     bool dataEnabled = true;
158     int32_t result = dataSwitchSettings_->QueryUserDataStatus(dataEnabled);
159     if (result != TELEPHONY_ERR_SUCCESS) {
160         TELEPHONY_LOGE("Slot%{public}d: Query result: %{public}d", slotId_, result);
161     }
162     if (dataEnabled == userDataOn) {
163         TELEPHONY_LOGI("Slot%{public}d: The status of the cellular data switch has not changed", slotId_);
164         return TELEPHONY_ERR_SUCCESS;
165     }
166 
167 #ifdef OHOS_BUILD_ENABLE_TELEPHONY_EXT
168     if (TELEPHONY_EXT_WRAPPER.sendDataSwitchChangeInfo_) {
169         int32_t callingUid = IPCSkeleton::GetCallingUid();
170         std::string bundleName = "";
171         TelephonyPermission::GetBundleNameByUid(callingUid, bundleName);
172         TELEPHONY_EXT_WRAPPER.sendDataSwitchChangeInfo_(bundleName.c_str(), userDataOn);
173     }
174 #endif
175     return dataSwitchSettings_->SetUserDataOn(userDataOn);
176 }
177 
SetIntelligenceSwitchEnable(bool userSwitchOn)178 int32_t CellularDataHandler::SetIntelligenceSwitchEnable(bool userSwitchOn)
179 {
180     if (dataSwitchSettings_ == nullptr) {
181         TELEPHONY_LOGE("Slot%{public}d: dataSwitchSettings_ is null.", slotId_);
182         return TELEPHONY_ERR_LOCAL_PTR_NULL;
183     }
184     bool switchEnabled = false;
185     int32_t result = dataSwitchSettings_->QueryIntelligenceSwitchStatus(switchEnabled);
186     if (result != TELEPHONY_ERR_SUCCESS) {
187         TELEPHONY_LOGE("Slot%{public}d: Query result: %{public}d", slotId_, result);
188     }
189     if (switchEnabled == userSwitchOn) {
190         TELEPHONY_LOGI("Slot%{public}d: The status of the cellular data switch has not changed", slotId_);
191         return TELEPHONY_ERR_SUCCESS;
192     }
193     return dataSwitchSettings_->SetIntelliSwitchOn(userSwitchOn);
194 }
195 
IsCellularDataEnabled(bool & dataEnabled) const196 int32_t CellularDataHandler::IsCellularDataEnabled(bool &dataEnabled) const
197 {
198     if (dataSwitchSettings_ == nullptr) {
199         TELEPHONY_LOGE("Slot%{public}d: dataSwitchSettings_ is null", slotId_);
200         return TELEPHONY_ERR_LOCAL_PTR_NULL;
201     }
202     return dataSwitchSettings_->QueryUserDataStatus(dataEnabled);
203 }
204 
IsCellularDataRoamingEnabled(bool & dataRoamingEnabled) const205 int32_t CellularDataHandler::IsCellularDataRoamingEnabled(bool &dataRoamingEnabled) const
206 {
207     if (slotId_ != CELLULAR_DATA_VSIM_SLOT_ID) {
208         int32_t simId = CoreManagerInner::GetInstance().GetSimId(slotId_);
209         if (simId <= INVALID_SIM_ID) {
210             TELEPHONY_LOGE("Slot%{public}d: invalid sim id %{public}d", slotId_, simId);
211             return TELEPHONY_ERR_LOCAL_PTR_NULL;
212         }
213     }
214     dataRoamingEnabled = defaultDataRoamingEnable_;
215     if (dataSwitchSettings_ == nullptr) {
216         TELEPHONY_LOGE("Slot%{public}d: dataSwitchSettings_ is null", slotId_);
217         return TELEPHONY_ERR_LOCAL_PTR_NULL;
218     }
219     dataSwitchSettings_->QueryUserDataRoamingStatus(dataRoamingEnabled);
220     return TELEPHONY_ERR_SUCCESS;
221 }
222 
GetIntelligenceSwitchState(bool & switchState)223 int32_t CellularDataHandler::GetIntelligenceSwitchState(bool &switchState)
224 {
225     if (dataSwitchSettings_ == nullptr) {
226         TELEPHONY_LOGE("Slot%{public}d: dataSwitchSettings_ is null.", slotId_);
227         return TELEPHONY_ERR_LOCAL_PTR_NULL;
228     }
229     bool switchEnabled = false;
230     int32_t result = dataSwitchSettings_->QueryIntelligenceSwitchStatus(switchEnabled);
231     if (result != TELEPHONY_ERR_SUCCESS) {
232         TELEPHONY_LOGE("Slot%{public}d: Query result: %{public}d", slotId_, result);
233     }
234     TELEPHONY_LOGI("GetIntelligenceSwitchState: %{public}d    -- %{public}d", switchState, switchEnabled);
235     switchState = switchEnabled;
236     return result;
237 }
238 
SetCellularDataRoamingEnabled(bool dataRoamingEnabled)239 int32_t CellularDataHandler::SetCellularDataRoamingEnabled(bool dataRoamingEnabled)
240 {
241     if (dataSwitchSettings_ == nullptr) {
242         TELEPHONY_LOGE("Slot%{public}d: dataSwitchSettings_ is null", slotId_);
243         return TELEPHONY_ERR_LOCAL_PTR_NULL;
244     }
245     bool currentDataRoamEnabled = defaultDataRoamingEnable_;
246     int32_t result = dataSwitchSettings_->QueryUserDataRoamingStatus(currentDataRoamEnabled);
247     if (result != TELEPHONY_ERR_SUCCESS) {
248         TELEPHONY_LOGE("Slot%{public}d: Query result: %{public}d", slotId_, result);
249     }
250     if (currentDataRoamEnabled == dataRoamingEnabled) {
251         TELEPHONY_LOGI("Slot%{public}d: The status of the data roam switch has not changed", slotId_);
252         return TELEPHONY_ERR_SUCCESS;
253     }
254     return dataSwitchSettings_->SetUserDataRoamingOn(dataRoamingEnabled);
255 }
256 
ClearAllConnections(DisConnectionReason reason)257 void CellularDataHandler::ClearAllConnections(DisConnectionReason reason)
258 {
259     if (apnManager_ == nullptr) {
260         TELEPHONY_LOGE("Slot%{public}d: apnManager is null", slotId_);
261         return;
262     }
263     for (const sptr<ApnHolder> &apn : apnManager_->GetAllApnHolder()) {
264         ClearConnection(apn, reason);
265     }
266 
267     if (connectionManager_ == nullptr) {
268         TELEPHONY_LOGE("Slot%{public}d: connectionManager_ is null", slotId_);
269         return;
270     }
271     connectionManager_->StopStallDetectionTimer();
272     connectionManager_->EndNetStatistics();
273 
274     ResetDataFlowType();
275 }
276 
ClearConnectionsOnUpdateApns(DisConnectionReason reason)277 void CellularDataHandler::ClearConnectionsOnUpdateApns(DisConnectionReason reason)
278 {
279     if (apnManager_ == nullptr) {
280         TELEPHONY_LOGE("Slot%{public}d: apnManager is null", slotId_);
281         return;
282     }
283     bool isRoaming = false;
284     int32_t result = IsCellularDataRoamingEnabled(isRoaming);
285     if (result != TELEPHONY_ERR_SUCCESS) {
286         isRoaming = false;
287     }
288     auto apnItem = apnManager_->GetRilAttachApn();
289     if (apnItem != nullptr) {
290         TELEPHONY_LOGI("update preferId=%{public}d", apnItem->attr_.profileId_);
291         UpdateApnInfo(apnItem->attr_.profileId_);
292     }
293     if (!ApnHolder::IsCompatibleApnItem(lastApnItem_, apnItem, isRoaming)) {
294         ClearAllConnections(reason);
295         if (lastApnItem_ == nullptr) {
296             lastApnItem_ = new ApnItem();
297         }
298         if (apnItem == nullptr) {
299             return;
300         }
301         *lastApnItem_ = *apnItem;
302     }
303 }
304 
ResetDataFlowType()305 void CellularDataHandler::ResetDataFlowType()
306 {
307     if (dataSwitchSettings_ == nullptr) {
308         TELEPHONY_LOGE("Slot%{public}d: in ClearAllConnections dataSwitchSettings_ is null", slotId_);
309         return;
310     }
311     bool dataEnabled = dataSwitchSettings_->IsUserDataOn();
312     if (!dataEnabled) {
313         connectionManager_->SetDataFlowType(CellDataFlowType::DATA_FLOW_TYPE_NONE);
314     }
315 }
316 
ClearConnection(const sptr<ApnHolder> & apn,DisConnectionReason reason)317 void CellularDataHandler::ClearConnection(const sptr<ApnHolder> &apn, DisConnectionReason reason)
318 {
319     if (apn == nullptr) {
320         TELEPHONY_LOGE("Slot%{public}d: apnHolder is null", slotId_);
321         return;
322     }
323     std::shared_ptr<CellularDataStateMachine> stateMachine = apn->GetCellularDataStateMachine();
324     if (stateMachine == nullptr) {
325         TELEPHONY_LOGD("Slot%{public}d: stateMachine is null", slotId_);
326         return;
327     }
328     TELEPHONY_LOGI("Slot%{public}d: The APN holder is of type %{public}s, reason:%{public}d",
329         slotId_, apn->GetApnType().c_str(), reason);
330     std::unique_ptr<DataDisconnectParams> object = std::make_unique<DataDisconnectParams>(apn->GetApnType(), reason);
331     if (object == nullptr) {
332         TELEPHONY_LOGE("Slot%{public}d: ClearConnection fail, object is null", slotId_);
333         return;
334     }
335     ApnProfileState apnState = apn->GetApnState();
336     if (apnState == ApnProfileState::PROFILE_STATE_IDLE ||
337         apnState == ApnProfileState::PROFILE_STATE_DISCONNECTING ||
338         apnState == ApnProfileState::PROFILE_STATE_RETRYING) {
339         TELEPHONY_LOGE("Slot%{public}d: apn state has been idle, disconnecting, or retrying", slotId_);
340         return;
341     }
342     apn->SetApnState(PROFILE_STATE_DISCONNECTING);
343     CellularDataHiSysEvent::WriteDataConnectStateBehaviorEvent(slotId_, apn->GetApnType(),
344         apn->GetCapability(), static_cast<int32_t>(PROFILE_STATE_DISCONNECTING));
345     InnerEvent::Pointer event = InnerEvent::Get(CellularDataEventCode::MSG_SM_DISCONNECT, object);
346     stateMachine->SendEvent(event);
347 }
348 
GetCellularDataState() const349 ApnProfileState CellularDataHandler::GetCellularDataState() const
350 {
351     if (apnManager_ == nullptr) {
352         TELEPHONY_LOGE("Slot%{public}d: apnManager is null", slotId_);
353         return ApnProfileState::PROFILE_STATE_IDLE;
354     }
355     return apnManager_->GetOverallApnState();
356 }
357 
GetCellularDataState(const std::string & apnType) const358 ApnProfileState CellularDataHandler::GetCellularDataState(const std::string &apnType) const
359 {
360     if (apnManager_ == nullptr) {
361         TELEPHONY_LOGE("Slot%{public}d: apnManager is null", slotId_);
362         return ApnProfileState::PROFILE_STATE_IDLE;
363     }
364     sptr<ApnHolder> apnHolder = apnManager_->GetApnHolder(apnType);
365     if (apnHolder == nullptr) {
366         TELEPHONY_LOGE("Slot%{public}d: apnHolder is null", slotId_);
367         return ApnProfileState::PROFILE_STATE_IDLE;
368     }
369     return apnHolder->GetApnState();
370 }
371 
RadioPsConnectionAttached(const InnerEvent::Pointer & event)372 void CellularDataHandler::RadioPsConnectionAttached(const InnerEvent::Pointer &event)
373 {
374     TELEPHONY_LOGI("Slot%{public}d: ps attached", slotId_);
375     if (event == nullptr || apnManager_ == nullptr) {
376         TELEPHONY_LOGE("Slot%{public}d: event or apnManager_ is null", slotId_);
377         return;
378     }
379     EstablishAllApnsIfConnectable();
380 }
381 
RoamingStateOn(const InnerEvent::Pointer & event)382 void CellularDataHandler::RoamingStateOn(const InnerEvent::Pointer &event)
383 {
384     TELEPHONY_LOGI("Slot%{public}d: roaming on", slotId_);
385     if (event == nullptr || dataSwitchSettings_ == nullptr || apnManager_ == nullptr) {
386         TELEPHONY_LOGE("Slot%{public}d: event or dataSwitchSettings_ or apnManager_ is null", slotId_);
387         return;
388     }
389     bool roamingState = false;
390     if (CoreManagerInner::GetInstance().GetPsRoamingState(slotId_) > 0) {
391         roamingState = true;
392     }
393     if (!roamingState) {
394         TELEPHONY_LOGE("Slot%{public}d: device not currently roaming state", slotId_);
395         return;
396     }
397     bool dataRoamingEnabled = false;
398     int32_t res = IsCellularDataRoamingEnabled(dataRoamingEnabled);
399     if (res != TELEPHONY_ERR_SUCCESS) {
400         dataRoamingEnabled = false;
401     }
402     ApnProfileState apnState = apnManager_->GetOverallApnState();
403     if ((apnState == ApnProfileState::PROFILE_STATE_CONNECTING || apnState == ApnProfileState::PROFILE_STATE_CONNECTED)
404         && !dataRoamingEnabled) {
405         ClearAllConnections(DisConnectionReason::REASON_RETRY_CONNECTION);
406     }
407     EstablishAllApnsIfConnectable();
408 }
409 
RoamingStateOff(const InnerEvent::Pointer & event)410 void CellularDataHandler::RoamingStateOff(const InnerEvent::Pointer &event)
411 {
412     TELEPHONY_LOGI("Slot%{public}d: roaming off", slotId_);
413     if (event == nullptr || dataSwitchSettings_ == nullptr || apnManager_ == nullptr) {
414         TELEPHONY_LOGE("Slot%{public}d: event or dataSwitchSettings_ or apnManager_ is null", slotId_);
415         return;
416     }
417     bool dataRoamingEnabled = false;
418     int32_t res = IsCellularDataRoamingEnabled(dataRoamingEnabled);
419     if (res != TELEPHONY_ERR_SUCCESS) {
420         dataRoamingEnabled = false;
421     }
422     if (!dataRoamingEnabled) {
423         ApnProfileState apnState = apnManager_->GetOverallApnState();
424         if (apnState == ApnProfileState::PROFILE_STATE_CONNECTING ||
425             apnState == ApnProfileState::PROFILE_STATE_CONNECTED) {
426             ClearAllConnections(DisConnectionReason::REASON_RETRY_CONNECTION);
427         }
428         EstablishAllApnsIfConnectable();
429     }
430 }
431 
PsRadioEmergencyStateOpen(const InnerEvent::Pointer & event)432 void CellularDataHandler::PsRadioEmergencyStateOpen(const InnerEvent::Pointer &event)
433 {
434     TELEPHONY_LOGI("Slot%{public}d: emergency on", slotId_);
435     ApnProfileState currentState = apnManager_->GetOverallApnState();
436     if (currentState == ApnProfileState::PROFILE_STATE_CONNECTED ||
437         currentState == ApnProfileState::PROFILE_STATE_CONNECTING) {
438         ClearAllConnections(DisConnectionReason::REASON_CLEAR_CONNECTION);
439     }
440 }
441 
PsRadioEmergencyStateClose(const InnerEvent::Pointer & event)442 void CellularDataHandler::PsRadioEmergencyStateClose(const InnerEvent::Pointer &event)
443 {
444     TELEPHONY_LOGI("Slot%{public}d: emergency off", slotId_);
445     ApnProfileState currentState = apnManager_->GetOverallApnState();
446     if (currentState == ApnProfileState::PROFILE_STATE_IDLE ||
447         currentState == ApnProfileState::PROFILE_STATE_DISCONNECTING) {
448         EstablishAllApnsIfConnectable();
449     }
450 }
451 
EstablishAllApnsIfConnectable()452 void CellularDataHandler::EstablishAllApnsIfConnectable()
453 {
454     if (apnManager_ == nullptr) {
455         TELEPHONY_LOGE("Slot%{public}d: apnManager is null", slotId_);
456         return;
457     }
458     apnManager_->ClearAllApnBad();
459     for (sptr<ApnHolder> apnHolder : apnManager_->GetSortApnHolder()) {
460         if (apnHolder == nullptr) {
461             TELEPHONY_LOGE("Slot%{public}d: apn is null", slotId_);
462             continue;
463         }
464         if (apnHolder->IsDataCallEnabled()) {
465             UpdateCellularDataConnectState(apnHolder->GetApnType());
466             ApnProfileState apnState = apnHolder->GetApnState();
467             if (apnState == PROFILE_STATE_FAILED || apnState == PROFILE_STATE_RETRYING) {
468                 apnHolder->ReleaseDataConnection();
469             }
470             AttemptEstablishDataConnection(apnHolder);
471         }
472     }
473 }
474 
SetDataPermittedForMms(bool dataPermittedForMms)475 bool CellularDataHandler::SetDataPermittedForMms(bool dataPermittedForMms)
476 {
477     if (incallDataStateMachine_ != nullptr) {
478         TELEPHONY_LOGI("Slot%{public}d: incall data active", slotId_);
479         return false;
480     }
481     if (CheckDataPermittedByDsds()) {
482         TELEPHONY_LOGI("Slot%{public}d: data permitted", slotId_);
483         return false;
484     }
485     CoreManagerInner &coreInner = CoreManagerInner::GetInstance();
486     const int32_t defSlotId = coreInner.GetDefaultCellularDataSlotId();
487     SetDataPermitted(defSlotId, !dataPermittedForMms);
488 #ifdef OHOS_BUILD_ENABLE_TELEPHONY_EXT
489     if (TELEPHONY_EXT_WRAPPER.isVSimEnabled_ && TELEPHONY_EXT_WRAPPER.isVSimEnabled_()) {
490         SetDataPermitted(CELLULAR_DATA_VSIM_SLOT_ID, !dataPermittedForMms);
491     }
492 #endif
493     SetDataPermitted(slotId_, dataPermittedForMms);
494     DelayedRefSingleton<CellularDataService>::GetInstance().ChangeConnectionForDsds(defSlotId, !dataPermittedForMms);
495     return true;
496 }
497 
CheckDataPermittedByDsds()498 bool CellularDataHandler::CheckDataPermittedByDsds()
499 {
500     if (TELEPHONY_EXT_WRAPPER.getVSimSlotId_) {
501         int vSimSlotId = INVALID_SLOT_ID;
502         TELEPHONY_EXT_WRAPPER.getVSimSlotId_(vSimSlotId);
503         if (vSimSlotId == CELLULAR_DATA_VSIM_SLOT_ID && slotId_ == CELLULAR_DATA_VSIM_SLOT_ID) {
504             return true;
505         }
506     }
507     CoreManagerInner &coreInner = CoreManagerInner::GetInstance();
508     const int32_t defSlotId = coreInner.GetDefaultCellularDataSlotId();
509     int32_t dsdsMode = DSDS_MODE_V2;
510     coreInner.GetDsdsMode(dsdsMode);
511     if (defSlotId != slotId_ && dsdsMode == DSDS_MODE_V2) {
512         TELEPHONY_LOGI("Slot%{public}d: default:%{public}d, current:%{public}d, dsdsMode:%{public}d", slotId_,
513             defSlotId, slotId_, dsdsMode);
514         return false;
515     }
516     return true;
517 }
518 
CheckCellularDataSlotId(sptr<ApnHolder> & apnHolder)519 bool CellularDataHandler::CheckCellularDataSlotId(sptr<ApnHolder> &apnHolder)
520 {
521     if (apnHolder == nullptr) {
522         TELEPHONY_LOGE("Slot%{public}d: apnHolder is null", slotId_);
523         return false;
524     }
525     if (IsVSimSlotId(slotId_)) {
526         return true;
527     }
528     CoreManagerInner &coreInner = CoreManagerInner::GetInstance();
529     const int32_t defSlotId = coreInner.GetDefaultCellularDataSlotId();
530     std::string apnType = apnHolder->GetApnType();
531     if (defSlotId != slotId_ && !apnType.compare(DATA_CONTEXT_ROLE_INTERNAL_DEFAULT)) {
532         TELEPHONY_LOGD("Slot%{public}d: internalDefault:%{public}d, current:%{public}d", slotId_, defSlotId, slotId_);
533         return false;
534     }
535 #ifdef OHOS_BUILD_ENABLE_TELEPHONY_EXT
536     if (slotId_ != CELLULAR_DATA_VSIM_SLOT_ID && !apnHolder->IsMmsType() &&
537         TELEPHONY_EXT_WRAPPER.isVSimEnabled_ && TELEPHONY_EXT_WRAPPER.isVSimEnabled_()) {
538         TELEPHONY_LOGE("slot%{public}d, VSimEnabled & not mms type, ret false", slotId_);
539         return false;
540     }
541     if (TELEPHONY_EXT_WRAPPER.isDualCellularCardAllowed_) {
542         if (TELEPHONY_EXT_WRAPPER.isDualCellularCardAllowed_()) {
543             return true;
544         }
545     }
546 #endif
547 
548     if (defSlotId != slotId_ && !apnType.compare(DATA_CONTEXT_ROLE_DEFAULT)) {
549         TELEPHONY_LOGD("Slot%{public}d: default:%{public}d, current:%{public}d", slotId_, defSlotId, slotId_);
550         CellularDataHiSysEvent::WriteDataActivateFaultEvent(slotId_, SWITCH_ON,
551             CellularDataErrorCode::DATA_ERROR_CELLULAR_DATA_SLOT_ID_MISMATCH,
552             "Default cellular data slot id is not current slot id");
553         return false;
554     }
555     return true;
556 }
557 
CheckAttachAndSimState(sptr<ApnHolder> & apnHolder)558 bool CellularDataHandler::CheckAttachAndSimState(sptr<ApnHolder> &apnHolder)
559 {
560     if (apnHolder == nullptr) {
561         TELEPHONY_LOGE("Slot%{public}d: apnHolder is null", slotId_);
562         return false;
563     }
564     CoreManagerInner &coreInner = CoreManagerInner::GetInstance();
565     bool attached = coreInner.GetPsRegState(slotId_) == (int32_t)RegServiceState::REG_STATE_IN_SERVICE;
566     bool isSimStateReadyOrLoaded = IsSimStateReadyOrLoaded();
567     TELEPHONY_LOGD("Slot%{public}d: attached: %{public}d simState: %{public}d isRilApnAttached: %{public}d",
568         slotId_, attached, isSimStateReadyOrLoaded, isRilApnAttached_);
569     if (apnHolder->IsMmsType() && isSimStateReadyOrLoaded && !attached) {
570         if (!HasInnerEvent(CellularDataEventCode::MSG_RESUME_DATA_PERMITTED_TIMEOUT)) {
571             SendEvent(CellularDataEventCode::MSG_RESUME_DATA_PERMITTED_TIMEOUT,
572                 apnHolder->IsMmsType(), RESUME_DATA_PERMITTED_TIMEOUT);
573         }
574         SetDataPermittedForMms(true);
575         return false;
576     }
577     bool isEmergencyApn = apnHolder->IsEmergencyType();
578     if (!isEmergencyApn && !attached) {
579         CellularDataHiSysEvent::WriteDataActivateFaultEvent(slotId_, SWITCH_ON,
580             CellularDataErrorCode::DATA_ERROR_PS_NOT_ATTACH, "It is not emergencyApn and not attached");
581         return false;
582     }
583     if (!isEmergencyApn && !isSimStateReadyOrLoaded) {
584         CellularDataHiSysEvent::WriteDataActivateFaultEvent(slotId_, SWITCH_ON,
585             CellularDataErrorCode::DATA_ERROR_SIM_NOT_READY, "It is not emergencyApn and sim not ready");
586         return false;
587     }
588     return isEmergencyApn || isSimStateReadyOrLoaded;
589 }
590 
CheckRoamingState(sptr<ApnHolder> & apnHolder)591 bool CellularDataHandler::CheckRoamingState(sptr<ApnHolder> &apnHolder)
592 {
593     if (dataSwitchSettings_ == nullptr || apnHolder == nullptr) {
594         TELEPHONY_LOGE("Slot%{public}d: dataSwitchSettings_ or apnManager_ is null", slotId_);
595         return false;
596     }
597     if (IsVSimSlotId(slotId_)) {
598         return true;
599     }
600     CoreManagerInner &coreInner = CoreManagerInner::GetInstance();
601     bool isEmergencyApn = apnHolder->IsEmergencyType();
602     bool isMmsApn = apnHolder->IsMmsType();
603     bool isBipApn = apnHolder->IsBipType();
604     bool isAllowActiveData = dataSwitchSettings_->IsAllowActiveData();
605     bool roamingState = coreInner.GetPsRoamingState(slotId_) > 0;
606     bool dataRoamingEnabled = dataSwitchSettings_->IsUserDataRoamingOn();
607     if (roamingState && !dataRoamingEnabled) {
608         isAllowActiveData = false;
609     } else if (isMmsApn || isBipApn) {
610         isAllowActiveData = true;
611     }
612     if (isEmergencyApn) {
613         isAllowActiveData = true;
614     }
615 
616 #ifdef OHOS_BUILD_ENABLE_TELEPHONY_EXT
617     if (TELEPHONY_EXT_WRAPPER.isApnAllowedActive_) {
618         std::string apnHolderType = apnHolder->GetApnType();
619         isAllowActiveData =
620             TELEPHONY_EXT_WRAPPER.isApnAllowedActive_(slotId_, apnHolderType.c_str(), isAllowActiveData);
621     }
622 #endif
623 
624     if (!isAllowActiveData) {
625         CellularDataHiSysEvent::WriteDataActivateFaultEvent(slotId_, SWITCH_ON,
626             CellularDataErrorCode::DATA_ERROR_ROAMING_SWITCH_OFF_AND_ROAMING, "Data roaming is not on and is roaming");
627         TELEPHONY_LOGD("Slot%{public}d: AllowActiveData:%{public}d lastCallState_:%{public}d", slotId_,
628             isAllowActiveData, lastCallState_);
629         return false;
630     }
631     if (IsRestrictedMode()) {
632         CellularDataHiSysEvent::WriteDataActivateFaultEvent(slotId_, SWITCH_ON,
633             CellularDataErrorCode::DATA_ERROR_CALL_AND_DATA_NOT_CONCURRENCY,
634             "CS call and data are not allowed concurrency");
635         TELEPHONY_LOGD("Slot%{public}d: AllowActiveData:%{public}d lastCallState_:%{public}d", slotId_,
636             isAllowActiveData, lastCallState_);
637         return false;
638     }
639     return true;
640 }
641 
CheckApnState(sptr<ApnHolder> & apnHolder)642 bool CellularDataHandler::CheckApnState(sptr<ApnHolder> &apnHolder)
643 {
644     if (apnManager_ == nullptr || apnHolder == nullptr) {
645         TELEPHONY_LOGE("Slot%{public}d: apnManager_ or apnManager_ is null", slotId_);
646         return false;
647     }
648     if (apnHolder->GetApnState() == PROFILE_STATE_DISCONNECTING &&
649         !HasInnerEvent(CellularDataEventCode::MSG_ESTABLISH_DATA_CONNECTION)) {
650         TELEPHONY_LOGI("Slot%{public}d: APN holder is disconnecting", slotId_);
651         int32_t id = apnManager_->FindApnIdByApnName(apnHolder->GetApnType());
652         SendEvent(CellularDataEventCode::MSG_ESTABLISH_DATA_CONNECTION, id, ESTABLISH_DATA_CONNECTION_DELAY);
653         return false;
654     }
655     if (apnHolder->GetApnState() == PROFILE_STATE_RETRYING) {
656         TELEPHONY_LOGI("during retry, check state fail");
657         return false;
658     }
659     if (apnHolder->GetApnState() == PROFILE_STATE_FAILED) {
660         apnHolder->SetApnState(PROFILE_STATE_IDLE);
661     }
662     if (apnHolder->GetApnState() != PROFILE_STATE_IDLE) {
663         TELEPHONY_LOGD("Slot%{public}d: APN holder is not idle, apn state is %{public}d",
664             slotId_, apnHolder->GetApnState());
665         return false;
666     }
667     std::vector<sptr<ApnItem>> matchedApns = apnManager_->FilterMatchedApns(apnHolder->GetApnType(), slotId_);
668     if (matchedApns.empty()) {
669         TELEPHONY_LOGE("Slot%{public}d: AttemptEstablishDataConnection:matchedApns is empty", slotId_);
670         return false;
671     }
672     apnHolder->SetAllMatchedApns(matchedApns);
673     return true;
674 }
675 
AttemptEstablishDataConnection(sptr<ApnHolder> & apnHolder)676 void CellularDataHandler::AttemptEstablishDataConnection(sptr<ApnHolder> &apnHolder)
677 {
678     if ((airplaneObserver_ != nullptr) && (airplaneObserver_->IsAirplaneModeOn())) {
679         return;
680     }
681     if (!CheckCellularDataSlotId(apnHolder) || !CheckAttachAndSimState(apnHolder) || !CheckRoamingState(apnHolder)) {
682         return;
683     }
684     DelayedSingleton<CellularDataHiSysEvent>::GetInstance()->SetCellularDataActivateStartTime();
685     StartTrace(HITRACE_TAG_OHOS, "ActivateCellularData");
686     if (!CheckApnState(apnHolder)) {
687         FinishTrace(HITRACE_TAG_OHOS);
688         return;
689     }
690     CoreManagerInner &coreInner = CoreManagerInner::GetInstance();
691     int32_t radioTech = static_cast<int32_t>(RadioTech::RADIO_TECHNOLOGY_INVALID);
692     coreInner.GetPsRadioTech(slotId_, radioTech);
693     if (!EstablishDataConnection(apnHolder, radioTech)) {
694         TELEPHONY_LOGE("Slot%{public}d: Establish data connection fail", slotId_);
695     }
696     FinishTrace(HITRACE_TAG_OHOS);
697     DelayedSingleton<CellularDataHiSysEvent>::GetInstance()->JudgingDataActivateTimeOut(slotId_, SWITCH_ON);
698 }
699 
FindIdleCellularDataConnection() const700 std::shared_ptr<CellularDataStateMachine> CellularDataHandler::FindIdleCellularDataConnection() const
701 {
702     if (connectionManager_ == nullptr) {
703         TELEPHONY_LOGE("Slot%{public}d: connectionManager_ is null", slotId_);
704         return nullptr;
705     }
706     std::vector<std::shared_ptr<CellularDataStateMachine>> allMachines = connectionManager_->GetAllConnectionMachine();
707     for (const std::shared_ptr<CellularDataStateMachine> &connect : allMachines) {
708         if (connect == nullptr || apnManager_ == nullptr) {
709             TELEPHONY_LOGE("Slot%{public}d: CellularDataHandler:stateMachine or apnManager_ is null", slotId_);
710             return nullptr;
711         }
712         if (connect->IsInactiveState() && apnManager_->IsDataConnectionNotUsed(connect)) {
713             return connect;
714         }
715     }
716     return nullptr;
717 }
718 
CreateCellularDataConnect()719 std::shared_ptr<CellularDataStateMachine> CellularDataHandler::CreateCellularDataConnect()
720 {
721     std::shared_ptr<CellularDataStateMachine> cellularDataStateMachine = std::make_shared<CellularDataStateMachine>(
722         connectionManager_, std::static_pointer_cast<TelEventHandler>(shared_from_this()));
723     if (cellularDataStateMachine == nullptr) {
724         TELEPHONY_LOGE("Slot%{public}d: cellularDataStateMachine is null", slotId_);
725         return nullptr;
726     }
727     return cellularDataStateMachine;
728 }
729 
EstablishDataConnection(sptr<ApnHolder> & apnHolder,int32_t radioTech)730 bool CellularDataHandler::EstablishDataConnection(sptr<ApnHolder> &apnHolder, int32_t radioTech)
731 {
732     int32_t profileId = GetCurrentApnId();
733     sptr<ApnItem> apnItem = apnManager_->GetApnItemById(profileId);
734     if (apnItem == nullptr) {
735         TELEPHONY_LOGD("profileId: %{public}d: apnItem is null", profileId);
736         apnItem = apnHolder->GetNextRetryApn();
737     }
738     if (apnItem == nullptr) {
739         TELEPHONY_LOGE("Slot%{public}d: apnItem is null", slotId_);
740         return false;
741     }
742     std::shared_ptr<CellularDataStateMachine> cellularDataStateMachine = nullptr;
743     if (apnHolder->GetApnType() != DATA_CONTEXT_ROLE_DUN) {
744         cellularDataStateMachine = CheckForCompatibleDataConnection(apnHolder);
745         if (cellularDataStateMachine != nullptr) {
746             sptr<ApnItem> dcApnItem = cellularDataStateMachine->GetApnItem();
747             if (dcApnItem != nullptr) {
748                 apnItem = dcApnItem;
749             }
750         }
751     }
752     if (cellularDataStateMachine == nullptr) {
753         if (IsSingleConnectionEnabled(radioTech)) {
754             if (HasAnyHigherPriorityConnection(apnHolder)) {
755                 TELEPHONY_LOGE("Slot%{public}d: has higher priority connection", slotId_);
756                 return false;
757             }
758             ApnProfileState apnState = apnManager_->GetOverallApnState();
759             if (apnState == ApnProfileState::PROFILE_STATE_CONNECTING ||
760                 apnState == ApnProfileState::PROFILE_STATE_CONNECTED) {
761                 ClearAllConnections(DisConnectionReason::REASON_CHANGE_CONNECTION);
762                 return false;
763             }
764         }
765         cellularDataStateMachine = FindIdleCellularDataConnection();
766         if (cellularDataStateMachine == nullptr) {
767             cellularDataStateMachine = CreateCellularDataConnect();
768             if (cellularDataStateMachine == nullptr) {
769                 TELEPHONY_LOGE("Slot%{public}d: cellularDataStateMachine is null", slotId_);
770                 return false;
771             }
772             cellularDataStateMachine->Init();
773             if (connectionManager_ == nullptr) {
774                 TELEPHONY_LOGE("Slot%{public}d: connectionManager_ is null", slotId_);
775                 return false;
776             }
777             connectionManager_->AddConnectionStateMachine(cellularDataStateMachine);
778         }
779     } else {
780         return HandleCompatibleDataConnection(cellularDataStateMachine, apnHolder);
781     }
782     cellularDataStateMachine->SetCapability(apnHolder->GetCapability());
783     apnHolder->SetCurrentApn(apnItem);
784     apnHolder->SetApnState(PROFILE_STATE_CONNECTING);
785     CellularDataHiSysEvent::WriteDataConnectStateBehaviorEvent(slotId_, apnHolder->GetApnType(),
786         apnHolder->GetCapability(), static_cast<int32_t>(PROFILE_STATE_CONNECTING));
787     apnHolder->SetCellularDataStateMachine(cellularDataStateMachine);
788     bool roamingState = CoreManagerInner::GetInstance().GetPsRoamingState(slotId_) > 0;
789     bool userDataRoaming = dataSwitchSettings_->IsUserDataRoamingOn();
790     UpdateCellularDataConnectState(apnHolder->GetApnType());
791     std::unique_ptr<DataConnectionParams> object = std::make_unique<DataConnectionParams>(
792         apnHolder, apnItem->attr_.profileId_, radioTech, roamingState, userDataRoaming, true);
793     TELEPHONY_LOGI("Slot%{public}d: MSG_SM_CONNECT profileId:%{public}d type:%{public}s networkType:%{public}d",
794         slotId_, apnItem->attr_.profileId_, apnHolder->GetApnType().c_str(), radioTech);
795     InnerEvent::Pointer event = InnerEvent::Get(CellularDataEventCode::MSG_SM_CONNECT, object);
796     if (event == nullptr) {
797         TELEPHONY_LOGE("event is null");
798         return false;
799     }
800     cellularDataStateMachine->SendEvent(event);
801     SetApnActivateStart(apnHolder->GetApnType());
802     return true;
803 }
804 
HandleCompatibleDataConnection(std::shared_ptr<CellularDataStateMachine> stateMachine,const sptr<ApnHolder> & apnHolder)805 bool CellularDataHandler::HandleCompatibleDataConnection(
806     std::shared_ptr<CellularDataStateMachine> stateMachine, const sptr<ApnHolder> &apnHolder)
807 {
808     TELEPHONY_LOGI("Enter HandleCompatibleDataConnection");
809     int32_t oldApnId = ApnManager::FindApnIdByCapability(stateMachine->GetCapability());
810     int32_t newApnId = ApnManager::FindApnIdByCapability(apnHolder->GetCapability());
811     if (stateMachine->IsActiveState()) {
812         TELEPHONY_LOGI("set reuse apnId[%{public}d] for apnId[%{public}d]", newApnId, oldApnId);
813         stateMachine->SetReuseApnCap(apnHolder->GetCapability());
814         stateMachine->UpdateReuseApnNetworkInfo(true);
815         return true;
816     }
817     SendEvent(CellularDataEventCode::MSG_ESTABLISH_DATA_CONNECTION, newApnId, ESTABLISH_DATA_CONNECTION_DELAY);
818     return false;
819 }
820 
EstablishDataConnectionComplete(const InnerEvent::Pointer & event)821 void CellularDataHandler::EstablishDataConnectionComplete(const InnerEvent::Pointer &event)
822 {
823     if (event == nullptr) {
824         TELEPHONY_LOGE("Slot%{public}d: event is null", slotId_);
825         return;
826     }
827     std::shared_ptr<SetupDataCallResultInfo> resultInfo = event->GetSharedObject<SetupDataCallResultInfo>();
828     if ((resultInfo != nullptr) && (apnManager_ != nullptr)) {
829         TELEPHONY_LOGI("EstablishDataConnectionComplete reason: %{public}d, flag: %{public}d",
830             resultInfo->reason, resultInfo->flag);
831         SetApnActivateEnd(resultInfo);
832         sptr<ApnHolder> apnHolder = apnManager_->GetApnHolder(apnManager_->FindApnNameByApnId(resultInfo->flag));
833         if (apnHolder == nullptr) {
834             TELEPHONY_LOGE("Slot%{public}d: flag:%{public}d complete apnHolder is null", slotId_, resultInfo->flag);
835             return;
836         }
837         apnHolder->SetApnState(PROFILE_STATE_CONNECTED);
838         CellularDataHiSysEvent::WriteDataConnectStateBehaviorEvent(slotId_, apnHolder->GetApnType(),
839             apnHolder->GetCapability(), static_cast<int32_t>(PROFILE_STATE_CONNECTED));
840         apnHolder->InitialApnRetryCount();
841         if (apnHolder->GetApnType() == DATA_CONTEXT_ROLE_DEFAULT) {
842             TELEPHONY_LOGI("default apn has connected, to setup internal_default apn");
843             SendEvent(CellularDataEventCode::MSG_RETRY_TO_SETUP_DATACALL, DATA_CONTEXT_ROLE_INTERNAL_DEFAULT_ID, 0);
844         }
845         DataConnCompleteUpdateState(apnHolder, resultInfo);
846     }
847 }
848 
DataConnCompleteUpdateState(const sptr<ApnHolder> & apnHolder,const std::shared_ptr<SetupDataCallResultInfo> & resultInfo)849 void CellularDataHandler::DataConnCompleteUpdateState(const sptr<ApnHolder> &apnHolder,
850     const std::shared_ptr<SetupDataCallResultInfo> &resultInfo)
851 {
852     std::shared_ptr<CellularDataStateMachine> stateMachine = apnHolder->GetCellularDataStateMachine();
853     if (stateMachine != nullptr) {
854         std::string proxyIpAddress = "";
855         sptr<ApnItem> attachApn = apnManager_->GetRilAttachApn();
856         if (attachApn != nullptr) {
857             proxyIpAddress = attachApn->attr_.proxyIpAddress_;
858         }
859         stateMachine->UpdateHttpProxy(proxyIpAddress);
860         stateMachine->UpdateNetworkInfo(*resultInfo);
861     } else {
862         apnHolder->SetApnState(PROFILE_STATE_IDLE);
863         TELEPHONY_LOGE(
864             "Slot%{public}d:update network info stateMachine(%{public}d) is null", slotId_, resultInfo->flag);
865     }
866     if (connectionManager_ != nullptr) {
867         connectionManager_->StartStallDetectionTimer();
868         connectionManager_->BeginNetStatistics();
869     }
870     if (!physicalConnectionActiveState_) {
871         physicalConnectionActiveState_ = true;
872         CoreManagerInner::GetInstance().DcPhysicalLinkActiveUpdate(slotId_, physicalConnectionActiveState_);
873     }
874     if (incallDataStateMachine_ != nullptr) {
875         InnerEvent::Pointer incallEvent = InnerEvent::Get(CellularDataEventCode::MSG_SM_INCALL_DATA_DATA_CONNECTED);
876         incallDataStateMachine_->SendEvent(incallEvent);
877     }
878     UpdateCellularDataConnectState(apnHolder->GetApnType());
879     UpdateApnInfo(apnHolder->GetCurrentApn()->attr_.profileId_);
880     if (apnHolder->IsMmsType()) {
881         RemoveEvent(CellularDataEventCode::MSG_RESUME_DATA_PERMITTED_TIMEOUT);
882     }
883 }
884 
CreatorDataShareHelper()885 std::shared_ptr<DataShare::DataShareHelper> CellularDataHandler::CreatorDataShareHelper()
886 {
887     sptr<ISystemAbilityManager> saManager = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
888     if (saManager == nullptr) {
889         TELEPHONY_LOGE("saManager is nullptr.");
890         return nullptr;
891     }
892     sptr<IRemoteObject> remoteObj = saManager->GetSystemAbility(TELEPHONY_CELLULAR_DATA_SYS_ABILITY_ID);
893     if (remoteObj == nullptr) {
894         TELEPHONY_LOGE("remoteObj is nullptr.");
895         return nullptr;
896     }
897     return DataShare::DataShareHelper::Creator(remoteObj, CELLULAR_DATA_RDB_URI);
898 }
899 
GetCurrentDataShareApnInfo(std::shared_ptr<DataShare::DataShareHelper> dataShareHelper,const int32_t simId,int32_t & profileIdValue)900 bool CellularDataHandler::GetCurrentDataShareApnInfo(std::shared_ptr<DataShare::DataShareHelper> dataShareHelper,
901     const int32_t simId, int32_t &profileIdValue)
902 {
903     Uri preferApnUri(std::string(CELLULAR_DATA_RDB_PREFER) + "?simId=" + std::to_string(simId));
904     DataShare::DataSharePredicates predicates;
905     std::vector<std::string> columns;
906     std::shared_ptr<DataShare::DataShareResultSet> resultSet =
907         dataShareHelper->Query(preferApnUri, predicates, columns);
908     if (resultSet == nullptr) {
909         TELEPHONY_LOGI("Query CurrentDataShareApnInfo resultSet is nullptr.");
910         return false;
911     }
912     int count = 0;
913     resultSet->GetRowCount(count);
914     if (count <= 0) {
915         TELEPHONY_LOGI("GetRowCount is NULL.");
916         resultSet->Close();
917         return false;
918     }
919     int columnIndex = 0;
920     resultSet->GoToFirstRow();
921     resultSet->GetColumnIndex(PdpProfileData::PROFILE_ID, columnIndex);
922     resultSet->GetInt(columnIndex, profileIdValue);
923     resultSet->Close();
924     return true;
925 }
926 
UpdateApnInfo(const int32_t profileId)927 void CellularDataHandler::UpdateApnInfo(const int32_t profileId)
928 {
929     int32_t simId = CoreManagerInner::GetInstance().GetSimId(slotId_);
930     if (simId <= INVALID_SIM_ID) {
931         TELEPHONY_LOGE("Slot%{public}d: failed due to invalid sim id %{public}d", slotId_, simId);
932         return;
933     }
934     std::shared_ptr<DataShare::DataShareHelper> dataShareHelper = CreatorDataShareHelper();
935     if (dataShareHelper == nullptr) {
936         TELEPHONY_LOGE("dataShareHelper is nullptr.");
937         return;
938     }
939     int32_t profileIdValue = 0;
940     if (!GetCurrentDataShareApnInfo(dataShareHelper, simId, profileIdValue)) {
941         TELEPHONY_LOGE("GetCurrentDataShareApnInfo fail.");
942         dataShareHelper->Release();
943         return;
944     }
945     if (profileIdValue != profileId) {
946         DataShare::DataSharePredicates predicates;
947         DataShare::DataShareValuesBucket values;
948         double profileIdAsDouble = static_cast<double>(profileId);
949         double simIdAsDouble = static_cast<double>(simId);
950         values.Put(PdpProfileData::PROFILE_ID, profileIdAsDouble);
951         values.Put(PdpProfileData::SIM_ID, simIdAsDouble);
952         Uri uri(CELLULAR_DATA_RDB_PREFER);
953         int32_t result = dataShareHelper->Update(uri, predicates, values);
954         if (result < TELEPHONY_ERR_SUCCESS) {
955             TELEPHONY_LOGE("UpdateApnInfo fail! result:%{public}d", result);
956         }
957     }
958     dataShareHelper->Release();
959 }
960 
GetCurrentApnId()961 int32_t CellularDataHandler::GetCurrentApnId()
962 {
963     int32_t simId = CoreManagerInner::GetInstance().GetSimId(slotId_);
964     if (simId <= INVALID_SIM_ID) {
965         TELEPHONY_LOGE("Slot%{public}d: failed due to invalid sim id %{public}d", slotId_, simId);
966         return 0;
967     }
968     std::shared_ptr<DataShare::DataShareHelper> dataShareHelper = CreatorDataShareHelper();
969     if (dataShareHelper == nullptr) {
970         TELEPHONY_LOGE("dataShareHelper is nullptr.");
971         return 0;
972     }
973     int32_t profileIdValue = 0;
974     if (!GetCurrentDataShareApnInfo(dataShareHelper, simId, profileIdValue)) {
975         TELEPHONY_LOGE("GetCurrentDataShareApnInfo fail.");
976     }
977     dataShareHelper->Release();
978     return profileIdValue;
979 }
980 
GetSlotId() const981 int32_t CellularDataHandler::GetSlotId() const
982 {
983     return slotId_;
984 }
985 
DisconnectDataComplete(const InnerEvent::Pointer & event)986 void CellularDataHandler::DisconnectDataComplete(const InnerEvent::Pointer &event)
987 {
988     if (event == nullptr || apnManager_ == nullptr || connectionManager_ == nullptr) {
989         TELEPHONY_LOGE("Slot%{public}d: event or apnManager or connectionManager_ is null", slotId_);
990         return;
991     }
992     auto netInfo = event->GetSharedObject<SetupDataCallResultInfo>();
993     if (netInfo == nullptr) {
994         TELEPHONY_LOGE("Slot%{public}d: netInfo is null", slotId_);
995         return;
996     }
997     int32_t apnId = netInfo->flag;
998     sptr<ApnHolder> apnHolder = apnManager_->FindApnHolderById(apnId);
999     if (apnHolder == nullptr) {
1000         TELEPHONY_LOGE("Slot%{public}d: apnHolder is null, apnId is %{public}d", slotId_, apnId);
1001         return;
1002     }
1003     DisConnectionReason reason = ConnectionRetryPolicy::ConvertPdpErrorToDisconnReason(netInfo->reason);
1004     auto stateMachine = apnHolder->GetCellularDataStateMachine();
1005     if (stateMachine == nullptr) {
1006         apnHolder->SetApnState(PROFILE_STATE_IDLE);
1007         TELEPHONY_LOGE("stateMachine is null");
1008         return;
1009     }
1010     stateMachine->UpdateNetworkInfo(*netInfo);
1011     connectionManager_->RemoveActiveConnectionByCid(stateMachine->GetCid());
1012     apnHolder->SetCellularDataStateMachine(nullptr);
1013     apnHolder->SetApnState(PROFILE_STATE_IDLE);
1014     CellularDataHiSysEvent::WriteDataConnectStateBehaviorEvent(slotId_, apnHolder->GetApnType(),
1015         apnHolder->GetCapability(), static_cast<int32_t>(PROFILE_STATE_IDLE));
1016     UpdateCellularDataConnectState(apnHolder->GetApnType());
1017     UpdatePhysicalConnectionState(connectionManager_->isNoActiveConnection());
1018     if (apnHolder->IsDataCallEnabled()) {
1019         RetryOrClearConnection(apnHolder, reason, netInfo);
1020     }
1021     if (!apnManager_->HasAnyConnectedState()) {
1022         connectionManager_->StopStallDetectionTimer();
1023         connectionManager_->EndNetStatistics();
1024         if (incallDataStateMachine_ != nullptr) {
1025             auto incallEvent = InnerEvent::Get(CellularDataEventCode::MSG_SM_INCALL_DATA_DATA_DISCONNECTED);
1026             incallDataStateMachine_->SendEvent(incallEvent);
1027         }
1028     }
1029     if (reason == DisConnectionReason::REASON_CHANGE_CONNECTION) {
1030         HandleSortConnection();
1031     }
1032     if (apnHolder->IsMmsType()) {
1033         SetDataPermittedForMms(false);
1034         RemoveEvent(CellularDataEventCode::MSG_RESUME_DATA_PERMITTED_TIMEOUT);
1035     }
1036 }
1037 
RetryOrClearConnection(const sptr<ApnHolder> & apnHolder,DisConnectionReason reason,const std::shared_ptr<SetupDataCallResultInfo> & netInfo)1038 void CellularDataHandler::RetryOrClearConnection(const sptr<ApnHolder> &apnHolder, DisConnectionReason reason,
1039     const std::shared_ptr<SetupDataCallResultInfo> &netInfo)
1040 {
1041     if (apnHolder == nullptr || netInfo == nullptr || apnManager_ == nullptr) {
1042         return;
1043     }
1044     ConnectionRetryPolicy::RestartRadioIfRequired(netInfo->reason, slotId_);
1045     if (reason == DisConnectionReason::REASON_CLEAR_CONNECTION) {
1046         TELEPHONY_LOGI("clear connection");
1047         ClearConnection(apnHolder, reason);
1048     } else if (reason == DisConnectionReason::REASON_PERMANENT_REJECT) {
1049         TELEPHONY_LOGI("permannent reject, mark bad and clear connection");
1050         apnHolder->SetApnBadState(true);
1051         ClearConnection(apnHolder, DisConnectionReason::REASON_CLEAR_CONNECTION);
1052     } else if (reason == DisConnectionReason::REASON_RETRY_CONNECTION) {
1053         apnHolder->SetApnState(PROFILE_STATE_RETRYING);
1054         RetryScene scene = static_cast<RetryScene>(netInfo->retryScene);
1055         bool isRetrying = (apnManager_->GetOverallDefaultApnState() == ApnProfileState::PROFILE_STATE_RETRYING);
1056         int64_t delayTime = apnHolder->GetRetryDelay(netInfo->reason, netInfo->retryTime, scene, isRetrying);
1057         TELEPHONY_LOGI("cid=%{public}d, cause=%{public}d, suggest=%{public}d, delay=%{public}lld, scene=%{public}d",
1058             netInfo->cid, netInfo->reason, netInfo->retryTime, static_cast<long long>(delayTime), netInfo->retryScene);
1059         SendEvent(CellularDataEventCode::MSG_RETRY_TO_SETUP_DATACALL, netInfo->flag, delayTime);
1060     }
1061 }
1062 
ResumeDataPermittedTimerOut(const AppExecFwk::InnerEvent::Pointer & event)1063 void CellularDataHandler::ResumeDataPermittedTimerOut(const AppExecFwk::InnerEvent::Pointer &event)
1064 {
1065     TELEPHONY_LOGI("SlotId=%{public}d, ResumeDataPermittedTimerOut", slotId_);
1066     if (apnManager_ == nullptr) {
1067         SetDataPermittedForMms(false);
1068         return;
1069     }
1070     auto apnHolder = apnManager_->FindApnHolderById(DataContextRolesId::DATA_CONTEXT_ROLE_MMS_ID);
1071     if (apnHolder == nullptr || apnHolder->GetApnState() == PROFILE_STATE_IDLE) {
1072         TELEPHONY_LOGI("SlotId=%{public}d, mms resume data due time out", slotId_);
1073         SetDataPermittedForMms(false);
1074     }
1075 }
1076 
RetryToSetupDatacall(const AppExecFwk::InnerEvent::Pointer & event)1077 void CellularDataHandler::RetryToSetupDatacall(const AppExecFwk::InnerEvent::Pointer &event)
1078 {
1079     if (event == nullptr || apnManager_ == nullptr) {
1080         return;
1081     }
1082     int32_t apnId = event->GetParam();
1083     auto apnHolder = apnManager_->FindApnHolderById(apnId);
1084     if (apnHolder == nullptr || apnHolder->GetApnState() != PROFILE_STATE_RETRYING) {
1085         return;
1086     }
1087     TELEPHONY_LOGI("apnId=%{public}d, state=%{public}d", apnId, apnHolder->GetApnState());
1088     apnHolder->SetApnState(PROFILE_STATE_IDLE);
1089     SendEvent(CellularDataEventCode::MSG_ESTABLISH_DATA_CONNECTION, apnId, 0);
1090 }
1091 
UpdatePhysicalConnectionState(bool noActiveConnection)1092 void CellularDataHandler::UpdatePhysicalConnectionState(bool noActiveConnection)
1093 {
1094     if (noActiveConnection && physicalConnectionActiveState_) {
1095         physicalConnectionActiveState_ = false;
1096         CoreManagerInner::GetInstance().DcPhysicalLinkActiveUpdate(slotId_, physicalConnectionActiveState_);
1097     } else if (!noActiveConnection && !physicalConnectionActiveState_) {
1098         physicalConnectionActiveState_ = true;
1099         CoreManagerInner::GetInstance().DcPhysicalLinkActiveUpdate(slotId_, physicalConnectionActiveState_);
1100     }
1101 }
1102 
HandleSortConnection()1103 void CellularDataHandler::HandleSortConnection()
1104 {
1105     ApnProfileState state = apnManager_->GetOverallApnState();
1106     if (state == PROFILE_STATE_IDLE || state == PROFILE_STATE_FAILED) {
1107         for (const sptr<ApnHolder> &sortApnHolder : apnManager_->GetSortApnHolder()) {
1108             if (sortApnHolder->IsDataCallEnabled()) {
1109                 int32_t apnId = apnManager_->FindApnIdByApnName(sortApnHolder->GetApnType());
1110                 TELEPHONY_LOGI("Slot%{public}d: HandleSortConnection the apn type is %{public}s", slotId_,
1111                     sortApnHolder->GetApnType().c_str());
1112                 SendEvent(CellularDataEventCode::MSG_ESTABLISH_DATA_CONNECTION, apnId, 0);
1113                 break;
1114             }
1115         }
1116     }
1117 }
1118 
MsgEstablishDataConnection(const InnerEvent::Pointer & event)1119 void CellularDataHandler::MsgEstablishDataConnection(const InnerEvent::Pointer &event)
1120 {
1121     if (apnManager_ == nullptr || event == nullptr) {
1122         TELEPHONY_LOGE("Slot%{public}d: apnManager_ or event is null", slotId_);
1123         return;
1124     }
1125     sptr<ApnHolder> apnHolder = apnManager_->FindApnHolderById(event->GetParam());
1126     if (apnHolder == nullptr) {
1127         TELEPHONY_LOGE("Slot%{public}d: apnHolder is null", slotId_);
1128         return;
1129     }
1130     TELEPHONY_LOGD("Slot%{public}d: APN holder type:%{public}s call:%{public}d", slotId_,
1131         apnHolder->GetApnType().c_str(), apnHolder->IsDataCallEnabled());
1132     if (apnHolder->IsDataCallEnabled()) {
1133         AttemptEstablishDataConnection(apnHolder);
1134     } else {
1135         TELEPHONY_LOGI("MsgEstablishDataConnection IsDataCallEnabled is false");
1136         DisConnectionReason reason = DisConnectionReason::REASON_CHANGE_CONNECTION;
1137         int32_t radioTech = static_cast<int32_t>(RadioTech::RADIO_TECHNOLOGY_INVALID);
1138         CoreManagerInner::GetInstance().GetPsRadioTech(slotId_, radioTech);
1139         if (!IsSingleConnectionEnabled(radioTech)) {
1140             reason = DisConnectionReason::REASON_CLEAR_CONNECTION;
1141         }
1142         ClearConnection(apnHolder, reason);
1143     }
1144 }
1145 
1146 #ifdef OHOS_BUILD_ENABLE_TELEPHONY_EXT
IsSimRequestNetOnVSimEnabled(int32_t reqType,bool isMmsType) const1147 bool CellularDataHandler::IsSimRequestNetOnVSimEnabled(int32_t reqType, bool isMmsType) const
1148 {
1149     if (reqType == TYPE_REQUEST_NET) {
1150         if (slotId_ != CELLULAR_DATA_VSIM_SLOT_ID &&
1151             TELEPHONY_EXT_WRAPPER.isVSimEnabled_ && TELEPHONY_EXT_WRAPPER.isVSimEnabled_() && !isMmsType) {
1152             TELEPHONY_LOGE("Slot%{public}d, VSimEnabled & not mms type", slotId_);
1153             return true;
1154         }
1155     }
1156     return false;
1157 }
1158 #endif
1159 
SetNetRequest(NetRequest & request,const std::unique_ptr<NetRequest> & netRequest)1160 void CellularDataHandler::SetNetRequest(NetRequest &request, const std::unique_ptr<NetRequest> &netRequest)
1161 {
1162     request.ident = netRequest->ident;
1163     request.capability = netRequest->capability;
1164     request.registerType = netRequest->registerType;
1165     request.bearTypes = netRequest->bearTypes;
1166     request.uid = netRequest->uid;
1167 }
1168 
SendEstablishDataConnectionEvent(int32_t id)1169 void CellularDataHandler::SendEstablishDataConnectionEvent(int32_t id)
1170 {
1171     InnerEvent::Pointer innerEvent = InnerEvent::Get(CellularDataEventCode::MSG_ESTABLISH_DATA_CONNECTION, id);
1172     if (!SendEvent(innerEvent)) {
1173         TELEPHONY_LOGE("Slot%{public}d: send data connection event failed", slotId_);
1174     }
1175 }
1176 
MsgRequestNetwork(const InnerEvent::Pointer & event)1177 void CellularDataHandler::MsgRequestNetwork(const InnerEvent::Pointer &event)
1178 {
1179     if (apnManager_ == nullptr || event == nullptr) {
1180         TELEPHONY_LOGE("Slot%{public}d: apnManager_ or event is null", slotId_);
1181         return;
1182     }
1183     std::unique_ptr<NetRequest> netRequest = event->GetUniqueObject<NetRequest>();
1184     if (netRequest == nullptr) {
1185         TELEPHONY_LOGE("Slot%{public}d: netRequest is null", slotId_);
1186         return;
1187     }
1188     NetRequest request;
1189     SetNetRequest(request, netRequest);
1190     int32_t id = ApnManager::FindApnIdByCapability(request.capability);
1191     sptr<ApnHolder> apnHolder = apnManager_->FindApnHolderById(id);
1192     if (apnHolder == nullptr) {
1193         TELEPHONY_LOGE("Slot%{public}d: apnHolder is null.", slotId_);
1194         return;
1195     }
1196 
1197 #ifdef OHOS_BUILD_ENABLE_TELEPHONY_EXT
1198     if (IsSimRequestNetOnVSimEnabled(event->GetParam(), apnHolder->IsMmsType())) {
1199         return;
1200     }
1201 #endif
1202 
1203     bool isAllCellularDataAllowed = true;
1204 #ifdef OHOS_BUILD_ENABLE_TELEPHONY_EXT
1205     if (TELEPHONY_EXT_WRAPPER.isAllCellularDataAllowed_) {
1206         isAllCellularDataAllowed =
1207             TELEPHONY_EXT_WRAPPER.isAllCellularDataAllowed_(request, apnHolder->GetUidStatus());
1208     }
1209 #endif
1210     WriteEventCellularRequest(request, event->GetParam());
1211     if (isAllCellularDataAllowed) {
1212         TELEPHONY_LOGD("allow cellular data");
1213         if (event->GetParam() == TYPE_REQUEST_NET) {
1214             apnHolder->RequestCellularData(request);
1215         } else {
1216             if (!apnHolder->ReleaseCellularData(request)) {
1217                 return;
1218             }
1219         }
1220     } else {
1221         if (event->GetParam() == TYPE_REQUEST_NET) {
1222             TELEPHONY_LOGD("not allow reqeust cellular data because of in controled");
1223             return;
1224         } else {
1225             TELEPHONY_LOGI("release all cellular data");
1226             apnHolder->ReleaseAllCellularData();
1227         }
1228     }
1229     SendEstablishDataConnectionEvent(id);
1230 }
1231 
WriteEventCellularRequest(NetRequest request,int32_t state)1232 bool CellularDataHandler::WriteEventCellularRequest(NetRequest request, int32_t state)
1233 {
1234     if (request.capability == NetCap::NET_CAPABILITY_INTERNET &&
1235         (request.bearTypes & (1ULL << NetBearType::BEARER_CELLULAR)) != 0) {
1236         CellularDataHiSysEvent::WriteCellularRequestBehaviorEvent(
1237             request.uid, request.ident, request.registerType, state);
1238             return true;
1239     }
1240     return false;
1241 }
1242 
ProcessEvent(const InnerEvent::Pointer & event)1243 void CellularDataHandler::ProcessEvent(const InnerEvent::Pointer &event)
1244 {
1245     if (event == nullptr) {
1246         TELEPHONY_LOGE("Slot%{public}d: event is null!", slotId_);
1247         return;
1248     }
1249     uint32_t eventCode = event->GetInnerEventId();
1250     std::map<uint32_t, Fun>::iterator it = eventIdMap_.find(eventCode);
1251     if (it != eventIdMap_.end()) {
1252         it->second(event);
1253     }
1254 }
1255 
OnReceiveEvent(const EventFwk::CommonEventData & data)1256 void CellularDataHandler::OnReceiveEvent(const EventFwk::CommonEventData &data)
1257 {
1258     const AAFwk::Want &want = data.GetWant();
1259     std::string action = want.GetAction();
1260     const int32_t defSlotId = CoreManagerInner::GetInstance().GetDefaultCellularDataSlotId();
1261     int32_t slotId = want.GetIntParam("slotId", 0);
1262     TELEPHONY_LOGI("[slot%{public}d] action=%{public}s code=%{public}d", slotId_, action.c_str(), data.GetCode());
1263     if (EventFwk::CommonEventSupport::COMMON_EVENT_CALL_STATE_CHANGED == action) {
1264         if (slotId_ != slotId) {
1265             return;
1266         }
1267         int32_t state = want.GetIntParam("state", CALL_STATUS_UNKNOWN);
1268         if (state == CALL_STATUS_UNKNOWN) {
1269             TELEPHONY_LOGE("Slot%{public}d: unknown call state=%{public}d", slotId, state);
1270             return;
1271         }
1272         HandleCallChanged(state);
1273     } else if (action == CommonEventSupport::COMMON_EVENT_SIM_CARD_DEFAULT_DATA_SUBSCRIPTION_CHANGED) {
1274         HandleDefaultDataSubscriptionChanged();
1275     } else if (action == CommonEventSupport::COMMON_EVENT_OPERATOR_CONFIG_CHANGED) {
1276         if (slotId_ != slotId) {
1277             return;
1278         }
1279         GetConfigurationFor5G();
1280     } else if (action == CommonEventSupport::COMMON_EVENT_SCREEN_ON) {
1281         if (slotId_ != defSlotId) {
1282             return;
1283         }
1284         HandleScreenStateChanged(true);
1285     } else if (action == CommonEventSupport::COMMON_EVENT_SCREEN_OFF) {
1286         if (slotId_ != defSlotId) {
1287             return;
1288         }
1289         HandleScreenStateChanged(false);
1290     } else if (action == CommonEventSupport::COMMON_EVENT_DATA_SHARE_READY) {
1291         RegisterDataSettingObserver();
1292     } else {
1293         TELEPHONY_LOGI("Slot%{public}d: action=%{public}s code=%{public}d", slotId_, action.c_str(), data.GetCode());
1294     }
1295 }
1296 
HandleScreenStateChanged(bool isScreenOn) const1297 void CellularDataHandler::HandleScreenStateChanged(bool isScreenOn) const
1298 {
1299     if (connectionManager_ == nullptr) {
1300         TELEPHONY_LOGE("Slot%{public}d: connectionManager is null!", slotId_);
1301         return;
1302     }
1303     connectionManager_->HandleScreenStateChanged(isScreenOn);
1304 }
1305 
IsSimStateReadyOrLoaded()1306 bool CellularDataHandler::IsSimStateReadyOrLoaded()
1307 {
1308     SimState simState = SimState::SIM_STATE_UNKNOWN;
1309     CoreManagerInner &coreInner = CoreManagerInner::GetInstance();
1310     coreInner.GetSimState(slotId_, simState);
1311     return (simState == SimState::SIM_STATE_READY || simState == SimState::SIM_STATE_LOADED);
1312 }
1313 
UpdateCellularDataConnectState(const std::string & apnType)1314 void CellularDataHandler::UpdateCellularDataConnectState(const std::string &apnType)
1315 {
1316     int32_t networkType = static_cast<int32_t>(RadioTech::RADIO_TECHNOLOGY_INVALID);
1317     CoreManagerInner::GetInstance().GetPsRadioTech(slotId_, networkType);
1318     if (apnType == DATA_CONTEXT_ROLE_DEFAULT || apnType == DATA_CONTEXT_ROLE_INTERNAL_DEFAULT) {
1319         ApnProfileState apnState = apnManager_->GetOverallDefaultApnState();
1320         StateNotification::GetInstance().UpdateCellularDataConnectState(slotId_, apnState, networkType);
1321     }
1322 }
1323 
HandleSettingSwitchChanged(const InnerEvent::Pointer & event)1324 void CellularDataHandler::HandleSettingSwitchChanged(const InnerEvent::Pointer &event)
1325 {
1326     if (event == nullptr) {
1327         TELEPHONY_LOGE("Slot%{public}d: event is null", slotId_);
1328         return;
1329     }
1330     bool setting_switch = event->GetParam();
1331     TELEPHONY_LOGI("Slot%{public}d: setting switch = %{public}d", slotId_, setting_switch);
1332 }
1333 
HandleDBSettingIncallChanged(const AppExecFwk::InnerEvent::Pointer & event)1334 void CellularDataHandler::HandleDBSettingIncallChanged(const AppExecFwk::InnerEvent::Pointer &event)
1335 {
1336     if (event == nullptr) {
1337         TELEPHONY_LOGE("Slot%{public}d: event is null", slotId_);
1338         return;
1339     }
1340     if (incallDataStateMachine_ == nullptr) {
1341         TELEPHONY_LOGE("Slot%{public}d: incallDataStateMachine_ is null", slotId_);
1342         return;
1343     }
1344     int64_t value = event->GetParam();
1345     if (value == static_cast<int64_t>(DataSwitchCode::CELLULAR_DATA_ENABLED)) {
1346         InnerEvent::Pointer incallEvent = InnerEvent::Get(CellularDataEventCode::MSG_SM_INCALL_DATA_SETTINGS_ON);
1347         incallDataStateMachine_->SendEvent(incallEvent);
1348     } else {
1349         InnerEvent::Pointer incallEvent = InnerEvent::Get(CellularDataEventCode::MSG_SM_INCALL_DATA_SETTINGS_OFF);
1350         incallDataStateMachine_->SendEvent(incallEvent);
1351     }
1352 }
1353 
CreateIncallDataStateMachine(int32_t callState)1354 std::shared_ptr<IncallDataStateMachine> CellularDataHandler::CreateIncallDataStateMachine(int32_t callState)
1355 {
1356     std::shared_ptr<IncallDataStateMachine> incallDataStateMachine = std::make_shared<IncallDataStateMachine>(slotId_,
1357         std::weak_ptr<TelEventHandler>(std::static_pointer_cast<TelEventHandler>(shared_from_this())), apnManager_);
1358     if (incallDataStateMachine == nullptr) {
1359         TELEPHONY_LOGE("Slot%{public}d: incallDataStateMachine is null", slotId_);
1360         return nullptr;
1361     }
1362     incallDataStateMachine->Init(callState);
1363     return incallDataStateMachine;
1364 }
1365 
IncallDataComplete(const InnerEvent::Pointer & event)1366 void CellularDataHandler::IncallDataComplete(const InnerEvent::Pointer &event)
1367 {
1368     TELEPHONY_LOGI("Slot%{public}d: MSG_INCALL_DATA_COMPLETE", slotId_);
1369     if (incallDataStateMachine_ != nullptr) {
1370         incallDataStateMachine_ = nullptr;
1371     }
1372 }
1373 
HandleCallChanged(int32_t state)1374 void CellularDataHandler::HandleCallChanged(int32_t state)
1375 {
1376     TELEPHONY_LOGI("Slot%{public}d: lastState:%{public}d, state:%{public}d", slotId_, lastCallState_, state);
1377     if (lastCallState_ == state) {
1378         TELEPHONY_LOGE("Slot%{public}d: call state=%{public}d, not changed", slotId_, state);
1379         return;
1380     }
1381     if (connectionManager_ == nullptr) {
1382         TELEPHONY_LOGE("Slot%{public}d: connectionManager is null!", slotId_);
1383         return;
1384     }
1385     lastCallState_ = state;
1386     connectionManager_->UpdateCallState(state);
1387     ImsRegInfo voiceInfo;
1388     CoreManagerInner::GetInstance().GetImsRegStatus(slotId_, ImsServiceType::TYPE_VOICE, voiceInfo);
1389     ImsRegInfo videoInfo;
1390     CoreManagerInner::GetInstance().GetImsRegStatus(slotId_, ImsServiceType::TYPE_VIDEO, videoInfo);
1391     if (voiceInfo.imsRegState == ImsRegState::IMS_REGISTERED || videoInfo.imsRegState == ImsRegState::IMS_REGISTERED
1392         || (incallDataStateMachine_ != nullptr && incallDataStateMachine_->IsSecondaryActiveState())) {
1393         HandleImsCallChanged(state);
1394     } else {
1395         HandleVoiceCallChanged(state);
1396     }
1397 }
1398 
HandleImsCallChanged(int32_t state)1399 void CellularDataHandler::HandleImsCallChanged(int32_t state)
1400 {
1401     if (state == TelCallStatus::CALL_STATUS_DIALING || state == TelCallStatus::CALL_STATUS_INCOMING) {
1402         if (incallDataStateMachine_ == nullptr) {
1403             incallDataStateMachine_ = CreateIncallDataStateMachine(state);
1404         }
1405     }
1406     if (incallDataStateMachine_ == nullptr) {
1407         TELEPHONY_LOGE("Slot%{public}d: incallDataStateMachine_ is null!", slotId_);
1408         return;
1409     }
1410     incallDataStateMachine_->UpdateCallState(state);
1411     if (state == TelCallStatus::CALL_STATUS_DIALING || state == TelCallStatus::CALL_STATUS_INCOMING) {
1412         InnerEvent::Pointer incallEvent = InnerEvent::Get(CellularDataEventCode::MSG_SM_INCALL_DATA_CALL_STARTED);
1413         incallDataStateMachine_->SendEvent(incallEvent);
1414     }
1415     if (state == TelCallStatus::CALL_STATUS_DISCONNECTED || state == TelCallStatus::CALL_STATUS_IDLE) {
1416         InnerEvent::Pointer incallEvent = InnerEvent::Get(CellularDataEventCode::MSG_SM_INCALL_DATA_CALL_ENDED);
1417         incallDataStateMachine_->SendEvent(incallEvent);
1418     }
1419 }
1420 
HandleVoiceCallChanged(int32_t state)1421 void CellularDataHandler::HandleVoiceCallChanged(int32_t state)
1422 {
1423     if (apnManager_ == nullptr || connectionManager_ == nullptr) {
1424         TELEPHONY_LOGE("Slot%{public}d: apnManager or connectionManager is null!", slotId_);
1425         return;
1426     }
1427     // next to check if radio technology support voice and data at same time.
1428     int32_t psRadioTech = static_cast<int32_t>(RadioTech::RADIO_TECHNOLOGY_INVALID);
1429     CoreManagerInner::GetInstance().GetPsRadioTech(slotId_, psRadioTech);
1430     bool support = (psRadioTech == static_cast<int32_t>(RadioTech::RADIO_TECHNOLOGY_GSM));
1431     if (state != TelCallStatus::CALL_STATUS_IDLE && state != TelCallStatus::CALL_STATUS_DISCONNECTED) {
1432         if (apnManager_->HasAnyConnectedState() && support) {
1433             connectionManager_->EndNetStatistics();
1434             connectionManager_->SetDataFlowType(CellDataFlowType::DATA_FLOW_TYPE_DORMANT);
1435             connectionManager_->StopStallDetectionTimer();
1436             disconnectionReason_ = DisConnectionReason::REASON_GSM_AND_CALLING_ONLY;
1437         }
1438     } else {
1439         if (apnManager_->HasAnyConnectedState() && support) {
1440             connectionManager_->StartStallDetectionTimer();
1441             connectionManager_->BeginNetStatistics();
1442         }
1443         disconnectionReason_ = DisConnectionReason::REASON_NORMAL;
1444         TELEPHONY_LOGI("Slot%{public}d: HandleVoiceCallChanged EstablishAllApnsIfConnectable", slotId_);
1445         EstablishAllApnsIfConnectable();
1446     }
1447     TELEPHONY_LOGI("Slot%{public}d: disconnectionReason_=%{public}d", slotId_, disconnectionReason_);
1448 }
1449 
HandleDefaultDataSubscriptionChanged()1450 void CellularDataHandler::HandleDefaultDataSubscriptionChanged()
1451 {
1452     TELEPHONY_LOGI("Slot%{public}d", slotId_);
1453     if (CheckDataPermittedByDsds()) {
1454         SetDataPermitted(slotId_, true);
1455     } else {
1456         SetDataPermitted(slotId_, false);
1457     }
1458     if (dataSwitchSettings_ != nullptr) {
1459         dataSwitchSettings_->LoadSwitchValue();
1460     }
1461     CoreManagerInner &coreInner = CoreManagerInner::GetInstance();
1462     const int32_t defSlotId = coreInner.GetDefaultCellularDataSlotId();
1463     if (defSlotId == slotId_) {
1464         SendEvent(CellularDataEventCode::MSG_ESTABLISH_ALL_APNS_IF_CONNECTABLE);
1465     } else {
1466         ClearAllConnections(DisConnectionReason::REASON_CLEAR_CONNECTION);
1467     }
1468 }
1469 
ReleaseAllNetworkRequest()1470 void CellularDataHandler::ReleaseAllNetworkRequest()
1471 {
1472     if (apnManager_ == nullptr) {
1473         TELEPHONY_LOGE("Slot%{public}d: apnManager_ is null", slotId_);
1474         return;
1475     }
1476     for (const sptr<ApnHolder> &apnHolder : apnManager_->GetAllApnHolder()) {
1477         if (apnHolder == nullptr) {
1478             continue;
1479         }
1480         apnHolder->ReleaseAllCellularData();
1481     }
1482 }
1483 
HandleSimStateChanged()1484 void CellularDataHandler::HandleSimStateChanged()
1485 {
1486     SimState simState = SimState::SIM_STATE_UNKNOWN;
1487     CoreManagerInner::GetInstance().GetSimState(slotId_, simState);
1488     TELEPHONY_LOGI("Slot%{public}d: sim state is :%{public}d", slotId_, simState);
1489     if (simState == SimState::SIM_STATE_READY) {
1490         std::u16string iccId;
1491         CoreManagerInner::GetInstance().GetSimIccId(slotId_, iccId);
1492         if (lastIccId_ != u"" && lastIccId_ == iccId) {
1493             EstablishAllApnsIfConnectable();
1494         }
1495     } else if (simState != SimState::SIM_STATE_LOADED) {
1496         isRilApnAttached_ = false;
1497         ClearAllConnections(DisConnectionReason::REASON_CLEAR_CONNECTION);
1498         if (simState == SimState::SIM_STATE_NOT_PRESENT) {
1499             CellularDataNetAgent::GetInstance().UnregisterNetSupplierForSimUpdate(slotId_);
1500             ReleaseAllNetworkRequest();
1501             UnRegisterDataSettingObserver();
1502         }
1503     }
1504 }
1505 
HandleRecordsChanged()1506 void CellularDataHandler::HandleRecordsChanged()
1507 {
1508     std::u16string iccId;
1509     CoreManagerInner::GetInstance().GetSimIccId(slotId_, iccId);
1510     if (iccId == u"") {
1511         TELEPHONY_LOGI("iccId nullptr");
1512         return;
1513     }
1514     if (iccId != lastIccId_) {
1515         if (dataSwitchSettings_ != nullptr) {
1516             dataSwitchSettings_->SetPolicyDataOn(true);
1517         }
1518         lastIccId_ = iccId;
1519     }
1520     GetConfigurationFor5G();
1521     CreateApnItem();
1522     SetRilAttachApn();
1523     ClearConnectionsOnUpdateApns(DisConnectionReason::REASON_CHANGE_CONNECTION);
1524     EstablishAllApnsIfConnectable();
1525 }
1526 
HandleSimEvent(const AppExecFwk::InnerEvent::Pointer & event)1527 void CellularDataHandler::HandleSimEvent(const AppExecFwk::InnerEvent::Pointer &event)
1528 {
1529     if (event == nullptr) {
1530         return;
1531     }
1532     auto slotId = event->GetParam();
1533     if (slotId != slotId_) {
1534         return;
1535     }
1536     if (dataSwitchSettings_ != nullptr) {
1537         dataSwitchSettings_->LoadSwitchValue();
1538     }
1539     auto eventId = event->GetInnerEventId();
1540     TELEPHONY_LOGI("Slot%{public}d, event:%{public}d", slotId_, eventId);
1541     switch (eventId) {
1542         case RadioEvent::RADIO_SIM_STATE_CHANGE:
1543             HandleSimStateChanged();
1544             break;
1545         case RadioEvent::RADIO_SIM_RECORDS_LOADED:
1546             HandleRecordsChanged();
1547             break;
1548         case RadioEvent::RADIO_NV_REFRESH_FINISHED: {
1549             SetRilAttachApn();
1550             break;
1551         }
1552         case RadioEvent::RADIO_SIM_ACCOUNT_LOADED:
1553             HandleSimAccountLoaded();
1554             break;
1555         default:
1556             break;
1557     }
1558 }
1559 
HandleEstablishAllApnsIfConnectable(const AppExecFwk::InnerEvent::Pointer & event)1560 void CellularDataHandler::HandleEstablishAllApnsIfConnectable(const AppExecFwk::InnerEvent::Pointer &event)
1561 {
1562     if (event == nullptr) {
1563         return;
1564     }
1565     EstablishAllApnsIfConnectable();
1566 }
1567 
HandleSimAccountLoaded()1568 void CellularDataHandler::HandleSimAccountLoaded()
1569 {
1570     CellularDataNetAgent::GetInstance().UnregisterNetSupplierForSimUpdate(slotId_);
1571     bool registerRes = CellularDataNetAgent::GetInstance().RegisterNetSupplier(slotId_);
1572     if (!registerRes) {
1573         TELEPHONY_LOGE("Slot%{public}d register supplierid fail", slotId_);
1574     }
1575     if (slotId_ == 0) {
1576         CellularDataNetAgent::GetInstance().UnregisterPolicyCallback();
1577         CellularDataNetAgent::GetInstance().RegisterPolicyCallback();
1578     }
1579     RegisterDataSettingObserver();
1580     if (dataSwitchSettings_ != nullptr) {
1581         dataSwitchSettings_->LoadSwitchValue();
1582     }
1583     CoreManagerInner &coreInner = CoreManagerInner::GetInstance();
1584     const int32_t defSlotId = coreInner.GetDefaultCellularDataSlotId();
1585     CreateApnItem();
1586     if (defSlotId == slotId_) {
1587         EstablishAllApnsIfConnectable();
1588         ApnProfileState apnState = apnManager_->GetOverallApnState();
1589         if (registerRes && apnState == ApnProfileState::PROFILE_STATE_CONNECTED) {
1590             UpdateNetworkInfo();
1591         }
1592     } else {
1593         ClearAllConnections(DisConnectionReason::REASON_CLEAR_CONNECTION);
1594     }
1595 }
1596 
CreateApnItem()1597 void CellularDataHandler::CreateApnItem()
1598 {
1599     if (apnManager_ == nullptr) {
1600         TELEPHONY_LOGE("Slot%{public}d: apnManager_ is null", slotId_);
1601         return;
1602     }
1603     int32_t result = 0;
1604     for (int32_t i = 0; i < DEFAULT_READ_APN_TIME; ++i) {
1605         result = apnManager_->CreateAllApnItemByDatabase(slotId_);
1606         if (result != 0) {
1607             break;
1608         }
1609     }
1610 #ifdef OHOS_BUILD_ENABLE_TELEPHONY_EXT
1611     if (TELEPHONY_EXT_WRAPPER.sendApnNeedRetryInfo_) {
1612         TELEPHONY_EXT_WRAPPER.sendApnNeedRetryInfo_(result);
1613     }
1614 #endif
1615 }
1616 
HandleApnChanged()1617 bool CellularDataHandler::HandleApnChanged()
1618 {
1619     if (apnManager_ == nullptr) {
1620         TELEPHONY_LOGE("apnManager is null");
1621         return false;
1622     }
1623     for (const sptr<ApnHolder> &apnHolder : apnManager_->GetAllApnHolder()) {
1624         TELEPHONY_LOGI("Slot%{public}d: apn type:%{public}s state:%{public}d", slotId_, apnHolder->GetApnType().c_str(),
1625             apnHolder->GetApnState());
1626     }
1627     InnerEvent::Pointer event = InnerEvent::Get(CellularDataEventCode::MSG_APN_CHANGED);
1628     if (event == nullptr) {
1629         TELEPHONY_LOGE("Slot%{public}d: get apn changed event is null", slotId_);
1630         return false;
1631     }
1632     return SendEvent(event);
1633 }
1634 
HandleApnChanged(const InnerEvent::Pointer & event)1635 void CellularDataHandler::HandleApnChanged(const InnerEvent::Pointer &event)
1636 {
1637     if (apnManager_ == nullptr) {
1638         TELEPHONY_LOGE("Slot%{public}d: apnManager_ is null", slotId_);
1639         return;
1640     }
1641     CreateApnItem();
1642     SetRilAttachApn();
1643     ClearConnectionsOnUpdateApns(DisConnectionReason::REASON_RETRY_CONNECTION);
1644     apnManager_->ClearAllApnBad();
1645     for (const sptr<ApnHolder> &apnHolder : apnManager_->GetAllApnHolder()) {
1646         if (apnHolder == nullptr) {
1647             continue;
1648         }
1649         int32_t id = apnManager_->FindApnIdByApnName(apnHolder->GetApnType());
1650         if (apnHolder->GetApnState() == PROFILE_STATE_RETRYING) {
1651             apnHolder->InitialApnRetryCount();
1652             apnHolder->SetApnState(PROFILE_STATE_IDLE);
1653             RemoveEvent(CellularDataEventCode::MSG_RETRY_TO_SETUP_DATACALL);
1654         }
1655         SendEvent(CellularDataEventCode::MSG_ESTABLISH_DATA_CONNECTION, id, ESTABLISH_DATA_CONNECTION_DELAY);
1656     }
1657 }
1658 
GetCellularDataFlowType()1659 int32_t CellularDataHandler::GetCellularDataFlowType()
1660 {
1661     if (connectionManager_ == nullptr) {
1662         TELEPHONY_LOGE("Slot%{public}d: connection manager is null", slotId_);
1663         return 0;
1664     }
1665     return connectionManager_->GetDataFlowType();
1666 }
1667 
HandleRadioStateChanged(const AppExecFwk::InnerEvent::Pointer & event)1668 void CellularDataHandler::HandleRadioStateChanged(const AppExecFwk::InnerEvent::Pointer &event)
1669 {
1670     if (apnManager_ == nullptr || event == nullptr) {
1671         TELEPHONY_LOGE("Slot%{public}d: radio off or not available apnManager or event is null!", slotId_);
1672         return;
1673     }
1674     std::shared_ptr<Int32Parcel> object = event->GetSharedObject<Int32Parcel>();
1675     if (object == nullptr) {
1676         TELEPHONY_LOGE("Slot%{public}d: object is nullptr!", slotId_);
1677         return;
1678     }
1679     TELEPHONY_LOGI("Slot%{public}d: Radio changed with state: %{public}d", slotId_, object->data);
1680     switch (object->data) {
1681         case CORE_SERVICE_POWER_OFF:
1682         case CORE_SERVICE_POWER_NOT_AVAILABLE: {
1683             ApnProfileState apnState = apnManager_->GetOverallApnState();
1684             TELEPHONY_LOGI("Slot%{public}d: apn state is %{public}d", slotId_, apnState);
1685             if (apnState != ApnProfileState::PROFILE_STATE_IDLE) {
1686                 ClearAllConnections(DisConnectionReason::REASON_CLEAR_CONNECTION);
1687             }
1688             break;
1689         }
1690         case CORE_SERVICE_POWER_ON:
1691             SetRilLinkBandwidths();
1692             EstablishAllApnsIfConnectable();
1693             break;
1694         default:
1695             TELEPHONY_LOGI("Slot%{public}d: un-handle state:%{public}d", slotId_, object->data);
1696             break;
1697     }
1698 }
1699 
HandleDsdsModeChanged(const AppExecFwk::InnerEvent::Pointer & event)1700 void CellularDataHandler::HandleDsdsModeChanged(const AppExecFwk::InnerEvent::Pointer &event)
1701 {
1702     if (event == nullptr) {
1703         TELEPHONY_LOGE("Slot%{public}d: event is null!", slotId_);
1704         return;
1705     }
1706     std::shared_ptr<Int32Parcel> object = event->GetSharedObject<Int32Parcel>();
1707     if (object == nullptr) {
1708         TELEPHONY_LOGE("Slot%{public}d: object is null!", slotId_);
1709         return;
1710     }
1711     TELEPHONY_LOGI("Slot%{public}d: DSDS changed with mode: %{public}d", slotId_, object->data);
1712     int32_t dsdsMode = DSDS_MODE_V2;
1713     CoreManagerInner::GetInstance().GetDsdsMode(dsdsMode);
1714     if (object->data == dsdsMode) {
1715         TELEPHONY_LOGE("Slot%{public}d: DSDS mode is the same!", slotId_);
1716         return;
1717     }
1718     if (object->data < DSDS_MODE_V2) {
1719         TELEPHONY_LOGE("Slot%{public}d: DSDS mode is illegal!", slotId_);
1720         return;
1721     }
1722     CoreManagerInner::GetInstance().SetDsdsMode(object->data);
1723     int32_t defaultSlotId = CoreManagerInner::GetInstance().GetDefaultCellularDataSlotId();
1724     int32_t simNum = CoreManagerInner::GetInstance().GetMaxSimCount();
1725     bool dataEnableStatus = true;
1726     IsCellularDataEnabled(dataEnableStatus);
1727     for (int32_t i = 0; i < simNum; ++i) {
1728         if (defaultSlotId != i && object->data == DSDS_MODE_V2) {
1729             SetDataPermitted(i, false);
1730         } else {
1731             if (dataEnableStatus) {
1732                 SetDataPermitted(i, true);
1733             }
1734             DelayedRefSingleton<CellularDataService>::GetInstance().ChangeConnectionForDsds(i, true);
1735         }
1736     }
1737     if (incallDataStateMachine_ != nullptr) {
1738         InnerEvent::Pointer incallEvent = InnerEvent::Get(CellularDataEventCode::MSG_SM_INCALL_DATA_DSDS_CHANGED);
1739         incallDataStateMachine_->SendEvent(incallEvent);
1740     }
1741 }
1742 
ClearConnectionIfRequired()1743 void CellularDataHandler::ClearConnectionIfRequired()
1744 {
1745     if (apnManager_ == nullptr) {
1746         TELEPHONY_LOGE("Slot%{public}d: apnManager_ is null", slotId_);
1747         return;
1748     }
1749     for (const sptr<ApnHolder> &apnHolder : apnManager_->GetAllApnHolder()) {
1750         if (apnHolder == nullptr) {
1751             TELEPHONY_LOGE("Slot%{public}d: apnHolder is null", slotId_);
1752             continue;
1753         }
1754         ApnProfileState apnState = apnHolder->GetApnState();
1755         std::string apnType = apnHolder->GetApnType();
1756         std::vector<sptr<ApnItem>> matchedApns = apnManager_->FilterMatchedApns(apnType, slotId_);
1757         if (matchedApns.empty()) {
1758             TELEPHONY_LOGE("Slot%{public}d: matchedApns is empty", slotId_);
1759             continue;
1760         }
1761         bool roamingState = CoreManagerInner::GetInstance().GetPsRoamingState(slotId_) > 0;
1762         if (!apnHolder->IsSameMatchedApns(matchedApns, roamingState)) {
1763             apnHolder->SetAllMatchedApns(matchedApns);
1764             if (apnState != ApnProfileState::PROFILE_STATE_IDLE &&
1765                 apnState != ApnProfileState::PROFILE_STATE_FAILED) {
1766                 TELEPHONY_LOGI("Slot%{public}d: the connection of APN type:%{public}s will be cleared.",
1767                     slotId_, apnType.c_str());
1768                 ClearConnection(apnHolder, DisConnectionReason::REASON_RETRY_CONNECTION);
1769             }
1770         }
1771     }
1772     if (connectionManager_ == nullptr) {
1773         TELEPHONY_LOGE("Slot%{public}d: connectionManager_ is null", slotId_);
1774         return;
1775     }
1776     if (!apnManager_->HasAnyConnectedState()) {
1777         connectionManager_->StopStallDetectionTimer();
1778         connectionManager_->EndNetStatistics();
1779         ResetDataFlowType();
1780     }
1781 }
1782 
PsDataRatChanged(const InnerEvent::Pointer & event)1783 void CellularDataHandler::PsDataRatChanged(const InnerEvent::Pointer &event)
1784 {
1785     CoreManagerInner &coreInner = CoreManagerInner::GetInstance();
1786     int32_t radioTech = static_cast<int32_t>(RadioTech::RADIO_TECHNOLOGY_INVALID);
1787     coreInner.GetPsRadioTech(slotId_, radioTech);
1788     TELEPHONY_LOGI("Slot%{public}d: radioTech is %{public}d", slotId_, radioTech);
1789     if (event == nullptr) {
1790         TELEPHONY_LOGE("Slot%{public}d: event is null", slotId_);
1791         return;
1792     }
1793     if (dataSwitchSettings_ == nullptr) {
1794         TELEPHONY_LOGE("Slot%{public}d: dataSwitchSettings is null", slotId_);
1795         return;
1796     }
1797     bool dataEnabled = dataSwitchSettings_->IsUserDataOn();
1798     if (!dataEnabled) {
1799         TELEPHONY_LOGE("Slot%{public}d: data enable is close", slotId_);
1800         return;
1801     }
1802     bool attached = coreInner.GetPsRegState(slotId_) == (int32_t)RegServiceState::REG_STATE_IN_SERVICE;
1803     if (!attached) {
1804         TELEPHONY_LOGE("Slot%{public}d: attached is false", slotId_);
1805         return;
1806     }
1807     ClearConnectionIfRequired();
1808     EstablishAllApnsIfConnectable();
1809 }
1810 
SetPolicyDataOn(bool enable)1811 void CellularDataHandler::SetPolicyDataOn(bool enable)
1812 {
1813     if (dataSwitchSettings_ == nullptr) {
1814         TELEPHONY_LOGE("Slot%{public}d: dataSwitchSettings is null", slotId_);
1815         return;
1816     }
1817     bool policyDataOn = dataSwitchSettings_->IsPolicyDataOn();
1818     if (policyDataOn != enable) {
1819         dataSwitchSettings_->SetPolicyDataOn(enable);
1820         if (enable) {
1821             SendEvent(CellularDataEventCode::MSG_ESTABLISH_ALL_APNS_IF_CONNECTABLE);
1822         } else {
1823             ClearAllConnections(DisConnectionReason::REASON_CLEAR_CONNECTION);
1824         }
1825     }
1826 }
1827 
IsRestrictedMode() const1828 bool CellularDataHandler::IsRestrictedMode() const
1829 {
1830     int32_t networkType = static_cast<int32_t>(RadioTech::RADIO_TECHNOLOGY_INVALID);
1831     CoreManagerInner::GetInstance().GetPsRadioTech(slotId_, networkType);
1832     bool support = (networkType == (int32_t)RadioTech::RADIO_TECHNOLOGY_GSM);
1833     bool inCall = (lastCallState_ != TelCallStatus::CALL_STATUS_IDLE &&
1834                    lastCallState_ != TelCallStatus::CALL_STATUS_DISCONNECTED);
1835     TELEPHONY_LOGD("Slot%{public}d: radio technology is gsm only:%{public}d and call is busy:%{public}d", slotId_,
1836         support, inCall);
1837     return inCall && support;
1838 }
1839 
GetDisConnectionReason()1840 DisConnectionReason CellularDataHandler::GetDisConnectionReason()
1841 {
1842     return disconnectionReason_;
1843 }
1844 
SetDataPermitted(int32_t slotId,bool dataPermitted)1845 void CellularDataHandler::SetDataPermitted(int32_t slotId, bool dataPermitted)
1846 {
1847     TELEPHONY_LOGI("Slot%{public}d: dataPermitted is %{public}d.", slotId, dataPermitted);
1848     int32_t maxSimCount = CoreManagerInner::GetInstance().GetMaxSimCount();
1849     if (maxSimCount <= 1) {
1850         TELEPHONY_LOGE("Slot%{public}d: maxSimCount is: %{public}d", slotId_, maxSimCount);
1851         return;
1852     }
1853     bool hasSimCard = false;
1854     CoreManagerInner::GetInstance().HasSimCard(slotId, hasSimCard);
1855     if (!hasSimCard && !IsVSimSlotId(slotId)) {
1856         TELEPHONY_LOGE("Slot%{public}d: no sim :%{public}d", slotId_, slotId);
1857         return;
1858     }
1859     CoreManagerInner::GetInstance().SetDataPermitted(
1860         slotId, CellularDataEventCode::MSG_SET_DATA_PERMITTED, dataPermitted, shared_from_this());
1861 }
1862 
SetDataPermittedResponse(const AppExecFwk::InnerEvent::Pointer & event)1863 void CellularDataHandler::SetDataPermittedResponse(const AppExecFwk::InnerEvent::Pointer &event)
1864 {
1865     if (event == nullptr) {
1866         TELEPHONY_LOGE("Slot%{public}d: event is null", slotId_);
1867         return;
1868     }
1869     std::shared_ptr<TelRilResponseInfo<int32_t>> rilInfo = event->GetSharedObject<TelRilResponseInfo<int32_t>>();
1870     if (rilInfo == nullptr) {
1871         TELEPHONY_LOGE("Slot%{public}d: RadioResponseInfo is null", slotId_);
1872         return;
1873     }
1874     if (rilInfo->errorNo != 0) {
1875         TELEPHONY_LOGE("Slot%{public}d: SetDataPermitted error", slotId_);
1876     }
1877 }
1878 
GetEsmFlagFromOpCfg()1879 bool CellularDataHandler::GetEsmFlagFromOpCfg()
1880 {
1881     int32_t esmFlagFromOpCfg = ESM_FLAG_INVALID;
1882     OperatorConfig configsForEsmFlag;
1883     CoreManagerInner::GetInstance().GetOperatorConfigs(slotId_, configsForEsmFlag);
1884     if (configsForEsmFlag.intValue.find(KEY_PLMN_ESM_FLAG_INT) != configsForEsmFlag.intValue.end()) {
1885         esmFlagFromOpCfg = configsForEsmFlag.intValue[KEY_PLMN_ESM_FLAG_INT];
1886     }
1887     if (esmFlagFromOpCfg < 0 || esmFlagFromOpCfg > 1) {
1888         TELEPHONY_LOGE("esmFlag value is invalid");
1889     }
1890     return (esmFlagFromOpCfg != 0);
1891 }
1892 
SetRilAttachApn()1893 void CellularDataHandler::SetRilAttachApn()
1894 {
1895     DataProfile dataProfile;
1896     if (!GetEsmFlagFromOpCfg()) {
1897         dataProfile.profileId = 0;
1898         dataProfile.apn = "";
1899         dataProfile.protocol = "";
1900         dataProfile.verType = 0;
1901         dataProfile.userName = "";
1902         dataProfile.password = "";
1903         dataProfile.roamingProtocol = "";
1904     } else {
1905         sptr<ApnItem> attachApn = apnManager_->GetRilAttachApn();
1906         if (attachApn == nullptr) {
1907             TELEPHONY_LOGE("Slot%{public}d: attachApn is null", slotId_);
1908             return;
1909         }
1910         dataProfile.profileId = attachApn->attr_.profileId_;
1911         dataProfile.apn = attachApn->attr_.apn_;
1912         dataProfile.protocol = attachApn->attr_.protocol_;
1913         dataProfile.verType = attachApn->attr_.authType_;
1914         dataProfile.userName = attachApn->attr_.user_;
1915         dataProfile.password = attachApn->attr_.password_;
1916         dataProfile.roamingProtocol = attachApn->attr_.roamingProtocol_;
1917     }
1918     TELEPHONY_LOGI("Slot%{public}d: DataProfile profileId = %{public}d", slotId_, dataProfile.profileId);
1919     CoreManagerInner::GetInstance().SetInitApnInfo(
1920         slotId_, CellularDataEventCode::MSG_SET_RIL_ATTACH_APN, dataProfile, shared_from_this());
1921 }
1922 
SetRilAttachApnResponse(const AppExecFwk::InnerEvent::Pointer & event)1923 void CellularDataHandler::SetRilAttachApnResponse(const AppExecFwk::InnerEvent::Pointer &event)
1924 {
1925     if (event == nullptr) {
1926         TELEPHONY_LOGE("Slot%{public}d: event is null", slotId_);
1927         return;
1928     }
1929     std::shared_ptr<TelRilResponseInfo<int32_t>> rilInfo = event->GetSharedObject<TelRilResponseInfo<int32_t>>();
1930     if (rilInfo == nullptr) {
1931         TELEPHONY_LOGE("Slot%{public}d: RadioResponseInfo is null", slotId_);
1932         return;
1933     }
1934     if (rilInfo->errorNo != 0) {
1935         TELEPHONY_LOGE("Slot%{public}d: SetRilAttachApn error", slotId_);
1936     }
1937     isRilApnAttached_ = (rilInfo->errorNo == 0);
1938     TELEPHONY_LOGI("Slot%{public}d: isRilApnAttached_ = %{public}d", slotId_, isRilApnAttached_);
1939 }
1940 
HasAnyHigherPriorityConnection(const sptr<ApnHolder> & apnHolder)1941 bool CellularDataHandler::HasAnyHigherPriorityConnection(const sptr<ApnHolder> &apnHolder)
1942 {
1943     if (apnManager_ == nullptr) {
1944         TELEPHONY_LOGE("Slot%{public}d: apnManager is null", slotId_);
1945         return false;
1946     }
1947     std::vector<sptr<ApnHolder>> sortApnHolders = apnManager_->GetSortApnHolder();
1948     if (sortApnHolders.empty()) {
1949         TELEPHONY_LOGE("Slot%{public}d: SortApnHolder is null", slotId_);
1950         return false;
1951     }
1952     for (const sptr<ApnHolder> &sortApnHolder : sortApnHolders) {
1953         if (sortApnHolder->GetPriority() > apnHolder->GetPriority()) {
1954             if (sortApnHolder->IsDataCallEnabled() &&
1955                 (sortApnHolder->GetApnState() == ApnProfileState::PROFILE_STATE_CONNECTED ||
1956                     sortApnHolder->GetApnState() == ApnProfileState::PROFILE_STATE_CONNECTING ||
1957                     sortApnHolder->GetApnState() == ApnProfileState::PROFILE_STATE_DISCONNECTING)) {
1958                 CellularDataHiSysEvent::WriteDataActivateFaultEvent(slotId_, SWITCH_ON,
1959                     CellularDataErrorCode::DATA_ERROR_HAS_HIGHER_PRIORITY_CONNECTION,
1960                     "There is higher priority connection");
1961                 return true;
1962             }
1963         }
1964     }
1965     return false;
1966 }
1967 
HasInternetCapability(const int32_t cid) const1968 bool CellularDataHandler::HasInternetCapability(const int32_t cid) const
1969 {
1970     if (connectionManager_ == nullptr) {
1971         TELEPHONY_LOGE("Slot%{public}d: connectionManager is null", slotId_);
1972         return false;
1973     }
1974     std::shared_ptr<CellularDataStateMachine> activeStateMachine = connectionManager_->GetActiveConnectionByCid(cid);
1975     if (activeStateMachine == nullptr) {
1976         TELEPHONY_LOGE("Slot%{public}d: get activeStateMachine by cid fail", slotId_);
1977         return false;
1978     }
1979     uint64_t netCapability = activeStateMachine->GetCapability();
1980     if (netCapability == NetCap::NET_CAPABILITY_INTERNET) {
1981         return true;
1982     }
1983     return false;
1984 }
1985 
ChangeConnectionForDsds(bool enable)1986 bool CellularDataHandler::ChangeConnectionForDsds(bool enable)
1987 {
1988     if (dataSwitchSettings_ == nullptr) {
1989         TELEPHONY_LOGE("Slot%{public}d: dataSwitchSettings_ is null.", slotId_);
1990         return false;
1991     }
1992     if (enable) {
1993         dataSwitchSettings_->SetInternalDataOn(true);
1994         SendEvent(CellularDataEventCode::MSG_ESTABLISH_ALL_APNS_IF_CONNECTABLE);
1995     } else {
1996         dataSwitchSettings_->SetInternalDataOn(false);
1997         ClearAllConnections(DisConnectionReason::REASON_CLEAR_CONNECTION);
1998     }
1999     return true;
2000 }
2001 
GetConfigurationFor5G()2002 void CellularDataHandler::GetConfigurationFor5G()
2003 {
2004     // get 5G configurations
2005     unMeteredAllNsaConfig_ = ParseOperatorConfig(u"allmeterednas");
2006     unMeteredNrNsaMmwaveConfig_ = ParseOperatorConfig(u"meterednrnsammware");
2007     unMeteredNrNsaSub6Config_ = ParseOperatorConfig(u"meteredNrnsasub6");
2008     unMeteredAllNrsaConfig_ = ParseOperatorConfig(u"meteredallnrsa");
2009     unMeteredNrsaMmwaveConfig_ = ParseOperatorConfig(u"meterednrsammware");
2010     unMeteredNrsaSub6Config_ = ParseOperatorConfig(u"meterednrsasub6");
2011     unMeteredRoamingConfig_ = ParseOperatorConfig(u"meteredroaming");
2012     GetDefaultConfiguration();
2013 }
2014 
ParseOperatorConfig(const std::u16string & configName)2015 bool CellularDataHandler::ParseOperatorConfig(const std::u16string &configName)
2016 {
2017     OperatorConfig configsFor5G;
2018     CoreManagerInner::GetInstance().GetOperatorConfigs(slotId_, configsFor5G);
2019     if (configsFor5G.configValue.count(configName) > 0) {
2020         std::string flag = Str16ToStr8(configsFor5G.configValue[configName]);
2021         TELEPHONY_LOGI("Slot%{public}d: parse operator 5G config: %{public}s", slotId_, flag.c_str());
2022         if (flag == "true") {
2023             return true;
2024         }
2025     }
2026     return false;
2027 }
2028 
GetSinglePdpEnabledFromOpCfg()2029 void CellularDataHandler::GetSinglePdpEnabledFromOpCfg()
2030 {
2031     OperatorConfig configsForSinglePdp;
2032     CoreManagerInner::GetInstance().GetOperatorConfigs(slotId_, configsForSinglePdp);
2033     if (configsForSinglePdp.boolValue.find(KEY_SINGLE_PDP_ENABLED_BOOL) != configsForSinglePdp.boolValue.end()) {
2034         multipleConnectionsEnabled_ = !configsForSinglePdp.boolValue[KEY_SINGLE_PDP_ENABLED_BOOL];
2035     }
2036     return;
2037 }
2038 
IsSingleConnectionEnabled(int32_t radioTech)2039 bool CellularDataHandler::IsSingleConnectionEnabled(int32_t radioTech)
2040 {
2041     std::vector<int32_t> singlePdpRadio;
2042     OperatorConfig configsForSinglePdpRadioType;
2043     CoreManagerInner::GetInstance().GetOperatorConfigs(slotId_, configsForSinglePdpRadioType);
2044     if (configsForSinglePdpRadioType.intArrayValue.count(KEY_SINGLE_PDP_RADIO_TYPE_INT_ARRAY) >0) {
2045         singlePdpRadio = configsForSinglePdpRadioType.intArrayValue[KEY_SINGLE_PDP_RADIO_TYPE_INT_ARRAY];
2046     }
2047     if (singlePdpRadio.empty()) {
2048         TELEPHONY_LOGI("single pdp radio type array is empty");
2049     }
2050     if (std::find(singlePdpRadio.begin(), singlePdpRadio.end(), radioTech) != singlePdpRadio.end()) {
2051         TELEPHONY_LOGI("radio type array is matched single pdp type");
2052         multipleConnectionsEnabled_ = false;
2053         return !multipleConnectionsEnabled_;
2054     }
2055     GetSinglePdpEnabledFromOpCfg();
2056     return !multipleConnectionsEnabled_;
2057 }
2058 
GetDefaultDataEnableConfig()2059 void CellularDataHandler::GetDefaultDataEnableConfig()
2060 {
2061     if (dataSwitchSettings_ == nullptr) {
2062         TELEPHONY_LOGE("Slot%{public}d: dataSwitchSettings_ is null", slotId_);
2063         return;
2064     }
2065     bool dataEnbaled = true;
2066     int32_t ret = dataSwitchSettings_->QueryUserDataStatus(dataEnbaled);
2067     const int32_t defSlotId = CoreManagerInner::GetInstance().GetDefaultCellularDataSlotId();
2068     if (ret == TELEPHONY_ERR_SUCCESS && defSlotId != slotId_) {
2069         return;
2070     }
2071     OperatorConfig config;
2072     CoreManagerInner::GetInstance().GetOperatorConfigs(slotId_, config);
2073     if (config.boolValue.find(KEY_DEFAULT_DATA_ENABLE_BOOL) != config.boolValue.end()) {
2074         dataEnbaled = config.boolValue[KEY_DEFAULT_DATA_ENABLE_BOOL];
2075         TELEPHONY_LOGI("Slot%{public}d: OperatorConfig dataEnable_ = %{public}d", slotId_, dataEnbaled);
2076         dataSwitchSettings_->SetUserDataOn(dataEnbaled);
2077     }
2078 }
2079 
GetDefaultDataRoamingConfig()2080 void CellularDataHandler::GetDefaultDataRoamingConfig()
2081 {
2082     defaultDataRoamingEnable_ = false;
2083     OperatorConfig configsForDataRoaming;
2084     CoreManagerInner::GetInstance().GetOperatorConfigs(slotId_, configsForDataRoaming);
2085     if (configsForDataRoaming.boolValue.find(KEY_DEFAULT_DATA_ROAMING_BOOL) != configsForDataRoaming.boolValue.end()) {
2086         defaultDataRoamingEnable_ = configsForDataRoaming.boolValue[KEY_DEFAULT_DATA_ROAMING_BOOL];
2087         TELEPHONY_LOGI("Slot%{public}d: OperatorConfig defaultDataRoamingEnable_ = %{public}d", slotId_,
2088             defaultDataRoamingEnable_);
2089     } else {
2090         std::string defaultDataRoaming = DEFAULT_DATA_ROAMING + std::to_string(slotId_);
2091         int32_t dataRoaming = static_cast<int32_t>(RoamingSwitchCode::CELLULAR_DATA_ROAMING_DISABLED);
2092         dataRoaming = GetIntParameter(defaultDataRoaming.c_str(), dataRoaming);
2093         defaultDataRoamingEnable_ =
2094             (dataRoaming == static_cast<int32_t>(RoamingSwitchCode::CELLULAR_DATA_ROAMING_ENABLED));
2095         TELEPHONY_LOGI(
2096             "Slot%{public}d: defaultDataRoamingEnable_ from prop is %{public}d", slotId_, defaultDataRoamingEnable_);
2097     }
2098     if (dataSwitchSettings_ == nullptr) {
2099         TELEPHONY_LOGE("Slot%{public}d: dataSwitchSettings_ is null", slotId_);
2100         return;
2101     }
2102     bool dataRoamingEnabled = false;
2103     int32_t ret = dataSwitchSettings_->QueryUserDataRoamingStatus(dataRoamingEnabled);
2104     if (ret != TELEPHONY_ERR_SUCCESS && defaultDataRoamingEnable_ != dataSwitchSettings_->IsUserDataRoamingOn()) {
2105         dataSwitchSettings_->UpdateUserDataRoamingOn(defaultDataRoamingEnable_);
2106         if (apnManager_ == nullptr) {
2107             TELEPHONY_LOGE("Slot%{public}d: apnManager_ is null", slotId_);
2108             return;
2109         }
2110         bool roamingState = false;
2111         if (CoreManagerInner::GetInstance().GetPsRoamingState(slotId_) > 0) {
2112             roamingState = true;
2113         }
2114         if (roamingState) {
2115             ApnProfileState apnState = apnManager_->GetOverallApnState();
2116             if (apnState == ApnProfileState::PROFILE_STATE_CONNECTING ||
2117                 apnState == ApnProfileState::PROFILE_STATE_CONNECTED) {
2118                 ClearAllConnections(DisConnectionReason::REASON_RETRY_CONNECTION);
2119             }
2120             EstablishAllApnsIfConnectable();
2121         } else {
2122             TELEPHONY_LOGI("Slot%{public}d: Not roaming(%{public}d), not doing anything", slotId_, roamingState);
2123         }
2124     }
2125 }
2126 
GetDefaultConfiguration()2127 void CellularDataHandler::GetDefaultConfiguration()
2128 {
2129     if (connectionManager_ == nullptr) {
2130         TELEPHONY_LOGE("Slot%{public}d: connectionManager is null", slotId_);
2131         return;
2132     }
2133     connectionManager_->GetDefaultBandWidthsConfig();
2134     connectionManager_->GetDefaultTcpBufferConfig();
2135     GetDefaultUpLinkThresholdsConfig();
2136     GetDefaultDownLinkThresholdsConfig();
2137     defaultMobileMtuConfig_ = CellularDataUtils::GetDefaultMobileMtuConfig();
2138     TELEPHONY_LOGI("Slot%{public}d: defaultMobileMtuConfig_ = %{public}d", slotId_, defaultMobileMtuConfig_);
2139     defaultPreferApn_ = CellularDataUtils::GetDefaultPreferApnConfig();
2140     TELEPHONY_LOGI("Slot%{public}d: defaultPreferApn_ is %{public}d", slotId_, defaultPreferApn_);
2141     multipleConnectionsEnabled_ = CellularDataUtils::GetDefaultMultipleConnectionsConfig();
2142     GetSinglePdpEnabledFromOpCfg();
2143     GetDefaultDataRoamingConfig();
2144     GetDefaultDataEnableConfig();
2145     TELEPHONY_LOGI("Slot%{public}d: multipleConnectionsEnabled_ = %{public}d, defaultDataRoamingEnable_ = %{public}d",
2146         slotId_, multipleConnectionsEnabled_, defaultDataRoamingEnable_);
2147 }
2148 
HandleRadioNrStateChanged(const AppExecFwk::InnerEvent::Pointer & event)2149 void CellularDataHandler::HandleRadioNrStateChanged(const AppExecFwk::InnerEvent::Pointer &event)
2150 {
2151     if (connectionManager_ == nullptr) {
2152         TELEPHONY_LOGE("Slot%{public}d: connectionManager is null", slotId_);
2153         return;
2154     }
2155     TELEPHONY_LOGI("Slot%{public}d: receive event", slotId_);
2156     std::vector<std::shared_ptr<CellularDataStateMachine>> stateMachines =
2157         connectionManager_->GetAllConnectionMachine();
2158     for (const std::shared_ptr<CellularDataStateMachine> &cellularDataStateMachine : stateMachines) {
2159         InnerEvent::Pointer eventCode = InnerEvent::Get(RadioEvent::RADIO_NR_STATE_CHANGED);
2160         cellularDataStateMachine->SendEvent(eventCode);
2161     }
2162 }
2163 
HandleRadioNrFrequencyChanged(const AppExecFwk::InnerEvent::Pointer & event)2164 void CellularDataHandler::HandleRadioNrFrequencyChanged(const AppExecFwk::InnerEvent::Pointer &event)
2165 {
2166     if (connectionManager_ == nullptr) {
2167         TELEPHONY_LOGE("Slot%{public}d: connectionManager is null", slotId_);
2168         return;
2169     }
2170     TELEPHONY_LOGI("Slot%{public}d: receive event", slotId_);
2171     std::vector<std::shared_ptr<CellularDataStateMachine>> stateMachines =
2172         connectionManager_->GetAllConnectionMachine();
2173     for (const std::shared_ptr<CellularDataStateMachine> &cellularDataStateMachine : stateMachines) {
2174         InnerEvent::Pointer eventCode = InnerEvent::Get(RadioEvent::RADIO_NR_FREQUENCY_CHANGED);
2175         cellularDataStateMachine->SendEvent(eventCode);
2176     }
2177 }
2178 
GetDefaultUpLinkThresholdsConfig()2179 void CellularDataHandler::GetDefaultUpLinkThresholdsConfig()
2180 {
2181     std::lock_guard<std::mutex> guard(mtx_);
2182     upLinkThresholds_.clear();
2183     char upLinkConfig[UP_DOWN_LINK_SIZE] = { 0 };
2184     GetParameter(CONFIG_UPLINK_THRESHOLDS, CAPACITY_THRESHOLDS_FOR_UPLINK, upLinkConfig, UP_DOWN_LINK_SIZE);
2185     TELEPHONY_LOGI("Slot%{public}d: upLinkThresholds = %{public}s", slotId_, upLinkConfig);
2186     upLinkThresholds_ = CellularDataUtils::Split(upLinkConfig, ",");
2187 }
2188 
GetDefaultDownLinkThresholdsConfig()2189 void CellularDataHandler::GetDefaultDownLinkThresholdsConfig()
2190 {
2191     std::lock_guard<std::mutex> guard(mtx_);
2192     downLinkThresholds_.clear();
2193     char downLinkConfig[UP_DOWN_LINK_SIZE] = { 0 };
2194     GetParameter(CONFIG_DOWNLINK_THRESHOLDS, CAPACITY_THRESHOLDS_FOR_DOWNLINK, downLinkConfig, UP_DOWN_LINK_SIZE);
2195     TELEPHONY_LOGI("Slot%{public}d: downLinkThresholds_ = %{public}s", slotId_, downLinkConfig);
2196     downLinkThresholds_ = CellularDataUtils::Split(downLinkConfig, ",");
2197 }
2198 
SetRilLinkBandwidths()2199 void CellularDataHandler::SetRilLinkBandwidths()
2200 {
2201     std::lock_guard<std::mutex> guard(mtx_);
2202     LinkBandwidthRule linkBandwidth;
2203     CoreManagerInner::GetInstance().GetPsRadioTech(slotId_, linkBandwidth.rat);
2204     linkBandwidth.delayMs = DELAY_SET_RIL_BANDWIDTH_MS;
2205     linkBandwidth.delayUplinkKbps = DELAY_SET_RIL_UP_DOWN_BANDWIDTH_MS;
2206     linkBandwidth.delayDownlinkKbps = DELAY_SET_RIL_UP_DOWN_BANDWIDTH_MS;
2207     for (std::string upLinkThreshold : upLinkThresholds_) {
2208         linkBandwidth.maximumUplinkKbps.push_back(atoi(upLinkThreshold.c_str()));
2209     }
2210     for (std::string downLinkThreshold : downLinkThresholds_) {
2211         linkBandwidth.maximumDownlinkKbps.push_back(atoi(downLinkThreshold.c_str()));
2212     }
2213     CoreManagerInner::GetInstance().SetLinkBandwidthReportingRule(
2214         slotId_, CellularDataEventCode::MSG_SET_RIL_BANDWIDTH, linkBandwidth, shared_from_this());
2215 }
2216 
HandleDBSettingEnableChanged(const AppExecFwk::InnerEvent::Pointer & event)2217 void CellularDataHandler::HandleDBSettingEnableChanged(const AppExecFwk::InnerEvent::Pointer &event)
2218 {
2219     if (dataSwitchSettings_ == nullptr) {
2220         TELEPHONY_LOGE("Slot%{public}d: dataSwitchSettings_ is null.", slotId_);
2221         return;
2222     }
2223     bool dataEnabled = true;
2224     dataSwitchSettings_->QueryUserDataStatus(dataEnabled);
2225     CoreManagerInner &coreInner = CoreManagerInner::GetInstance();
2226     const int32_t defSlotId = coreInner.GetDefaultCellularDataSlotId();
2227     if (dataEnabled && defSlotId == slotId_) {
2228         EstablishAllApnsIfConnectable();
2229     } else {
2230         ClearAllConnections(DisConnectionReason::REASON_CLEAR_CONNECTION);
2231     }
2232 }
2233 
HandleDBSettingRoamingChanged(const AppExecFwk::InnerEvent::Pointer & event)2234 void CellularDataHandler::HandleDBSettingRoamingChanged(const AppExecFwk::InnerEvent::Pointer &event)
2235 {
2236     if (dataSwitchSettings_ == nullptr) {
2237         TELEPHONY_LOGE("Slot%{public}d: dataSwitchSettings_ is null", slotId_);
2238         return;
2239     }
2240     bool dataRoamingEnabled = dataSwitchSettings_->IsUserDataRoamingOn();
2241     bool roamingState = false;
2242     if (CoreManagerInner::GetInstance().GetPsRoamingState(slotId_) > 0) {
2243         roamingState = true;
2244     }
2245     if (roamingState) {
2246         if (dataRoamingEnabled) {
2247             EstablishAllApnsIfConnectable();
2248         } else {
2249             ClearAllConnections(DisConnectionReason::REASON_CLEAR_CONNECTION);
2250         }
2251     }
2252 }
2253 
UnRegisterDataSettingObserver()2254 void CellularDataHandler::UnRegisterDataSettingObserver()
2255 {
2256     if (settingObserver_ == nullptr || roamingObserver_ == nullptr || incallObserver_ == nullptr ||
2257         cellularDataRdbObserver_ == nullptr || airplaneObserver_ == nullptr) {
2258         TELEPHONY_LOGE("Slot%{public}d: settingObserver_ or roamingObserver_ or incallObserver_ or "
2259                        "cellularDataRdbObserver_ or airplaneObserver_ is null", slotId_);
2260         return;
2261     }
2262     std::shared_ptr<CellularDataSettingsRdbHelper> settingHelper = CellularDataSettingsRdbHelper::GetInstance();
2263     if (settingHelper == nullptr) {
2264         TELEPHONY_LOGE("Slot%{public}d: settingHelper is null", slotId_);
2265         return;
2266     }
2267     Uri dataEnableUri(CELLULAR_DATA_SETTING_DATA_ENABLE_URI);
2268     settingHelper->UnRegisterSettingsObserver(dataEnableUri, settingObserver_);
2269 
2270     int32_t simId = CoreManagerInner::GetInstance().GetSimId(slotId_);
2271     if (simId <= INVALID_SIM_ID) {
2272         TELEPHONY_LOGE("Slot%{public}d: failed due to invalid sim id %{public}d", slotId_, simId);
2273         return;
2274     }
2275     Uri dataRoamingUri(std::string(CELLULAR_DATA_SETTING_DATA_ROAMING_URI) + std::to_string(simId));
2276     settingHelper->UnRegisterSettingsObserver(dataRoamingUri, roamingObserver_);
2277     Uri dataIncallUri(CELLULAR_DATA_SETTING_INTELLIGENCE_NETWORK_URI);
2278     settingHelper->UnRegisterSettingsObserver(dataIncallUri, incallObserver_);
2279     Uri airplaneUri(CELLULAR_DATA_AIRPLANE_MODE_URI);
2280     settingHelper->UnRegisterSettingsObserver(airplaneUri, airplaneObserver_);
2281 
2282     std::shared_ptr<CellularDataRdbHelper> cellularDataRdbHelper = CellularDataRdbHelper::GetInstance();
2283     if (cellularDataRdbHelper == nullptr) {
2284         TELEPHONY_LOGE("Slot%{public}d: cellularDataRdbHelper is null", slotId_);
2285         return;
2286     }
2287     cellularDataRdbHelper->UnRegisterObserver(cellularDataRdbObserver_);
2288 }
2289 
RegisterDataSettingObserver()2290 void CellularDataHandler::RegisterDataSettingObserver()
2291 {
2292     if (settingObserver_ == nullptr || roamingObserver_ == nullptr || incallObserver_ == nullptr ||
2293         cellularDataRdbObserver_ == nullptr || airplaneObserver_ == nullptr) {
2294         TELEPHONY_LOGE("Slot%{public}d: settingObserver_ or roamingObserver_ or incallObserver_ or "
2295                        "cellularDataRdbObserver_ or airplaneObserver_ is null", slotId_);
2296         return;
2297     }
2298     std::shared_ptr<CellularDataSettingsRdbHelper> settingHelper = CellularDataSettingsRdbHelper::GetInstance();
2299     if (settingHelper == nullptr) {
2300         TELEPHONY_LOGE("Slot%{public}d: settingHelper is null", slotId_);
2301         return;
2302     }
2303     Uri dataEnableUri(CELLULAR_DATA_SETTING_DATA_ENABLE_URI);
2304     settingHelper->RegisterSettingsObserver(dataEnableUri, settingObserver_);
2305 
2306     int32_t simId = CoreManagerInner::GetInstance().GetSimId(slotId_);
2307     if (simId <= INVALID_SIM_ID) {
2308         TELEPHONY_LOGE("Slot%{public}d: failed due to invalid sim id %{public}d", slotId_, simId);
2309         return;
2310     }
2311     Uri dataRoamingUri(std::string(CELLULAR_DATA_SETTING_DATA_ROAMING_URI) + std::to_string(simId));
2312     settingHelper->RegisterSettingsObserver(dataRoamingUri, roamingObserver_);
2313     Uri dataIncallUri(CELLULAR_DATA_SETTING_INTELLIGENCE_NETWORK_URI);
2314     settingHelper->RegisterSettingsObserver(dataIncallUri, incallObserver_);
2315     Uri airplaneUri(CELLULAR_DATA_AIRPLANE_MODE_URI);
2316     settingHelper->RegisterSettingsObserver(airplaneUri, airplaneObserver_);
2317 
2318     std::shared_ptr<CellularDataRdbHelper> cellularDataRdbHelper = CellularDataRdbHelper::GetInstance();
2319     if (cellularDataRdbHelper == nullptr) {
2320         TELEPHONY_LOGE("Slot%{public}d: cellularDataRdbHelper is null", slotId_);
2321         return;
2322     }
2323     cellularDataRdbHelper->RegisterObserver(cellularDataRdbObserver_);
2324 }
2325 
OnRilAdapterHostDied(const AppExecFwk::InnerEvent::Pointer & event)2326 void CellularDataHandler::OnRilAdapterHostDied(const AppExecFwk::InnerEvent::Pointer &event)
2327 {
2328     if (connectionManager_ == nullptr) {
2329         TELEPHONY_LOGE("Slot%{public}d: connectionManager is null", slotId_);
2330         return;
2331     }
2332     TELEPHONY_LOGI("Slot%{public}d: receive event", slotId_);
2333     std::vector<std::shared_ptr<CellularDataStateMachine>> stateMachines =
2334         connectionManager_->GetAllConnectionMachine();
2335     for (const std::shared_ptr<CellularDataStateMachine> &cellularDataStateMachine : stateMachines) {
2336         InnerEvent::Pointer eventCode = InnerEvent::Get(CellularDataEventCode::MSG_SM_RIL_ADAPTER_HOST_DIED);
2337         cellularDataStateMachine->SendEvent(eventCode);
2338     }
2339 }
2340 
GetDataConnApnAttr(ApnItem::Attribute & apnAttr) const2341 void CellularDataHandler::GetDataConnApnAttr(ApnItem::Attribute &apnAttr) const
2342 {
2343     if (apnManager_ == nullptr) {
2344         TELEPHONY_LOGE("Slot%{public}d: GetDataConnApnAttr:apnManager is null", slotId_);
2345         return;
2346     }
2347     for (const sptr<ApnHolder> &apnHolder : apnManager_->GetAllApnHolder()) {
2348         if (apnHolder == nullptr) {
2349             TELEPHONY_LOGE("Slot%{public}d: apnHolder is null", slotId_);
2350             continue;
2351         }
2352         if (apnHolder->IsDataCallEnabled()) {
2353             sptr<ApnItem> apnItem = apnHolder->GetCurrentApn();
2354             if (apnItem == nullptr) {
2355                 continue;
2356             }
2357             apnAttr = apnItem->attr_;
2358             return;
2359         }
2360     }
2361 }
2362 
GetDataConnIpType() const2363 std::string CellularDataHandler::GetDataConnIpType() const
2364 {
2365     if (apnManager_ == nullptr) {
2366         TELEPHONY_LOGE("Slot%{public}d: GetDataConnApnAttr:apnManager is null", slotId_);
2367         return "";
2368     }
2369     for (const sptr<ApnHolder> &apnHolder : apnManager_->GetAllApnHolder()) {
2370         if (apnHolder == nullptr) {
2371             TELEPHONY_LOGE("Slot%{public}d: apnHolder is null", slotId_);
2372             continue;
2373         }
2374         if (apnHolder->IsDataCallEnabled()) {
2375             auto stateMachine = apnHolder->GetCellularDataStateMachine();
2376             if (stateMachine == nullptr) {
2377                 TELEPHONY_LOGE("Slot%{public}d: stateMachine is null", slotId_);
2378                 continue;
2379             }
2380             return stateMachine->GetIpType();
2381         }
2382     }
2383     return "";
2384 }
2385 
GetDataRecoveryState()2386 int32_t CellularDataHandler::GetDataRecoveryState()
2387 {
2388     if (connectionManager_ == nullptr) {
2389         TELEPHONY_LOGE("Slot%{public}d: connectionManager is null", slotId_);
2390         return -1;
2391     }
2392     return connectionManager_->GetDataRecoveryState();
2393 }
2394 
HandleFactoryReset(const InnerEvent::Pointer & event)2395 void CellularDataHandler::HandleFactoryReset(const InnerEvent::Pointer &event)
2396 {
2397     TELEPHONY_LOGI("Slot%{public}d: factory reset", slotId_);
2398     SetCellularDataEnable(true);
2399     SetCellularDataRoamingEnabled(defaultDataRoamingEnable_);
2400     if (apnManager_ == nullptr) {
2401         TELEPHONY_LOGE("Slot%{public}d: apnManager_ is null", slotId_);
2402         return;
2403     }
2404     apnManager_->ResetApns(slotId_);
2405 }
2406 
IsNeedDoRecovery(bool needDoRecovery) const2407 void CellularDataHandler::IsNeedDoRecovery(bool needDoRecovery) const
2408 {
2409     if (connectionManager_ == nullptr) {
2410         TELEPHONY_LOGE("Slot%{public}d: in IsNeedDoRecovery connectionManager_ is null", slotId_);
2411         return;
2412     }
2413     connectionManager_->IsNeedDoRecovery(needDoRecovery);
2414 }
2415 
OnCleanAllDataConnectionsDone(const AppExecFwk::InnerEvent::Pointer & event)2416 void CellularDataHandler::OnCleanAllDataConnectionsDone(const AppExecFwk::InnerEvent::Pointer &event)
2417 {
2418     TELEPHONY_LOGI("Slot%{public}d: receive OnCleanAllDataConnectionsDone event", slotId_);
2419 }
2420 
IsVSimSlotId(int32_t slotId)2421 bool CellularDataHandler::IsVSimSlotId(int32_t slotId)
2422 {
2423     if (TELEPHONY_EXT_WRAPPER.getVSimSlotId_) {
2424         int vSimSlotId = INVALID_SLOT_ID;
2425         TELEPHONY_EXT_WRAPPER.getVSimSlotId_(vSimSlotId);
2426         return vSimSlotId == slotId;
2427     }
2428     return false;
2429 }
2430 
CheckForCompatibleDataConnection(sptr<ApnHolder> & apnHolder)2431 std::shared_ptr<CellularDataStateMachine> CellularDataHandler::CheckForCompatibleDataConnection(
2432     sptr<ApnHolder> &apnHolder)
2433 {
2434     std::shared_ptr<CellularDataStateMachine> potentialDc = nullptr;
2435     if (apnManager_ == nullptr || connectionManager_ == nullptr ||
2436         apnHolder->GetApnType() == DATA_CONTEXT_ROLE_DEFAULT ||
2437         apnHolder->GetApnType() == DATA_CONTEXT_ROLE_INTERNAL_DEFAULT) {
2438         return potentialDc;
2439     }
2440     std::vector<sptr<ApnItem>> dunApnList;
2441     if (apnHolder->GetApnType() == DATA_CONTEXT_ROLE_DUN) {
2442         apnManager_->FetchDunApns(dunApnList, slotId_);
2443     }
2444     auto allDCs = connectionManager_->GetAllConnectionMachine();
2445     bool isRoaming = false;
2446     int32_t result = IsCellularDataRoamingEnabled(isRoaming);
2447     if (result != TELEPHONY_ERR_SUCCESS) {
2448         isRoaming = false;
2449     }
2450     for (const auto& curDc : allDCs) {
2451         sptr<ApnItem> apnItem = curDc->GetApnItem();
2452         for (const auto& dunItem : dunApnList) {
2453             if (!ApnHolder::IsCompatibleApnItem(apnItem, dunItem, isRoaming)) {
2454                 continue;
2455             }
2456             if (curDc->IsActiveState()) {
2457                 return curDc;
2458             } else if (curDc->IsActivatingState()) {
2459                 potentialDc = curDc;
2460             } else if (curDc->IsDisconnectingState()) {
2461                 if (potentialDc == nullptr) {
2462                     potentialDc = curDc;
2463                 }
2464             }
2465         }
2466         if (dunApnList.size() == 0 && apnItem->CanDealWithType(apnHolder->GetApnType())) {
2467             if (curDc->IsActiveState()) {
2468                 return curDc;
2469             } else if (curDc->IsActivatingState()) {
2470                 potentialDc = curDc;
2471             } else if (curDc->IsDisconnectingState() && potentialDc == nullptr) {
2472                 potentialDc = curDc;
2473             }
2474         }
2475     }
2476     return potentialDc;
2477 }
2478 
HandleUpdateNetInfo(const AppExecFwk::InnerEvent::Pointer & event)2479 void CellularDataHandler::HandleUpdateNetInfo(const AppExecFwk::InnerEvent::Pointer &event)
2480 {
2481     TELEPHONY_LOGI("Slot%{public}d: HandleUpdateNetInfo", slotId_);
2482     if (event == nullptr || apnManager_ == nullptr) {
2483         TELEPHONY_LOGE("event or apnManager_ is null");
2484         return;
2485     }
2486 
2487     std::shared_ptr<SetupDataCallResultInfo> netInfo = event->GetSharedObject<SetupDataCallResultInfo>();
2488     if (netInfo == nullptr) {
2489         TELEPHONY_LOGE("info is null");
2490         return;
2491     }
2492 
2493     sptr<ApnHolder> apnHolder = apnManager_->FindApnHolderById(netInfo->flag);
2494     if (apnHolder == nullptr) {
2495         TELEPHONY_LOGE("Slot%{public}d: flag:%{public}d complete apnHolder is null", slotId_, netInfo->flag);
2496         return;
2497     }
2498     if (apnHolder->GetApnState() != PROFILE_STATE_CONNECTING && apnHolder->GetApnState() != PROFILE_STATE_CONNECTED) {
2499         TELEPHONY_LOGE("Slot%{public}d: apnHolder is not connecting or connected", slotId_);
2500         return;
2501     }
2502     auto stateMachine = apnHolder->GetCellularDataStateMachine();
2503     if (stateMachine == nullptr) {
2504         TELEPHONY_LOGE("stateMachine is null");
2505         return;
2506     }
2507     stateMachine->UpdateNetworkInfo(*netInfo);
2508 }
2509 
IsGsm()2510 bool CellularDataHandler::IsGsm()
2511 {
2512     bool isGsm = false;
2513     CoreManagerInner::GetInstance().IsGsm(slotId_, isGsm);
2514     return isGsm;
2515 }
2516 
IsCdma()2517 bool CellularDataHandler::IsCdma()
2518 {
2519     bool isCdma = false;
2520     CoreManagerInner::GetInstance().IsCdma(slotId_, isCdma);
2521     return isCdma;
2522 }
2523 
ReleaseCellularDataConnection()2524 void CellularDataHandler::ReleaseCellularDataConnection()
2525 {
2526     int32_t id = ApnManager::FindApnIdByCapability(OHOS::NetManagerStandard::NET_CAPABILITY_INTERNET);
2527     if (!apnManager_) {
2528         TELEPHONY_LOGE("apnManager_ is nullptr");
2529         return;
2530     }
2531     OHOS::sptr<ApnHolder> apnHolder = apnManager_->FindApnHolderById(id);
2532     if (apnHolder->GetUidStatus() == HasSystemUse::HAS) {
2533         TELEPHONY_LOGI("system using, can not release");
2534         return;
2535     }
2536     ClearConnection(apnHolder, DisConnectionReason::REASON_CLEAR_CONNECTION);
2537 }
2538 
UpdateNetworkInfo()2539 bool CellularDataHandler::UpdateNetworkInfo()
2540 {
2541     if (connectionManager_ == nullptr) {
2542         TELEPHONY_LOGE("Slot%{public}d: connectionManager_ is null", slotId_);
2543         return false;
2544     }
2545     auto stateMachines = connectionManager_->GetAllConnectionMachine();
2546     for (const std::shared_ptr<CellularDataStateMachine> &cellularDataStateMachine : stateMachines) {
2547         auto eventCode = InnerEvent::Get(CellularDataEventCode::MSG_SM_UPDATE_NETWORK_INFO);
2548         cellularDataStateMachine->SendEvent(eventCode);
2549     }
2550     return true;
2551 }
2552 
IsSupportDunApn()2553 bool CellularDataHandler::IsSupportDunApn()
2554 {
2555     if (apnManager_ == nullptr) {
2556         TELEPHONY_LOGE("Slot%{public}d: apnManager is null", slotId_);
2557         return false;
2558     }
2559     std::vector<sptr<ApnItem>> dunApnList;
2560     apnManager_->FetchDunApns(dunApnList, slotId_);
2561     ApnProfileState apnState = apnManager_->GetOverallDefaultApnState();
2562     TELEPHONY_LOGI("Slot%{public}d: IsSupportDun=%{public}d, apnState=%{public}d", slotId_, !dunApnList.empty(),
2563         apnState);
2564     return (!dunApnList.empty() && apnState == ApnProfileState::PROFILE_STATE_CONNECTED);
2565 }
2566 
GetDefaultActReportInfo()2567 ApnActivateReportInfo CellularDataHandler::GetDefaultActReportInfo()
2568 {
2569     return GetApnActReportInfo(DATA_CONTEXT_ROLE_DEFAULT_ID);
2570 }
2571 
GetInternalActReportInfo()2572 ApnActivateReportInfo CellularDataHandler::GetInternalActReportInfo()
2573 {
2574     return GetApnActReportInfo(DATA_CONTEXT_ROLE_INTERNAL_DEFAULT_ID);
2575 }
2576 
GetApnActReportInfo(uint32_t apnId)2577 ApnActivateReportInfo CellularDataHandler::GetApnActReportInfo(uint32_t apnId)
2578 {
2579     struct ApnActivateReportInfo info;
2580     uint32_t totalDuration = 0;
2581     uint32_t totalActTimes = 0;
2582     uint32_t totalActSuccTimes = 0;
2583     uint32_t topReason = 0;
2584     uint32_t topReasonCnt = 0;
2585     std::map<uint32_t, uint32_t> errorMap;
2586     std::lock_guard<std::mutex> lock(apnActivateListMutex_);
2587     EraseApnActivateList();
2588     for (uint32_t i = 0; i < apnActivateChrList_.size(); i++) {
2589         ApnActivateInfo info = apnActivateChrList_[i];
2590         if (info.apnId != apnId) {
2591             continue;
2592         }
2593         totalDuration += info.duration;
2594         totalActTimes++;
2595         if (info.reason == 0) {
2596             totalActSuccTimes++;
2597             continue;
2598         }
2599         if (errorMap.find(info.reason) != errorMap.end()) {
2600             errorMap[info.reason] = errorMap[info.reason]+1;
2601         } else {
2602             errorMap[info.reason] = 1;
2603         }
2604     }
2605     apnActivateListMutex_.unlock();
2606     info.actTimes = totalActTimes;
2607     info.actSuccTimes = totalActSuccTimes;
2608     info.averDuration = totalActSuccTimes == 0 ? 0 : totalDuration / totalActSuccTimes;
2609     std::map<uint32_t, uint32_t>::iterator iter;
2610     for (iter = errorMap.begin(); iter != errorMap.end(); ++iter) {
2611         if (iter->second > topReasonCnt) {
2612             topReason = iter->first;
2613             topReasonCnt = iter->second;
2614         }
2615     }
2616     info.topReason = topReason;
2617     TELEPHONY_LOGI("GetApnActReportInfo,%{public}d,%{public}d,%{public}d,%{public}d,%{public}d,",
2618         totalDuration, totalActTimes, totalActSuccTimes, topReason, topReasonCnt);
2619     return info;
2620 }
2621 
SetApnActivateStart(const std::string & apnType)2622 void CellularDataHandler::SetApnActivateStart(const std::string &apnType)
2623 {
2624     uint64_t currentTime = GetCurTime();
2625     if (apnType == DATA_CONTEXT_ROLE_DEFAULT) {
2626         defaultApnActTime_ = currentTime;
2627     }
2628     if (apnType == DATA_CONTEXT_ROLE_INTERNAL_DEFAULT) {
2629         internalApnActTime_ = currentTime;
2630     }
2631 }
2632 
SetApnActivateEnd(const std::shared_ptr<SetupDataCallResultInfo> & resultInfo)2633 void CellularDataHandler::SetApnActivateEnd(const std::shared_ptr<SetupDataCallResultInfo> &resultInfo)
2634 {
2635     struct ApnActivateInfo info;
2636     info.actSuccTime = GetCurTime();
2637     info.reason = resultInfo->reason;
2638     info.apnId = resultInfo->flag;
2639     if (resultInfo->flag == DATA_CONTEXT_ROLE_INTERNAL_DEFAULT_ID
2640         && internalApnActTime_ != 0) {
2641         info.duration = info.actSuccTime - internalApnActTime_;
2642     }
2643     if (resultInfo->flag == DATA_CONTEXT_ROLE_DEFAULT_ID
2644         && defaultApnActTime_ != 0) {
2645         info.duration = info.actSuccTime - defaultApnActTime_;
2646     }
2647     std::lock_guard<std::mutex> lock(apnActivateListMutex_);
2648     EraseApnActivateList();
2649     apnActivateChrList_.push_back(info);
2650     apnActivateListMutex_.unlock();
2651 }
2652 
EraseApnActivateList()2653 void CellularDataHandler::EraseApnActivateList()
2654 {
2655     int64_t currentTime = GetCurTime();
2656     for (std::vector<ApnActivateInfo>::iterator iter = apnActivateChrList_.begin();
2657         iter != apnActivateChrList_.end();) {
2658         if ((currentTime - iter->actSuccTime) > KEEP_APN_ACTIVATE_PERIOD) {
2659             apnActivateChrList_.erase(iter);
2660         } else {
2661             iter++;
2662         }
2663     }
2664 }
2665 
GetCurTime()2666 int64_t CellularDataHandler::GetCurTime()
2667 {
2668     return std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now()
2669         .time_since_epoch()).count();
2670 }
2671 } // namespace Telephony
2672 } // namespace OHOS
2673