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