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 "mcc_pool.h"
17 
18 using namespace std;
19 
20 namespace OHOS {
21 namespace Telephony {
22 std::mutex mccMutex_;
23 std::vector<std::shared_ptr<MccAccess>> MccPool::mccAccessTable_;
24 std::vector<std::string> MccPool::specialMccMnc_;
25 std::vector<std::string> MccPool::indiaMccMnc_;
26 constexpr size_t MCC_ACCESS_TABLE_LEN = 240;
AccessToMcc(int mcc)27 std::shared_ptr<MccAccess> MccPool::AccessToMcc(int mcc)
28 {
29     std::lock_guard<std::mutex> lock(mccMutex_);
30     InitMccTables();
31     auto it = std::find_if(mccAccessTable_.begin(), mccAccessTable_.end(),
32         [mcc](const auto &p) { return p != nullptr && p->mcc_ == mcc; });
33     if (it != mccAccessTable_.end()) {
34         return *it;
35     } else {
36         return std::make_shared<MccAccess>(mcc, "", 0);
37     }
38 }
39 
MccCountryCode(int mcc)40 std::string MccPool::MccCountryCode(int mcc)
41 {
42     auto entry = AccessToMcc(mcc);
43     if (entry == nullptr) {
44         return "";
45     }
46     return entry->iso_;
47 }
48 
ShortestMncLengthFromMcc(int mcc)49 int MccPool::ShortestMncLengthFromMcc(int mcc)
50 {
51     auto access = AccessToMcc(mcc);
52     if (access == nullptr || access->iso_.empty()) {
53         return MCC_SHORT;
54     } else {
55         return access->mncShortestLength_;
56     }
57 }
58 
InitMccTables()59 void MccPool::InitMccTables()
60 {
61     if (mccAccessTable_.size() == 0) {
62         mccAccessTable_.reserve(MCC_ACCESS_TABLE_LEN);
63         AddMccForAsia();
64         AddMccForEurope();
65         AddMccForAfrica();
66         AddMccForNorthAmerica();
67         AddMccForSouthAmerica();
68         AddMccForAustralia();
69         std::sort(mccAccessTable_.begin(), mccAccessTable_.end(), MccPool::MccCompare);
70     }
71 }
72 
AddMccForAsia()73 void MccPool::AddMccForAsia()
74 {
75     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_GR, "gr", MCC_SHORT));
76     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_NL, "nl", MCC_SHORT));
77     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_BE, "be", MCC_SHORT));
78     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_FR, "fr", MCC_SHORT));
79     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_MC, "mc", MCC_SHORT));
80     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_AD, "ad", MCC_SHORT));
81     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_ES, "es", MCC_SHORT));
82     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_HU, "hu", MCC_SHORT));
83     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_BA, "ba", MCC_SHORT));
84     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_HR, "hr", MCC_SHORT));
85     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_RS, "rs", MCC_SHORT));
86     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_IT, "it", MCC_SHORT));
87     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_VA, "va", MCC_SHORT));
88     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_RO, "ro", MCC_SHORT));
89     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_CH, "ch", MCC_SHORT));
90     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_CZ, "cz", MCC_SHORT));
91     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_SK, "sk", MCC_SHORT));
92     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_AT, "at", MCC_SHORT));
93     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_GB_A, "gb", MCC_SHORT));
94     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_GB_B, "gb", MCC_SHORT));
95     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_DK, "dk", MCC_SHORT));
96     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_SE, "se", MCC_SHORT));
97     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_NO, "no", MCC_SHORT));
98     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_FI, "fi", MCC_SHORT));
99     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_LT, "lt", MCC_SHORT));
100     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_LV, "lv", MCC_SHORT));
101     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_EE, "ee", MCC_SHORT));
102     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_RU, "ru", MCC_SHORT));
103     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_UA, "ua", MCC_SHORT));
104     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_BY, "by", MCC_SHORT));
105     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_MD, "md", MCC_SHORT));
106     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_PL, "pl", MCC_SHORT));
107     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_DE, "de", MCC_SHORT));
108     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_GI, "gi", MCC_SHORT));
109     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_PT, "pt", MCC_SHORT));
110     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_LU, "lu", MCC_SHORT));
111     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_IE, "ie", MCC_SHORT));
112     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_IS, "is", MCC_SHORT));
113     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_AL, "al", MCC_SHORT));
114     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_MT, "mt", MCC_SHORT));
115     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_CY, "cy", MCC_SHORT));
116 }
117 
AddMccForEurope()118 void MccPool::AddMccForEurope()
119 {
120     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_GE_A, "ge", MCC_SHORT));
121     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_AM, "am", MCC_SHORT));
122     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_BG, "bg", MCC_SHORT));
123     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_TR, "tr", MCC_SHORT));
124     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_FO, "fo", MCC_SHORT));
125     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_GE_B, "ge", MCC_SHORT));
126     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_GL, "gl", MCC_SHORT));
127     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_SM, "sm", MCC_SHORT));
128     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_SI, "si", MCC_SHORT));
129     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_MK, "mk", MCC_SHORT));
130     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_LI, "li", MCC_SHORT));
131     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_ME, "me", MCC_SHORT));
132     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_CA, "ca", MCC_LONG));
133     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_PM, "pm", MCC_SHORT));
134     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_US_A, "us", MCC_LONG));
135     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_US_B, "us", MCC_LONG));
136     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_US_C, "us", MCC_LONG));
137     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_US_D, "us", MCC_LONG));
138     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_US_E, "us", MCC_LONG));
139     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_US_F, "us", MCC_LONG));
140     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_US_G, "us", MCC_LONG));
141     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_PR, "pr", MCC_SHORT));
142     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_VI, "vi", MCC_SHORT));
143     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_MX, "mx", MCC_SHORT));
144     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_JM, "jm", MCC_LONG));
145     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_GP, "gp", MCC_SHORT));
146     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_BB, "bb", MCC_LONG));
147     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_AG, "ag", MCC_LONG));
148     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_KY, "ky", MCC_LONG));
149     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_VG, "vg", MCC_LONG));
150     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_BM, "bm", MCC_SHORT));
151     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_GD, "gd", MCC_SHORT));
152     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_MS, "ms", MCC_SHORT));
153     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_KN, "kn", MCC_SHORT));
154     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_LC, "lc", MCC_SHORT));
155     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_VC, "vc", MCC_SHORT));
156     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_AI_A, "ai", MCC_SHORT));
157     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_AW, "aw", MCC_SHORT));
158     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_BS, "bs", MCC_SHORT));
159     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_AI_B, "ai", MCC_LONG));
160     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_DM, "dm", MCC_SHORT));
161 }
162 
AddMccForAfrica()163 void MccPool::AddMccForAfrica()
164 {
165     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_CU, "cu", MCC_SHORT));
166     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_DO, "do", MCC_SHORT));
167     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_HT, "ht", MCC_SHORT));
168     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_TT, "tt", MCC_SHORT));
169     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_TC, "tc", MCC_SHORT));
170     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_AZ, "az", MCC_SHORT));
171     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_KZ, "kz", MCC_SHORT));
172     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_BT, "bt", MCC_SHORT));
173     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_IN_A, "in", MCC_SHORT));
174     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_IN_B, "in", MCC_SHORT));
175     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_IN_C, "in", MCC_SHORT));
176     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_PK, "pk", MCC_SHORT));
177     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_AF, "af", MCC_SHORT));
178     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_LK, "lk", MCC_SHORT));
179     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_MM, "mm", MCC_SHORT));
180     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_LB, "lb", MCC_SHORT));
181     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_JO, "jo", MCC_SHORT));
182     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_SY, "sy", MCC_SHORT));
183     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_IQ, "iq", MCC_SHORT));
184     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_KW, "kw", MCC_SHORT));
185     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_SA, "sa", MCC_SHORT));
186     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_YE, "ye", MCC_SHORT));
187     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_OM, "om", MCC_SHORT));
188     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_PS, "ps", MCC_SHORT));
189     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_AE_A, "ae", MCC_SHORT));
190     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_IL, "il", MCC_SHORT));
191     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_BH, "bh", MCC_SHORT));
192     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_QA, "qa", MCC_SHORT));
193     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_MN, "mn", MCC_SHORT));
194     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_NP, "np", MCC_SHORT));
195     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_AE_B, "ae", MCC_SHORT));
196     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_AE_C, "ae", MCC_SHORT));
197     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_IR, "ir", MCC_SHORT));
198     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_UZ, "uz", MCC_SHORT));
199     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_TJ, "tj", MCC_SHORT));
200     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_KG, "kg", MCC_SHORT));
201     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_TM, "tm", MCC_SHORT));
202     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_JP_A, "jp", MCC_SHORT));
203     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_JP_B, "jp", MCC_SHORT));
204     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_KR, "kr", MCC_SHORT));
205     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_VN, "vn", MCC_SHORT));
206 }
207 
AddMccForNorthAmerica()208 void MccPool::AddMccForNorthAmerica()
209 {
210     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_HK, "hk", MCC_SHORT));
211     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_MO, "mo", MCC_SHORT));
212     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_KH, "kh", MCC_SHORT));
213     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_LA, "la", MCC_SHORT));
214     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_CN_A, "cn", MCC_SHORT));
215     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_CN_B, "cn", MCC_SHORT));
216     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_TW, "tw", MCC_SHORT));
217     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_KP, "kp", MCC_SHORT));
218     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_BD, "bd", MCC_SHORT));
219     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_MV, "mv", MCC_SHORT));
220     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_MY, "my", MCC_SHORT));
221     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_AU, "au", MCC_SHORT));
222     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_ID, "id", MCC_SHORT));
223     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_TL, "tl", MCC_SHORT));
224     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_PH, "ph", MCC_SHORT));
225     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_TH, "th", MCC_SHORT));
226     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_SG, "sg", MCC_SHORT));
227     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_BN, "bn", MCC_SHORT));
228     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_NZ, "nz", MCC_SHORT));
229     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_MP, "mp", MCC_SHORT));
230     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_GU, "gu", MCC_SHORT));
231     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_NR, "nr", MCC_SHORT));
232     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_PG, "pg", MCC_SHORT));
233     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_TO, "to", MCC_SHORT));
234     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_SB, "sb", MCC_SHORT));
235     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_VU, "vu", MCC_SHORT));
236     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_FJ, "fj", MCC_SHORT));
237     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_WF, "wf", MCC_SHORT));
238     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_AS, "as", MCC_SHORT));
239     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_KI, "ki", MCC_SHORT));
240     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_NC, "nc", MCC_SHORT));
241     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_PF, "pf", MCC_SHORT));
242     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_CK, "ck", MCC_SHORT));
243     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_WS, "ws", MCC_SHORT));
244     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_FM, "fm", MCC_SHORT));
245     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_MH, "mh", MCC_SHORT));
246     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_PW, "pw", MCC_SHORT));
247     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_TV, "tv", MCC_SHORT));
248     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_NU, "nu", MCC_SHORT));
249     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_EG, "eg", MCC_SHORT));
250     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_DZ, "dz", MCC_SHORT));
251 }
252 
AddMccForSouthAmerica()253 void MccPool::AddMccForSouthAmerica()
254 {
255     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_MA, "ma", MCC_SHORT));
256     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_TN, "tn", MCC_SHORT));
257     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_LY, "ly", MCC_SHORT));
258     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_GM, "gm", MCC_SHORT));
259     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_SN, "sn", MCC_SHORT));
260     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_MR, "mr", MCC_SHORT));
261     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_ML, "ml", MCC_SHORT));
262     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_GN, "gn", MCC_SHORT));
263     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_CI, "ci", MCC_SHORT));
264     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_BF, "bf", MCC_SHORT));
265     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_NE, "ne", MCC_SHORT));
266     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_TG, "tg", MCC_SHORT));
267     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_BJ, "bj", MCC_SHORT));
268     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_MU, "mu", MCC_SHORT));
269     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_LR, "lr", MCC_SHORT));
270     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_SL, "sl", MCC_SHORT));
271     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_GH, "gh", MCC_SHORT));
272     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_NG, "ng", MCC_SHORT));
273     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_TD, "td", MCC_SHORT));
274     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_CF, "cf", MCC_SHORT));
275     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_CM, "cm", MCC_SHORT));
276     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_CV, "cv", MCC_SHORT));
277     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_ST, "st", MCC_SHORT));
278     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_GQ, "gq", MCC_SHORT));
279     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_GA, "ga", MCC_SHORT));
280     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_CG, "cg", MCC_SHORT));
281     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_CD, "cd", MCC_SHORT));
282     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_AO, "ao", MCC_SHORT));
283     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_GW, "gw", MCC_SHORT));
284     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_SC, "sc", MCC_SHORT));
285     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_SD, "sd", MCC_SHORT));
286     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_RW, "rw", MCC_SHORT));
287     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_ET, "et", MCC_SHORT));
288     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_SO, "so", MCC_SHORT));
289     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_DJ, "dj", MCC_SHORT));
290     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_KE, "ke", MCC_SHORT));
291     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_TZ, "tz", MCC_SHORT));
292     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_UG, "ug", MCC_SHORT));
293     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_BI, "bi", MCC_SHORT));
294     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_MZ, "mz", MCC_SHORT));
295 }
296 
AddMccForAustralia()297 void MccPool::AddMccForAustralia()
298 {
299     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_ZM, "zm", MCC_SHORT));
300     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_MG, "mg", MCC_SHORT));
301     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_RE, "re", MCC_SHORT));
302     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_ZW, "zw", MCC_SHORT));
303     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_NA, "na", MCC_SHORT));
304     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_MW, "mw", MCC_SHORT));
305     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_LS, "ls", MCC_SHORT));
306     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_BW, "bw", MCC_SHORT));
307     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_SZ, "sz", MCC_SHORT));
308     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_KM, "km", MCC_SHORT));
309     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_ZA, "za", MCC_SHORT));
310     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_ER, "er", MCC_SHORT));
311     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_SH, "sh", MCC_SHORT));
312     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_SS, "ss", MCC_SHORT));
313     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_BZ, "bz", MCC_SHORT));
314     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_GT, "gt", MCC_SHORT));
315     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_SV, "sv", MCC_SHORT));
316     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_HN, "hn", MCC_LONG));
317     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_NI, "ni", MCC_SHORT));
318     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_CR, "cr", MCC_SHORT));
319     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_PA, "pa", MCC_SHORT));
320     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_PE, "pe", MCC_SHORT));
321     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_AR, "ar", MCC_SHORT));
322     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_BR, "br", MCC_SHORT));
323     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_CL, "cl", MCC_SHORT));
324     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_CO, "co", MCC_LONG));
325     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_VE, "ve", MCC_SHORT));
326     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_BO, "bo", MCC_SHORT));
327     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_GY, "gy", MCC_SHORT));
328     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_EC, "ec", MCC_SHORT));
329     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_GF, "gf", MCC_SHORT));
330     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_PY, "py", MCC_SHORT));
331     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_SR, "sr", MCC_SHORT));
332     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_UY, "uy", MCC_SHORT));
333     mccAccessTable_.push_back(std::make_shared<MccAccess>(MCC_FK, "fk", MCC_SHORT));
334 }
335 
MccCompare(const std::shared_ptr<MccAccess> & mccAccessA,const std::shared_ptr<MccAccess> & mccAccessB)336 bool MccPool::MccCompare(const std::shared_ptr<MccAccess> &mccAccessA, const std::shared_ptr<MccAccess> &mccAccessB)
337 {
338     if (mccAccessA == nullptr || mccAccessB == nullptr) {
339         return false;
340     }
341     return (mccAccessA->mcc_ < mccAccessB->mcc_);
342 }
343 
LengthIsTwoMnc(const std::string & mccMncCode)344 bool MccPool::LengthIsTwoMnc(const std::string &mccMncCode)
345 {
346     InitIndiaTables();
347     std::vector<std::string>::iterator obj = std::find(indiaMccMnc_.begin(), indiaMccMnc_.end(), mccMncCode);
348     return (obj == indiaMccMnc_.end()) ? false : true;
349 }
350 
InitIndiaTables()351 void MccPool::InitIndiaTables()
352 {
353     if (indiaMccMnc_.size() == 0) {
354         indiaMccMnc_ = {"40400", "40401", "40402", "40403", "40404", "40405", "40407", "40409",
355             "40410", "40411", "40412", "40413", "40414", "40415", "40416", "40417",
356             "40418", "40419", "40420", "40421", "40422", "40424", "40425", "40427",
357             "40428", "40429", "40430", "40431", "40433", "40434", "40435", "40436",
358             "40437", "40438", "40440", "40441", "40442", "40443", "40444", "40445",
359             "40446", "40449", "40450", "40451", "40452", "40453", "40454", "40455",
360             "40456", "40457", "40458", "40459", "40460", "40462", "40464", "40466",
361             "40467", "40468", "40469", "40470", "40471", "40472", "40473", "40474",
362             "40475", "40476", "40477", "40478", "40479", "40480", "40481", "40482",
363             "40483", "40484", "40485", "40486", "40487", "40488", "40489", "40490",
364             "40491", "40492", "40493", "40494", "40495", "40496", "40497", "40498",
365             "40501", "40505", "40506", "40507", "40508", "40509", "40510", "40511",
366             "40512", "40513", "40514", "40515", "40517", "40518", "40519", "40520",
367             "40521", "40522", "40523", "40524", "40548", "40551", "40552", "40553",
368             "40554", "40555", "40556", "40566", "40567", "40570"};
369     }
370 }
371 
LengthIsThreeMnc(const std::string & mccMncCode)372 bool MccPool::LengthIsThreeMnc(const std::string &mccMncCode)
373 {
374     InitSpecialMccMncTables();
375     std::vector<std::string>::iterator obj = std::find(specialMccMnc_.begin(), specialMccMnc_.end(), mccMncCode);
376     return (obj == specialMccMnc_.end()) ? false : true;
377 }
378 
InitSpecialMccMncTables()379 void MccPool::InitSpecialMccMncTables()
380 {
381     if (specialMccMnc_.size() == 0) {
382         AddMccMncForCa();
383         AddMccMncForInAirtel();
384         AddMccMncForInHutch();
385         AddMccMncForMy();
386     }
387 }
388 
AddMccMncForCa()389 void MccPool::AddMccMncForCa()
390 {
391     specialMccMnc_.push_back("302370");
392     specialMccMnc_.push_back("302720");
393     specialMccMnc_.push_back("310260");
394     specialMccMnc_.push_back("405025");
395     specialMccMnc_.push_back("405026");
396     specialMccMnc_.push_back("405027");
397     specialMccMnc_.push_back("405028");
398     specialMccMnc_.push_back("405029");
399     specialMccMnc_.push_back("405030");
400     specialMccMnc_.push_back("405031");
401     specialMccMnc_.push_back("405032");
402     specialMccMnc_.push_back("405033");
403     specialMccMnc_.push_back("405034");
404     specialMccMnc_.push_back("405035");
405     specialMccMnc_.push_back("405036");
406     specialMccMnc_.push_back("405037");
407     specialMccMnc_.push_back("405038");
408     specialMccMnc_.push_back("405039");
409     specialMccMnc_.push_back("405040");
410     specialMccMnc_.push_back("405041");
411     specialMccMnc_.push_back("405042");
412     specialMccMnc_.push_back("405043");
413     specialMccMnc_.push_back("405044");
414     specialMccMnc_.push_back("405045");
415     specialMccMnc_.push_back("405046");
416     specialMccMnc_.push_back("405047");
417     specialMccMnc_.push_back("405750");
418     specialMccMnc_.push_back("405751");
419     specialMccMnc_.push_back("405752");
420     specialMccMnc_.push_back("405753");
421     specialMccMnc_.push_back("405754");
422     specialMccMnc_.push_back("405755");
423     specialMccMnc_.push_back("405756");
424     specialMccMnc_.push_back("405799");
425     specialMccMnc_.push_back("405800");
426     specialMccMnc_.push_back("405801");
427 }
428 
AddMccMncForInAirtel()429 void MccPool::AddMccMncForInAirtel()
430 {
431     specialMccMnc_.push_back("405802");
432     specialMccMnc_.push_back("405803");
433     specialMccMnc_.push_back("405804");
434     specialMccMnc_.push_back("405805");
435     specialMccMnc_.push_back("405806");
436     specialMccMnc_.push_back("405807");
437     specialMccMnc_.push_back("405808");
438     specialMccMnc_.push_back("405809");
439     specialMccMnc_.push_back("405810");
440     specialMccMnc_.push_back("405811");
441     specialMccMnc_.push_back("405812");
442     specialMccMnc_.push_back("405813");
443     specialMccMnc_.push_back("405814");
444     specialMccMnc_.push_back("405815");
445     specialMccMnc_.push_back("405816");
446     specialMccMnc_.push_back("405817");
447     specialMccMnc_.push_back("405818");
448     specialMccMnc_.push_back("405819");
449     specialMccMnc_.push_back("405820");
450     specialMccMnc_.push_back("405821");
451     specialMccMnc_.push_back("405822");
452     specialMccMnc_.push_back("405823");
453     specialMccMnc_.push_back("405824");
454     specialMccMnc_.push_back("405825");
455     specialMccMnc_.push_back("405826");
456     specialMccMnc_.push_back("405827");
457     specialMccMnc_.push_back("405828");
458     specialMccMnc_.push_back("405829");
459     specialMccMnc_.push_back("405830");
460     specialMccMnc_.push_back("405831");
461     specialMccMnc_.push_back("405832");
462     specialMccMnc_.push_back("405833");
463     specialMccMnc_.push_back("405834");
464     specialMccMnc_.push_back("405835");
465     specialMccMnc_.push_back("405836");
466 }
467 
AddMccMncForInHutch()468 void MccPool::AddMccMncForInHutch()
469 {
470     specialMccMnc_.push_back("405837");
471     specialMccMnc_.push_back("405838");
472     specialMccMnc_.push_back("405839");
473     specialMccMnc_.push_back("405840");
474     specialMccMnc_.push_back("405841");
475     specialMccMnc_.push_back("405842");
476     specialMccMnc_.push_back("405843");
477     specialMccMnc_.push_back("405844");
478     specialMccMnc_.push_back("405845");
479     specialMccMnc_.push_back("405846");
480     specialMccMnc_.push_back("405847");
481     specialMccMnc_.push_back("405848");
482     specialMccMnc_.push_back("405849");
483     specialMccMnc_.push_back("405850");
484     specialMccMnc_.push_back("405851");
485     specialMccMnc_.push_back("405852");
486     specialMccMnc_.push_back("405853");
487     specialMccMnc_.push_back("405854");
488     specialMccMnc_.push_back("405855");
489     specialMccMnc_.push_back("405856");
490     specialMccMnc_.push_back("405857");
491     specialMccMnc_.push_back("405858");
492     specialMccMnc_.push_back("405859");
493     specialMccMnc_.push_back("405860");
494     specialMccMnc_.push_back("405861");
495     specialMccMnc_.push_back("405862");
496     specialMccMnc_.push_back("405863");
497     specialMccMnc_.push_back("405864");
498     specialMccMnc_.push_back("405865");
499     specialMccMnc_.push_back("405866");
500     specialMccMnc_.push_back("405867");
501     specialMccMnc_.push_back("405868");
502     specialMccMnc_.push_back("405869");
503     specialMccMnc_.push_back("405870");
504     specialMccMnc_.push_back("405871");
505     specialMccMnc_.push_back("405872");
506     specialMccMnc_.push_back("405873");
507     specialMccMnc_.push_back("405874");
508     specialMccMnc_.push_back("405875");
509 }
510 
AddMccMncForMy()511 void MccPool::AddMccMncForMy()
512 {
513     specialMccMnc_.push_back("405876");
514     specialMccMnc_.push_back("405877");
515     specialMccMnc_.push_back("405878");
516     specialMccMnc_.push_back("405879");
517     specialMccMnc_.push_back("405880");
518     specialMccMnc_.push_back("405881");
519     specialMccMnc_.push_back("405882");
520     specialMccMnc_.push_back("405883");
521     specialMccMnc_.push_back("405884");
522     specialMccMnc_.push_back("405885");
523     specialMccMnc_.push_back("405886");
524     specialMccMnc_.push_back("405908");
525     specialMccMnc_.push_back("405909");
526     specialMccMnc_.push_back("405910");
527     specialMccMnc_.push_back("405911");
528     specialMccMnc_.push_back("405912");
529     specialMccMnc_.push_back("405913");
530     specialMccMnc_.push_back("405914");
531     specialMccMnc_.push_back("405915");
532     specialMccMnc_.push_back("405916");
533     specialMccMnc_.push_back("405917");
534     specialMccMnc_.push_back("405918");
535     specialMccMnc_.push_back("405919");
536     specialMccMnc_.push_back("405920");
537     specialMccMnc_.push_back("405921");
538     specialMccMnc_.push_back("405922");
539     specialMccMnc_.push_back("405923");
540     specialMccMnc_.push_back("405924");
541     specialMccMnc_.push_back("405925");
542     specialMccMnc_.push_back("405926");
543     specialMccMnc_.push_back("405927");
544     specialMccMnc_.push_back("405928");
545     specialMccMnc_.push_back("405929");
546     specialMccMnc_.push_back("405930");
547     specialMccMnc_.push_back("405931");
548     specialMccMnc_.push_back("405932");
549     specialMccMnc_.push_back("502142");
550     specialMccMnc_.push_back("502143");
551     specialMccMnc_.push_back("502145");
552     specialMccMnc_.push_back("502146");
553     specialMccMnc_.push_back("502147");
554     specialMccMnc_.push_back("502148");
555 }
556 
MccPool()557 MccPool::MccPool() {}
558 
~MccPool()559 MccPool::~MccPool() {}
560 } // namespace Telephony
561 } // namespace OHOS
562