• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2021 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "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