• 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 "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     telRilManager->RegisterCoreNotify(slotId, shared_from_this(), RadioEvent::RADIO_VOICE_TECH_CHANGED, nullptr);
121     telRilManager->RegisterCoreNotify(slotId_, shared_from_this(), RadioEvent::RADIO_ICC_REFRESH, nullptr);
122     TELEPHONY_LOGI("SimFileManager::Init() end");
123 }
124 
InitSimFile(SimFileManager::IccType type)125 bool SimFileManager::InitSimFile(SimFileManager::IccType type)
126 {
127     if (fileController_ == nullptr || diallingNumberHandler_ == nullptr) {
128         TELEPHONY_LOGE("InitSimFile need more helper");
129         return false;
130     }
131     auto iccFileIt = iccFileCache_.find(type);
132     if (iccFileIt == iccFileCache_.end()) {
133         if (type == SimFileManager::IccType::ICC_TYPE_CDMA) {
134             simFile_ = std::make_shared<RuimFile>(simStateManager_.lock());
135         } else if (type == SimFileManager::IccType::ICC_TYPE_IMS) {
136             simFile_ = std::make_shared<IsimFile>(simStateManager_.lock());
137         } else {
138             simFile_ = std::make_shared<SimFile>(simStateManager_.lock());
139         }
140         if (simFile_ != nullptr) {
141             simFile_->RegisterCoreNotify(shared_from_this(), RadioEvent::RADIO_SIM_RECORDS_LOADED);
142         }
143         iccFileCache_.insert(std::make_pair(type, simFile_));
144     } else {
145         simFile_ = iccFileIt->second;
146     }
147 
148     if (simFile_ == nullptr) {
149         TELEPHONY_LOGE("SimFileManager::Init simFile create nullptr.");
150         return false;
151     }
152     simFile_->SetRilAndFileController(telRilManager_.lock(), fileController_, diallingNumberHandler_);
153     simFile_->SetId(slotId_);
154     simFile_->Init();
155     return true;
156 }
157 
InitIccFileController(SimFileManager::IccType type)158 bool SimFileManager::InitIccFileController(SimFileManager::IccType type)
159 {
160     auto iccFileConIt = iccFileControllerCache_.find(type);
161     if (iccFileConIt == iccFileControllerCache_.end()) {
162         if (type == SimFileManager::IccType::ICC_TYPE_CDMA) { // ruim 30 usim 20 isim 60
163             fileController_ = std::make_shared<RuimFileController>(slotId_);
164         } else if (type == SimFileManager::IccType::ICC_TYPE_IMS) {
165             fileController_ = std::make_shared<IsimFileController>(slotId_);
166         } else if (type == SimFileManager::IccType::ICC_TYPE_GSM) {
167             fileController_ = std::make_shared<SimFileController>(slotId_);
168         } else {
169             fileController_ = std::make_shared<UsimFileController>(slotId_);
170         }
171         iccFileControllerCache_.insert(std::make_pair(type, fileController_));
172     } else {
173         fileController_ = iccFileConIt->second;
174     }
175     if (fileController_ == nullptr) {
176         TELEPHONY_LOGE("SimFileManager::Init fileController create nullptr.");
177         return false;
178     }
179     fileController_->SetRilManager(telRilManager_.lock());
180     return true;
181 }
182 
GetSimOperatorNumeric()183 std::u16string SimFileManager::GetSimOperatorNumeric()
184 {
185     if (simFile_ == nullptr) {
186         TELEPHONY_LOGE("SimFileManager::GetSimOperatorNumeric simFile nullptr");
187         return Str8ToStr16("");
188     }
189 
190     std::string result = simFile_->ObtainSimOperator();
191     TELEPHONY_LOGD("SimFileManager::GetOperator result:%{public}s ", (result.empty() ? "false" : "true"));
192     return Str8ToStr16(result);
193 }
194 
GetISOCountryCodeForSim()195 std::u16string SimFileManager::GetISOCountryCodeForSim()
196 {
197     if (simFile_ == nullptr) {
198         TELEPHONY_LOGE("SimFileManager::GetISOCountryCodeForSim simFile nullptr");
199         return Str8ToStr16("");
200     }
201 
202     std::string result = simFile_->ObtainIsoCountryCode();
203     TELEPHONY_LOGD("SimFileManager::ObtainIsoCountryCode result:%{public}s ", (result.empty() ? "false" : "true"));
204     return Str8ToStr16(result);
205 }
206 
GetSimSpn()207 std::u16string SimFileManager::GetSimSpn()
208 {
209     if (simFile_ == nullptr) {
210         TELEPHONY_LOGE("SimFileManager::GetSimSpn simFile nullptr");
211         return Str8ToStr16("");
212     }
213 
214     std::string result = simFile_->ObtainSPN();
215     TELEPHONY_LOGD("SimFileManager::GetSimSpn result:%{public}s ", (result.empty() ? "false" : "true"));
216     return Str8ToStr16(result);
217 }
218 
GetSimEons(const std::string & plmn,int32_t lac,bool longNameRequired)219 std::u16string SimFileManager::GetSimEons(const std::string &plmn, int32_t lac, bool longNameRequired)
220 {
221     if (simFile_ == nullptr) {
222         TELEPHONY_LOGE("SimFileManager::GetEons simFile nullptr");
223         return Str8ToStr16("");
224     }
225 
226     std::string result = simFile_->ObtainEons(plmn, lac, longNameRequired);
227     TELEPHONY_LOGD("SimFileManager::GetEons result:%{public}s ", (result.empty() ? "false" : "true"));
228     return Str8ToStr16(result);
229 }
230 
GetSimIccId()231 std::u16string SimFileManager::GetSimIccId()
232 {
233     if (simFile_ == nullptr) {
234         TELEPHONY_LOGE("SimFileManager::GetSimIccId simFile nullptr");
235         return Str8ToStr16("");
236     }
237 
238     std::string result = simFile_->ObtainIccId();
239     TELEPHONY_LOGD("SimFileManager::GetSimIccId result:%{public}s ", (result.empty() ? "false" : "true"));
240     return Str8ToStr16(result);
241 }
242 
GetSimDecIccId()243 std::u16string SimFileManager::GetSimDecIccId()
244 {
245     if (simFile_ == nullptr) {
246         TELEPHONY_LOGE("simFile is nullptr!");
247         return Str8ToStr16("");
248     }
249 
250     std::string result = simFile_->ObtainDecIccId();
251     TELEPHONY_LOGD("obtain dec iccId result:%{public}s ", (result.empty() ? "false" : "true"));
252     return Str8ToStr16(result);
253 }
254 
GetIMSI()255 std::u16string SimFileManager::GetIMSI()
256 {
257     if (simFile_ == nullptr) {
258         TELEPHONY_LOGE("SimFileManager::GetIMSI simFile nullptr");
259         return Str8ToStr16("");
260     }
261 
262     std::string result = simFile_->ObtainIMSI();
263     TELEPHONY_LOGD("SimFileManager::ObtainIMSI result:%{public}s ", (result.empty() ? "false" : "true"));
264     return Str8ToStr16(result);
265 }
266 
GetLocaleFromDefaultSim()267 std::u16string SimFileManager::GetLocaleFromDefaultSim()
268 {
269     if (simFile_ == nullptr) {
270         TELEPHONY_LOGE("SimFileManager::GetLocaleFromDefaultSim simFile nullptr");
271         return Str8ToStr16("");
272     }
273 
274     std::string result = simFile_->ObtainIccLanguage();
275     TELEPHONY_LOGD("SimFileManager::GetLocaleFromDefaultSim result:%{public}s ", (result.empty() ? "false" : "true"));
276     return Str8ToStr16(result);
277 }
278 
GetSimGid1()279 std::u16string SimFileManager::GetSimGid1()
280 {
281     if (simFile_ == nullptr) {
282         TELEPHONY_LOGE("SimFileManager::GetSimGid1 simFile nullptr");
283         return Str8ToStr16("");
284     }
285 
286     std::string result = simFile_->ObtainGid1();
287     TELEPHONY_LOGI("SimFileManager::GetSimGid1 result:%{public}s ", (result.empty() ? "false" : "true"));
288     return Str8ToStr16(result);
289 }
290 
GetSimGid2()291 std::u16string SimFileManager::GetSimGid2()
292 {
293     if (simFile_ == nullptr) {
294         TELEPHONY_LOGE("SimFileManager::GetSimGid2 simFile nullptr");
295         return Str8ToStr16("");
296     }
297 
298     std::string result = simFile_->ObtainGid2();
299     TELEPHONY_LOGI("SimFileManager::GetSimGid2 result:%{public}s ", (result.empty() ? "false" : "true"));
300     return Str8ToStr16(result);
301 }
302 
GetSimTelephoneNumber()303 std::u16string SimFileManager::GetSimTelephoneNumber()
304 {
305     std::string result = "";
306     if (simFile_ != nullptr) {
307         result = simFile_->ObtainMsisdnNumber();
308     }
309     TELEPHONY_LOGD("result is empty:%{public}s", (result.empty() ? "true" : "false"));
310     return Str8ToStr16(result);
311 }
312 
SetSimTelephoneNumber(const std::u16string & alphaTag,const std::u16string & phoneNumber)313 bool SimFileManager::SetSimTelephoneNumber(const std::u16string &alphaTag, const std::u16string &phoneNumber)
314 {
315     if (simFile_ == nullptr) {
316         TELEPHONY_LOGE("SimFileManager::SetSimTelephoneNumber simFile nullptr");
317         return false;
318     }
319     std::string tag = Str16ToStr8(alphaTag);
320     std::string number = Str16ToStr8(phoneNumber);
321     return simFile_->UpdateMsisdnNumber(tag, number);
322 }
323 
GetSimTeleNumberIdentifier()324 std::u16string SimFileManager::GetSimTeleNumberIdentifier()
325 {
326     if (simFile_ == nullptr) {
327         TELEPHONY_LOGE("SimFileManager::GetSimTeleNumberIdentifier simFile nullptr");
328         return Str8ToStr16("");
329     }
330 
331     std::string result = simFile_->ObtainMsisdnAlphaStatus();
332     TELEPHONY_LOGI(
333         "SimFileManager::GetSimTeleNumberIdentifier result:%{public}s ", (result.empty() ? "false" : "true"));
334     return Str8ToStr16(result);
335 }
336 
GetVoiceMailIdentifier()337 std::u16string SimFileManager::GetVoiceMailIdentifier()
338 {
339     if (simFile_ == nullptr) {
340         TELEPHONY_LOGE("SimFileManager::GetVoiceMailIdentifier simFile nullptr");
341         return Str8ToStr16("");
342     }
343 
344     std::string result = simFile_->ObtainVoiceMailInfo();
345     TELEPHONY_LOGI(
346         "SimFileManager::GetVoiceMailIdentifier result:%{public}s ", (result.empty() ? "false" : "true"));
347     return Str8ToStr16(result);
348 }
349 
IsPhoneTypeGsm(int32_t slotId)350 bool SimFileManager::IsPhoneTypeGsm(int32_t slotId)
351 {
352     PhoneType phoneType = CoreManagerInner::GetInstance().GetPhoneType(slotId);
353     return phoneType == PhoneType::PHONE_TYPE_IS_GSM;
354 }
355 
GetVoiceMailNumberCdmaKey()356 std::string SimFileManager::GetVoiceMailNumberCdmaKey()
357 {
358     std::string key = "";
359     char spNumber[VM_NUMBER_LEN] = {0};
360     std::string spName = VM_NUMBER_CDMA_KEY;
361     GetParameter(key.append(spName).append(std::to_string(slotId_)).c_str(), "", spNumber, VM_NUMBER_LEN);
362     return spNumber;
363 }
364 
GetVoiceMailNumberKey()365 std::string SimFileManager::GetVoiceMailNumberKey()
366 {
367     std::string number = simFile_->GetVoiceMailNumber();
368     if (!number.empty()) {
369         return number;
370     }
371     if (TELEPHONY_EXT_WRAPPER.getVoiceMailIccidParameter_ != nullptr) {
372         std::string iccid = simFile_->ObtainIccId();
373         number = TELEPHONY_EXT_WRAPPER.getVoiceMailIccidParameter_(slotId_, iccid.c_str());
374         if (!number.empty()) {
375             return number;
376         }
377     }
378     std::string key = "";
379     char spNumber[VM_NUMBER_LEN] = {0};
380     std::string spName = VM_NUMBER_KEY;
381     GetParameter(key.append(spName).append(std::to_string(slotId_)).c_str(), "", spNumber, VM_NUMBER_LEN);
382     return spNumber;
383 }
384 
GetVoiceMailNumberFromParam()385 std::string SimFileManager::GetVoiceMailNumberFromParam()
386 {
387     std::string number = "";
388     if (IsPhoneTypeGsm(slotId_)) {
389         number = GetVoiceMailNumberKey();
390     } else {
391         number = GetVoiceMailNumberCdmaKey();
392     }
393     return number;
394 }
395 
GetVoiceMailNumber()396 std::u16string SimFileManager::GetVoiceMailNumber()
397 {
398     if (simFile_ == nullptr) {
399         TELEPHONY_LOGE("SimFileManager::GetVoiceMailNumber simFile nullptr");
400         return Str8ToStr16("");
401     }
402 
403     std::string result = GetVoiceMailNumberFromParam();
404     TELEPHONY_LOGI("SimFileManager::GetVoiceMailNumber result:%{public}s ", (result.empty() ? "false" : "true"));
405     return Str8ToStr16(result);
406 }
407 
GetVoiceMailCount()408 int32_t SimFileManager::GetVoiceMailCount()
409 {
410     if (simFile_ == nullptr) {
411         TELEPHONY_LOGE("SimFileManager::GetVoiceMailCount simFile nullptr");
412         return UNKNOWN_VOICE_MAIL_COUNT;
413     }
414 
415     return simFile_->ObtainVoiceMailCount();
416 }
417 
SetVoiceMailCount(int32_t voiceMailCount)418 bool SimFileManager::SetVoiceMailCount(int32_t voiceMailCount)
419 {
420     if (simFile_ == nullptr) {
421         TELEPHONY_LOGE("SimFileManager::SetVoiceMailCount simFile nullptr");
422         return false;
423     }
424 
425     return simFile_->SetVoiceMailCount(voiceMailCount);
426 }
427 
SetVoiceCallForwarding(bool enable,const std::string & number)428 bool SimFileManager::SetVoiceCallForwarding(bool enable, const std::string &number)
429 {
430     if (simFile_ == nullptr) {
431         TELEPHONY_LOGE("SimFileManager::SetVoiceCallForwarding simFile nullptr");
432         return false;
433     }
434 
435     return simFile_->SetVoiceCallForwarding(enable, number);
436 }
437 
GetOpName()438 std::u16string SimFileManager::GetOpName()
439 {
440     return Str8ToStr16(opName_);
441 }
442 
GetOpKey()443 std::u16string SimFileManager::GetOpKey()
444 {
445     return Str8ToStr16(opKey_);
446 }
447 
GetOpKeyExt()448 std::u16string SimFileManager::GetOpKeyExt()
449 {
450     return Str8ToStr16(opKeyExt_);
451 }
452 
SetOpName(const std::string & opName)453 void SimFileManager::SetOpName(const std::string &opName)
454 {
455     opName_ = opName;
456 }
457 
SetOpKey(const std::string & opKey)458 void SimFileManager::SetOpKey(const std::string &opKey)
459 {
460     opKey_ = opKey;
461 }
462 
SetOpKeyExt(const std::string & opKeyExt)463 void SimFileManager::SetOpKeyExt(const std::string &opKeyExt)
464 {
465     opKeyExt_ = opKeyExt;
466 }
467 
ObtainSpnCondition(bool roaming,const std::string & operatorNum)468 int SimFileManager::ObtainSpnCondition(bool roaming, const std::string &operatorNum)
469 {
470     if (simFile_ == nullptr) {
471         TELEPHONY_LOGE("SimFileManager::ObtainSpnCondition simFile nullptr");
472         return 0;
473     }
474 
475     int result = simFile_->ObtainSpnCondition(roaming, operatorNum);
476     TELEPHONY_LOGI("SimFileManager::ObtainSpnCondition:%{public}d", result);
477     return result;
478 }
479 
GetIccFile()480 std::shared_ptr<IccFile> SimFileManager::GetIccFile()
481 {
482     return simFile_;
483 }
484 
GetIccFileController()485 std::shared_ptr<IccFileController> SimFileManager::GetIccFileController()
486 {
487     return fileController_;
488 }
489 
RegisterCoreNotify(const std::shared_ptr<AppExecFwk::EventHandler> & handler,int what)490 void SimFileManager::RegisterCoreNotify(const std::shared_ptr<AppExecFwk::EventHandler> &handler, int what)
491 {
492     auto simStateManager = simStateManager_.lock();
493     if (what == RadioEvent::RADIO_SIM_STATE_CHANGE && simStateManager != nullptr) {
494         simStateManager->RegisterCoreNotify(handler, what);
495         return;
496     }
497     if (simFile_ == nullptr) {
498         TELEPHONY_LOGE("SimFileManager::RegisterCoreNotify simFile nullptr");
499         return;
500     }
501     simFile_->RegisterCoreNotify(handler, what);
502 }
503 
UnRegisterCoreNotify(const std::shared_ptr<AppExecFwk::EventHandler> & handler,int what)504 void SimFileManager::UnRegisterCoreNotify(const std::shared_ptr<AppExecFwk::EventHandler> &handler, int what)
505 {
506     auto simStateManager = simStateManager_.lock();
507     if (what == RadioEvent::RADIO_SIM_STATE_CHANGE && simStateManager != nullptr) {
508         simStateManager->UnRegisterCoreNotify(handler, what);
509         return;
510     }
511     if (simFile_ == nullptr) {
512         TELEPHONY_LOGE("SimFileManager::UnRegisterCoreNotify simFile nullptr");
513         return;
514     }
515     simFile_->UnRegisterCoreNotify(handler, what);
516 }
517 
SetImsi(std::string imsi)518 void SimFileManager::SetImsi(std::string imsi)
519 {
520     if (simFile_ == nullptr) {
521         TELEPHONY_LOGE("SimFileManager::SetImsi simFile nullptr");
522         return;
523     }
524     simFile_->UpdateImsi(imsi);
525 }
526 
SetVoiceMailParamGsm(const std::u16string mailNumber,bool isSavedIccRecords)527 void SimFileManager::SetVoiceMailParamGsm(const std::u16string mailNumber, bool isSavedIccRecords)
528 {
529     TELEPHONY_LOGI("SimFileManager::SetVoiceMailParamGsm, set gsm voice mail number");
530     std::string vmNumKey = "";
531     SetParameter(vmNumKey.append(VM_NUMBER_KEY).append(std::to_string(slotId_)).c_str(),
532         Str16ToStr8(mailNumber).c_str());
533     if (isSavedIccRecords) {
534         simFile_->SetVoiceMailNumber(Str16ToStr8(mailNumber));
535     }
536     if (TELEPHONY_EXT_WRAPPER.setVoiceMailIccidParameter_ != nullptr) {
537         std::string iccid = simFile_->ObtainIccId();
538         TELEPHONY_EXT_WRAPPER.setVoiceMailIccidParameter_(slotId_, iccid.c_str(), Str16ToStr8(mailNumber).c_str());
539     }
540 }
541 
SetVoiceMailParamCdma(const std::u16string mailNumber)542 void SimFileManager::SetVoiceMailParamCdma(const std::u16string mailNumber)
543 {
544     TELEPHONY_LOGI("SimFileManager::SetVoiceMailParamGsm, set cdma voice mail number");
545     std::string vmNumKey = "";
546     SetParameter(vmNumKey.append(VM_NUMBER_CDMA_KEY).append(std::to_string(slotId_)).c_str(),
547         Str16ToStr8(mailNumber).c_str());
548 }
549 
EncryptImsi(const std::string imsi)550 std::string SimFileManager::EncryptImsi(const std::string imsi)
551 {
552     if (imsi.empty()) {
553         return "";
554     }
555     unsigned char hash[SHA256_DIGEST_LENGTH];
556     SHA256_CTX sha256;
557     SHA256_Init(&sha256);
558     SHA256_Update(&sha256, imsi.c_str(), imsi.size());
559     SHA256_Final(hash, &sha256);
560     std::string encryptImsi = SIMUtils::BytesConvertToHexString(hash, SHA256_DIGEST_LENGTH);
561     return encryptImsi;
562 }
563 
GetVoiceMailSimImsiFromParam()564 std::string SimFileManager::GetVoiceMailSimImsiFromParam()
565 {
566     std::string key = "";
567     char spNumber[VM_NUMBER_LEN] = {0};
568     GetParameter(key.append(VM_NUMBER_SIM_IMSI_KEY).append(std::to_string(slotId_)).c_str(), "",
569         spNumber, VM_NUMBER_LEN);
570     return spNumber;
571 }
572 
SetVoiceMailSimImsiParam(std::string imsi)573 void SimFileManager::SetVoiceMailSimImsiParam(std::string imsi)
574 {
575     std::string encryptImsi = EncryptImsi(imsi);
576     std::string key = "";
577     SetParameter(key.append(VM_NUMBER_SIM_IMSI_KEY).append(std::to_string(slotId_)).c_str(), encryptImsi.c_str());
578 }
579 
StoreVoiceMailNumber(const std::u16string mailNumber,bool isSavedIccRecords)580 void SimFileManager::StoreVoiceMailNumber(const std::u16string mailNumber, bool isSavedIccRecords)
581 {
582     std::string imsi = simFile_->ObtainIMSI();
583     SetVoiceMailSimImsiParam(imsi);
584     if (IsPhoneTypeGsm(slotId_)) {
585         SetVoiceMailParamGsm(mailNumber, isSavedIccRecords);
586     } else {
587         SetVoiceMailParamCdma(mailNumber);
588     }
589 }
590 
SetVoiceMailInfo(const std::u16string & mailName,const std::u16string & mailNumber)591 bool SimFileManager::SetVoiceMailInfo(const std::u16string &mailName, const std::u16string &mailNumber)
592 {
593     if (simFile_ == nullptr || !HasSimCard()) {
594         TELEPHONY_LOGE("SimFileManager::SetVoiceMail simFile nullptr");
595         return false;
596     }
597     bool isVoiceMailFixed = simFile_->GetIsVoiceMailFixed();
598     if (isVoiceMailFixed) {
599         TELEPHONY_LOGE("SimFileManager::SetVoiceMailInfo, voice mail is fixed by cust, set fail");
600         return false;
601     }
602     StoreVoiceMailNumber(mailNumber, true);
603     std::string name = Str16ToStr8(mailName);
604     std::string number = Str16ToStr8(mailNumber);
605     bool result = simFile_->UpdateVoiceMail(name, number);
606     TELEPHONY_LOGI("SimFileManager::SetVoiceMail result:%{public}s ", (!result ? "false" : "true"));
607     return result;
608 }
609 
HasSimCard()610 bool SimFileManager::HasSimCard()
611 {
612     auto simStateManager = simStateManager_.lock();
613     if (simStateManager == nullptr) {
614         TELEPHONY_LOGE("simStateManager nullptr");
615         return false;
616     }
617     bool result = simStateManager->HasSimCard();
618     TELEPHONY_LOGI("result:%{public}s ", (result ? "true" : "false"));
619     return result;
620 }
621 
InitDiallingNumberHandler()622 bool SimFileManager::InitDiallingNumberHandler()
623 {
624     if (fileController_ == nullptr) {
625         TELEPHONY_LOGE("InitDiallingNumberHandler null fileController");
626         return false;
627     }
628     if (diallingNumberHandler_ != nullptr) {
629         TELEPHONY_LOGI("InitDiallingNumberHandler update fileController");
630         diallingNumberHandler_->UpdateFileController(fileController_);
631         return true;
632     }
633     diallingNumberHandler_ = std::make_shared<IccDiallingNumbersHandler>(fileController_);
634     if (diallingNumberHandler_ == nullptr) {
635         TELEPHONY_LOGE("SimFileManager failed to create IccDiallingNumbersHandler.");
636         return false;
637     }
638     return true;
639 }
640 
IsCTSimCard()641 bool SimFileManager::IsCTSimCard()
642 {
643     auto simStateManager = simStateManager_.lock();
644     if (simStateManager == nullptr) {
645         TELEPHONY_LOGE("simStateManager nullptr");
646         return false;
647     }
648     if (simFile_ == nullptr) {
649         TELEPHONY_LOGE("simFile nullptr");
650         return false;
651     }
652     CardType cardType = simStateManager->GetCardType();
653     bool isCTCardType = IsCTCardType(cardType);
654     std::string iccId = simFile_->ObtainIccId();
655     if (!iccId.empty() && iccId.length() >= ICCID_LEN_MINIMUM) {
656         iccId.resize(ICCID_LEN_MINIMUM);
657     }
658     if (isCTCardType && IsCTIccId(iccId)) {
659         TELEPHONY_LOGI("[slot%{public}d] result = 1", slotId_);
660         return true;
661     }
662     TELEPHONY_LOGI("[slot%{public}d] goto check plmn", slotId_);
663     bool result = false;
664     std::string plmn = simFile_->ObtainSimOperator();
665     if (!plmn.empty()) {
666         auto plmnRet = find(CT_CPLMNS.begin(), CT_CPLMNS.end(), plmn);
667         result = plmnRet != CT_CPLMNS.end();
668         TELEPHONY_LOGI("[slot%{public}d] plmn check result = %{public}d", slotId_, result);
669     }
670     if (!iccId.empty()) {
671         if (result) {
672             if (!iccId.compare(GC_ICCID)) {
673                 result = false;
674             }
675         } else {
676             if (!plmn.compare(ROAMING_CPLMN) && IsCTIccId(iccId)) {
677                 result = true;
678             }
679         }
680     }
681     TELEPHONY_LOGI("[slot%{public}d] result = %{public}d", slotId_, result);
682     return result;
683 }
684 
IsCTCardType(CardType type)685 bool SimFileManager::IsCTCardType(CardType type)
686 {
687     bool isCTCardType = false;
688     switch (type) {
689         case CardType::SINGLE_MODE_RUIM_CARD:
690         case CardType::CT_NATIONAL_ROAMING_CARD:
691         case CardType::DUAL_MODE_TELECOM_LTE_CARD:
692             isCTCardType = true;
693             break;
694         default:
695             isCTCardType = false;
696             break;
697     }
698     return isCTCardType;
699 }
700 
IsCTIccId(std::string iccId)701 bool SimFileManager::IsCTIccId(std::string iccId)
702 {
703     bool isCTIccId = false;
704     if (!iccId.empty() && iccId.length() >= ICCID_LEN_MINIMUM) {
705         if (iccId.compare(0, PREFIX_LOCAL_ICCID_LEN, PREFIX_LOCAL_ICCID) == 0) {
706             iccId.resize(ICCID_LEN_SIX);
707         }
708         auto iccIdRet = find(CT_ICCID_ARRAY.begin(), CT_ICCID_ARRAY.end(), iccId);
709         isCTIccId = iccIdRet != CT_ICCID_ARRAY.end();
710     }
711     return isCTIccId;
712 }
713 
ObtainDiallingNumberHandler()714 std::shared_ptr<IccDiallingNumbersHandler> SimFileManager::ObtainDiallingNumberHandler()
715 {
716     return diallingNumberHandler_;
717 }
718 
HandleSimRecordsLoaded()719 void SimFileManager::HandleSimRecordsLoaded()
720 {
721     if (simFile_ == nullptr) {
722         TELEPHONY_LOGE("simFile_ is null");
723         return;
724     }
725 
726     std::string imsiFromSim = simFile_->ObtainIMSI();
727     std::string encryptImsiFromSim = EncryptImsi(imsiFromSim);
728     std::string imsiFromParam = GetVoiceMailSimImsiFromParam();
729     if ((!IsPhoneTypeGsm(slotId_) || !imsiFromParam.empty()) &&
730         !encryptImsiFromSim.empty() && imsiFromParam != encryptImsiFromSim) {
731         std::string nullStr = "";
732         StoreVoiceMailNumber(Str8ToStr16(nullStr), false);
733         SetVoiceMailSimImsiParam(nullStr);
734     }
735 }
736 
ProcessEvent(const AppExecFwk::InnerEvent::Pointer & event)737 void SimFileManager::ProcessEvent(const AppExecFwk::InnerEvent::Pointer &event)
738 {
739     if (event == nullptr) {
740         TELEPHONY_LOGE("event is nullptr!");
741         return;
742     }
743     uint32_t id = event->GetInnerEventId();
744     TELEPHONY_LOGD("SimFileManager::ProcessEvent id %{public}d", id);
745     auto simStateManager = simStateManager_.lock();
746     if (simStateManager == nullptr) {
747         TELEPHONY_LOGE("simStateManager is nullptr");
748         return;
749     }
750     switch (id) {
751         case RadioEvent::RADIO_VOICE_TECH_CHANGED: {
752             TELEPHONY_LOGD("SimFileManager receive RADIO_VOICE_TECH_CHANGED");
753             std::shared_ptr<VoiceRadioTechnology> tech = event->GetSharedObject<VoiceRadioTechnology>();
754             SimFileManager::IccType iccType = GetIccTypeByTech(tech);
755             if (iccType == SimFileManager::IccType::ICC_TYPE_CDMA &&
756                 simStateManager->GetCardType() == CardType::SINGLE_MODE_USIM_CARD) {
757                 iccType = SimFileManager::IccType::ICC_TYPE_USIM;
758                 TELEPHONY_LOGI("SimFileManager change iccType to USIM");
759             }
760             ChangeSimFileByCardType(iccType);
761             break;
762         }
763         case RadioEvent::RADIO_CARD_TYPE_CHANGE: {
764             CardType cardType = simStateManager->GetCardType();
765             TELEPHONY_LOGI("SimFileManager GetCardType is %{public}d", cardType);
766             SimFileManager::IccType iccType = GetIccTypeByCardType(cardType);
767             ChangeSimFileByCardType(iccType);
768             break;
769         }
770         case RadioEvent::RADIO_SIM_RECORDS_LOADED: {
771             TELEPHONY_LOGI("SimFileManager::ProcessEvent, handle sim records loaded event");
772             HandleSimRecordsLoaded();
773             break;
774         }
775         case RadioEvent::RADIO_ICC_REFRESH: {
776             TELEPHONY_LOGI("SimFileManager::ProcessEvent, handle sim refresh event");
777             if (simFile_ == nullptr) {
778                 TELEPHONY_LOGE("simFile_ is null");
779                 return;
780             }
781             simFile_->ProcessIccRefresh(MSG_ID_DEFAULT);
782             break;
783         }
784         default:
785             break;
786     }
787 }
788 
CreateInstance(std::weak_ptr<ITelRilManager> ril,std::weak_ptr<SimStateManager> simState)789 std::shared_ptr<SimFileManager> SimFileManager::CreateInstance(
790     std::weak_ptr<ITelRilManager> ril, std::weak_ptr<SimStateManager> simState)
791 {
792     if (ril.lock() == nullptr) {
793         TELEPHONY_LOGE("rilmanager null pointer");
794         return nullptr;
795     }
796     if (simState.lock() == nullptr) {
797         TELEPHONY_LOGE("simState null pointer");
798         return nullptr;
799     }
800 
801     EventFwk::MatchingSkills matchingSkills;
802     matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_OPERATOR_CONFIG_CHANGED);
803     EventFwk::CommonEventSubscribeInfo subscribeInfo(matchingSkills);
804     subscribeInfo.SetThreadMode(EventFwk::CommonEventSubscribeInfo::COMMON);
805 
806     std::shared_ptr<SimFileManager> manager = std::make_shared<SimFileManager>(subscribeInfo, ril, simState);
807     if (manager == nullptr) {
808         TELEPHONY_LOGE("manager create nullptr.");
809         return nullptr;
810     }
811     bool subRet = EventFwk::CommonEventManager::SubscribeCommonEvent(manager);
812     TELEPHONY_LOGI("SimFileManager::CreateInstance, subscribe user switched subRet is %{public}d", subRet);
813     return manager;
814 }
815 
ChangeSimFileByCardType(SimFileManager::IccType type)816 void SimFileManager::ChangeSimFileByCardType(SimFileManager::IccType type)
817 {
818     TELEPHONY_LOGI("SimFileManager new icc type:%{public}d, old icc type: %{public}d", type, iccType_);
819     if (!IsValidType(type)) {
820         TELEPHONY_LOGI("SimFileManager handle new icc invalid type received %{public}d", type);
821         return;
822     }
823     if (type == iccType_) {
824         TELEPHONY_LOGI("SimFileManager same type as ready");
825         return;
826     }
827     if (type != iccType_) {
828         TELEPHONY_LOGI("SimFileManager handle new icc type received %{public}d", type);
829         iccType_ = type;
830         if (simFile_ != nullptr) {
831             simFile_->UnInit();
832         }
833         InitIccFileController(type);
834         InitDiallingNumberHandler();
835         InitSimFile(type);
836     }
837 }
838 
GetIccTypeByCardType(CardType type)839 SimFileManager::IccType SimFileManager::GetIccTypeByCardType(CardType type)
840 {
841     switch (type) {
842         case CardType::SINGLE_MODE_RUIM_CARD:
843             return SimFileManager::IccType::ICC_TYPE_CDMA;
844         case CardType::SINGLE_MODE_ISIM_CARD:
845             return SimFileManager::IccType::ICC_TYPE_IMS;
846         case CardType::SINGLE_MODE_SIM_CARD:
847         case CardType::DUAL_MODE_CG_CARD:
848         case CardType::CT_NATIONAL_ROAMING_CARD:
849         case CardType::CU_DUAL_MODE_CARD:
850         case CardType::DUAL_MODE_TELECOM_LTE_CARD:
851         case CardType::DUAL_MODE_UG_CARD:
852             return SimFileManager::IccType::ICC_TYPE_GSM;
853         default:
854             break;
855     }
856     return SimFileManager::IccType::ICC_TYPE_USIM;
857 }
858 
GetIccTypeByTech(const std::shared_ptr<VoiceRadioTechnology> & tech)859 SimFileManager::IccType SimFileManager::GetIccTypeByTech(const std::shared_ptr<VoiceRadioTechnology> &tech)
860 {
861     if (tech == nullptr) {
862         TELEPHONY_LOGE("GetCardTypeByTech param tech is nullptr then ICC_TYPE_UNKNOW");
863         return SimFileManager::IccType::ICC_TYPE_USIM;
864     }
865     switch (tech->actType) {
866         case int32_t(RadioTech::RADIO_TECHNOLOGY_EHRPD):
867         case int32_t(RadioTech::RADIO_TECHNOLOGY_1XRTT):
868             return SimFileManager::IccType::ICC_TYPE_CDMA;
869         case int32_t(RadioTech::RADIO_TECHNOLOGY_LTE_CA):
870         case int32_t(RadioTech::RADIO_TECHNOLOGY_LTE):
871         case int32_t(RadioTech::RADIO_TECHNOLOGY_GSM):
872         case int32_t(RadioTech::RADIO_TECHNOLOGY_TD_SCDMA):
873         case int32_t(RadioTech::RADIO_TECHNOLOGY_HSPA):
874         case int32_t(RadioTech::RADIO_TECHNOLOGY_HSPAP):
875         default:
876             break;
877     }
878     return SimFileManager::IccType::ICC_TYPE_USIM;
879 }
880 
IsValidType(SimFileManager::IccType type)881 bool SimFileManager::IsValidType(SimFileManager::IccType type)
882 {
883     switch (type) {
884         case SimFileManager::IccType::ICC_TYPE_CDMA:
885         case SimFileManager::IccType::ICC_TYPE_GSM:
886         case SimFileManager::IccType::ICC_TYPE_IMS:
887         case SimFileManager::IccType::ICC_TYPE_USIM:
888             return true;
889         default:
890             break;
891     }
892     return false;
893 }
894 
GetSimIst()895 std::u16string SimFileManager::GetSimIst()
896 {
897     if (simFile_ == nullptr) {
898         TELEPHONY_LOGE("SimFileManager::GetSimIst simFile nullptr");
899         return Str8ToStr16("");
900     }
901     std::string result = static_cast<IsimFile *>(simFile_.get())->ObtainIsimIst();
902     TELEPHONY_LOGI("SimFileManager::GetSimIst result:%{public}s ", (result.empty() ? "false" : "true"));
903     return Str8ToStr16(result);
904 }
905 
ClearData()906 void SimFileManager::ClearData()
907 {
908     opName_ = "";
909     opKey_ = "";
910     opKeyExt_ = "";
911     if (simFile_ == nullptr) {
912         TELEPHONY_LOGE("SimFileManager::ClearData simFile nullptr");
913         return;
914     }
915     simFile_->ClearData();
916 }
917 } // namespace Telephony
918 } // namespace OHOS
919