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 "icc_dialling_numbers_handler.h"
17
18 using namespace std;
19 using namespace OHOS::AppExecFwk;
20
21 namespace OHOS {
22 namespace Telephony {
23 std::atomic_int IccDiallingNumbersHandler::nextSerialId_(1);
24 std::unordered_map<int, std::shared_ptr<DiallingNumberLoadRequest>> IccDiallingNumbersHandler::requestMap_;
25 static std::mutex requestLock_;
26
IccDiallingNumbersHandler(const std::shared_ptr<AppExecFwk::EventRunner> & runner,std::shared_ptr<IccFileController> fh)27 IccDiallingNumbersHandler::IccDiallingNumbersHandler(
28 const std::shared_ptr<AppExecFwk::EventRunner> &runner, std::shared_ptr<IccFileController> fh)
29 : AppExecFwk::EventHandler(runner), fileController_(fh)
30 {
31 InitFuncMap();
32 }
33
CreateLoadRequest(int fileId,int exId,int indexNum,const std::string & pin2Str,const AppExecFwk::InnerEvent::Pointer & result)34 std::shared_ptr<DiallingNumberLoadRequest> IccDiallingNumbersHandler::CreateLoadRequest(
35 int fileId, int exId, int indexNum, const std::string &pin2Str, const AppExecFwk::InnerEvent::Pointer &result)
36 {
37 std::lock_guard<std::mutex> lock(requestLock_);
38 std::shared_ptr<DiallingNumberLoadRequest> loadRequest =
39 std::make_shared<DiallingNumberLoadRequest>(GetNextSerialId(), fileId, exId, indexNum, pin2Str, result);
40 if (loadRequest == nullptr) {
41 TELEPHONY_LOGE("IccDiallingNumbersHandler loadRequest is nullptr");
42 return nullptr;
43 }
44 IccDiallingNumbersHandler::requestMap_.insert(std::make_pair(loadRequest->GetLoadId(), loadRequest));
45 return loadRequest;
46 }
47
GetFilePath(int elementaryFileId)48 std::string IccDiallingNumbersHandler::GetFilePath(int elementaryFileId)
49 {
50 // GSM SIM file path from TS 51.011
51 std::string mf = MASTER_FILE_SIM;
52 mf.append(DEDICATED_FILE_TELECOM);
53 return elementaryFileId == ELEMENTARY_FILE_ADN ? mf : "";
54 }
55
GetDiallingNumbers(int ef,int exid,int index,AppExecFwk::InnerEvent::Pointer & response)56 void IccDiallingNumbersHandler::GetDiallingNumbers(
57 int ef, int exid, int index, AppExecFwk::InnerEvent::Pointer &response)
58 {
59 std::shared_ptr<DiallingNumberLoadRequest> loadRequest = CreateLoadRequest(ef, exid, index, "", response);
60 AppExecFwk::InnerEvent::Pointer ptDiallingNumberRead =
61 BuildCallerInfo(MSG_SIM_OBTAIN_ADN_DONE, loadRequest->GetLoadId());
62 fileController_->ObtainLinearFixedFile(ef, GetFilePath(ef), index, ptDiallingNumberRead);
63 }
64
GetAllDiallingNumbers(int ef,int exid,AppExecFwk::InnerEvent::Pointer & response)65 void IccDiallingNumbersHandler::GetAllDiallingNumbers(int ef, int exid, AppExecFwk::InnerEvent::Pointer &response)
66 {
67 TELEPHONY_LOGI("IccDiallingNumbersHandler::GetAllDiallingNumbers start");
68 std::shared_ptr<DiallingNumberLoadRequest> loadRequest = CreateLoadRequest(ef, exid, 0, "", response);
69 AppExecFwk::InnerEvent::Pointer ptDiallingNumberReadAll =
70 BuildCallerInfo(MSG_SIM_OBTAIN_ALL_ADN_DONE, loadRequest->GetLoadId());
71 fileController_->ObtainAllLinearFixedFile(ef, GetFilePath(ef), ptDiallingNumberReadAll);
72 }
73
UpdateDiallingNumbers(const DiallingNumberUpdateInfor & infor,AppExecFwk::InnerEvent::Pointer & response)74 void IccDiallingNumbersHandler::UpdateDiallingNumbers(
75 const DiallingNumberUpdateInfor &infor, AppExecFwk::InnerEvent::Pointer &response)
76 {
77 std::shared_ptr<DiallingNumberLoadRequest> loadRequest =
78 CreateLoadRequest(infor.fileId, infor.extFile, infor.index, infor.pin2, response);
79 loadRequest->SetIsDelete(infor.isDel);
80 TELEPHONY_LOGI("UpdateDiallingNumbers contents ready");
81 std::shared_ptr<void> diallingNumberObj = static_cast<std::shared_ptr<void>>(infor.diallingNumber);
82 AppExecFwk::InnerEvent::Pointer linearFileSize =
83 BuildCallerInfo(MSG_SIM_OBTAIN_LINEAR_FILE_SIZE_DONE, diallingNumberObj, loadRequest->GetLoadId());
84 fileController_->ObtainLinearFileSize(infor.fileId, GetFilePath(infor.fileId), linearFileSize);
85 }
86
ProcessEvent(const AppExecFwk::InnerEvent::Pointer & event)87 void IccDiallingNumbersHandler::ProcessEvent(const AppExecFwk::InnerEvent::Pointer &event)
88 {
89 auto id = event->GetInnerEventId();
90 int loadId = 0;
91 TELEPHONY_LOGI("IccDiallingNumbersHandler::ProcessEvent id %{public}d", id);
92 auto itFunc = memberFuncMap_.find(id);
93 if (itFunc != memberFuncMap_.end()) {
94 auto memberFunc = itFunc->second;
95 if (memberFunc != nullptr) {
96 (this->*memberFunc)(event, loadId);
97 SendBackResult(loadId);
98 }
99 } else {
100 TELEPHONY_LOGI("IccDiallingNumbersHandler::ProcessEvent unknown id %{public}d", id);
101 }
102 }
103
ProcessLinearSizeDone(const AppExecFwk::InnerEvent::Pointer & event,int & id)104 void IccDiallingNumbersHandler::ProcessLinearSizeDone(const AppExecFwk::InnerEvent::Pointer &event, int &id)
105 {
106 std::unique_ptr<ControllerToFileMsg> fdError = event->GetUniqueObject<ControllerToFileMsg>();
107 int loadId = 0;
108 std::shared_ptr<DiallingNumberLoadRequest> loadRequest = nullptr;
109 if (fdError != nullptr) {
110 loadId = fdError->arg1;
111 id = loadId;
112 loadRequest = FindLoadRequest(loadId);
113 if (loadRequest != nullptr) {
114 loadRequest->SetException(fdError->exception);
115 }
116 TELEPHONY_LOGE("ProcessLinearSizeDone error occured");
117 return;
118 }
119
120 std::shared_ptr<EfLinearResult> object = event->GetSharedObject<EfLinearResult>();
121 std::shared_ptr<DiallingNumbersInfo> diallingNumberLoad = nullptr;
122 loadId = object->arg1;
123 id = loadId;
124 loadRequest = FindLoadRequest(loadId);
125 if (object != nullptr && (loadRequest != nullptr)) {
126 if (object->exception == nullptr) {
127 std::shared_ptr<void> baseLoad = object->iccLoader;
128 int *dataSize = object->valueData;
129 if (baseLoad != nullptr) {
130 diallingNumberLoad = std::static_pointer_cast<DiallingNumbersInfo>(baseLoad);
131 }
132 if (!FormatNameAndNumber(diallingNumberLoad, loadRequest->GetIsDelete())) {
133 loadRequest->SetException(static_cast<std::shared_ptr<void>>(MakeExceptionResult(
134 PARAMETER_INCORRECT)));
135 return;
136 }
137 SendUpdateCommand(diallingNumberLoad, dataSize[0], loadRequest, loadId);
138 }
139 } else {
140 TELEPHONY_LOGE("ProcessLinearSizeDone: get null pointer!!!");
141 }
142 }
143
ProcessUpdateRecordDone(const AppExecFwk::InnerEvent::Pointer & event,int & id)144 void IccDiallingNumbersHandler::ProcessUpdateRecordDone(const AppExecFwk::InnerEvent::Pointer &event, int &id)
145 {
146 std::unique_ptr<ControllerToFileMsg> object = event->GetUniqueObject<ControllerToFileMsg>();
147 int loadId = object->arg1;
148 id = loadId;
149 std::shared_ptr<DiallingNumberLoadRequest> loadRequest = FindLoadRequest(loadId);
150 if (loadRequest != nullptr) {
151 loadRequest->ClearCount();
152 loadRequest->SetException(object->exception);
153 if (loadRequest->GetException() == nullptr) {
154 loadRequest->SetResult(object->iccLoader);
155 }
156 }
157 }
158
ProcessDiallingNumberAllLoadDone(const AppExecFwk::InnerEvent::Pointer & event,int & id)159 void IccDiallingNumbersHandler::ProcessDiallingNumberAllLoadDone(
160 const AppExecFwk::InnerEvent::Pointer &event, int &id)
161 {
162 std::unique_ptr<ControllerToFileMsg> fdError = event->GetUniqueObject<ControllerToFileMsg>();
163 int loadId = 0;
164 std::shared_ptr<DiallingNumberLoadRequest> loadRequest = nullptr;
165 if (fdError != nullptr) {
166 loadId = fdError->arg1;
167 id = loadId;
168 loadRequest = FindLoadRequest(loadId);
169 if (loadRequest != nullptr) {
170 loadRequest->SetException(fdError->exception);
171 }
172 TELEPHONY_LOGE("ProcessDiallingNumberAllLoadDone error occured");
173 return;
174 }
175
176 std::shared_ptr<MultiRecordResult> object = event->GetSharedObject<MultiRecordResult>();
177 loadId = object->arg1;
178 id = loadId;
179 loadRequest = FindLoadRequest(loadId);
180 if (object->exception != nullptr) {
181 TELEPHONY_LOGE("ProcessDiallingNumberAllLoadDone load failed");
182 if (loadRequest != nullptr) {
183 loadRequest->SetException(object->exception);
184 }
185 return;
186 }
187 std::shared_ptr<std::vector<std::shared_ptr<DiallingNumbersInfo>>> diallingNumberList = nullptr;
188 if (loadRequest != nullptr) {
189 loadRequest->ClearCount();
190 diallingNumberList = std::make_shared<std::vector<std::shared_ptr<DiallingNumbersInfo>>>();
191 loadRequest->SetResult(static_cast<std::shared_ptr<void>>(diallingNumberList));
192 }
193 std::vector<std::string> &dataList = object->fileResults;
194 TELEPHONY_LOGI("ProcessDiallingNumberAllLoadDone start: %{public}zu", dataList.size());
195 int i = 0;
196 for (std::vector<std::string>::iterator it = dataList.begin(); it != dataList.end(); it++, i++) {
197 std::string item = *it;
198 std::shared_ptr<DiallingNumbersInfo> diallingNumber =
199 std::make_shared<DiallingNumbersInfo>(loadRequest->GetElementaryFileId(), 1 + i);
200 FetchDiallingNumberContent(diallingNumber, item);
201 diallingNumberList->push_back(diallingNumber);
202 }
203 }
204
ProcessDiallingNumberLoadDone(const AppExecFwk::InnerEvent::Pointer & event,int & id)205 void IccDiallingNumbersHandler::ProcessDiallingNumberLoadDone(const AppExecFwk::InnerEvent::Pointer &event, int &id)
206 {
207 std::unique_ptr<ControllerToFileMsg> fd = event->GetUniqueObject<ControllerToFileMsg>();
208 int loadId = fd->arg1;
209 id = loadId;
210 std::shared_ptr<DiallingNumberLoadRequest> loadRequest = FindLoadRequest(loadId);
211 if (fd->exception != nullptr) {
212 if (loadRequest != nullptr) {
213 loadRequest->SetException(fd->exception);
214 }
215 TELEPHONY_LOGE("ProcessDiallingNumberLoadDone load failed with exception");
216 return;
217 }
218
219 std::string iccData = fd->resultData;
220 TELEPHONY_LOGI("ProcessDiallingNumberLoadDone handle start");
221 std::shared_ptr<DiallingNumbersInfo> diallingNumber =
222 std::make_shared<DiallingNumbersInfo>(loadRequest->GetElementaryFileId(), loadRequest->GetIndex());
223 FetchDiallingNumberContent(diallingNumber, iccData);
224 if (loadRequest != nullptr) {
225 loadRequest->SetResult(static_cast<std::shared_ptr<void>>(diallingNumber));
226 }
227 }
228
SendUpdateCommand(const std::shared_ptr<DiallingNumbersInfo> & diallingNumber,int length,const std::shared_ptr<DiallingNumberLoadRequest> & loadRequest,int loadId)229 void IccDiallingNumbersHandler::SendUpdateCommand(const std::shared_ptr<DiallingNumbersInfo> &diallingNumber,
230 int length, const std::shared_ptr<DiallingNumberLoadRequest> &loadRequest, int loadId)
231 {
232 int dataLen = length;
233 if (dataLen == INVALID_LENGTH) {
234 dataLen = RECORD_LENGTH;
235 }
236 TELEPHONY_LOGI("DiallingNumbersHandler::SendUpdateCommand start!! %{public}d %{public}d", dataLen, length);
237 std::shared_ptr<unsigned char> dataDiallingNumber = CreateSavingSequence(diallingNumber, dataLen);
238 if (dataDiallingNumber != nullptr) {
239 std::string data = SIMUtils::BytesConvertToHexString(dataDiallingNumber.get(), dataLen);
240 AppExecFwk::InnerEvent::Pointer event =
241 BuildCallerInfo(MSG_SIM_RENEW_ADN_DONE, diallingNumber, loadId);
242 fileController_->UpdateLinearFixedFile(loadRequest->GetElementaryFileId(),
243 GetFilePath(loadRequest->GetElementaryFileId()), loadRequest->GetIndex(), data, dataLen,
244 loadRequest->GetPin2(), event);
245 loadRequest->InitCount();
246 } else {
247 TELEPHONY_LOGE("invalid adn data");
248 loadRequest->SetException(static_cast<std::shared_ptr<void>>(MakeExceptionResult(
249 PARAMETER_INCORRECT)));
250 }
251 }
252
SendBackResult(int loadId)253 bool IccDiallingNumbersHandler::SendBackResult(int loadId)
254 {
255 std::shared_ptr<DiallingNumberLoadRequest> loadRequest = FindLoadRequest(loadId);
256 if (loadRequest == nullptr) {
257 return false;
258 }
259 if (loadRequest->GetCaller() == nullptr || loadRequest->HasCount()) {
260 return false;
261 }
262 auto owner = loadRequest->GetCaller()->GetOwner();
263 int id = loadRequest->GetCaller()->GetInnerEventId();
264 std::unique_ptr<DiallingNumbersHandleHolder> fd =
265 loadRequest->GetCaller()->GetUniqueObject<DiallingNumbersHandleHolder>();
266 std::unique_ptr<DiallingNumbersHandlerResult> data = make_unique<DiallingNumbersHandlerResult>(fd.get());
267 data->result = loadRequest->GetResult();
268 data->exception = loadRequest->GetException();
269 if (owner == nullptr) {
270 TELEPHONY_LOGE("IccDiallingNumbersHandler::SendBackResult owner null pointer");
271 return false;
272 }
273 owner->SendEvent(id, data);
274 ClearLoadRequest(loadId);
275 TELEPHONY_LOGI("IccDiallingNumbersHandler::SendBackResult send end");
276 return true;
277 }
278
BuildCallerInfo(int eventId,int loadId)279 AppExecFwk::InnerEvent::Pointer IccDiallingNumbersHandler::BuildCallerInfo(int eventId, int loadId)
280 {
281 std::unique_ptr<FileToControllerMsg> object = std::make_unique<FileToControllerMsg>();
282 object->arg1 = loadId;
283 int eventParam = 0;
284 AppExecFwk::InnerEvent::Pointer event = AppExecFwk::InnerEvent::Get(eventId, object, eventParam);
285 event->SetOwner(shared_from_this());
286 return event;
287 }
288
BuildCallerInfo(int eventId,std::shared_ptr<void> pobj,int loadId)289 AppExecFwk::InnerEvent::Pointer IccDiallingNumbersHandler::BuildCallerInfo(
290 int eventId, std::shared_ptr<void> pobj, int loadId)
291 {
292 std::unique_ptr<FileToControllerMsg> object = std::make_unique<FileToControllerMsg>();
293 object->arg1 = loadId;
294 object->iccLoader = pobj;
295 int eventParam = 0;
296 AppExecFwk::InnerEvent::Pointer event = AppExecFwk::InnerEvent::Get(eventId, object, eventParam);
297 event->SetOwner(shared_from_this());
298 return event;
299 }
300
FindLoadRequest(int serial)301 std::shared_ptr<DiallingNumberLoadRequest> IccDiallingNumbersHandler::FindLoadRequest(int serial)
302 {
303 std::lock_guard<std::mutex> lock(requestLock_);
304 std::shared_ptr<DiallingNumberLoadRequest> loadRequest = nullptr;
305 auto iter = IccDiallingNumbersHandler::requestMap_.find(serial);
306 if (iter == IccDiallingNumbersHandler::requestMap_.end()) {
307 TELEPHONY_LOGI("FindLoadRequest not found serial:%{public}d", serial);
308 } else {
309 loadRequest = iter->second;
310 }
311 TELEPHONY_LOGI("FindLoadRequest : %{public}d", serial);
312 return loadRequest;
313 }
314
ClearLoadRequest(int serial)315 void IccDiallingNumbersHandler::ClearLoadRequest(int serial)
316 {
317 std::lock_guard<std::mutex> lock(requestLock_);
318 IccDiallingNumbersHandler::requestMap_.erase(serial);
319 }
320
FetchDiallingNumberContent(const std::shared_ptr<DiallingNumbersInfo> & diallingNumber,const std::string & recordData)321 void IccDiallingNumbersHandler::FetchDiallingNumberContent(
322 const std::shared_ptr<DiallingNumbersInfo> &diallingNumber, const std::string &recordData)
323 {
324 TELEPHONY_LOGI("FetchDiallingNumberContent start");
325 int recordLen = 0;
326 std::shared_ptr<unsigned char> data = SIMUtils::HexStringConvertToBytes(recordData, recordLen);
327 if (diallingNumber == nullptr || data == nullptr) {
328 TELEPHONY_LOGE("FetchDiallingNumberContent null data");
329 return;
330 }
331 /* parse name */
332 int offset = 0;
333 int length = recordLen - PRE_BYTES_NUM;
334 unsigned char *record = data.get();
335 std::string tempStrTag = SIMUtils::DiallingNumberStringFieldConvertToString(data, offset, length, NAME_CHAR_POS);
336 diallingNumber->name_ = Str8ToStr16(tempStrTag);
337 /* parse length */
338 offset += length;
339 length = static_cast<int>(record[offset]);
340 if (length > MAX_NUMBER_SIZE_BYTES) {
341 diallingNumber->number_ = u"";
342 TELEPHONY_LOGE("FetchDiallingNumberContent number error");
343 return;
344 }
345 /* parse number */
346 ++offset;
347 std::string tempStrNumber =
348 SimNumberDecode::BCDConvertToString(data, offset, length, SimNumberDecode::BCD_TYPE_ADN);
349 diallingNumber->number_ = Str8ToStr16(tempStrNumber);
350 TELEPHONY_LOGI("FetchDiallingNumberContent result end");
351 }
352
CreateSavingSequence(const std::shared_ptr<DiallingNumbersInfo> & diallingNumber,int dataLength)353 std::shared_ptr<unsigned char> IccDiallingNumbersHandler::CreateSavingSequence(
354 const std::shared_ptr<DiallingNumbersInfo> &diallingNumber, int dataLength)
355 {
356 std::shared_ptr<unsigned char> byteTagPac = nullptr;
357 std::shared_ptr<unsigned char> diallingNumberStringPac = nullptr;
358 unsigned char *byteTag = nullptr;
359 unsigned char *diallingNumberString = nullptr;
360 int offset = dataLength - PRE_BYTES_NUM;
361 int byteTagLen = 0;
362 if (dataLength < 0) {
363 return nullptr;
364 }
365 unsigned char *cache = (unsigned char *)calloc(dataLength, sizeof(unsigned char));
366 if (cache == nullptr) {
367 return nullptr;
368 }
369 diallingNumberStringPac = std::shared_ptr<unsigned char>(cache);
370 diallingNumberString = diallingNumberStringPac.get();
371 for (int i = 0; i < dataLength; i++) {
372 diallingNumberString[i] = (unsigned char)BYTE_VALUE;
373 }
374 TELEPHONY_LOGI("CreateSavingSequence contents start");
375
376 uint maxNumberSize = (DIALING_NUMBERS_END - DIALING_NUMBERS_BEGIN + 1) * LENGTH_RATE;
377 if (diallingNumber->number_.empty()) {
378 TELEPHONY_LOGE("CreateSavingSequence number should not be empty");
379 return diallingNumberStringPac;
380 } else if (diallingNumber->number_.size() > maxNumberSize) {
381 TELEPHONY_LOGE("CreateSavingSequence number length exceed the maximum");
382 return nullptr;
383 }
384 byteTagPac = CreateNameSequence(diallingNumber->name_, byteTagLen);
385 byteTag = byteTagPac.get();
386
387 if (byteTagLen <= offset) {
388 std::string tempNum = Str16ToStr8(diallingNumber->number_);
389 FillNumberFiledForDiallingNumber(diallingNumberStringPac, tempNum, dataLength);
390 if (byteTagLen > 0) {
391 SIMUtils::ArrayCopy(byteTag, 0, diallingNumberString, 0, byteTagLen);
392 }
393 TELEPHONY_LOGI("CreateSavingSequence result: %{public}d", byteTagLen);
394 return diallingNumberStringPac;
395 } else {
396 TELEPHONY_LOGE("CreateSavingSequence max data length is %{public}d", offset);
397 return nullptr;
398 }
399 }
400
FillNumberFiledForDiallingNumber(std::shared_ptr<unsigned char> diallingNumber,const std::string & number,int dataLength)401 void IccDiallingNumbersHandler::FillNumberFiledForDiallingNumber(
402 std::shared_ptr<unsigned char> diallingNumber, const std::string &number, int dataLength)
403 {
404 if (diallingNumber == nullptr) {
405 return;
406 }
407 unsigned char *diallingNumberString = diallingNumber.get();
408 int offSet = dataLength - PRE_BYTES_NUM;
409 std::vector<uint8_t> bcdCodes;
410 if (!SimNumberDecode::NumberConvertToBCD(number, bcdCodes, false, SimNumberDecode::BCD_TYPE_ADN)) {
411 TELEPHONY_LOGE("FillNumberFiledForDiallingNumber fail at to SimNumberDecode::NumberConvertToBCD");
412 return;
413 }
414 TELEPHONY_LOGI(" get result from SimNumberDecode::NumberConvertToBCD !! size:%{public}zu", bcdCodes.size());
415 for (int i = 0; i < bcdCodes.size(); ++i) {
416 diallingNumberString[offSet + TON_NPI_NUMBER + i] = bcdCodes.at(i);
417 }
418 uint index = offSet + BCD_NUMBER_BYTES;
419 unsigned char value = (unsigned char)(bcdCodes.size());
420 diallingNumberString[index] = value;
421 index = offSet + MORE_FILE_ID;
422 value = (unsigned char)(BYTE_VALUE);
423 diallingNumberString[index] = value;
424 index = offSet + EXTRA_FILE_ID;
425 diallingNumberString[index] = value;
426 }
427
CreateNameSequence(const std::u16string & name,int & seqLength)428 std::shared_ptr<unsigned char> IccDiallingNumbersHandler::CreateNameSequence(
429 const std::u16string &name, int &seqLength)
430 {
431 std::string tempTag = Str16ToStr8(name);
432 std::shared_ptr<unsigned char> seqResult = nullptr;
433 if (SimCharDecode::IsChineseString(tempTag)) {
434 std::string sq = SimCharDecode::CharCodeToSequence(name, true);
435 seqResult = SIMUtils::HexStringConvertToBytes(sq, seqLength);
436 TELEPHONY_LOGI("chinese alphabet encode result %{public}s %{public}d", sq.c_str(), seqLength);
437 } else {
438 std::string sq = SimCharDecode::CharCodeToSequence(tempTag, false);
439 seqResult = SIMUtils::HexStringConvertToBytes(sq, seqLength);
440 TELEPHONY_LOGI("english alphabet encode result %{public}s %{public}d", sq.c_str(), seqLength);
441 }
442 return seqResult;
443 }
444
FormatNameAndNumber(std::shared_ptr<DiallingNumbersInfo> & diallingNumber,bool isDel)445 bool IccDiallingNumbersHandler::FormatNameAndNumber(
446 std::shared_ptr<DiallingNumbersInfo> &diallingNumber, bool isDel)
447 {
448 if (isDel) {
449 diallingNumber->number_ = u"";
450 diallingNumber->name_ = u"";
451 return true;
452 }
453 std::string nameTemp = Str16ToStr8(diallingNumber->name_);
454 std::string numberTemp = Str16ToStr8(diallingNumber->number_);
455 std::string &&name = SIMUtils::Trim(nameTemp);
456 std::string &&number = SIMUtils::Trim(numberTemp);
457
458 if (name.empty() || number.empty()) {
459 TELEPHONY_LOGE("name or number shuld not be empty");
460 return false;
461 }
462 std::u16string &&nameWide = Str8ToStr16(name);
463 std::u16string &&numberWide = Str8ToStr16(number);
464
465 uint nameMaxNum = SimCharDecode::IsChineseString(name) ? MAX_CHINESE_NAME : MAX_ENGLISH_NAME;
466 if (nameWide.size() > nameMaxNum) {
467 diallingNumber->name_ = nameWide.substr(0, nameMaxNum);
468 }
469
470 uint numberMaxNum = MAX_NUMBER_CHAR;
471 if (numberWide.size() > numberMaxNum) {
472 std::string tempNum = number.substr(0, numberMaxNum);
473 if (SimNumberDecode::IsValidNumberString(tempNum)) {
474 diallingNumber->number_ = Str8ToStr16(tempNum);
475 } else {
476 TELEPHONY_LOGE("invalid number full string");
477 return false;
478 }
479 } else {
480 if (!SimNumberDecode::IsValidNumberString(number)) {
481 TELEPHONY_LOGE("invalid number string");
482 return false;
483 }
484 }
485 return true;
486 }
487
MakeExceptionResult(int code)488 std::shared_ptr<HRilRadioResponseInfo> IccDiallingNumbersHandler::MakeExceptionResult(int code)
489 {
490 std::shared_ptr<HRilRadioResponseInfo> responseInfo = std::make_shared<HRilRadioResponseInfo>();
491 responseInfo->error = static_cast<Telephony::HRilErrType>(code);
492 return responseInfo;
493 }
494
InitFuncMap()495 void IccDiallingNumbersHandler::InitFuncMap()
496 {
497 memberFuncMap_[MSG_SIM_OBTAIN_ADN_DONE] = &IccDiallingNumbersHandler::ProcessDiallingNumberLoadDone;
498 memberFuncMap_[MSG_SIM_OBTAIN_ALL_ADN_DONE] = &IccDiallingNumbersHandler::ProcessDiallingNumberAllLoadDone;
499 memberFuncMap_[MSG_SIM_OBTAIN_LINEAR_FILE_SIZE_DONE] = &IccDiallingNumbersHandler::ProcessLinearSizeDone;
500 memberFuncMap_[MSG_SIM_RENEW_ADN_DONE] = &IccDiallingNumbersHandler::ProcessUpdateRecordDone;
501 }
502
UpdateFileController(const std::shared_ptr<IccFileController> & fileController)503 void IccDiallingNumbersHandler::UpdateFileController(const std::shared_ptr<IccFileController> &fileController)
504 {
505 fileController_ = fileController;
506 }
~IccDiallingNumbersHandler()507 IccDiallingNumbersHandler::~IccDiallingNumbersHandler() {}
508 } // namespace Telephony
509 } // namespace OHOS
510