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 "sim_file_manager.h"
17
18 #include <openssl/sha.h>
19 #include "core_manager_inner.h"
20 #include "network_state.h"
21 #include "parameters.h"
22 #include "radio_event.h"
23 #include "system_ability_definition.h"
24 #include "telephony_ext_wrapper.h"
25
26 namespace OHOS {
27 namespace Telephony {
28 static constexpr int32_t VM_NUMBER_LEN = 256;
29 constexpr const char *VM_NUMBER_SIM_IMSI_KEY = "persist.telephony.voicemail.simimsi";
30 const std::vector<std::string> CT_CPLMNS = { "46003", "46005", "46011", "46012", "47008", "45502", "45507", "46050",
31 "46051", "46059" };
32 const std::vector<std::string> CT_ICCID_ARRAY = { "898603", "898606", "898611", "8985302", "8985307" };
33 constexpr int32_t ICCID_LEN_MINIMUM = 7;
34 constexpr int32_t ICCID_LEN_SIX = 6;
35 constexpr int32_t PREFIX_LOCAL_ICCID_LEN = 4;
36 constexpr const char *GC_ICCID = "8985231";
37 constexpr const char *PREFIX_LOCAL_ICCID = "8986";
38 constexpr const char *ROAMING_CPLMN = "20404";
39
SimFileManager(const EventFwk::CommonEventSubscribeInfo & sp,std::weak_ptr<ITelRilManager> telRilManager,std::weak_ptr<Telephony::SimStateManager> state)40 SimFileManager::SimFileManager(
41 const EventFwk::CommonEventSubscribeInfo &sp, std::weak_ptr<ITelRilManager> telRilManager,
42 std::weak_ptr<Telephony::SimStateManager> state)
43 : TelEventHandler("SimFileManager"), CommonEventSubscriber(sp), telRilManager_(telRilManager),
44 simStateManager_(state)
45 {
46 if (simStateManager_.lock() == nullptr) {
47 TELEPHONY_LOGE("SimFileManager set NULL simStateManager.");
48 return;
49 }
50 TELEPHONY_LOGI("SIM manager SimFileManager::SimFileManager started ");
51 }
52
~SimFileManager()53 SimFileManager::~SimFileManager()
54 {
55 if (simFile_ != nullptr) {
56 simFile_->UnInit();
57 }
58 }
59
OnReceiveEvent(const EventFwk::CommonEventData & data)60 void SimFileManager::OnReceiveEvent(const EventFwk::CommonEventData &data)
61 {
62 const AAFwk::Want &want = data.GetWant();
63 std::string action = want.GetAction();
64 int32_t slotId = want.GetIntParam("slotId", 0);
65 TELEPHONY_LOGI("[slot%{public}d] action=%{public}s code=%{public}d", slotId, action.c_str(), data.GetCode());
66 if (EventFwk::CommonEventSupport::COMMON_EVENT_OPERATOR_CONFIG_CHANGED == action) {
67 if (slotId_ != slotId || simFile_ == nullptr) {
68 return;
69 }
70 TELEPHONY_LOGI("SimFileManager::OnReceiveEvent");
71 simFile_->LoadVoiceMail();
72 }
73 }
74
Init(int slotId)75 void SimFileManager::Init(int slotId)
76 {
77 TELEPHONY_LOGI("SimFileManager::Init() started slot %{public}d", slotId);
78 slotId_ = slotId;
79 if (stateRecord_ == HandleRunningState::STATE_RUNNING) {
80 TELEPHONY_LOGI("SimFileManager::Init stateRecord_ started.");
81 return;
82 }
83 if (stateHandler_ == HandleRunningState::STATE_RUNNING) {
84 TELEPHONY_LOGI("SimFileManager::Init stateHandler_ started.");
85 return;
86 }
87 auto telRilManager = telRilManager_.lock();
88 if (telRilManager == nullptr) {
89 TELEPHONY_LOGE("SimFileManager get NULL ITelRilManager.");
90 return;
91 }
92 auto simStateManager = simStateManager_.lock();
93 if (simStateManager == nullptr) {
94 TELEPHONY_LOGE("SimFileManager get NULL simStateManager.");
95 return;
96 }
97 CardType cardType = simStateManager->GetCardType();
98 TELEPHONY_LOGI("SimFileManager current card type is %{public}d", cardType);
99 if ((cardType == static_cast<CardType>(0)) || (cardType == CardType::UNKNOWN_CARD)) {
100 cardType = CardType::SINGLE_MODE_USIM_CARD; // default card
101 }
102 iccType_ = GetIccTypeByCardType(cardType);
103 TELEPHONY_LOGI("SimFileManager current icc type is %{public}d", iccType_);
104 if (!InitIccFileController(iccType_)) {
105 TELEPHONY_LOGE("SimFileManager::InitIccFileController fail");
106 return;
107 }
108 if (!InitDiallingNumberHandler()) {
109 TELEPHONY_LOGE("SimFileManager::InitDiallingNumberHandler fail");
110 return;
111 }
112 if (!InitSimFile(iccType_)) {
113 TELEPHONY_LOGE("SimFileManager::InitSimFile fail");
114 return;
115 }
116 stateRecord_ = HandleRunningState::STATE_RUNNING;
117 stateHandler_ = HandleRunningState::STATE_RUNNING;
118
119 simStateManager->RegisterCoreNotify(shared_from_this(), RadioEvent::RADIO_CARD_TYPE_CHANGE);
120 simStateManager->RegisterCoreNotify(shared_from_this(), RadioEvent::RADIO_SIM_ICCID_LOADED);
121 telRilManager->RegisterCoreNotify(slotId, shared_from_this(), RadioEvent::RADIO_VOICE_TECH_CHANGED, nullptr);
122 telRilManager->RegisterCoreNotify(slotId, shared_from_this(), RadioEvent::RADIO_ICC_REFRESH, nullptr);
123 TELEPHONY_LOGI("SimFileManager::Init() end");
124 }
125
InitSimFile(SimFileManager::IccType type)126 bool SimFileManager::InitSimFile(SimFileManager::IccType type)
127 {
128 if (fileController_ == nullptr || diallingNumberHandler_ == nullptr) {
129 TELEPHONY_LOGE("InitSimFile need more helper");
130 return false;
131 }
132 auto iccFileIt = iccFileCache_.find(type);
133 if (iccFileIt == iccFileCache_.end()) {
134 if (type == SimFileManager::IccType::ICC_TYPE_CDMA) {
135 simFile_ = std::make_shared<RuimFile>(simStateManager_.lock());
136 iccFileCache_.insert(std::make_pair(SimFileManager::IccType::ICC_TYPE_CDMA, simFile_));
137 } else if (type == SimFileManager::IccType::ICC_TYPE_IMS) {
138 simFile_ = std::make_shared<IsimFile>(simStateManager_.lock());
139 iccFileCache_.insert(std::make_pair(SimFileManager::IccType::ICC_TYPE_IMS, simFile_));
140 } else {
141 simFile_ = std::make_shared<SimFile>(simStateManager_.lock());
142 iccFileCache_.insert(std::make_pair(SimFileManager::IccType::ICC_TYPE_USIM, simFile_));
143 iccFileCache_.insert(std::make_pair(SimFileManager::IccType::ICC_TYPE_GSM, simFile_));
144 }
145 if (simFile_ != nullptr) {
146 simFile_->RegisterCoreNotify(shared_from_this(), RadioEvent::RADIO_SIM_RECORDS_LOADED);
147 }
148 } else {
149 simFile_ = iccFileIt->second;
150 }
151
152 if (simFile_ == nullptr) {
153 TELEPHONY_LOGE("SimFileManager::Init simFile create nullptr.");
154 return false;
155 }
156
157 simFile_->SetRilAndFileController(telRilManager_.lock(), fileController_, diallingNumberHandler_);
158 simFile_->SetId(slotId_);
159 simFile_->Init();
160 if (TELEPHONY_EXT_WRAPPER.createIccFileExt_ != nullptr) {
161 TELEPHONY_EXT_WRAPPER.createIccFileExt_(slotId_, simFile_);
162 }
163 return true;
164 }
165
InitIccFileController(SimFileManager::IccType type)166 bool SimFileManager::InitIccFileController(SimFileManager::IccType type)
167 {
168 auto iccFileConIt = iccFileControllerCache_.find(type);
169 if (iccFileConIt == iccFileControllerCache_.end()) {
170 if (type == SimFileManager::IccType::ICC_TYPE_CDMA) { // ruim 30 usim 20 isim 60
171 fileController_ = std::make_shared<RuimFileController>(slotId_);
172 } else if (type == SimFileManager::IccType::ICC_TYPE_IMS) {
173 fileController_ = std::make_shared<IsimFileController>(slotId_);
174 } else if (type == SimFileManager::IccType::ICC_TYPE_GSM) {
175 fileController_ = std::make_shared<SimFileController>(slotId_);
176 } else {
177 fileController_ = std::make_shared<UsimFileController>(slotId_);
178 }
179 iccFileControllerCache_.insert(std::make_pair(type, fileController_));
180 } else {
181 fileController_ = iccFileConIt->second;
182 }
183 if (fileController_ == nullptr) {
184 TELEPHONY_LOGE("SimFileManager::Init fileController create nullptr.");
185 return false;
186 }
187 fileController_->SetRilManager(telRilManager_.lock());
188 return true;
189 }
190
GetSimOperatorNumeric()191 std::u16string SimFileManager::GetSimOperatorNumeric()
192 {
193 if (simFile_ == nullptr) {
194 TELEPHONY_LOGE("SimFileManager::GetSimOperatorNumeric simFile nullptr");
195 return Str8ToStr16("");
196 }
197
198 std::string result = simFile_->ObtainSimOperator();
199 TELEPHONY_LOGD("SimFileManager::GetOperator result:%{public}s ", (result.empty() ? "false" : "true"));
200 return Str8ToStr16(result);
201 }
202
GetMCC()203 std::u16string SimFileManager::GetMCC()
204 {
205 if (simFile_ == nullptr) {
206 TELEPHONY_LOGE("SimFileManager::GetMCC simFile nullptr");
207 return Str8ToStr16("");
208 }
209
210 std::string result = simFile_->ObtainMCC();
211 TELEPHONY_LOGD("SimFileManager::GetMCC result:%{public}s ", (result.empty() ? "false" : "true"));
212 return Str8ToStr16(result);
213 }
214
GetMNC()215 std::u16string SimFileManager::GetMNC()
216 {
217 if (simFile_ == nullptr) {
218 TELEPHONY_LOGE("SimFileManager::GetMNC simFile nullptr");
219 return Str8ToStr16("");
220 }
221
222 std::string result = simFile_->ObtainMNC();
223 TELEPHONY_LOGD("SimFileManager::GetMNC result:%{public}s ", (result.empty() ? "false" : "true"));
224 return Str8ToStr16(result);
225 }
226
GetISOCountryCodeForSim()227 std::u16string SimFileManager::GetISOCountryCodeForSim()
228 {
229 if (simFile_ == nullptr) {
230 TELEPHONY_LOGE("SimFileManager::GetISOCountryCodeForSim simFile nullptr");
231 return Str8ToStr16("");
232 }
233
234 std::string result = simFile_->ObtainIsoCountryCode();
235 TELEPHONY_LOGD("SimFileManager::ObtainIsoCountryCode result:%{public}s ", (result.empty() ? "false" : "true"));
236 return Str8ToStr16(result);
237 }
238
GetSimSpn()239 std::u16string SimFileManager::GetSimSpn()
240 {
241 if (simFile_ == nullptr) {
242 TELEPHONY_LOGE("SimFileManager::GetSimSpn simFile nullptr");
243 return Str8ToStr16("");
244 }
245
246 std::string result = simFile_->ObtainSPN();
247 TELEPHONY_LOGD("SimFileManager::GetSimSpn result:%{public}s ", (result.empty() ? "false" : "true"));
248 return Str8ToStr16(result);
249 }
250
GetSimEons(const std::string & plmn,int32_t lac,bool longNameRequired)251 std::u16string SimFileManager::GetSimEons(const std::string &plmn, int32_t lac, bool longNameRequired)
252 {
253 if (simFile_ == nullptr) {
254 TELEPHONY_LOGE("SimFileManager::GetEons simFile nullptr");
255 return Str8ToStr16("");
256 }
257
258 std::string result = simFile_->ObtainEons(plmn, lac, longNameRequired);
259 TELEPHONY_LOGD("SimFileManager::GetEons result:%{public}s ", (result.empty() ? "false" : "true"));
260 return Str8ToStr16(result);
261 }
262
GetSimIccId()263 std::u16string SimFileManager::GetSimIccId()
264 {
265 auto simStateManager = simStateManager_.lock();
266 if (simStateManager == nullptr) {
267 TELEPHONY_LOGE("simStateManager nullptr");
268 return Str8ToStr16("");
269 }
270 std::string result = simStateManager->GetIccid();
271 if (!result.empty()) {
272 return Str8ToStr16(result);
273 }
274 if (simFile_ == nullptr) {
275 TELEPHONY_LOGE("SimFileManager::GetSimIccId simFile nullptr");
276 return Str8ToStr16("");
277 }
278 result = simFile_->ObtainIccId();
279 TELEPHONY_LOGD("SimFileManager::GetSimIccId result:%{public}s ", (result.empty() ? "false" : "true"));
280 return Str8ToStr16(result);
281 }
282
GetSimDecIccId()283 std::u16string SimFileManager::GetSimDecIccId()
284 {
285 if (simFile_ == nullptr) {
286 TELEPHONY_LOGE("simFile is nullptr!");
287 return Str8ToStr16("");
288 }
289
290 std::string result = simFile_->ObtainDecIccId();
291 TELEPHONY_LOGD("obtain dec iccId result:%{public}s ", (result.empty() ? "false" : "true"));
292 return Str8ToStr16(result);
293 }
294
GetIMSI()295 std::u16string SimFileManager::GetIMSI()
296 {
297 if (simFile_ == nullptr) {
298 TELEPHONY_LOGE("SimFileManager::GetIMSI simFile nullptr");
299 return Str8ToStr16("");
300 }
301
302 std::string result = simFile_->ObtainIMSI();
303 TELEPHONY_LOGD("SimFileManager::ObtainIMSI result:%{public}s ", (result.empty() ? "false" : "true"));
304 return Str8ToStr16(result);
305 }
306
GetEhPlmns()307 std::set<std::string> SimFileManager::GetEhPlmns()
308 {
309 std::set<std::string> result;
310 if (simFile_ == nullptr) {
311 TELEPHONY_LOGE("SimFileManager::GetEhPlmns simFile nullptr");
312 return result;
313 }
314
315 result = simFile_->ObtainEhPlmns();
316 TELEPHONY_LOGD("SimFileManager::ObtainEhPlmns result:%{public}d ", (result.empty() ? 0 : 1));
317 return result;
318 }
319
GetSpdiPlmns()320 std::set<std::string> SimFileManager::GetSpdiPlmns()
321 {
322 std::set<std::string> result;
323 if (simFile_ == nullptr) {
324 TELEPHONY_LOGE("SimFileManager::GetSpdiPlmns simFile nullptr");
325 return result;
326 }
327
328 result = simFile_->ObtainSpdiPlmns();
329 TELEPHONY_LOGD("SimFileManager::ObtainSpdiPlmns result:%{public}d ", (result.empty() ? 0 : 1));
330 return result;
331 }
332
GetLocaleFromDefaultSim()333 std::u16string SimFileManager::GetLocaleFromDefaultSim()
334 {
335 if (simFile_ == nullptr) {
336 TELEPHONY_LOGE("SimFileManager::GetLocaleFromDefaultSim simFile nullptr");
337 return Str8ToStr16("");
338 }
339
340 std::string result = simFile_->ObtainIccLanguage();
341 TELEPHONY_LOGD("SimFileManager::GetLocaleFromDefaultSim result:%{public}s ", (result.empty() ? "false" : "true"));
342 return Str8ToStr16(result);
343 }
344
GetSimGid1()345 std::u16string SimFileManager::GetSimGid1()
346 {
347 if (simFile_ == nullptr) {
348 TELEPHONY_LOGE("SimFileManager::GetSimGid1 simFile nullptr");
349 return Str8ToStr16("");
350 }
351
352 std::string result = simFile_->ObtainGid1();
353 TELEPHONY_LOGI("SimFileManager::GetSimGid1 result:%{public}s ", (result.empty() ? "false" : "true"));
354 return Str8ToStr16(result);
355 }
356
GetSimGid2()357 std::u16string SimFileManager::GetSimGid2()
358 {
359 if (simFile_ == nullptr) {
360 TELEPHONY_LOGE("SimFileManager::GetSimGid2 simFile nullptr");
361 return Str8ToStr16("");
362 }
363
364 std::string result = simFile_->ObtainGid2();
365 TELEPHONY_LOGI("SimFileManager::GetSimGid2 result:%{public}s ", (result.empty() ? "false" : "true"));
366 return Str8ToStr16(result);
367 }
368
GetSimTelephoneNumber()369 std::u16string SimFileManager::GetSimTelephoneNumber()
370 {
371 std::string result = "";
372 if (simFile_ != nullptr) {
373 result = simFile_->ObtainMsisdnNumber();
374 }
375 TELEPHONY_LOGD("result is empty:%{public}s", (result.empty() ? "true" : "false"));
376 return Str8ToStr16(result);
377 }
378
SetSimTelephoneNumber(const std::u16string & alphaTag,const std::u16string & phoneNumber)379 bool SimFileManager::SetSimTelephoneNumber(const std::u16string &alphaTag, const std::u16string &phoneNumber)
380 {
381 if (simFile_ == nullptr) {
382 TELEPHONY_LOGE("SimFileManager::SetSimTelephoneNumber simFile nullptr");
383 return false;
384 }
385 std::string tag = Str16ToStr8(alphaTag);
386 std::string number = Str16ToStr8(phoneNumber);
387 return simFile_->UpdateMsisdnNumber(tag, number);
388 }
389
GetSimTeleNumberIdentifier()390 std::u16string SimFileManager::GetSimTeleNumberIdentifier()
391 {
392 if (simFile_ == nullptr) {
393 TELEPHONY_LOGE("SimFileManager::GetSimTeleNumberIdentifier simFile nullptr");
394 return Str8ToStr16("");
395 }
396
397 std::string result = simFile_->ObtainMsisdnAlphaStatus();
398 TELEPHONY_LOGI(
399 "SimFileManager::GetSimTeleNumberIdentifier result:%{public}s ", (result.empty() ? "false" : "true"));
400 return Str8ToStr16(result);
401 }
402
GetVoiceMailIdentifier()403 std::u16string SimFileManager::GetVoiceMailIdentifier()
404 {
405 if (simFile_ == nullptr) {
406 TELEPHONY_LOGE("SimFileManager::GetVoiceMailIdentifier simFile nullptr");
407 return Str8ToStr16("");
408 }
409
410 std::string result = simFile_->ObtainVoiceMailInfo();
411 TELEPHONY_LOGI(
412 "SimFileManager::GetVoiceMailIdentifier result:%{public}s ", (result.empty() ? "false" : "true"));
413 return Str8ToStr16(result);
414 }
415
IsPhoneTypeGsm(int32_t slotId)416 bool SimFileManager::IsPhoneTypeGsm(int32_t slotId)
417 {
418 PhoneType phoneType = CoreManagerInner::GetInstance().GetPhoneType(slotId);
419 return phoneType == PhoneType::PHONE_TYPE_IS_GSM;
420 }
421
GetVoiceMailNumberCdmaKey()422 std::string SimFileManager::GetVoiceMailNumberCdmaKey()
423 {
424 std::string key = "";
425 char spNumber[VM_NUMBER_LEN] = {0};
426 std::string spName = VM_NUMBER_CDMA_KEY;
427 GetParameter(key.append(spName).append(std::to_string(slotId_)).c_str(), "", spNumber, VM_NUMBER_LEN);
428 return spNumber;
429 }
430
GetVoiceMailNumberKey()431 std::string SimFileManager::GetVoiceMailNumberKey()
432 {
433 std::string number = simFile_->GetVoiceMailNumber();
434 if (!number.empty()) {
435 return number;
436 }
437 if (TELEPHONY_EXT_WRAPPER.getVoiceMailIccidParameter_ != nullptr) {
438 std::string iccid = simFile_->ObtainIccId();
439 TELEPHONY_EXT_WRAPPER.getVoiceMailIccidParameter_(slotId_, iccid.c_str(), number);
440 if (!number.empty()) {
441 return number;
442 }
443 }
444 std::string key = "";
445 char spNumber[VM_NUMBER_LEN] = {0};
446 std::string spName = VM_NUMBER_KEY;
447 GetParameter(key.append(spName).append(std::to_string(slotId_)).c_str(), "", spNumber, VM_NUMBER_LEN);
448 return spNumber;
449 }
450
GetVoiceMailNumberFromParam()451 std::string SimFileManager::GetVoiceMailNumberFromParam()
452 {
453 std::string number = "";
454 if (IsPhoneTypeGsm(slotId_)) {
455 number = GetVoiceMailNumberKey();
456 } else {
457 number = GetVoiceMailNumberCdmaKey();
458 }
459 return number;
460 }
461
GetVoiceMailNumber()462 std::u16string SimFileManager::GetVoiceMailNumber()
463 {
464 if (simFile_ == nullptr) {
465 TELEPHONY_LOGE("SimFileManager::GetVoiceMailNumber simFile nullptr");
466 return Str8ToStr16("");
467 }
468
469 std::string result = GetVoiceMailNumberFromParam();
470 TELEPHONY_LOGI("SimFileManager::GetVoiceMailNumber result:%{public}s ", (result.empty() ? "false" : "true"));
471 return Str8ToStr16(result);
472 }
473
GetVoiceMailCount()474 int32_t SimFileManager::GetVoiceMailCount()
475 {
476 if (simFile_ == nullptr) {
477 TELEPHONY_LOGE("SimFileManager::GetVoiceMailCount simFile nullptr");
478 return UNKNOWN_VOICE_MAIL_COUNT;
479 }
480
481 return simFile_->ObtainVoiceMailCount();
482 }
483
SetVoiceMailCount(int32_t voiceMailCount)484 bool SimFileManager::SetVoiceMailCount(int32_t voiceMailCount)
485 {
486 if (simFile_ == nullptr) {
487 TELEPHONY_LOGE("SimFileManager::SetVoiceMailCount simFile nullptr");
488 return false;
489 }
490
491 return simFile_->SetVoiceMailCount(voiceMailCount);
492 }
493
SetVoiceCallForwarding(bool enable,const std::string & number)494 bool SimFileManager::SetVoiceCallForwarding(bool enable, const std::string &number)
495 {
496 if (simFile_ == nullptr) {
497 TELEPHONY_LOGE("SimFileManager::SetVoiceCallForwarding simFile nullptr");
498 return false;
499 }
500
501 return simFile_->SetVoiceCallForwarding(enable, number);
502 }
503
GetOpName()504 std::u16string SimFileManager::GetOpName()
505 {
506 return Str8ToStr16(opName_);
507 }
508
GetOpKey()509 std::u16string SimFileManager::GetOpKey()
510 {
511 return Str8ToStr16(opKey_);
512 }
513
GetOpKeyExt()514 std::u16string SimFileManager::GetOpKeyExt()
515 {
516 return Str8ToStr16(opKeyExt_);
517 }
518
SetOpName(const std::string & opName)519 void SimFileManager::SetOpName(const std::string &opName)
520 {
521 opName_ = opName;
522 }
523
SetOpKey(const std::string & opKey)524 void SimFileManager::SetOpKey(const std::string &opKey)
525 {
526 opKey_ = opKey;
527 }
528
SetOpKeyExt(const std::string & opKeyExt)529 void SimFileManager::SetOpKeyExt(const std::string &opKeyExt)
530 {
531 opKeyExt_ = opKeyExt;
532 }
533
ObtainSpnCondition(bool roaming,const std::string & operatorNum)534 int SimFileManager::ObtainSpnCondition(bool roaming, const std::string &operatorNum)
535 {
536 if (simFile_ == nullptr) {
537 TELEPHONY_LOGE("SimFileManager::ObtainSpnCondition simFile nullptr");
538 return 0;
539 }
540
541 int result = simFile_->ObtainSpnCondition(roaming, operatorNum);
542 TELEPHONY_LOGD("SimFileManager::ObtainSpnCondition:%{public}d", result);
543 return result;
544 }
545
GetIccFile()546 std::shared_ptr<IccFile> SimFileManager::GetIccFile()
547 {
548 return simFile_;
549 }
550
GetIccFileController()551 std::shared_ptr<IccFileController> SimFileManager::GetIccFileController()
552 {
553 return fileController_;
554 }
555
RegisterCoreNotify(const std::shared_ptr<AppExecFwk::EventHandler> & handler,int what)556 void SimFileManager::RegisterCoreNotify(const std::shared_ptr<AppExecFwk::EventHandler> &handler, int what)
557 {
558 auto simStateManager = simStateManager_.lock();
559 if (what == RadioEvent::RADIO_SIM_STATE_CHANGE && simStateManager != nullptr) {
560 simStateManager->RegisterCoreNotify(handler, what);
561 return;
562 }
563 if (simFile_ == nullptr) {
564 TELEPHONY_LOGE("SimFileManager::RegisterCoreNotify simFile nullptr");
565 return;
566 }
567 simFile_->RegisterCoreNotify(handler, what);
568 }
569
UnRegisterCoreNotify(const std::shared_ptr<AppExecFwk::EventHandler> & handler,int what)570 void SimFileManager::UnRegisterCoreNotify(const std::shared_ptr<AppExecFwk::EventHandler> &handler, int what)
571 {
572 auto simStateManager = simStateManager_.lock();
573 if (what == RadioEvent::RADIO_SIM_STATE_CHANGE && simStateManager != nullptr) {
574 simStateManager->UnRegisterCoreNotify(handler, what);
575 return;
576 }
577 if (simFile_ == nullptr) {
578 TELEPHONY_LOGE("SimFileManager::UnRegisterCoreNotify simFile nullptr");
579 return;
580 }
581 simFile_->UnRegisterCoreNotify(handler, what);
582 }
583
SetImsi(std::string imsi)584 void SimFileManager::SetImsi(std::string imsi)
585 {
586 if (simFile_ == nullptr) {
587 TELEPHONY_LOGE("SimFileManager::SetImsi simFile nullptr");
588 return;
589 }
590 simFile_->UpdateImsi(imsi);
591 }
592
SetVoiceMailParamGsm(const std::u16string mailNumber,bool isSavedIccRecords)593 void SimFileManager::SetVoiceMailParamGsm(const std::u16string mailNumber, bool isSavedIccRecords)
594 {
595 TELEPHONY_LOGI("SimFileManager::SetVoiceMailParamGsm, set gsm voice mail number");
596 std::string vmNumKey = "";
597 SetParameter(vmNumKey.append(VM_NUMBER_KEY).append(std::to_string(slotId_)).c_str(),
598 Str16ToStr8(mailNumber).c_str());
599 if (isSavedIccRecords) {
600 simFile_->SetVoiceMailNumber(Str16ToStr8(mailNumber));
601 }
602 if (TELEPHONY_EXT_WRAPPER.setVoiceMailIccidParameter_ != nullptr) {
603 std::string iccid = simFile_->ObtainIccId();
604 TELEPHONY_EXT_WRAPPER.setVoiceMailIccidParameter_(slotId_, iccid.c_str(), Str16ToStr8(mailNumber).c_str());
605 }
606 }
607
SetVoiceMailParamCdma(const std::u16string mailNumber)608 void SimFileManager::SetVoiceMailParamCdma(const std::u16string mailNumber)
609 {
610 TELEPHONY_LOGI("SimFileManager::SetVoiceMailParamGsm, set cdma voice mail number");
611 std::string vmNumKey = "";
612 SetParameter(vmNumKey.append(VM_NUMBER_CDMA_KEY).append(std::to_string(slotId_)).c_str(),
613 Str16ToStr8(mailNumber).c_str());
614 }
615
EncryptImsi(const std::string imsi)616 std::string SimFileManager::EncryptImsi(const std::string imsi)
617 {
618 if (imsi.empty()) {
619 return "";
620 }
621 unsigned char hash[SHA256_DIGEST_LENGTH];
622 SHA256_CTX sha256;
623 SHA256_Init(&sha256);
624 SHA256_Update(&sha256, imsi.c_str(), imsi.size());
625 SHA256_Final(hash, &sha256);
626 std::string encryptImsi = SIMUtils::BytesConvertToHexString(hash, SHA256_DIGEST_LENGTH);
627 return encryptImsi;
628 }
629
GetVoiceMailSimImsiFromParam()630 std::string SimFileManager::GetVoiceMailSimImsiFromParam()
631 {
632 std::string key = "";
633 char spNumber[VM_NUMBER_LEN] = {0};
634 GetParameter(key.append(VM_NUMBER_SIM_IMSI_KEY).append(std::to_string(slotId_)).c_str(), "",
635 spNumber, VM_NUMBER_LEN);
636 return spNumber;
637 }
638
SetVoiceMailSimImsiParam(std::string imsi)639 void SimFileManager::SetVoiceMailSimImsiParam(std::string imsi)
640 {
641 std::string encryptImsi = EncryptImsi(imsi);
642 std::string key = "";
643 SetParameter(key.append(VM_NUMBER_SIM_IMSI_KEY).append(std::to_string(slotId_)).c_str(), encryptImsi.c_str());
644 }
645
StoreVoiceMailNumber(const std::u16string mailNumber,bool isSavedIccRecords)646 void SimFileManager::StoreVoiceMailNumber(const std::u16string mailNumber, bool isSavedIccRecords)
647 {
648 std::string imsi = simFile_->ObtainIMSI();
649 SetVoiceMailSimImsiParam(imsi);
650 if (IsPhoneTypeGsm(slotId_)) {
651 SetVoiceMailParamGsm(mailNumber, isSavedIccRecords);
652 } else {
653 SetVoiceMailParamCdma(mailNumber);
654 }
655 }
656
SetVoiceMailInfo(const std::u16string & mailName,const std::u16string & mailNumber)657 bool SimFileManager::SetVoiceMailInfo(const std::u16string &mailName, const std::u16string &mailNumber)
658 {
659 if (simFile_ == nullptr || !HasSimCard()) {
660 TELEPHONY_LOGE("SimFileManager::SetVoiceMail simFile nullptr");
661 return false;
662 }
663 bool isVoiceMailFixed = simFile_->GetIsVoiceMailFixed();
664 if (isVoiceMailFixed) {
665 TELEPHONY_LOGE("SimFileManager::SetVoiceMailInfo, voice mail is fixed by cust, set fail");
666 return false;
667 }
668 StoreVoiceMailNumber(mailNumber, true);
669 std::string name = Str16ToStr8(mailName);
670 std::string number = Str16ToStr8(mailNumber);
671 bool result = simFile_->UpdateVoiceMail(name, number);
672 TELEPHONY_LOGI("SimFileManager::SetVoiceMail result:%{public}s ", (!result ? "false" : "true"));
673 return true;
674 }
675
HasSimCard()676 bool SimFileManager::HasSimCard()
677 {
678 auto simStateManager = simStateManager_.lock();
679 if (simStateManager == nullptr) {
680 TELEPHONY_LOGE("simStateManager nullptr");
681 return false;
682 }
683 bool result = simStateManager->HasSimCard();
684 TELEPHONY_LOGI("result:%{public}s ", (result ? "true" : "false"));
685 return result;
686 }
687
InitDiallingNumberHandler()688 bool SimFileManager::InitDiallingNumberHandler()
689 {
690 if (fileController_ == nullptr) {
691 TELEPHONY_LOGE("InitDiallingNumberHandler null fileController");
692 return false;
693 }
694 if (diallingNumberHandler_ != nullptr) {
695 TELEPHONY_LOGI("InitDiallingNumberHandler update fileController");
696 diallingNumberHandler_->UpdateFileController(fileController_);
697 return true;
698 }
699 diallingNumberHandler_ = std::make_shared<IccDiallingNumbersHandler>(fileController_);
700 if (diallingNumberHandler_ == nullptr) {
701 TELEPHONY_LOGE("SimFileManager failed to create IccDiallingNumbersHandler.");
702 return false;
703 }
704 return true;
705 }
706
UpdateOpkeyConfig()707 void SimFileManager::UpdateOpkeyConfig()
708 {
709 if (simFile_ != nullptr) {
710 simFile_->UpdateOpkeyConfig();
711 }
712 }
713
IsCTSimCard()714 bool SimFileManager::IsCTSimCard()
715 {
716 auto simStateManager = simStateManager_.lock();
717 if (simStateManager == nullptr) {
718 TELEPHONY_LOGE("simStateManager nullptr");
719 return false;
720 }
721 if (simFile_ == nullptr) {
722 TELEPHONY_LOGE("simFile nullptr");
723 return false;
724 }
725 CardType cardType = simStateManager->GetCardType();
726 bool isCTCardType = IsCTCardType(cardType);
727 std::string iccId = simFile_->ObtainIccId();
728 if (!iccId.empty() && iccId.length() >= ICCID_LEN_MINIMUM) {
729 iccId.resize(ICCID_LEN_MINIMUM);
730 }
731 if (isCTCardType && IsCTIccId(iccId)) {
732 TELEPHONY_LOGI("[slot%{public}d] result = 1", slotId_);
733 return true;
734 }
735 TELEPHONY_LOGD("[slot%{public}d] goto check plmn", slotId_);
736 bool result = false;
737 std::string plmn = simFile_->ObtainSimOperator();
738 if (!plmn.empty()) {
739 auto plmnRet = find(CT_CPLMNS.begin(), CT_CPLMNS.end(), plmn);
740 result = plmnRet != CT_CPLMNS.end();
741 TELEPHONY_LOGD("[slot%{public}d] plmn check result = %{public}d", slotId_, result);
742 }
743 if (!iccId.empty()) {
744 if (result) {
745 if (!iccId.compare(GC_ICCID)) {
746 result = false;
747 }
748 } else {
749 if (!plmn.compare(ROAMING_CPLMN) && IsCTIccId(iccId)) {
750 result = true;
751 }
752 }
753 }
754 TELEPHONY_LOGI("[slot%{public}d] result = %{public}d", slotId_, result);
755 return result;
756 }
757
IsCTCardType(CardType type)758 bool SimFileManager::IsCTCardType(CardType type)
759 {
760 bool isCTCardType = false;
761 switch (type) {
762 case CardType::SINGLE_MODE_RUIM_CARD:
763 case CardType::CT_NATIONAL_ROAMING_CARD:
764 case CardType::DUAL_MODE_TELECOM_LTE_CARD:
765 isCTCardType = true;
766 break;
767 default:
768 isCTCardType = false;
769 break;
770 }
771 return isCTCardType;
772 }
773
IsCTIccId(std::string iccId)774 bool SimFileManager::IsCTIccId(std::string iccId)
775 {
776 bool isCTIccId = false;
777 if (!iccId.empty() && iccId.length() >= ICCID_LEN_MINIMUM) {
778 if (iccId.compare(0, PREFIX_LOCAL_ICCID_LEN, PREFIX_LOCAL_ICCID) == 0) {
779 iccId.resize(ICCID_LEN_SIX);
780 }
781 auto iccIdRet = find(CT_ICCID_ARRAY.begin(), CT_ICCID_ARRAY.end(), iccId);
782 isCTIccId = iccIdRet != CT_ICCID_ARRAY.end();
783 }
784 return isCTIccId;
785 }
786
ObtainDiallingNumberHandler()787 std::shared_ptr<IccDiallingNumbersHandler> SimFileManager::ObtainDiallingNumberHandler()
788 {
789 return diallingNumberHandler_;
790 }
791
HandleVoiceTechChanged(std::shared_ptr<VoiceRadioTechnology> tech)792 void SimFileManager::HandleVoiceTechChanged(std::shared_ptr<VoiceRadioTechnology> tech)
793 {
794 TELEPHONY_LOGD("SimFileManager receive RADIO_VOICE_TECH_CHANGED");
795 if (tech == nullptr) {
796 TELEPHONY_LOGE("tech is nullptr!");
797 return;
798 }
799 auto simStateManager = simStateManager_.lock();
800 if (simStateManager == nullptr) {
801 TELEPHONY_LOGE("simStateManager is nullptr");
802 return;
803 }
804 SimFileManager::IccType iccType = GetIccTypeByTech(tech);
805 if (iccType == SimFileManager::IccType::ICC_TYPE_CDMA &&
806 simStateManager->GetCardType() == CardType::SINGLE_MODE_USIM_CARD) {
807 iccType = SimFileManager::IccType::ICC_TYPE_USIM;
808 TELEPHONY_LOGI("change iccType to USIM, slotId: %{public}d", slotId_);
809 }
810 ChangeSimFileByCardType(iccType);
811 }
812
HandleIccRefresh()813 void SimFileManager::HandleIccRefresh()
814 {
815 TELEPHONY_LOGI("handle sim refresh event, slotId: %{public}d", slotId_);
816 if (simFile_ == nullptr) {
817 TELEPHONY_LOGE("simFile_ is null");
818 return;
819 }
820 simFile_->ProcessIccRefresh(MSG_ID_DEFAULT);
821 }
822
HandleOperatorConfigChanged()823 void SimFileManager::HandleOperatorConfigChanged()
824 {
825 TELEPHONY_LOGI("handle operator config change event, slotId: %{public}d", slotId_);
826 if (simFile_ == nullptr) {
827 TELEPHONY_LOGE("simFile_ is null");
828 return;
829 }
830 simFile_->LoadVoiceMail();
831 }
832
HandleSimRecordsLoaded()833 void SimFileManager::HandleSimRecordsLoaded()
834 {
835 if (simFile_ == nullptr) {
836 TELEPHONY_LOGE("simFile_ is null");
837 return;
838 }
839
840 std::string imsiFromSim = simFile_->ObtainIMSI();
841 std::string encryptImsiFromSim = EncryptImsi(imsiFromSim);
842 std::string imsiFromParam = GetVoiceMailSimImsiFromParam();
843 if ((!IsPhoneTypeGsm(slotId_) || !imsiFromParam.empty()) &&
844 !encryptImsiFromSim.empty() && imsiFromParam != encryptImsiFromSim) {
845 std::string nullStr = "";
846 StoreVoiceMailNumber(Str8ToStr16(nullStr), false);
847 SetVoiceMailSimImsiParam(nullStr);
848 }
849 }
850
HandleSimIccidLoaded(std::string iccid)851 void SimFileManager::HandleSimIccidLoaded(std::string iccid)
852 {
853 if (simFile_ == nullptr) {
854 TELEPHONY_LOGE("simFile_ is null");
855 return;
856 }
857 simFile_->UpdateIccId(iccid);
858 }
859
ProcessEvent(const AppExecFwk::InnerEvent::Pointer & event)860 void SimFileManager::ProcessEvent(const AppExecFwk::InnerEvent::Pointer &event)
861 {
862 if (event == nullptr) {
863 TELEPHONY_LOGE("event is nullptr!");
864 return;
865 }
866 uint32_t id = event->GetInnerEventId();
867 TELEPHONY_LOGD("SimFileManager::ProcessEvent id %{public}d", id);
868 auto simStateManager = simStateManager_.lock();
869 if (simStateManager == nullptr) {
870 TELEPHONY_LOGE("simStateManager is nullptr");
871 return;
872 }
873 switch (id) {
874 case RadioEvent::RADIO_VOICE_TECH_CHANGED: {
875 std::shared_ptr<VoiceRadioTechnology> tech = event->GetSharedObject<VoiceRadioTechnology>();
876 HandleVoiceTechChanged(tech);
877 break;
878 }
879 case RadioEvent::RADIO_CARD_TYPE_CHANGE: {
880 CardType cardType = simStateManager->GetCardType();
881 TELEPHONY_LOGI("getCardType is %{public}d, slotId: %{public}d", cardType, slotId_);
882 SimFileManager::IccType iccType = GetIccTypeByCardType(cardType);
883 ChangeSimFileByCardType(iccType);
884 break;
885 }
886 case RadioEvent::RADIO_SIM_RECORDS_LOADED: {
887 TELEPHONY_LOGI("handle sim records loaded event, slotId: %{public}d", slotId_);
888 HandleSimRecordsLoaded();
889 break;
890 }
891 case RadioEvent::RADIO_ICC_REFRESH: {
892 HandleIccRefresh();
893 break;
894 }
895 case RadioEvent::RADIO_SIM_ICCID_LOADED: {
896 TELEPHONY_LOGI("handle sim iccid load event, slotId: %{public}d", slotId_);
897 std::string iccid = simStateManager->GetIccid();
898 HandleSimIccidLoaded(iccid);
899 break;
900 }
901 case RadioEvent::RADIO_OPERATOR_CONFIG_CHANGED: {
902 HandleOperatorConfigChanged();
903 break;
904 }
905 default:
906 break;
907 }
908 }
909
CreateInstance(std::weak_ptr<ITelRilManager> ril,std::weak_ptr<SimStateManager> simState)910 std::shared_ptr<SimFileManager> SimFileManager::CreateInstance(
911 std::weak_ptr<ITelRilManager> ril, std::weak_ptr<SimStateManager> simState)
912 {
913 if (ril.lock() == nullptr) {
914 TELEPHONY_LOGE("rilmanager null pointer");
915 return nullptr;
916 }
917 if (simState.lock() == nullptr) {
918 TELEPHONY_LOGE("simState null pointer");
919 return nullptr;
920 }
921
922 EventFwk::MatchingSkills matchingSkills;
923 matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_OPERATOR_CONFIG_CHANGED);
924 EventFwk::CommonEventSubscribeInfo subscribeInfo(matchingSkills);
925 subscribeInfo.SetThreadMode(EventFwk::CommonEventSubscribeInfo::COMMON);
926
927 std::shared_ptr<SimFileManager> manager = std::make_shared<SimFileManager>(subscribeInfo, ril, simState);
928 if (manager == nullptr) {
929 TELEPHONY_LOGE("manager create nullptr.");
930 return nullptr;
931 }
932 TELEPHONY_LOGI("SimFileManager::CreateInstance success");
933 return manager;
934 }
935
ChangeSimFileByCardType(SimFileManager::IccType type)936 void SimFileManager::ChangeSimFileByCardType(SimFileManager::IccType type)
937 {
938 TELEPHONY_LOGI("SimFileManager new icc type:%{public}d, old icc type: %{public}d", type, iccType_);
939 if (!IsValidType(type)) {
940 TELEPHONY_LOGI("SimFileManager handle new icc invalid type received %{public}d", type);
941 return;
942 }
943 if (type == iccType_) {
944 TELEPHONY_LOGI("SimFileManager same type as ready");
945 return;
946 }
947 if (type != iccType_) {
948 TELEPHONY_LOGI("SimFileManager handle new icc type received %{public}d", type);
949 iccType_ = type;
950 if (simFile_ != nullptr) {
951 simFile_->UnInit();
952 }
953 InitIccFileController(type);
954 InitDiallingNumberHandler();
955 InitSimFile(type);
956 }
957 }
958
GetIccTypeByCardType(CardType type)959 SimFileManager::IccType SimFileManager::GetIccTypeByCardType(CardType type)
960 {
961 switch (type) {
962 case CardType::SINGLE_MODE_RUIM_CARD:
963 return SimFileManager::IccType::ICC_TYPE_CDMA;
964 case CardType::SINGLE_MODE_ISIM_CARD:
965 return SimFileManager::IccType::ICC_TYPE_IMS;
966 case CardType::SINGLE_MODE_SIM_CARD:
967 case CardType::DUAL_MODE_CG_CARD:
968 case CardType::CT_NATIONAL_ROAMING_CARD:
969 case CardType::CU_DUAL_MODE_CARD:
970 case CardType::DUAL_MODE_TELECOM_LTE_CARD:
971 case CardType::DUAL_MODE_UG_CARD:
972 return SimFileManager::IccType::ICC_TYPE_GSM;
973 default:
974 break;
975 }
976 return SimFileManager::IccType::ICC_TYPE_USIM;
977 }
978
GetIccTypeByTech(const std::shared_ptr<VoiceRadioTechnology> & tech)979 SimFileManager::IccType SimFileManager::GetIccTypeByTech(const std::shared_ptr<VoiceRadioTechnology> &tech)
980 {
981 if (tech == nullptr) {
982 TELEPHONY_LOGE("GetCardTypeByTech param tech is nullptr then ICC_TYPE_UNKNOW");
983 return SimFileManager::IccType::ICC_TYPE_USIM;
984 }
985 switch (tech->actType) {
986 case int32_t(RadioTech::RADIO_TECHNOLOGY_EHRPD):
987 case int32_t(RadioTech::RADIO_TECHNOLOGY_1XRTT):
988 return SimFileManager::IccType::ICC_TYPE_CDMA;
989 case int32_t(RadioTech::RADIO_TECHNOLOGY_LTE_CA):
990 case int32_t(RadioTech::RADIO_TECHNOLOGY_LTE):
991 case int32_t(RadioTech::RADIO_TECHNOLOGY_GSM):
992 case int32_t(RadioTech::RADIO_TECHNOLOGY_TD_SCDMA):
993 case int32_t(RadioTech::RADIO_TECHNOLOGY_HSPA):
994 case int32_t(RadioTech::RADIO_TECHNOLOGY_HSPAP):
995 default:
996 break;
997 }
998 return SimFileManager::IccType::ICC_TYPE_USIM;
999 }
1000
IsValidType(SimFileManager::IccType type)1001 bool SimFileManager::IsValidType(SimFileManager::IccType type)
1002 {
1003 switch (type) {
1004 case SimFileManager::IccType::ICC_TYPE_CDMA:
1005 case SimFileManager::IccType::ICC_TYPE_GSM:
1006 case SimFileManager::IccType::ICC_TYPE_IMS:
1007 case SimFileManager::IccType::ICC_TYPE_USIM:
1008 return true;
1009 default:
1010 break;
1011 }
1012 return false;
1013 }
1014
GetSimIst()1015 std::u16string SimFileManager::GetSimIst()
1016 {
1017 if (simFile_ == nullptr) {
1018 TELEPHONY_LOGE("SimFileManager::GetSimIst simFile nullptr");
1019 return Str8ToStr16("");
1020 }
1021 std::string result = static_cast<IsimFile *>(simFile_.get())->ObtainIsimIst();
1022 TELEPHONY_LOGI("SimFileManager::GetSimIst result:%{public}s ", (result.empty() ? "false" : "true"));
1023 return Str8ToStr16(result);
1024 }
1025
ClearData()1026 void SimFileManager::ClearData()
1027 {
1028 opName_ = "";
1029 opKey_ = "";
1030 opKeyExt_ = "";
1031 if (simFile_ == nullptr) {
1032 TELEPHONY_LOGE("SimFileManager::ClearData simFile nullptr");
1033 return;
1034 }
1035 simFile_->ClearData();
1036 }
1037 } // namespace Telephony
1038 } // namespace OHOS
1039