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