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