12d43be4eSopenharmony_ci/* 22d43be4eSopenharmony_ci * Copyright (C) 2021 Huawei Device Co., Ltd. 32d43be4eSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 42d43be4eSopenharmony_ci * you may not use this file except in compliance with the License. 52d43be4eSopenharmony_ci * You may obtain a copy of the License at 62d43be4eSopenharmony_ci * 72d43be4eSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 82d43be4eSopenharmony_ci * 92d43be4eSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 102d43be4eSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 112d43be4eSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 122d43be4eSopenharmony_ci * See the License for the specific language governing permissions and 132d43be4eSopenharmony_ci * limitations under the License. 142d43be4eSopenharmony_ci */ 152d43be4eSopenharmony_ci 162d43be4eSopenharmony_ci#include "apn_manager.h" 172d43be4eSopenharmony_ci 182d43be4eSopenharmony_ci#include "cellular_data_utils.h" 192d43be4eSopenharmony_ci#include "core_manager_inner.h" 202d43be4eSopenharmony_ci#include "net_specifier.h" 212d43be4eSopenharmony_ci#include "string_ex.h" 222d43be4eSopenharmony_ci#include "tel_profile_util.h" 232d43be4eSopenharmony_ci#include "telephony_log_wrapper.h" 242d43be4eSopenharmony_ci#include "telephony_ext_wrapper.h" 252d43be4eSopenharmony_ci 262d43be4eSopenharmony_cinamespace OHOS { 272d43be4eSopenharmony_cinamespace Telephony { 282d43be4eSopenharmony_ciconst std::map<std::string, int32_t> ApnManager::apnIdApnNameMap_ { 292d43be4eSopenharmony_ci {DATA_CONTEXT_ROLE_ALL, DATA_CONTEXT_ROLE_ALL_ID}, 302d43be4eSopenharmony_ci {DATA_CONTEXT_ROLE_DEFAULT, DATA_CONTEXT_ROLE_DEFAULT_ID}, 312d43be4eSopenharmony_ci {DATA_CONTEXT_ROLE_MMS, DATA_CONTEXT_ROLE_MMS_ID}, 322d43be4eSopenharmony_ci {DATA_CONTEXT_ROLE_SUPL, DATA_CONTEXT_ROLE_SUPL_ID}, 332d43be4eSopenharmony_ci {DATA_CONTEXT_ROLE_DUN, DATA_CONTEXT_ROLE_DUN_ID}, 342d43be4eSopenharmony_ci {DATA_CONTEXT_ROLE_IMS, DATA_CONTEXT_ROLE_IMS_ID}, 352d43be4eSopenharmony_ci {DATA_CONTEXT_ROLE_IA, DATA_CONTEXT_ROLE_IA_ID}, 362d43be4eSopenharmony_ci {DATA_CONTEXT_ROLE_EMERGENCY, DATA_CONTEXT_ROLE_EMERGENCY_ID}, 372d43be4eSopenharmony_ci {DATA_CONTEXT_ROLE_INTERNAL_DEFAULT, DATA_CONTEXT_ROLE_INTERNAL_DEFAULT_ID}, 382d43be4eSopenharmony_ci {DATA_CONTEXT_ROLE_XCAP, DATA_CONTEXT_ROLE_XCAP_ID} 392d43be4eSopenharmony_ci}; 402d43be4eSopenharmony_ciconst std::map<std::string, ApnTypes> ApnManager::apnNameApnTypeMap_ { 412d43be4eSopenharmony_ci {DATA_CONTEXT_ROLE_ALL, ApnTypes::ALL}, 422d43be4eSopenharmony_ci {DATA_CONTEXT_ROLE_DEFAULT, ApnTypes::DEFAULT}, 432d43be4eSopenharmony_ci {DATA_CONTEXT_ROLE_MMS, ApnTypes::MMS}, 442d43be4eSopenharmony_ci {DATA_CONTEXT_ROLE_SUPL, ApnTypes::SUPL}, 452d43be4eSopenharmony_ci {DATA_CONTEXT_ROLE_DUN, ApnTypes::DUN}, 462d43be4eSopenharmony_ci {DATA_CONTEXT_ROLE_IMS, ApnTypes::IMS}, 472d43be4eSopenharmony_ci {DATA_CONTEXT_ROLE_IA, ApnTypes::IA}, 482d43be4eSopenharmony_ci {DATA_CONTEXT_ROLE_EMERGENCY, ApnTypes::EMERGENCY}, 492d43be4eSopenharmony_ci {DATA_CONTEXT_ROLE_XCAP, ApnTypes::XCAP}, 502d43be4eSopenharmony_ci {DATA_CONTEXT_ROLE_INTERNAL_DEFAULT, ApnTypes::INTERNAL_DEFAULT} 512d43be4eSopenharmony_ci}; 522d43be4eSopenharmony_ciconstexpr const char *CT_MCC_MNC_1 = "46003"; 532d43be4eSopenharmony_ciconstexpr const char *CT_MCC_MNC_2 = "46011"; 542d43be4eSopenharmony_ciconstexpr const char *GC_ICCID = "8985231"; 552d43be4eSopenharmony_ciconstexpr const char *GC_MCC_MNC = "45431"; 562d43be4eSopenharmony_ciconstexpr const char *GC_SPN = "CTExcel"; 572d43be4eSopenharmony_ciconstexpr const char *MO_ICCID_1 = "8985302"; 582d43be4eSopenharmony_ciconstexpr const char *MO_ICCID_2 = "8985307"; 592d43be4eSopenharmony_ciconstexpr const char *MO_UNICOM_MCCMNC = "46001"; 602d43be4eSopenharmony_ciconstexpr int32_t ICCID_LEN_MINIMUM = 7; 612d43be4eSopenharmony_ci 622d43be4eSopenharmony_ciApnManager::ApnManager() = default; 632d43be4eSopenharmony_ci 642d43be4eSopenharmony_ciApnManager::~ApnManager() = default; 652d43be4eSopenharmony_ci 662d43be4eSopenharmony_civoid ApnManager::InitApnHolders() 672d43be4eSopenharmony_ci{ 682d43be4eSopenharmony_ci AddApnHolder(DATA_CONTEXT_ROLE_DEFAULT, static_cast<int32_t>(DataContextPriority::PRIORITY_LOW)); 692d43be4eSopenharmony_ci AddApnHolder(DATA_CONTEXT_ROLE_MMS, static_cast<int32_t>(DataContextPriority::PRIORITY_NORMAL)); 702d43be4eSopenharmony_ci AddApnHolder(DATA_CONTEXT_ROLE_INTERNAL_DEFAULT, static_cast<int32_t>(DataContextPriority::PRIORITY_NONE)); 712d43be4eSopenharmony_ci AddApnHolder(DATA_CONTEXT_ROLE_XCAP, static_cast<int32_t>(DataContextPriority::PRIORITY_NORMAL)); 722d43be4eSopenharmony_ci AddApnHolder(DATA_CONTEXT_ROLE_DUN, static_cast<int32_t>(DataContextPriority::PRIORITY_NORMAL)); 732d43be4eSopenharmony_ci AddApnHolder(DATA_CONTEXT_ROLE_IA, static_cast<int32_t>(DataContextPriority::PRIORITY_HIGH)); 742d43be4eSopenharmony_ci AddApnHolder(DATA_CONTEXT_ROLE_SUPL, static_cast<int32_t>(DataContextPriority::PRIORITY_NORMAL)); 752d43be4eSopenharmony_ci} 762d43be4eSopenharmony_ci 772d43be4eSopenharmony_cisptr<ApnHolder> ApnManager::FindApnHolderById(const int32_t id) const 782d43be4eSopenharmony_ci{ 792d43be4eSopenharmony_ci if (apnIdApnHolderMap_.empty()) { 802d43be4eSopenharmony_ci TELEPHONY_LOGE("apnIdApnHolderMap_ empty"); 812d43be4eSopenharmony_ci return nullptr; 822d43be4eSopenharmony_ci } 832d43be4eSopenharmony_ci if (id == DATA_CONTEXT_ROLE_INVALID_ID) { 842d43be4eSopenharmony_ci TELEPHONY_LOGE("find a invalid capability!"); 852d43be4eSopenharmony_ci return nullptr; 862d43be4eSopenharmony_ci } 872d43be4eSopenharmony_ci std::map<int32_t, sptr<ApnHolder>>::const_iterator it = apnIdApnHolderMap_.find(id); 882d43be4eSopenharmony_ci if (it != apnIdApnHolderMap_.end()) { 892d43be4eSopenharmony_ci return it->second; 902d43be4eSopenharmony_ci } 912d43be4eSopenharmony_ci return nullptr; 922d43be4eSopenharmony_ci} 932d43be4eSopenharmony_ci 942d43be4eSopenharmony_ciint32_t ApnManager::FindApnIdByApnName(const std::string &type) 952d43be4eSopenharmony_ci{ 962d43be4eSopenharmony_ci std::map<std::string, int32_t>::const_iterator it = apnIdApnNameMap_.find(type); 972d43be4eSopenharmony_ci if (it != apnIdApnNameMap_.end()) { 982d43be4eSopenharmony_ci return it->second; 992d43be4eSopenharmony_ci } 1002d43be4eSopenharmony_ci TELEPHONY_LOGE("apnType %{public}s is not exist!", type.c_str()); 1012d43be4eSopenharmony_ci return DATA_CONTEXT_ROLE_INVALID_ID; 1022d43be4eSopenharmony_ci} 1032d43be4eSopenharmony_ci 1042d43be4eSopenharmony_cistd::string ApnManager::FindApnNameByApnId(const int32_t id) 1052d43be4eSopenharmony_ci{ 1062d43be4eSopenharmony_ci for (std::pair<const std::string, int32_t> it : apnIdApnNameMap_) { 1072d43be4eSopenharmony_ci if (it.second == id) { 1082d43be4eSopenharmony_ci return it.first; 1092d43be4eSopenharmony_ci } 1102d43be4eSopenharmony_ci } 1112d43be4eSopenharmony_ci TELEPHONY_LOGI("apnId %{public}d is not exist!", id); 1122d43be4eSopenharmony_ci return DATA_CONTEXT_ROLE_DEFAULT; 1132d43be4eSopenharmony_ci} 1142d43be4eSopenharmony_ci 1152d43be4eSopenharmony_ciint32_t ApnManager::FindApnTypeByApnName(const std::string &apnName) 1162d43be4eSopenharmony_ci{ 1172d43be4eSopenharmony_ci auto iter = apnNameApnTypeMap_.find(apnName); 1182d43be4eSopenharmony_ci if (iter != apnNameApnTypeMap_.end()) { 1192d43be4eSopenharmony_ci return static_cast<uint64_t>(iter->second); 1202d43be4eSopenharmony_ci } 1212d43be4eSopenharmony_ci TELEPHONY_LOGI("ApnName %{public}s is not exist!", apnName.c_str()); 1222d43be4eSopenharmony_ci return static_cast<uint64_t>(ApnTypes::NONETYPE); 1232d43be4eSopenharmony_ci} 1242d43be4eSopenharmony_ci 1252d43be4eSopenharmony_ciint32_t ApnManager::FindApnIdByCapability(const uint64_t capability) 1262d43be4eSopenharmony_ci{ 1272d43be4eSopenharmony_ci switch (capability) { 1282d43be4eSopenharmony_ci case NetManagerStandard::NetCap::NET_CAPABILITY_INTERNET: 1292d43be4eSopenharmony_ci return DATA_CONTEXT_ROLE_DEFAULT_ID; 1302d43be4eSopenharmony_ci case NetManagerStandard::NetCap::NET_CAPABILITY_MMS: 1312d43be4eSopenharmony_ci return DATA_CONTEXT_ROLE_MMS_ID; 1322d43be4eSopenharmony_ci case NetManagerStandard::NetCap::NET_CAPABILITY_INTERNAL_DEFAULT: 1332d43be4eSopenharmony_ci return DATA_CONTEXT_ROLE_INTERNAL_DEFAULT_ID; 1342d43be4eSopenharmony_ci case NetManagerStandard::NetCap::NET_CAPABILITY_IA: 1352d43be4eSopenharmony_ci return DATA_CONTEXT_ROLE_IA_ID; 1362d43be4eSopenharmony_ci case NetManagerStandard::NetCap::NET_CAPABILITY_XCAP: 1372d43be4eSopenharmony_ci return DATA_CONTEXT_ROLE_XCAP_ID; 1382d43be4eSopenharmony_ci case NetManagerStandard::NetCap::NET_CAPABILITY_SUPL: 1392d43be4eSopenharmony_ci return DATA_CONTEXT_ROLE_SUPL_ID; 1402d43be4eSopenharmony_ci case NetManagerStandard::NetCap::NET_CAPABILITY_DUN: 1412d43be4eSopenharmony_ci return DATA_CONTEXT_ROLE_DUN_ID; 1422d43be4eSopenharmony_ci default: 1432d43be4eSopenharmony_ci return DATA_CONTEXT_ROLE_INVALID_ID; 1442d43be4eSopenharmony_ci } 1452d43be4eSopenharmony_ci} 1462d43be4eSopenharmony_ci 1472d43be4eSopenharmony_cistatic bool HasNetCap(const uint64_t capabilities, const NetManagerStandard::NetCap netCap) 1482d43be4eSopenharmony_ci{ 1492d43be4eSopenharmony_ci return (capabilities & (1L << netCap)) != 0; 1502d43be4eSopenharmony_ci} 1512d43be4eSopenharmony_ci 1522d43be4eSopenharmony_ciNetManagerStandard::NetCap ApnManager::FindBestCapability(const uint64_t capabilities) 1532d43be4eSopenharmony_ci{ 1542d43be4eSopenharmony_ci NetManagerStandard::NetCap netCap = NetManagerStandard::NetCap::NET_CAPABILITY_END; 1552d43be4eSopenharmony_ci if (HasNetCap(capabilities, NetManagerStandard::NetCap::NET_CAPABILITY_INTERNET)) { 1562d43be4eSopenharmony_ci netCap = NetManagerStandard::NetCap::NET_CAPABILITY_INTERNET; 1572d43be4eSopenharmony_ci } 1582d43be4eSopenharmony_ci if (HasNetCap(capabilities, NetManagerStandard::NetCap::NET_CAPABILITY_INTERNAL_DEFAULT)) { 1592d43be4eSopenharmony_ci netCap = NetManagerStandard::NetCap::NET_CAPABILITY_INTERNAL_DEFAULT; 1602d43be4eSopenharmony_ci } 1612d43be4eSopenharmony_ci if (HasNetCap(capabilities, NetManagerStandard::NetCap::NET_CAPABILITY_MMS)) { 1622d43be4eSopenharmony_ci netCap = NetManagerStandard::NetCap::NET_CAPABILITY_MMS; 1632d43be4eSopenharmony_ci } 1642d43be4eSopenharmony_ci if (HasNetCap(capabilities, NetManagerStandard::NetCap::NET_CAPABILITY_SUPL)) { 1652d43be4eSopenharmony_ci netCap = NetManagerStandard::NetCap::NET_CAPABILITY_SUPL; 1662d43be4eSopenharmony_ci } 1672d43be4eSopenharmony_ci if (HasNetCap(capabilities, NetManagerStandard::NetCap::NET_CAPABILITY_DUN)) { 1682d43be4eSopenharmony_ci netCap = NetManagerStandard::NetCap::NET_CAPABILITY_DUN; 1692d43be4eSopenharmony_ci } 1702d43be4eSopenharmony_ci if (HasNetCap(capabilities, NetManagerStandard::NetCap::NET_CAPABILITY_XCAP)) { 1712d43be4eSopenharmony_ci netCap = NetManagerStandard::NetCap::NET_CAPABILITY_XCAP; 1722d43be4eSopenharmony_ci } 1732d43be4eSopenharmony_ci if (HasNetCap(capabilities, NetManagerStandard::NetCap::NET_CAPABILITY_IA)) { 1742d43be4eSopenharmony_ci netCap = NetManagerStandard::NetCap::NET_CAPABILITY_IA; 1752d43be4eSopenharmony_ci } 1762d43be4eSopenharmony_ci return netCap; 1772d43be4eSopenharmony_ci} 1782d43be4eSopenharmony_ci 1792d43be4eSopenharmony_civoid ApnManager::AddApnHolder(const std::string &apnType, const int32_t priority) 1802d43be4eSopenharmony_ci{ 1812d43be4eSopenharmony_ci int32_t apnId = FindApnIdByApnName(apnType); 1822d43be4eSopenharmony_ci if (apnId == DATA_CONTEXT_ROLE_INVALID_ID) { 1832d43be4eSopenharmony_ci TELEPHONY_LOGE("APN INVALID ID"); 1842d43be4eSopenharmony_ci return; 1852d43be4eSopenharmony_ci } 1862d43be4eSopenharmony_ci sptr<ApnHolder> apnHolder = std::make_unique<ApnHolder>(apnType, priority).release(); 1872d43be4eSopenharmony_ci if (apnHolder == nullptr) { 1882d43be4eSopenharmony_ci TELEPHONY_LOGE("apnHolder is null, type: %{public}s", apnType.c_str()); 1892d43be4eSopenharmony_ci return; 1902d43be4eSopenharmony_ci } 1912d43be4eSopenharmony_ci apnHolder->SetApnState(PROFILE_STATE_IDLE); 1922d43be4eSopenharmony_ci apnHolders_.push_back(apnHolder); 1932d43be4eSopenharmony_ci apnIdApnHolderMap_.insert(std::pair<int32_t, sptr<ApnHolder>>(apnId, apnHolder)); 1942d43be4eSopenharmony_ci sortedApnHolders_.emplace_back(apnHolder); 1952d43be4eSopenharmony_ci sort(sortedApnHolders_.begin(), sortedApnHolders_.end(), 1962d43be4eSopenharmony_ci [](const sptr<ApnHolder> &c1, const sptr<ApnHolder> &c2) { 1972d43be4eSopenharmony_ci if (c1 == nullptr || c2 == nullptr) { 1982d43be4eSopenharmony_ci return false; 1992d43be4eSopenharmony_ci } 2002d43be4eSopenharmony_ci return c2->GetPriority() < c1->GetPriority(); 2012d43be4eSopenharmony_ci }); 2022d43be4eSopenharmony_ci TELEPHONY_LOGI("The Apn holder type:%{public}s, size:%{public}zu", apnType.c_str(), sortedApnHolders_.size()); 2032d43be4eSopenharmony_ci} 2042d43be4eSopenharmony_ci 2052d43be4eSopenharmony_cisptr<ApnHolder> ApnManager::GetApnHolder(const std::string &apnType) const 2062d43be4eSopenharmony_ci{ 2072d43be4eSopenharmony_ci int32_t apnId = FindApnIdByApnName(apnType); 2082d43be4eSopenharmony_ci if (DATA_CONTEXT_ROLE_INVALID_ID == apnId) { 2092d43be4eSopenharmony_ci TELEPHONY_LOGE("APN INVALID ID"); 2102d43be4eSopenharmony_ci return nullptr; 2112d43be4eSopenharmony_ci } 2122d43be4eSopenharmony_ci std::map<int32_t, sptr<ApnHolder>>::const_iterator it = apnIdApnHolderMap_.find(apnId); 2132d43be4eSopenharmony_ci if (it != apnIdApnHolderMap_.end()) { 2142d43be4eSopenharmony_ci return it->second; 2152d43be4eSopenharmony_ci } 2162d43be4eSopenharmony_ci TELEPHONY_LOGE("apnType %{public}s is not exist!", apnType.c_str()); 2172d43be4eSopenharmony_ci return nullptr; 2182d43be4eSopenharmony_ci} 2192d43be4eSopenharmony_ci 2202d43be4eSopenharmony_cistd::vector<sptr<ApnHolder>> ApnManager::GetAllApnHolder() const 2212d43be4eSopenharmony_ci{ 2222d43be4eSopenharmony_ci return apnHolders_; 2232d43be4eSopenharmony_ci} 2242d43be4eSopenharmony_ci 2252d43be4eSopenharmony_cistd::vector<sptr<ApnHolder>> ApnManager::GetSortApnHolder() const 2262d43be4eSopenharmony_ci{ 2272d43be4eSopenharmony_ci return sortedApnHolders_; 2282d43be4eSopenharmony_ci} 2292d43be4eSopenharmony_ci 2302d43be4eSopenharmony_ciint32_t ApnManager::CreateAllApnItemByDatabase(int32_t slotId) 2312d43be4eSopenharmony_ci{ 2322d43be4eSopenharmony_ci int32_t count = 0; 2332d43be4eSopenharmony_ci if (TELEPHONY_EXT_WRAPPER.createAllApnItemExt_) { 2342d43be4eSopenharmony_ci sptr<ApnItem> extraApnItem = ApnItem::MakeDefaultApn("default"); 2352d43be4eSopenharmony_ci if (TELEPHONY_EXT_WRAPPER.createAllApnItemExt_(slotId, extraApnItem)) { 2362d43be4eSopenharmony_ci std::lock_guard<std::mutex> lock(mutex_); 2372d43be4eSopenharmony_ci allApnItem_.clear(); 2382d43be4eSopenharmony_ci allApnItem_.push_back(extraApnItem); 2392d43be4eSopenharmony_ci return ++count; 2402d43be4eSopenharmony_ci } 2412d43be4eSopenharmony_ci } 2422d43be4eSopenharmony_ci std::u16string operatorNumeric; 2432d43be4eSopenharmony_ci CoreManagerInner::GetInstance().GetSimOperatorNumeric(slotId, operatorNumeric); 2442d43be4eSopenharmony_ci std::string numeric = Str16ToStr8(operatorNumeric); 2452d43be4eSopenharmony_ci GetCTOperator(slotId, numeric); 2462d43be4eSopenharmony_ci if (numeric.empty()) { 2472d43be4eSopenharmony_ci TELEPHONY_LOGE("numeric is empty!!!"); 2482d43be4eSopenharmony_ci return count; 2492d43be4eSopenharmony_ci } 2502d43be4eSopenharmony_ci TELEPHONY_LOGI("current slotId = %{public}d, numeric = %{public}s", slotId, numeric.c_str()); 2512d43be4eSopenharmony_ci auto helper = CellularDataRdbHelper::GetInstance(); 2522d43be4eSopenharmony_ci if (helper == nullptr) { 2532d43be4eSopenharmony_ci TELEPHONY_LOGE("get cellularDataRdbHelper failed"); 2542d43be4eSopenharmony_ci return count; 2552d43be4eSopenharmony_ci } 2562d43be4eSopenharmony_ci preferId_ = INVALID_PROFILE_ID; 2572d43be4eSopenharmony_ci std::vector<PdpProfile> preferApnVec; 2582d43be4eSopenharmony_ci if (helper->QueryPreferApn(slotId, preferApnVec)) { 2592d43be4eSopenharmony_ci preferId_ = preferApnVec[0].profileId; 2602d43be4eSopenharmony_ci TELEPHONY_LOGI("query preferId_ = %{public}d", preferId_); 2612d43be4eSopenharmony_ci } 2622d43be4eSopenharmony_ci std::string mcc = numeric.substr(0, DEFAULT_MCC_SIZE); 2632d43be4eSopenharmony_ci std::string mnc = numeric.substr(mcc.size(), numeric.size() - mcc.size()); 2642d43be4eSopenharmony_ci int32_t mvnoCount = CreateMvnoApnItems(slotId, mcc, mnc); 2652d43be4eSopenharmony_ci if (mvnoCount > 0) { 2662d43be4eSopenharmony_ci return mvnoCount; 2672d43be4eSopenharmony_ci } 2682d43be4eSopenharmony_ci std::vector<PdpProfile> apnVec; 2692d43be4eSopenharmony_ci if (!helper->QueryApns(mcc, mnc, apnVec, slotId)) { 2702d43be4eSopenharmony_ci TELEPHONY_LOGE("query apns from data ability fail"); 2712d43be4eSopenharmony_ci return count; 2722d43be4eSopenharmony_ci } 2732d43be4eSopenharmony_ci return MakeSpecificApnItem(apnVec); 2742d43be4eSopenharmony_ci} 2752d43be4eSopenharmony_ci 2762d43be4eSopenharmony_civoid ApnManager::GetCTOperator(int32_t slotId, std::string &numeric) 2772d43be4eSopenharmony_ci{ 2782d43be4eSopenharmony_ci bool isCTSimCard = false; 2792d43be4eSopenharmony_ci CoreManagerInner::GetInstance().IsCTSimCard(slotId, isCTSimCard); 2802d43be4eSopenharmony_ci if (isCTSimCard && numeric.compare(CT_MCC_MNC_2)) { 2812d43be4eSopenharmony_ci numeric = CT_MCC_MNC_1; 2822d43be4eSopenharmony_ci } 2832d43be4eSopenharmony_ci if (!numeric.compare(CT_MCC_MNC_1)) { 2842d43be4eSopenharmony_ci std::u16string tempIccId; 2852d43be4eSopenharmony_ci CoreManagerInner::GetInstance().GetSimIccId(slotId, tempIccId); 2862d43be4eSopenharmony_ci std::string iccId = Str16ToStr8(tempIccId); 2872d43be4eSopenharmony_ci std::u16string tempSpn; 2882d43be4eSopenharmony_ci CoreManagerInner::GetInstance().GetSimSpn(slotId, tempSpn); 2892d43be4eSopenharmony_ci std::string spn = Str16ToStr8(tempSpn); 2902d43be4eSopenharmony_ci if (!iccId.compare(0, ICCID_LEN_MINIMUM, GC_ICCID) || !spn.compare(GC_SPN)) { 2912d43be4eSopenharmony_ci numeric = GC_MCC_MNC; 2922d43be4eSopenharmony_ci } else if (!iccId.compare(0, ICCID_LEN_MINIMUM, MO_ICCID_1) || 2932d43be4eSopenharmony_ci !iccId.compare(0, ICCID_LEN_MINIMUM, MO_ICCID_2)) { 2942d43be4eSopenharmony_ci std::u16string tempPlmn; 2952d43be4eSopenharmony_ci CoreManagerInner::GetInstance().GetSimOperatorNumeric(slotId, tempPlmn); 2962d43be4eSopenharmony_ci std::string plmn = Str16ToStr8(tempPlmn); 2972d43be4eSopenharmony_ci if (!plmn.empty() && !plmn.compare(MO_UNICOM_MCCMNC)) { 2982d43be4eSopenharmony_ci numeric = MO_UNICOM_MCCMNC; 2992d43be4eSopenharmony_ci } 3002d43be4eSopenharmony_ci } 3012d43be4eSopenharmony_ci } 3022d43be4eSopenharmony_ci} 3032d43be4eSopenharmony_ci 3042d43be4eSopenharmony_ciint32_t ApnManager::CreateMvnoApnItems(int32_t slotId, const std::string &mcc, const std::string &mnc) 3052d43be4eSopenharmony_ci{ 3062d43be4eSopenharmony_ci int32_t count = 0; 3072d43be4eSopenharmony_ci auto helper = CellularDataRdbHelper::GetInstance(); 3082d43be4eSopenharmony_ci if (helper == nullptr) { 3092d43be4eSopenharmony_ci TELEPHONY_LOGE("get cellularDataRdbHelper failed"); 3102d43be4eSopenharmony_ci return count; 3112d43be4eSopenharmony_ci } 3122d43be4eSopenharmony_ci std::vector<PdpProfile> mvnoApnVec; 3132d43be4eSopenharmony_ci std::u16string spn; 3142d43be4eSopenharmony_ci CoreManagerInner::GetInstance().GetSimSpn(slotId, spn); 3152d43be4eSopenharmony_ci if (!helper->QueryMvnoApnsByType(mcc, mnc, MvnoType::SPN, Str16ToStr8(spn), mvnoApnVec, slotId)) { 3162d43be4eSopenharmony_ci TELEPHONY_LOGE("query mvno apns by spn fail"); 3172d43be4eSopenharmony_ci return count; 3182d43be4eSopenharmony_ci } 3192d43be4eSopenharmony_ci std::u16string imsi; 3202d43be4eSopenharmony_ci CoreManagerInner::GetInstance().GetIMSI(slotId, imsi); 3212d43be4eSopenharmony_ci if (!helper->QueryMvnoApnsByType(mcc, mnc, MvnoType::IMSI, Str16ToStr8(imsi), mvnoApnVec, slotId)) { 3222d43be4eSopenharmony_ci TELEPHONY_LOGE("query mvno apns by imsi fail"); 3232d43be4eSopenharmony_ci return count; 3242d43be4eSopenharmony_ci } 3252d43be4eSopenharmony_ci std::u16string gid1; 3262d43be4eSopenharmony_ci CoreManagerInner::GetInstance().GetSimGid1(slotId, gid1); 3272d43be4eSopenharmony_ci if (!helper->QueryMvnoApnsByType(mcc, mnc, MvnoType::GID1, Str16ToStr8(gid1), mvnoApnVec, slotId)) { 3282d43be4eSopenharmony_ci TELEPHONY_LOGE("query mvno apns by gid1 fail"); 3292d43be4eSopenharmony_ci return count; 3302d43be4eSopenharmony_ci } 3312d43be4eSopenharmony_ci std::u16string iccId; 3322d43be4eSopenharmony_ci CoreManagerInner::GetInstance().GetSimIccId(slotId, iccId); 3332d43be4eSopenharmony_ci if (!helper->QueryMvnoApnsByType(mcc, mnc, MvnoType::ICCID, Str16ToStr8(iccId), mvnoApnVec, slotId)) { 3342d43be4eSopenharmony_ci TELEPHONY_LOGE("query mvno apns by iccId fail"); 3352d43be4eSopenharmony_ci return count; 3362d43be4eSopenharmony_ci } 3372d43be4eSopenharmony_ci return MakeSpecificApnItem(mvnoApnVec); 3382d43be4eSopenharmony_ci} 3392d43be4eSopenharmony_ci 3402d43be4eSopenharmony_ciint32_t ApnManager::MakeSpecificApnItem(std::vector<PdpProfile> &apnVec) 3412d43be4eSopenharmony_ci{ 3422d43be4eSopenharmony_ci std::lock_guard<std::mutex> lock(mutex_); 3432d43be4eSopenharmony_ci allApnItem_.clear(); 3442d43be4eSopenharmony_ci int32_t count = 0; 3452d43be4eSopenharmony_ci for (PdpProfile &apnData : apnVec) { 3462d43be4eSopenharmony_ci TELEPHONY_LOGI("profileId = %{public}d, profileName = %{public}s, mvnoType = %{public}s", 3472d43be4eSopenharmony_ci apnData.profileId, apnData.profileName.c_str(), apnData.mvnoType.c_str()); 3482d43be4eSopenharmony_ci if (apnData.profileId == preferId_ && apnData.apnTypes.empty()) { 3492d43be4eSopenharmony_ci apnData.apnTypes = DATA_CONTEXT_ROLE_DEFAULT; 3502d43be4eSopenharmony_ci } 3512d43be4eSopenharmony_ci sptr<ApnItem> apnItem = ApnItem::MakeApn(apnData); 3522d43be4eSopenharmony_ci if (apnItem != nullptr) { 3532d43be4eSopenharmony_ci allApnItem_.push_back(apnItem); 3542d43be4eSopenharmony_ci count++; 3552d43be4eSopenharmony_ci } 3562d43be4eSopenharmony_ci } 3572d43be4eSopenharmony_ci int32_t preferId = preferId_; 3582d43be4eSopenharmony_ci auto it = std::find_if(allApnItem_.begin(), allApnItem_.end(), 3592d43be4eSopenharmony_ci [preferId](auto &apn) { return apn != nullptr && apn->attr_.profileId_ == preferId; }); 3602d43be4eSopenharmony_ci if (it != allApnItem_.end()) { 3612d43be4eSopenharmony_ci sptr<ApnItem> apnItem = *it; 3622d43be4eSopenharmony_ci allApnItem_.erase(it); 3632d43be4eSopenharmony_ci allApnItem_.insert(allApnItem_.begin(), apnItem); 3642d43be4eSopenharmony_ci } 3652d43be4eSopenharmony_ci return count; 3662d43be4eSopenharmony_ci} 3672d43be4eSopenharmony_ci 3682d43be4eSopenharmony_cistd::vector<sptr<ApnItem>> ApnManager::FilterMatchedApns(const std::string &requestApnType, const int32_t slotId) 3692d43be4eSopenharmony_ci{ 3702d43be4eSopenharmony_ci std::lock_guard<std::mutex> lock(mutex_); 3712d43be4eSopenharmony_ci std::vector<sptr<ApnItem>> matchApnItemList; 3722d43be4eSopenharmony_ci if (requestApnType == DATA_CONTEXT_ROLE_DUN) { 3732d43be4eSopenharmony_ci FetchDunApns(matchApnItemList, slotId); 3742d43be4eSopenharmony_ci return matchApnItemList; 3752d43be4eSopenharmony_ci } 3762d43be4eSopenharmony_ci for (const sptr<ApnItem> &apnItem : allApnItem_) { 3772d43be4eSopenharmony_ci if (apnItem->CanDealWithType(requestApnType)) { 3782d43be4eSopenharmony_ci matchApnItemList.push_back(apnItem); 3792d43be4eSopenharmony_ci } 3802d43be4eSopenharmony_ci } 3812d43be4eSopenharmony_ci TELEPHONY_LOGD("apn size is :%{public}zu", matchApnItemList.size()); 3822d43be4eSopenharmony_ci return matchApnItemList; 3832d43be4eSopenharmony_ci} 3842d43be4eSopenharmony_ci 3852d43be4eSopenharmony_cibool ApnManager::IsDataConnectionNotUsed(const std::shared_ptr<CellularDataStateMachine> &stateMachine) const 3862d43be4eSopenharmony_ci{ 3872d43be4eSopenharmony_ci if (stateMachine == nullptr) { 3882d43be4eSopenharmony_ci TELEPHONY_LOGE("CellularDataHandler:stateMachine is null"); 3892d43be4eSopenharmony_ci return false; 3902d43be4eSopenharmony_ci } 3912d43be4eSopenharmony_ci for (const sptr<ApnHolder> &apnHolder : apnHolders_) { 3922d43be4eSopenharmony_ci if (apnHolder == nullptr) { 3932d43be4eSopenharmony_ci TELEPHONY_LOGE("apn holder is null"); 3942d43be4eSopenharmony_ci continue; 3952d43be4eSopenharmony_ci } 3962d43be4eSopenharmony_ci std::shared_ptr<CellularDataStateMachine> cellularDataStateMachine = apnHolder->GetCellularDataStateMachine(); 3972d43be4eSopenharmony_ci if (cellularDataStateMachine != nullptr && stateMachine == cellularDataStateMachine) { 3982d43be4eSopenharmony_ci TELEPHONY_LOGE("cellularDataStateMachine in use"); 3992d43be4eSopenharmony_ci return false; 4002d43be4eSopenharmony_ci } 4012d43be4eSopenharmony_ci } 4022d43be4eSopenharmony_ci return true; 4032d43be4eSopenharmony_ci} 4042d43be4eSopenharmony_ci 4052d43be4eSopenharmony_cibool ApnManager::HasAnyConnectedState() const 4062d43be4eSopenharmony_ci{ 4072d43be4eSopenharmony_ci for (const sptr<ApnHolder> &apnHolder : apnHolders_) { 4082d43be4eSopenharmony_ci if (apnHolder == nullptr) { 4092d43be4eSopenharmony_ci TELEPHONY_LOGE("apn holder is null"); 4102d43be4eSopenharmony_ci continue; 4112d43be4eSopenharmony_ci } 4122d43be4eSopenharmony_ci if (apnHolder->GetApnState() == ApnProfileState::PROFILE_STATE_CONNECTED || 4132d43be4eSopenharmony_ci apnHolder->GetApnState() == ApnProfileState::PROFILE_STATE_DISCONNECTING) { 4142d43be4eSopenharmony_ci return true; 4152d43be4eSopenharmony_ci } 4162d43be4eSopenharmony_ci } 4172d43be4eSopenharmony_ci return false; 4182d43be4eSopenharmony_ci} 4192d43be4eSopenharmony_ci 4202d43be4eSopenharmony_ciApnProfileState ApnManager::GetOverallApnState() const 4212d43be4eSopenharmony_ci{ 4222d43be4eSopenharmony_ci if (apnHolders_.empty()) { 4232d43be4eSopenharmony_ci TELEPHONY_LOGE("apn overall state is STATE_IDLE"); 4242d43be4eSopenharmony_ci return ApnProfileState::PROFILE_STATE_IDLE; 4252d43be4eSopenharmony_ci } 4262d43be4eSopenharmony_ci if (HasAnyConnectedState()) { 4272d43be4eSopenharmony_ci TELEPHONY_LOGI("apn overall state is STATE_CONNECTED"); 4282d43be4eSopenharmony_ci return ApnProfileState::PROFILE_STATE_CONNECTED; 4292d43be4eSopenharmony_ci } 4302d43be4eSopenharmony_ci bool failState = false; 4312d43be4eSopenharmony_ci for (const sptr<ApnHolder> &apnHolder : apnHolders_) { 4322d43be4eSopenharmony_ci if (apnHolder == nullptr) { 4332d43be4eSopenharmony_ci continue; 4342d43be4eSopenharmony_ci } 4352d43be4eSopenharmony_ci if (apnHolder->GetApnState() == ApnProfileState::PROFILE_STATE_CONNECTING || 4362d43be4eSopenharmony_ci apnHolder->GetApnState() == ApnProfileState::PROFILE_STATE_RETRYING) { 4372d43be4eSopenharmony_ci TELEPHONY_LOGI("apn overall state is STATE_CONNECTING"); 4382d43be4eSopenharmony_ci return ApnProfileState::PROFILE_STATE_CONNECTING; 4392d43be4eSopenharmony_ci } else if (apnHolder->GetApnState() == ApnProfileState::PROFILE_STATE_IDLE) { 4402d43be4eSopenharmony_ci failState = true; 4412d43be4eSopenharmony_ci } 4422d43be4eSopenharmony_ci } 4432d43be4eSopenharmony_ci if (failState) { 4442d43be4eSopenharmony_ci TELEPHONY_LOGD("apn overall state is STATE_IDLE"); 4452d43be4eSopenharmony_ci return ApnProfileState::PROFILE_STATE_IDLE; 4462d43be4eSopenharmony_ci } 4472d43be4eSopenharmony_ci TELEPHONY_LOGI("apn overall state is STATE_FAILED"); 4482d43be4eSopenharmony_ci return ApnProfileState::PROFILE_STATE_FAILED; 4492d43be4eSopenharmony_ci} 4502d43be4eSopenharmony_ci 4512d43be4eSopenharmony_ciApnProfileState ApnManager::GetOverallDefaultApnState() const 4522d43be4eSopenharmony_ci{ 4532d43be4eSopenharmony_ci if (apnHolders_.empty()) { 4542d43be4eSopenharmony_ci TELEPHONY_LOGE("apn overall state is STATE_IDLE"); 4552d43be4eSopenharmony_ci return ApnProfileState::PROFILE_STATE_IDLE; 4562d43be4eSopenharmony_ci } 4572d43be4eSopenharmony_ci auto defaultApnState = static_cast<int32_t>(ApnProfileState::PROFILE_STATE_IDLE); 4582d43be4eSopenharmony_ci auto internalApnState = static_cast<int32_t>(ApnProfileState::PROFILE_STATE_IDLE); 4592d43be4eSopenharmony_ci 4602d43be4eSopenharmony_ci for (const sptr<ApnHolder> &apnHolder : apnHolders_) { 4612d43be4eSopenharmony_ci if (apnHolder == nullptr) { 4622d43be4eSopenharmony_ci continue; 4632d43be4eSopenharmony_ci } 4642d43be4eSopenharmony_ci if (apnHolder->GetApnType() == DATA_CONTEXT_ROLE_DEFAULT) { 4652d43be4eSopenharmony_ci defaultApnState = static_cast<int32_t>(apnHolder->GetApnState()); 4662d43be4eSopenharmony_ci } 4672d43be4eSopenharmony_ci if (apnHolder->GetApnType() == DATA_CONTEXT_ROLE_INTERNAL_DEFAULT) { 4682d43be4eSopenharmony_ci internalApnState = static_cast<int32_t>(apnHolder->GetApnState()); 4692d43be4eSopenharmony_ci } 4702d43be4eSopenharmony_ci } 4712d43be4eSopenharmony_ci TELEPHONY_LOGI("defaultApnState is %{public}d, internalApnState is %{public}d", defaultApnState, 4722d43be4eSopenharmony_ci internalApnState); 4732d43be4eSopenharmony_ci return defaultApnState > internalApnState ? static_cast<ApnProfileState>(defaultApnState) 4742d43be4eSopenharmony_ci : static_cast<ApnProfileState>(internalApnState); 4752d43be4eSopenharmony_ci} 4762d43be4eSopenharmony_ci 4772d43be4eSopenharmony_cisptr<ApnItem> ApnManager::GetRilAttachApn() 4782d43be4eSopenharmony_ci{ 4792d43be4eSopenharmony_ci std::lock_guard<std::mutex> lock(mutex_); 4802d43be4eSopenharmony_ci if (allApnItem_.empty()) { 4812d43be4eSopenharmony_ci TELEPHONY_LOGE("apn item is null"); 4822d43be4eSopenharmony_ci return nullptr; 4832d43be4eSopenharmony_ci } 4842d43be4eSopenharmony_ci sptr<ApnItem> attachApn = nullptr; 4852d43be4eSopenharmony_ci for (const sptr<ApnItem> &apnItem : allApnItem_) { 4862d43be4eSopenharmony_ci if (apnItem->CanDealWithType(DATA_CONTEXT_ROLE_IA)) { 4872d43be4eSopenharmony_ci attachApn = apnItem; 4882d43be4eSopenharmony_ci break; 4892d43be4eSopenharmony_ci } 4902d43be4eSopenharmony_ci if (attachApn == nullptr && apnItem->CanDealWithType(DATA_CONTEXT_ROLE_DEFAULT)) { 4912d43be4eSopenharmony_ci attachApn = apnItem; 4922d43be4eSopenharmony_ci } 4932d43be4eSopenharmony_ci } 4942d43be4eSopenharmony_ci if (attachApn == nullptr) { 4952d43be4eSopenharmony_ci attachApn = allApnItem_[0]; 4962d43be4eSopenharmony_ci } 4972d43be4eSopenharmony_ci return attachApn; 4982d43be4eSopenharmony_ci} 4992d43be4eSopenharmony_ci 5002d43be4eSopenharmony_cibool ApnManager::ResetApns(int32_t slotId) 5012d43be4eSopenharmony_ci{ 5022d43be4eSopenharmony_ci auto helper = CellularDataRdbHelper::GetInstance(); 5032d43be4eSopenharmony_ci if (helper == nullptr) { 5042d43be4eSopenharmony_ci TELEPHONY_LOGE("get cellularDataRdbHelper failed"); 5052d43be4eSopenharmony_ci return false; 5062d43be4eSopenharmony_ci } 5072d43be4eSopenharmony_ci return helper->ResetApns(slotId); 5082d43be4eSopenharmony_ci} 5092d43be4eSopenharmony_ci 5102d43be4eSopenharmony_civoid ApnManager::FetchDunApns(std::vector<sptr<ApnItem>> &matchApnItemList, const int32_t slotId) 5112d43be4eSopenharmony_ci{ 5122d43be4eSopenharmony_ci bool roamingState = CoreManagerInner::GetInstance().GetPsRoamingState(slotId) > 0; 5132d43be4eSopenharmony_ci if (roamingState && !IsPreferredApnUserEdited()) { 5142d43be4eSopenharmony_ci TELEPHONY_LOGI("FetchDunApns: Dun apn is not used in roaming network"); 5152d43be4eSopenharmony_ci return; 5162d43be4eSopenharmony_ci } 5172d43be4eSopenharmony_ci int32_t preferId = preferId_; 5182d43be4eSopenharmony_ci sptr<ApnItem> preferredApn = nullptr; 5192d43be4eSopenharmony_ci auto it = std::find_if(allApnItem_.begin(), allApnItem_.end(), [preferId](auto &apn) { 5202d43be4eSopenharmony_ci return apn != nullptr && apn->attr_.profileId_ == preferId; 5212d43be4eSopenharmony_ci }); 5222d43be4eSopenharmony_ci if (it != allApnItem_.end()) { 5232d43be4eSopenharmony_ci preferredApn = *it; 5242d43be4eSopenharmony_ci } 5252d43be4eSopenharmony_ci if (preferredApn != nullptr && preferredApn->CanDealWithType(DATA_CONTEXT_ROLE_DUN)) { 5262d43be4eSopenharmony_ci matchApnItemList.insert(matchApnItemList.begin(), preferredApn); 5272d43be4eSopenharmony_ci } 5282d43be4eSopenharmony_ci if (matchApnItemList.empty()) { 5292d43be4eSopenharmony_ci for (const auto &item : allApnItem_) { 5302d43be4eSopenharmony_ci if (item->CanDealWithType(DATA_CONTEXT_ROLE_DUN)) { 5312d43be4eSopenharmony_ci matchApnItemList.push_back(item); 5322d43be4eSopenharmony_ci } 5332d43be4eSopenharmony_ci } 5342d43be4eSopenharmony_ci } 5352d43be4eSopenharmony_ci} 5362d43be4eSopenharmony_ci 5372d43be4eSopenharmony_cibool ApnManager::IsPreferredApnUserEdited() 5382d43be4eSopenharmony_ci{ 5392d43be4eSopenharmony_ci bool isUserEdited = false; 5402d43be4eSopenharmony_ci int32_t preferId = preferId_; 5412d43be4eSopenharmony_ci auto it = std::find_if(allApnItem_.begin(), allApnItem_.end(), [preferId](auto &apn) { 5422d43be4eSopenharmony_ci return apn->attr_.profileId_ == preferId; 5432d43be4eSopenharmony_ci }); 5442d43be4eSopenharmony_ci if (it != allApnItem_.end() && *it != nullptr) { 5452d43be4eSopenharmony_ci isUserEdited = (*it)->attr_.isEdited_; 5462d43be4eSopenharmony_ci } 5472d43be4eSopenharmony_ci return isUserEdited; 5482d43be4eSopenharmony_ci} 5492d43be4eSopenharmony_ci 5502d43be4eSopenharmony_civoid ApnManager::ClearAllApnBad() 5512d43be4eSopenharmony_ci{ 5522d43be4eSopenharmony_ci for (const sptr<ApnHolder> &apnHolder : apnHolders_) { 5532d43be4eSopenharmony_ci if (apnHolder != nullptr) { 5542d43be4eSopenharmony_ci apnHolder->ClearCurrentApnBad(); 5552d43be4eSopenharmony_ci } 5562d43be4eSopenharmony_ci } 5572d43be4eSopenharmony_ci} 5582d43be4eSopenharmony_ci} // namespace Telephony 5592d43be4eSopenharmony_ci} // namespace OHOS 560