• 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 "apn_manager.h"
17 
18 #include "cellular_data_utils.h"
19 #include "cellular_data_hisysevent.h"
20 #include "core_manager_inner.h"
21 #include "net_specifier.h"
22 #include "string_ex.h"
23 #include "tel_profile_util.h"
24 #include "telephony_log_wrapper.h"
25 #include "telephony_ext_wrapper.h"
26 
27 namespace OHOS {
28 namespace Telephony {
29 const std::map<std::string, int32_t> ApnManager::apnIdApnNameMap_ {
30     {DATA_CONTEXT_ROLE_ALL, DATA_CONTEXT_ROLE_ALL_ID},
31     {DATA_CONTEXT_ROLE_DEFAULT, DATA_CONTEXT_ROLE_DEFAULT_ID},
32     {DATA_CONTEXT_ROLE_MMS, DATA_CONTEXT_ROLE_MMS_ID},
33     {DATA_CONTEXT_ROLE_SUPL, DATA_CONTEXT_ROLE_SUPL_ID},
34     {DATA_CONTEXT_ROLE_DUN, DATA_CONTEXT_ROLE_DUN_ID},
35     {DATA_CONTEXT_ROLE_IMS, DATA_CONTEXT_ROLE_IMS_ID},
36     {DATA_CONTEXT_ROLE_IA, DATA_CONTEXT_ROLE_IA_ID},
37     {DATA_CONTEXT_ROLE_EMERGENCY, DATA_CONTEXT_ROLE_EMERGENCY_ID},
38     {DATA_CONTEXT_ROLE_INTERNAL_DEFAULT, DATA_CONTEXT_ROLE_INTERNAL_DEFAULT_ID},
39     {DATA_CONTEXT_ROLE_XCAP, DATA_CONTEXT_ROLE_XCAP_ID},
40     {DATA_CONTEXT_ROLE_BIP, DATA_CONTEXT_ROLE_BIP_ID}
41 };
42 const std::map<std::string, ApnTypes> ApnManager::apnNameApnTypeMap_ {
43     {DATA_CONTEXT_ROLE_ALL, ApnTypes::ALL},
44     {DATA_CONTEXT_ROLE_DEFAULT, ApnTypes::DEFAULT},
45     {DATA_CONTEXT_ROLE_MMS, ApnTypes::MMS},
46     {DATA_CONTEXT_ROLE_SUPL, ApnTypes::SUPL},
47     {DATA_CONTEXT_ROLE_DUN, ApnTypes::DUN},
48     {DATA_CONTEXT_ROLE_IMS, ApnTypes::IMS},
49     {DATA_CONTEXT_ROLE_IA, ApnTypes::IA},
50     {DATA_CONTEXT_ROLE_EMERGENCY, ApnTypes::EMERGENCY},
51     {DATA_CONTEXT_ROLE_XCAP, ApnTypes::XCAP},
52     {DATA_CONTEXT_ROLE_BIP, ApnTypes::BIP},
53     {DATA_CONTEXT_ROLE_INTERNAL_DEFAULT, ApnTypes::INTERNAL_DEFAULT}
54 };
55 const std::vector<ApnProfileState> ApnManager::apnStateArr_ = {
56     PROFILE_STATE_CONNECTED,
57     PROFILE_STATE_DISCONNECTING,
58     PROFILE_STATE_CONNECTING,
59     PROFILE_STATE_IDLE,
60     PROFILE_STATE_RETRYING,
61     PROFILE_STATE_FAILED
62 };
63 constexpr const char *CT_MCC_MNC_1 = "46003";
64 constexpr const char *CT_MCC_MNC_2 = "46011";
65 constexpr const char *GC_ICCID = "8985231";
66 constexpr const char *GC_MCC_MNC = "45431";
67 constexpr const char *GC_SPN = "CTExcel";
68 constexpr const char *MO_ICCID_1 = "8985302";
69 constexpr const char *MO_ICCID_2 = "8985307";
70 constexpr const char *MO_UNICOM_MCCMNC = "46001";
71 constexpr int32_t ICCID_LEN_MINIMUM = 7;
72 
73 ApnManager::ApnManager() = default;
74 
75 ApnManager::~ApnManager() = default;
76 
InitApnHolders()77 void ApnManager::InitApnHolders()
78 {
79     AddApnHolder(DATA_CONTEXT_ROLE_DEFAULT, static_cast<int32_t>(DataContextPriority::PRIORITY_LOW));
80     AddApnHolder(DATA_CONTEXT_ROLE_MMS, static_cast<int32_t>(DataContextPriority::PRIORITY_NORMAL));
81     AddApnHolder(DATA_CONTEXT_ROLE_INTERNAL_DEFAULT, static_cast<int32_t>(DataContextPriority::PRIORITY_NONE));
82     AddApnHolder(DATA_CONTEXT_ROLE_XCAP, static_cast<int32_t>(DataContextPriority::PRIORITY_NORMAL));
83     AddApnHolder(DATA_CONTEXT_ROLE_DUN, static_cast<int32_t>(DataContextPriority::PRIORITY_NORMAL));
84     AddApnHolder(DATA_CONTEXT_ROLE_IA, static_cast<int32_t>(DataContextPriority::PRIORITY_HIGH));
85     AddApnHolder(DATA_CONTEXT_ROLE_SUPL, static_cast<int32_t>(DataContextPriority::PRIORITY_NORMAL));
86     AddApnHolder(DATA_CONTEXT_ROLE_BIP, static_cast<int32_t>(DataContextPriority::PRIORITY_NORMAL));
87 }
88 
FindApnHolderById(const int32_t id) const89 sptr<ApnHolder> ApnManager::FindApnHolderById(const int32_t id) const
90 {
91     if (apnIdApnHolderMap_.empty()) {
92         TELEPHONY_LOGE("apnIdApnHolderMap_ empty");
93         return nullptr;
94     }
95     if (id == DATA_CONTEXT_ROLE_INVALID_ID) {
96         TELEPHONY_LOGE("find a invalid capability!");
97         return nullptr;
98     }
99     std::map<int32_t, sptr<ApnHolder>>::const_iterator it = apnIdApnHolderMap_.find(id);
100     if (it != apnIdApnHolderMap_.end()) {
101         return it->second;
102     }
103     return nullptr;
104 }
105 
FindApnIdByApnName(const std::string & type)106 int32_t ApnManager::FindApnIdByApnName(const std::string &type)
107 {
108     std::map<std::string, int32_t>::const_iterator it = apnIdApnNameMap_.find(type);
109     if (it != apnIdApnNameMap_.end()) {
110         return it->second;
111     }
112     TELEPHONY_LOGE("apnType %{public}s is not exist!", type.c_str());
113     return DATA_CONTEXT_ROLE_INVALID_ID;
114 }
115 
FindApnNameByApnId(const int32_t id)116 std::string ApnManager::FindApnNameByApnId(const int32_t id)
117 {
118     for (std::pair<const std::string, int32_t> it : apnIdApnNameMap_) {
119         if (it.second == id) {
120             return it.first;
121         }
122     }
123     TELEPHONY_LOGI("apnId %{public}d is not exist!", id);
124     return DATA_CONTEXT_ROLE_DEFAULT;
125 }
126 
FindApnTypeByApnName(const std::string & apnName)127 int32_t ApnManager::FindApnTypeByApnName(const std::string &apnName)
128 {
129     auto iter = apnNameApnTypeMap_.find(apnName);
130     if (iter != apnNameApnTypeMap_.end()) {
131         return static_cast<uint64_t>(iter->second);
132     }
133     TELEPHONY_LOGI("ApnName %{public}s is not exist!", apnName.c_str());
134     return static_cast<uint64_t>(ApnTypes::NONETYPE);
135 }
136 
FindApnIdByCapability(const uint64_t capability)137 int32_t ApnManager::FindApnIdByCapability(const uint64_t capability)
138 {
139     switch (capability) {
140         case NetManagerStandard::NetCap::NET_CAPABILITY_INTERNET:
141             return DATA_CONTEXT_ROLE_DEFAULT_ID;
142         case NetManagerStandard::NetCap::NET_CAPABILITY_MMS:
143             return DATA_CONTEXT_ROLE_MMS_ID;
144         case NetManagerStandard::NetCap::NET_CAPABILITY_INTERNAL_DEFAULT:
145             return DATA_CONTEXT_ROLE_INTERNAL_DEFAULT_ID;
146         case NetManagerStandard::NetCap::NET_CAPABILITY_IA:
147             return DATA_CONTEXT_ROLE_IA_ID;
148         case NetManagerStandard::NetCap::NET_CAPABILITY_XCAP:
149             return DATA_CONTEXT_ROLE_XCAP_ID;
150         case NetManagerStandard::NetCap::NET_CAPABILITY_SUPL:
151             return DATA_CONTEXT_ROLE_SUPL_ID;
152         case NetManagerStandard::NetCap::NET_CAPABILITY_DUN:
153             return DATA_CONTEXT_ROLE_DUN_ID;
154         case NetManagerStandard::NetCap::NET_CAPABILITY_BIP:
155             return DATA_CONTEXT_ROLE_BIP_ID;
156         default:
157             return DATA_CONTEXT_ROLE_INVALID_ID;
158     }
159 }
160 
HasNetCap(const uint64_t capabilities,const NetManagerStandard::NetCap netCap)161 static bool HasNetCap(const uint64_t capabilities, const NetManagerStandard::NetCap netCap)
162 {
163     return (capabilities & (1L << netCap)) != 0;
164 }
165 
FindBestCapability(const uint64_t capabilities)166 NetManagerStandard::NetCap ApnManager::FindBestCapability(const uint64_t capabilities)
167 {
168     NetManagerStandard::NetCap netCap = NetManagerStandard::NetCap::NET_CAPABILITY_END;
169     if (HasNetCap(capabilities, NetManagerStandard::NetCap::NET_CAPABILITY_INTERNET)) {
170         netCap = NetManagerStandard::NetCap::NET_CAPABILITY_INTERNET;
171     }
172     if (HasNetCap(capabilities, NetManagerStandard::NetCap::NET_CAPABILITY_INTERNAL_DEFAULT)) {
173         netCap = NetManagerStandard::NetCap::NET_CAPABILITY_INTERNAL_DEFAULT;
174     }
175     if (HasNetCap(capabilities, NetManagerStandard::NetCap::NET_CAPABILITY_MMS)) {
176         netCap = NetManagerStandard::NetCap::NET_CAPABILITY_MMS;
177     }
178     if (HasNetCap(capabilities, NetManagerStandard::NetCap::NET_CAPABILITY_SUPL)) {
179         netCap = NetManagerStandard::NetCap::NET_CAPABILITY_SUPL;
180     }
181     if (HasNetCap(capabilities, NetManagerStandard::NetCap::NET_CAPABILITY_DUN)) {
182         netCap = NetManagerStandard::NetCap::NET_CAPABILITY_DUN;
183     }
184     if (HasNetCap(capabilities, NetManagerStandard::NetCap::NET_CAPABILITY_XCAP)) {
185         netCap = NetManagerStandard::NetCap::NET_CAPABILITY_XCAP;
186     }
187     if (HasNetCap(capabilities, NetManagerStandard::NetCap::NET_CAPABILITY_IA)) {
188         netCap = NetManagerStandard::NetCap::NET_CAPABILITY_IA;
189     }
190     if (HasNetCap(capabilities, NetManagerStandard::NetCap::NET_CAPABILITY_BIP)) {
191         netCap = NetManagerStandard::NetCap::NET_CAPABILITY_BIP;
192     }
193     return netCap;
194 }
195 
AddApnHolder(const std::string & apnType,const int32_t priority)196 void ApnManager::AddApnHolder(const std::string &apnType, const int32_t priority)
197 {
198     int32_t apnId = FindApnIdByApnName(apnType);
199     if (apnId == DATA_CONTEXT_ROLE_INVALID_ID) {
200         TELEPHONY_LOGE("APN INVALID ID");
201         return;
202     }
203     sptr<ApnHolder> apnHolder = std::make_unique<ApnHolder>(apnType, priority).release();
204     if (apnHolder == nullptr) {
205         TELEPHONY_LOGE("apnHolder is null, type: %{public}s", apnType.c_str());
206         return;
207     }
208     apnHolder->SetApnState(PROFILE_STATE_IDLE);
209     apnHolders_.push_back(apnHolder);
210     apnIdApnHolderMap_.insert(std::pair<int32_t, sptr<ApnHolder>>(apnId, apnHolder));
211     sortedApnHolders_.emplace_back(apnHolder);
212     sort(sortedApnHolders_.begin(), sortedApnHolders_.end(),
213         [](const sptr<ApnHolder> &c1, const sptr<ApnHolder> &c2) {
214             if (c1 == nullptr || c2 == nullptr) {
215                 return false;
216             }
217             return c2->GetPriority() < c1->GetPriority();
218         });
219     TELEPHONY_LOGI("The Apn holder type:%{public}s, size:%{public}zu", apnType.c_str(), sortedApnHolders_.size());
220 }
221 
GetApnHolder(const std::string & apnType) const222 sptr<ApnHolder> ApnManager::GetApnHolder(const std::string &apnType) const
223 {
224     int32_t apnId = FindApnIdByApnName(apnType);
225     if (DATA_CONTEXT_ROLE_INVALID_ID == apnId) {
226         TELEPHONY_LOGE("APN INVALID ID");
227         return nullptr;
228     }
229     std::map<int32_t, sptr<ApnHolder>>::const_iterator it = apnIdApnHolderMap_.find(apnId);
230     if (it != apnIdApnHolderMap_.end()) {
231         return it->second;
232     }
233     TELEPHONY_LOGE("apnType %{public}s is not exist!", apnType.c_str());
234     return nullptr;
235 }
236 
GetAllApnHolder() const237 std::vector<sptr<ApnHolder>> ApnManager::GetAllApnHolder() const
238 {
239     return apnHolders_;
240 }
241 
GetSortApnHolder() const242 std::vector<sptr<ApnHolder>> ApnManager::GetSortApnHolder() const
243 {
244     return sortedApnHolders_;
245 }
246 
CreateAllApnItemByDatabase(int32_t slotId)247 int32_t ApnManager::CreateAllApnItemByDatabase(int32_t slotId)
248 {
249     int32_t count = 0;
250     if (TELEPHONY_EXT_WRAPPER.createAllApnItemExt_) {
251         sptr<ApnItem> extraApnItem = ApnItem::MakeDefaultApn("default");
252         if (TELEPHONY_EXT_WRAPPER.createAllApnItemExt_(slotId, extraApnItem)) {
253             std::lock_guard<std::mutex> lock(mutex_);
254             allApnItem_.clear();
255             allApnItem_.push_back(extraApnItem);
256             return ++count;
257         }
258     }
259     std::u16string operatorNumeric;
260     CoreManagerInner::GetInstance().GetSimOperatorNumeric(slotId, operatorNumeric);
261     std::string numeric = Str16ToStr8(operatorNumeric);
262     GetCTOperator(slotId, numeric);
263     if (numeric.empty()) {
264         TELEPHONY_LOGE("numeric is empty!!!");
265         return count;
266     }
267     TELEPHONY_LOGI("current slotId = %{public}d, numeric = %{public}s", slotId, numeric.c_str());
268     preferId_ = INVALID_PROFILE_ID;
269     if (!GetPreferId(slotId)) {
270         TELEPHONY_LOGE("query prefer apn fail");
271         return count;
272     }
273     auto helper = CellularDataRdbHelper::GetInstance();
274     if (helper == nullptr) {
275         TELEPHONY_LOGE("get cellularDataRdbHelper failed");
276         return count;
277     }
278     std::string mcc = numeric.substr(0, DEFAULT_MCC_SIZE);
279     std::string mnc = numeric.substr(mcc.size(), numeric.size() - mcc.size());
280     int32_t mvnoCount = CreateMvnoApnItems(slotId, mcc, mnc);
281     if (mvnoCount > 0) {
282         return mvnoCount;
283     }
284     std::vector<PdpProfile> apnVec;
285     if (!helper->QueryApns(mcc, mnc, apnVec, slotId)) {
286         TELEPHONY_LOGE("query apns from data ability fail");
287         return count;
288     }
289     return MakeSpecificApnItem(apnVec, slotId);
290 }
291 
GetCTOperator(int32_t slotId,std::string & numeric)292 void ApnManager::GetCTOperator(int32_t slotId, std::string &numeric)
293 {
294     bool isCTSimCard = false;
295     CoreManagerInner::GetInstance().IsCTSimCard(slotId, isCTSimCard);
296     if (isCTSimCard && numeric.compare(CT_MCC_MNC_2)) {
297         numeric = CT_MCC_MNC_1;
298     }
299     if (!numeric.compare(CT_MCC_MNC_1)) {
300         std::u16string tempIccId;
301         CoreManagerInner::GetInstance().GetSimIccId(slotId, tempIccId);
302         std::string iccId = Str16ToStr8(tempIccId);
303         std::u16string tempSpn;
304         CoreManagerInner::GetInstance().GetSimSpn(slotId, tempSpn);
305         std::string spn = Str16ToStr8(tempSpn);
306         if (!iccId.compare(0, ICCID_LEN_MINIMUM, GC_ICCID) || !spn.compare(GC_SPN)) {
307             numeric = GC_MCC_MNC;
308         } else if (!iccId.compare(0, ICCID_LEN_MINIMUM, MO_ICCID_1) ||
309             !iccId.compare(0, ICCID_LEN_MINIMUM, MO_ICCID_2)) {
310             std::u16string tempPlmn;
311             CoreManagerInner::GetInstance().GetSimOperatorNumeric(slotId, tempPlmn);
312             std::string plmn = Str16ToStr8(tempPlmn);
313             if (!plmn.empty() && !plmn.compare(MO_UNICOM_MCCMNC)) {
314                 numeric = MO_UNICOM_MCCMNC;
315             }
316         }
317     }
318 }
319 
CreateMvnoApnItems(int32_t slotId,const std::string & mcc,const std::string & mnc)320 int32_t ApnManager::CreateMvnoApnItems(int32_t slotId, const std::string &mcc, const std::string &mnc)
321 {
322     int32_t count = 0;
323     auto helper = CellularDataRdbHelper::GetInstance();
324     if (helper == nullptr) {
325         TELEPHONY_LOGE("get cellularDataRdbHelper failed");
326         return count;
327     }
328     std::vector<PdpProfile> mvnoApnVec;
329     std::u16string spn;
330     CoreManagerInner::GetInstance().GetSimSpn(slotId, spn);
331     if (!helper->QueryMvnoApnsByType(mcc, mnc, MvnoType::SPN, Str16ToStr8(spn), mvnoApnVec, slotId)) {
332         TELEPHONY_LOGE("query mvno apns by spn fail");
333         return count;
334     }
335     std::u16string imsi;
336     CoreManagerInner::GetInstance().GetIMSI(slotId, imsi);
337     if (!helper->QueryMvnoApnsByType(mcc, mnc, MvnoType::IMSI, Str16ToStr8(imsi), mvnoApnVec, slotId)) {
338         TELEPHONY_LOGE("query mvno apns by imsi fail");
339         return count;
340     }
341     std::u16string gid1;
342     CoreManagerInner::GetInstance().GetSimGid1(slotId, gid1);
343     if (!helper->QueryMvnoApnsByType(mcc, mnc, MvnoType::GID1, Str16ToStr8(gid1), mvnoApnVec, slotId)) {
344         TELEPHONY_LOGE("query mvno apns by gid1 fail");
345         return count;
346     }
347     std::u16string iccId;
348     CoreManagerInner::GetInstance().GetSimIccId(slotId, iccId);
349     if (!helper->QueryMvnoApnsByType(mcc, mnc, MvnoType::ICCID, Str16ToStr8(iccId), mvnoApnVec, slotId)) {
350         TELEPHONY_LOGE("query mvno apns by iccId fail");
351         return count;
352     }
353     return MakeSpecificApnItem(mvnoApnVec, slotId);
354 }
355 
ReportApnInfo(int32_t slotId,PdpProfile & apnData)356 void ApnManager::ReportApnInfo(int32_t slotId, PdpProfile &apnData)
357 {
358     if (apnData.apnTypes.empty()) {
359         return;
360     }
361     if (apnData.apnTypes.find(DATA_CONTEXT_ROLE_DEFAULT) == std::string::npos) {
362         return;
363     }
364     CellularDataHiSysEvent::WriteApnInfoBehaviorEvent(slotId, apnData);
365 }
366 
MakeSpecificApnItem(std::vector<PdpProfile> & apnVec,int32_t slotId)367 int32_t ApnManager::MakeSpecificApnItem(std::vector<PdpProfile> &apnVec, int32_t slotId)
368 {
369     std::lock_guard<std::mutex> lock(mutex_);
370     allApnItem_.clear();
371     TryMergeSimilarPdpProfile(apnVec);
372     int32_t count = 0;
373     for (PdpProfile &apnData : apnVec) {
374         TELEPHONY_LOGI("profileId = %{public}d, profileName = %{public}s, mvnoType = %{public}s",
375             apnData.profileId, apnData.profileName.c_str(), apnData.mvnoType.c_str());
376         if (apnData.profileId == preferId_ && apnData.apnTypes.empty()) {
377             apnData.apnTypes = DATA_CONTEXT_ROLE_DEFAULT;
378         }
379         ReportApnInfo(slotId, apnData);
380         sptr<ApnItem> apnItem = ApnItem::MakeApn(apnData);
381         if (apnItem != nullptr) {
382             allApnItem_.push_back(apnItem);
383             count++;
384         }
385     }
386     int32_t preferId = preferId_;
387     auto it = std::find_if(allApnItem_.begin(), allApnItem_.end(),
388         [preferId](auto &apn) { return apn != nullptr && apn->attr_.profileId_ == preferId; });
389     if (it != allApnItem_.end()) {
390         sptr<ApnItem> apnItem = *it;
391         allApnItem_.erase(it);
392         allApnItem_.insert(allApnItem_.begin(), apnItem);
393     }
394     return count;
395 }
396 
FilterMatchedApns(const std::string & requestApnType,const int32_t slotId)397 std::vector<sptr<ApnItem>> ApnManager::FilterMatchedApns(const std::string &requestApnType, const int32_t slotId)
398 {
399     std::lock_guard<std::mutex> lock(mutex_);
400     std::vector<sptr<ApnItem>> matchApnItemList;
401     if (requestApnType == DATA_CONTEXT_ROLE_DUN) {
402         FetchDunApns(matchApnItemList, slotId);
403         return matchApnItemList;
404     } else if (requestApnType == DATA_CONTEXT_ROLE_BIP) {
405         FetchBipApns(matchApnItemList);
406         return matchApnItemList;
407     }
408 
409     for (const sptr<ApnItem> &apnItem : allApnItem_) {
410         if (apnItem->CanDealWithType(requestApnType)) {
411             matchApnItemList.push_back(apnItem);
412         }
413     }
414     TELEPHONY_LOGD("apn size is :%{public}zu", matchApnItemList.size());
415     return matchApnItemList;
416 }
417 
IsDataConnectionNotUsed(const std::shared_ptr<CellularDataStateMachine> & stateMachine) const418 bool ApnManager::IsDataConnectionNotUsed(const std::shared_ptr<CellularDataStateMachine> &stateMachine) const
419 {
420     if (stateMachine == nullptr) {
421         TELEPHONY_LOGE("CellularDataHandler:stateMachine is null");
422         return false;
423     }
424     for (const sptr<ApnHolder> &apnHolder : apnHolders_) {
425         if (apnHolder == nullptr) {
426             TELEPHONY_LOGE("apn holder is null");
427             continue;
428         }
429         std::shared_ptr<CellularDataStateMachine> cellularDataStateMachine = apnHolder->GetCellularDataStateMachine();
430         if (cellularDataStateMachine != nullptr && stateMachine == cellularDataStateMachine) {
431             TELEPHONY_LOGE("cellularDataStateMachine in use");
432             return false;
433         }
434     }
435     return true;
436 }
437 
HasAnyConnectedState() const438 bool ApnManager::HasAnyConnectedState() const
439 {
440     for (const sptr<ApnHolder> &apnHolder : apnHolders_) {
441         if (apnHolder == nullptr) {
442             TELEPHONY_LOGE("apn holder is null");
443             continue;
444         }
445         if (apnHolder->GetApnState() == ApnProfileState::PROFILE_STATE_CONNECTED ||
446             apnHolder->GetApnState() == ApnProfileState::PROFILE_STATE_DISCONNECTING) {
447             return true;
448         }
449     }
450     return false;
451 }
452 
GetOverallApnState() const453 ApnProfileState ApnManager::GetOverallApnState() const
454 {
455     if (apnHolders_.empty()) {
456         TELEPHONY_LOGE("apn overall state is STATE_IDLE");
457         return ApnProfileState::PROFILE_STATE_IDLE;
458     }
459     if (HasAnyConnectedState()) {
460         TELEPHONY_LOGI("apn overall state is STATE_CONNECTED");
461         return ApnProfileState::PROFILE_STATE_CONNECTED;
462     }
463     bool failState = false;
464     for (const sptr<ApnHolder> &apnHolder : apnHolders_) {
465         if (apnHolder == nullptr) {
466             continue;
467         }
468         if (apnHolder->GetApnState() == ApnProfileState::PROFILE_STATE_CONNECTING ||
469             apnHolder->GetApnState() == ApnProfileState::PROFILE_STATE_RETRYING) {
470             TELEPHONY_LOGI("apn overall state is STATE_CONNECTING");
471             return ApnProfileState::PROFILE_STATE_CONNECTING;
472         } else if (apnHolder->GetApnState() == ApnProfileState::PROFILE_STATE_IDLE) {
473             failState = true;
474         }
475     }
476     if (failState) {
477         TELEPHONY_LOGD("apn overall state is STATE_IDLE");
478         return ApnProfileState::PROFILE_STATE_IDLE;
479     }
480     TELEPHONY_LOGI("apn overall state is STATE_FAILED");
481     return ApnProfileState::PROFILE_STATE_FAILED;
482 }
483 
GetOverallDefaultApnState() const484 ApnProfileState ApnManager::GetOverallDefaultApnState() const
485 {
486     if (apnHolders_.empty()) {
487         TELEPHONY_LOGE("apn overall state is STATE_IDLE");
488         return ApnProfileState::PROFILE_STATE_IDLE;
489     }
490     ApnProfileState defaultApnState = ApnProfileState::PROFILE_STATE_IDLE;
491     ApnProfileState internalApnState = ApnProfileState::PROFILE_STATE_IDLE;
492 
493     for (const sptr<ApnHolder> &apnHolder : apnHolders_) {
494         if (apnHolder == nullptr) {
495             continue;
496         }
497         if (apnHolder->GetApnType() == DATA_CONTEXT_ROLE_DEFAULT) {
498             defaultApnState = apnHolder->GetApnState();
499         }
500         if (apnHolder->GetApnType() == DATA_CONTEXT_ROLE_INTERNAL_DEFAULT) {
501             internalApnState = apnHolder->GetApnState();
502         }
503     }
504     TELEPHONY_LOGI("defaultApnState is %{public}d, internalApnState is %{public}d", defaultApnState,
505         internalApnState);
506     for (auto apnState : apnStateArr_) {
507         if (defaultApnState == apnState || internalApnState == apnState) {
508             return apnState;
509         }
510     }
511     return ApnProfileState::PROFILE_STATE_IDLE;
512 }
513 
GetRilAttachApn()514 sptr<ApnItem> ApnManager::GetRilAttachApn()
515 {
516     std::lock_guard<std::mutex> lock(mutex_);
517     if (allApnItem_.empty()) {
518         TELEPHONY_LOGE("apn item is null");
519         return nullptr;
520     }
521     if (preferId_ != INVALID_PROFILE_ID) {
522         TELEPHONY_LOGI("GetRilAttachApn use prefer apn");
523         return allApnItem_[0];
524     }
525     sptr<ApnItem> attachApn = nullptr;
526     for (const sptr<ApnItem> &apnItem : allApnItem_) {
527         if (apnItem->CanDealWithType(DATA_CONTEXT_ROLE_IA)) {
528             attachApn = apnItem;
529             break;
530         }
531         if (attachApn == nullptr && apnItem->CanDealWithType(DATA_CONTEXT_ROLE_DEFAULT)) {
532             attachApn = apnItem;
533         }
534     }
535     if (attachApn == nullptr) {
536         attachApn = allApnItem_[0];
537     }
538     return attachApn;
539 }
540 
GetApnItemById(const int32_t id)541 sptr<ApnItem> ApnManager::GetApnItemById(const int32_t id)
542 {
543     std::lock_guard<std::mutex> lock(mutex_);
544     if (allApnItem_.empty()) {
545         TELEPHONY_LOGE("apn item is null");
546         return nullptr;
547     }
548     sptr<ApnItem> attachApn = nullptr;
549     for (const sptr<ApnItem> &apnItem : allApnItem_) {
550         if (id == apnItem->attr_.profileId_) {
551             attachApn = apnItem;
552             break;
553         }
554     }
555     return attachApn;
556 }
557 
ResetApns(int32_t slotId)558 bool ApnManager::ResetApns(int32_t slotId)
559 {
560     auto helper = CellularDataRdbHelper::GetInstance();
561     if (helper == nullptr) {
562         TELEPHONY_LOGE("get cellularDataRdbHelper failed");
563         return false;
564     }
565     return helper->ResetApns(slotId);
566 }
567 
FetchBipApns(std::vector<sptr<ApnItem>> & matchApnItemList)568 void ApnManager::FetchBipApns(std::vector<sptr<ApnItem>> &matchApnItemList)
569 {
570     sptr<ApnItem> defaultApn = nullptr;
571     for (const sptr<ApnItem> &apnItem : allApnItem_) {
572         if (apnItem->CanDealWithType(DATA_CONTEXT_ROLE_BIP)) {
573             matchApnItemList.push_back(apnItem);
574             return;
575         }
576         if (apnItem->CanDealWithType(DATA_CONTEXT_ROLE_DEFAULT)) {
577             defaultApn = apnItem;
578         }
579     }
580 
581     if (defaultApn != nullptr) {
582         matchApnItemList.push_back(defaultApn);
583     }
584 }
585 
FetchDunApns(std::vector<sptr<ApnItem>> & matchApnItemList,const int32_t slotId)586 void ApnManager::FetchDunApns(std::vector<sptr<ApnItem>> &matchApnItemList, const int32_t slotId)
587 {
588     bool roamingState = CoreManagerInner::GetInstance().GetPsRoamingState(slotId) > 0;
589     if (roamingState && !IsPreferredApnUserEdited()) {
590         TELEPHONY_LOGI("FetchDunApns: Dun apn is not used in roaming network");
591         return;
592     }
593     int32_t preferId = preferId_;
594     sptr<ApnItem> preferredApn = nullptr;
595     auto it = std::find_if(allApnItem_.begin(), allApnItem_.end(), [preferId](auto &apn) {
596         return apn != nullptr && apn->attr_.profileId_ == preferId;
597     });
598     if (it != allApnItem_.end()) {
599         preferredApn = *it;
600     }
601     if (preferredApn != nullptr && preferredApn->CanDealWithType(DATA_CONTEXT_ROLE_DUN)) {
602         matchApnItemList.insert(matchApnItemList.begin(), preferredApn);
603     }
604     if (matchApnItemList.empty()) {
605         for (const auto &item : allApnItem_) {
606             if (item->CanDealWithType(DATA_CONTEXT_ROLE_DUN)) {
607                 matchApnItemList.push_back(item);
608             }
609         }
610     }
611 }
612 
IsPreferredApnUserEdited()613 bool ApnManager::IsPreferredApnUserEdited()
614 {
615     bool isUserEdited = false;
616     int32_t preferId = preferId_;
617     auto it = std::find_if(allApnItem_.begin(), allApnItem_.end(), [preferId](auto &apn) {
618         return apn->attr_.profileId_ == preferId;
619     });
620     if (it != allApnItem_.end() && *it != nullptr) {
621         isUserEdited = (*it)->attr_.isEdited_;
622     }
623     return isUserEdited;
624 }
625 
ClearAllApnBad()626 void ApnManager::ClearAllApnBad()
627 {
628     for (const sptr<ApnHolder> &apnHolder : apnHolders_) {
629         if (apnHolder != nullptr) {
630             apnHolder->SetApnBadState(false);
631         }
632     }
633 }
634 
TryMergeSimilarPdpProfile(std::vector<PdpProfile> & apnVec)635 void ApnManager::TryMergeSimilarPdpProfile(std::vector<PdpProfile> &apnVec)
636 {
637     // coalesce similar APNs to prevent bringing up two data calls with same interface
638     std::vector<PdpProfile> newApnVec;
639     for (size_t i = 0; i < apnVec.size(); i++) {
640         if (apnVec[i].profileId == -1) {
641             continue;
642         }
643         for (size_t j = i + 1; j < apnVec.size(); j++) {
644             if (ApnItem::IsSimilarPdpProfile(apnVec[i], apnVec[j])) {
645                 MergePdpProfile(apnVec[i], apnVec[j]);
646                 apnVec[j].profileId = -1;
647             }
648         }
649         newApnVec.push_back(apnVec[i]);
650     }
651     apnVec.assign(newApnVec.begin(), newApnVec.end());
652 }
653 
MergePdpProfile(PdpProfile & newProfile,PdpProfile & oldProfile)654 void ApnManager::MergePdpProfile(PdpProfile &newProfile, PdpProfile &oldProfile)
655 {
656     newProfile.apnTypes = newProfile.apnTypes + ',' + oldProfile.apnTypes;
657     newProfile.pdpProtocol = (newProfile.pdpProtocol == PROTOCOL_IPV4V6) ?
658         newProfile.pdpProtocol : oldProfile.pdpProtocol;
659     newProfile.roamPdpProtocol = (newProfile.roamPdpProtocol == PROTOCOL_IPV4V6) ?
660         newProfile.roamPdpProtocol : oldProfile.roamPdpProtocol;
661     if (preferId_ == oldProfile.profileId) {
662         TELEPHONY_LOGI("preferId change from %{public}d to %{public}d", oldProfile.profileId, newProfile.profileId);
663         preferId_ = newProfile.profileId;
664     }
665     TELEPHONY_LOGI("merge %{public}d and %{public}d: apn[%{public}s], apnTypes[%{public}s]",
666         newProfile.profileId, oldProfile.profileId, newProfile.apn.c_str(), newProfile.apnTypes.c_str());
667 }
668 
FindCapabilityByApnId(int32_t apnId)669 uint64_t ApnManager::FindCapabilityByApnId(int32_t apnId)
670 {
671     switch (apnId) {
672         case DATA_CONTEXT_ROLE_DEFAULT_ID:
673             return NetManagerStandard::NetCap::NET_CAPABILITY_INTERNET;
674         case DATA_CONTEXT_ROLE_MMS_ID:
675             return NetManagerStandard::NetCap::NET_CAPABILITY_MMS;
676         case DATA_CONTEXT_ROLE_INTERNAL_DEFAULT_ID:
677             return NetManagerStandard::NetCap::NET_CAPABILITY_INTERNAL_DEFAULT;
678         case DATA_CONTEXT_ROLE_IA_ID:
679             return NetManagerStandard::NetCap::NET_CAPABILITY_IA;
680         case DATA_CONTEXT_ROLE_XCAP_ID:
681             return NetManagerStandard::NetCap::NET_CAPABILITY_XCAP;
682         case DATA_CONTEXT_ROLE_SUPL_ID:
683             return NetManagerStandard::NetCap::NET_CAPABILITY_SUPL;
684         case DATA_CONTEXT_ROLE_DUN_ID:
685             return NetManagerStandard::NetCap::NET_CAPABILITY_DUN;
686         case DATA_CONTEXT_ROLE_BIP_ID:
687             return NetManagerStandard::NetCap::NET_CAPABILITY_BIP;
688         default:
689             return NetManagerStandard::NetCap::NET_CAPABILITY_END;
690     }
691 }
692 
GetPreferId(int32_t slotId)693 bool ApnManager::GetPreferId(int32_t slotId)
694 {
695     int32_t simId = CoreManagerInner::GetInstance().GetSimId(slotId);
696     if (simId <= INVALID_SIM_ID) {
697         TELEPHONY_LOGE("Slot%{public}d: failed due to invalid sim id %{public}d", slotId, simId);
698         return false;
699     }
700     auto helper = CellularDataRdbHelper::GetInstance();
701     if (helper == nullptr) {
702         TELEPHONY_LOGE("get cellularDataRdbHelper failed");
703         return false;
704     }
705     std::vector<PdpProfile> preferApnVec;
706     if (helper->QueryPreferApn(slotId, preferApnVec)) {
707         if (preferApnVec.size() > 0) {
708             preferId_ = preferApnVec[0].profileId;
709             TELEPHONY_LOGI("query preferId_ = %{public}d", preferId_);
710         } else {
711             TELEPHONY_LOGI("query prefer apn is null");
712         }
713         return true;
714     }
715     TELEPHONY_LOGE("query prefer apn fail");
716     return false;
717 }
718 }  // namespace Telephony
719 }  // namespace OHOS
720