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