diff --git a/services/sim/include/multi_sim_controller.h b/services/sim/include/multi_sim_controller.h index 472f298bcecffb0fdcdb8e804200e43cd9f24c62..e276718cb1da4016c6bd4be1a8457d97966f4859 100755 --- a/services/sim/include/multi_sim_controller.h +++ b/services/sim/include/multi_sim_controller.h @@ -36,6 +36,9 @@ public: std::vector> simFileManager); virtual ~MultiSimController(); + void AddExtraManagers(std::shared_ptr simStateManager, + std::shared_ptr simFileManager); + void Init(); bool InitData(int32_t slotId); int32_t GetDefaultVoiceSlotId(); diff --git a/services/sim/include/multi_sim_monitor.h b/services/sim/include/multi_sim_monitor.h index aa2f946ccbf784ce502d3bed58b0ad4ee47eb686..f7cca503e167192a12015f65ecbac8b3923d826e 100644 --- a/services/sim/include/multi_sim_monitor.h +++ b/services/sim/include/multi_sim_monitor.h @@ -76,6 +76,7 @@ private: std::list listSimAccountCallbackRecord_; std::mutex mutexInner_; std::atomic remainCount_ = 30; + int32_t maxSlotCount_ = 0; }; } // namespace Telephony } // namespace OHOS diff --git a/services/sim/src/multi_sim_controller.cpp b/services/sim/src/multi_sim_controller.cpp index 8cc218f0ea27c9e0c6cf76cc2331e4423c43a107..794574377d0b04b77d1241df2b9d2ea344ab8997 100644 --- a/services/sim/src/multi_sim_controller.cpp +++ b/services/sim/src/multi_sim_controller.cpp @@ -92,6 +92,16 @@ bool MultiSimController::ForgetAllData(int32_t slotId) return simDbHelper_->ForgetAllData(slotId) != INVALID_VALUE; } +void MultiSimController::AddExtraManagers(std::shared_ptr simStateManager, + std::shared_ptr simFileManager) +{ + if (simStateManager_.size() == SIM_SLOT_COUNT) { + simStateManager_.push_back(simStateManager); + simFileManager_.push_back(simFileManager); + maxCount_ = MAX_SLOT_COUNT; + } +} + bool MultiSimController::InitData(int32_t slotId) { TELEPHONY_LOGI("start to initData slotId is %{public}d", slotId); @@ -396,7 +406,7 @@ void MultiSimController::SortCache() */ bool MultiSimController::IsValidData(int32_t slotId) { - if ((slotId < DEFAULT_SIM_SLOT_ID) || (slotId >= SIM_SLOT_COUNT)) { + if ((slotId < DEFAULT_SIM_SLOT_ID) || (static_cast(slotId) >= simStateManager_.size())) { TELEPHONY_LOGE("can not get simStateManager"); return false; } diff --git a/services/sim/src/multi_sim_monitor.cpp b/services/sim/src/multi_sim_monitor.cpp index 8f768b521f916f2a365283ef6445e4eff5523589..20d93a4e2df397940e70ecbd3ecf7ee21660da21 100644 --- a/services/sim/src/multi_sim_monitor.cpp +++ b/services/sim/src/multi_sim_monitor.cpp @@ -143,7 +143,11 @@ void MultiSimMonitor::RegisterCoreNotify( bool MultiSimMonitor::IsValidSlotId(int32_t slotId) { - return (slotId >= DEFAULT_SIM_SLOT_ID) && (slotId < SIM_SLOT_COUNT); + if (maxSlotCount_ == 0) { + maxSlotCount_ = (SIM_SLOT_COUNT == DUAL_SLOT_COUNT && VSIM_MODEM_COUNT == MAX_SLOT_COUNT) ? + MAX_SLOT_COUNT : SIM_SLOT_COUNT; + } + return (slotId >= DEFAULT_SIM_SLOT_ID) && (slotId < maxSlotCount_); } bool MultiSimMonitor::IsVSimSlotId(int32_t slotId) diff --git a/services/sim/src/sim_manager.cpp b/services/sim/src/sim_manager.cpp index 0ca5acefc7dd93881fd668ea3101febdd63237bc..a362f05ac981697c6ed2c10bb9255ba1b2a1f9c6 100644 --- a/services/sim/src/sim_manager.cpp +++ b/services/sim/src/sim_manager.cpp @@ -85,6 +85,8 @@ int32_t SimManager::InitTelExtraModule(int32_t slotId) simFileManager_.resize(MAX_SLOT_COUNT); simAccountManager_.resize(MAX_SLOT_COUNT); InitBaseManager(slotId); + multiSimController_->AddExtraManagers(simStateManager_[slotId], simFileManager_[slotId]); + slotCount_ = MAX_SLOT_COUNT; return TELEPHONY_SUCCESS; } @@ -162,7 +164,7 @@ int32_t SimManager::GetSimState(int32_t slotId, SimState &simState) int32_t SimManager::GetCardType(int32_t slotId, CardType &cardType) { if (!HasSimCardInner(slotId)) { - TELEPHONY_LOGE("GetCardType has no sim card!"); + TELEPHONY_LOGE("slot%{public}d GetCardType has no sim card!", slotId); return TELEPHONY_ERR_NO_SIM_CARD; } cardType = simStateManager_[slotId]->GetCardType();