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_file_controller.h"
17
18 using namespace std;
19 using namespace OHOS::AppExecFwk;
20
21 namespace OHOS {
22 namespace Telephony {
IccFileController(const std::string & name,int slotId)23 IccFileController::IccFileController(const std::string &name, int slotId) : TelEventHandler(name), slotId_(slotId) {}
24
ProcessEvent(const AppExecFwk::InnerEvent::Pointer & event)25 void IccFileController::ProcessEvent(const AppExecFwk::InnerEvent::Pointer &event)
26 {
27 if (event == nullptr) {
28 TELEPHONY_LOGE("event is nullptr!");
29 return;
30 }
31 uint32_t id = event->GetInnerEventId();
32 TELEPHONY_LOGD("IccFileController ProcessEvent Id is %{public}d", id);
33 if (ProcessErrorResponse(event)) {
34 return;
35 }
36 switch (id) {
37 case MSG_SIM_OBTAIN_SIZE_OF_LINEAR_ELEMENTARY_FILE_DONE:
38 ProcessLinearRecordSize(event);
39 break;
40 case MSG_SIM_OBTAIN_SIZE_OF_FIXED_ELEMENTARY_FILE_DONE:
41 ProcessRecordSize(event);
42 break;
43 case MSG_SIM_OBTAIN_SIZE_OF_TRANSPARENT_ELEMENTARY_FILE_DONE:
44 ProcessBinarySize(event);
45 break;
46 case MSG_SIM_OBTAIN_FIXED_ELEMENTARY_FILE_DONE:
47 ProcessReadRecord(event);
48 break;
49 case MSG_SIM_OBTAIN_ICON_DONE:
50 case MSG_SIM_UPDATE_LINEAR_FIXED_FILE_DONE:
51 case MSG_SIM_UPDATE_TRANSPARENT_ELEMENTARY_FILE_DONE:
52 case MSG_SIM_OBTAIN_TRANSPARENT_ELEMENTARY_FILE_DONE:
53 ProcessReadBinary(event);
54 break;
55 default:
56 break;
57 }
58 }
59
ProcessLinearRecordSize(const AppExecFwk::InnerEvent::Pointer & event)60 void IccFileController::ProcessLinearRecordSize(const AppExecFwk::InnerEvent::Pointer &event)
61 {
62 std::unique_ptr<IccFromRilMsg> rcvMsg = event->GetUniqueObject<IccFromRilMsg>();
63 if (rcvMsg == nullptr) {
64 TELEPHONY_LOGE("rcvMsg is nullptr");
65 return;
66 }
67 IccFileData *result = &(rcvMsg->fileData);
68 std::shared_ptr<IccControllerHolder> hd = rcvMsg->controlHolder;
69 if (result == nullptr || hd == nullptr) {
70 TELEPHONY_LOGE("result or hd is nullptr");
71 return;
72 }
73 const AppExecFwk::InnerEvent::Pointer &process = hd->fileLoaded;
74 TELEPHONY_LOGI("ProcessLinearRecordSize --- resultData: --- %{public}s", result->resultData.c_str());
75 int recordLen = 0;
76 int fileSize[] = { 0, 0, 0 };
77 std::shared_ptr<unsigned char> rawData = SIMUtils::HexStringConvertToBytes(result->resultData, recordLen);
78 if (recordLen > LENGTH_OF_RECORD) {
79 unsigned char *fileData = rawData.get();
80 ParseFileSize(fileSize, RECORD_NUM, fileData);
81 }
82 SendEfLinearResult(process, fileSize, RECORD_NUM);
83 }
84
ProcessRecordSize(const AppExecFwk::InnerEvent::Pointer & event)85 void IccFileController::ProcessRecordSize(const AppExecFwk::InnerEvent::Pointer &event)
86 {
87 int size = 0;
88 std::unique_ptr<IccFromRilMsg> rcvMsg = event->GetUniqueObject<IccFromRilMsg>();
89 if (rcvMsg == nullptr) {
90 TELEPHONY_LOGE("rcvMsg is nullptr");
91 return;
92 }
93 IccFileData *result = &(rcvMsg->fileData);
94 std::shared_ptr<IccControllerHolder> hd = rcvMsg->controlHolder;
95 if (result == nullptr || hd == nullptr) {
96 TELEPHONY_LOGE("result or hd is nullptr");
97 return;
98 }
99 TELEPHONY_LOGI("ProcessRecordSize --- resultData: --- %{public}s", result->resultData.c_str());
100 int recordLen = 0;
101 std::shared_ptr<unsigned char> rawData = SIMUtils::HexStringConvertToBytes(result->resultData, recordLen);
102 if (rawData == nullptr) {
103 TELEPHONY_LOGE("rawData is nullptr");
104 SendResponse(rcvMsg->controlHolder, &(rcvMsg->fileData));
105 return;
106 }
107 unsigned char *fileData = rawData.get();
108 std::string path = CheckRightPath(hd->filePath, hd->fileId);
109 if (recordLen > LENGTH_OF_RECORD) {
110 if (!IsValidRecordSizeData(fileData)) {
111 TELEPHONY_LOGE("ProcessRecordSize get error filetype");
112 SendResponse(rcvMsg->controlHolder, &(rcvMsg->fileData));
113 return;
114 }
115 GetFileAndDataSize(fileData, hd->fileSize, size);
116 if (hd->fileSize != 0) {
117 hd->countFiles = size / hd->fileSize;
118 }
119 }
120 TELEPHONY_LOGI("ProcessRecordSize fileId:%{public}d %{public}d %{public}d %{public}d", hd->fileId, size,
121 hd->fileSize, hd->countFiles);
122 if (telRilManager_ != nullptr) {
123 SimIoRequestInfo msg;
124 msg.command = CONTROLLER_REQ_READ_RECORD;
125 msg.fileId = hd->fileId;
126 msg.p1 = hd->fileNum;
127 msg.p2 = ICC_FILE_CURRENT_MODE;
128 msg.p3 = hd->fileSize;
129 msg.data = IccFileController::NULLSTR;
130 msg.path = path;
131 msg.pin2 = "";
132 telRilManager_->GetSimIO(slotId_, msg, BuildCallerInfo(MSG_SIM_OBTAIN_FIXED_ELEMENTARY_FILE_DONE, hd));
133 }
134 }
135
ProcessBinarySize(const AppExecFwk::InnerEvent::Pointer & event)136 void IccFileController::ProcessBinarySize(const AppExecFwk::InnerEvent::Pointer &event)
137 {
138 std::unique_ptr<IccFromRilMsg> rcvMsg = event->GetUniqueObject<IccFromRilMsg>();
139 if (rcvMsg == nullptr) {
140 TELEPHONY_LOGE("rcvMsg is nullptr");
141 return;
142 }
143 IccFileData *result = &(rcvMsg->fileData);
144 std::shared_ptr<IccControllerHolder> hd = rcvMsg->controlHolder;
145 if (result == nullptr || hd == nullptr) {
146 TELEPHONY_LOGE("ProcessBinarySize result or hd is nullptr");
147 return;
148 }
149 TELEPHONY_LOGI("ProcessBinarySize --- resultData: --- %{public}s", result->resultData.c_str());
150 int binaryLen = 0;
151 std::shared_ptr<unsigned char> rawData = SIMUtils::HexStringConvertToBytes(result->resultData, binaryLen);
152 if (rawData == nullptr) {
153 TELEPHONY_LOGE("ProcessBinarySize rawData is nullptr");
154 SendResponse(rcvMsg->controlHolder, &(rcvMsg->fileData));
155 return;
156 }
157 unsigned char *fileData = rawData.get();
158 int size = 0;
159 if (binaryLen > STRUCTURE_OF_DATA) {
160 if (!IsValidBinarySizeData(fileData)) {
161 TELEPHONY_LOGE("ProcessBinarySize get error filetype");
162 SendResponse(rcvMsg->controlHolder, &(rcvMsg->fileData));
163 return;
164 }
165 GetDataSize(fileData, size);
166 }
167 int fileId = rcvMsg->arg1;
168 TELEPHONY_LOGI("ProcessBinarySize fileId:%{public}d size:%{public}d", fileId, size);
169 const AppExecFwk::InnerEvent::Pointer &evt = hd->fileLoaded;
170 if (evt == nullptr) {
171 TELEPHONY_LOGE("ProcessBinarySize isNull is null pointer");
172 return;
173 }
174 AppExecFwk::InnerEvent::Pointer process =
175 BuildCallerInfo(MSG_SIM_OBTAIN_TRANSPARENT_ELEMENTARY_FILE_DONE, fileId, 0, evt);
176 if (telRilManager_ != nullptr) {
177 SimIoRequestInfo msg;
178 msg.command = CONTROLLER_REQ_READ_BINARY;
179 msg.fileId = fileId;
180 msg.p1 = 0;
181 msg.p2 = 0;
182 msg.p3 = static_cast<int32_t>(size);
183 msg.data = IccFileController::NULLSTR;
184 msg.path = ObtainElementFilePath(fileId);
185 msg.pin2 = "";
186 telRilManager_->GetSimIO(slotId_, msg, process);
187 }
188 }
189
ProcessReadRecord(const AppExecFwk::InnerEvent::Pointer & event)190 void IccFileController::ProcessReadRecord(const AppExecFwk::InnerEvent::Pointer &event)
191 {
192 std::string str = IccFileController::NULLSTR;
193 std::string path = IccFileController::NULLSTR;
194 std::unique_ptr<IccFromRilMsg> rcvMsg = event->GetUniqueObject<IccFromRilMsg>();
195 if (rcvMsg == nullptr || rcvMsg->controlHolder == nullptr) {
196 TELEPHONY_LOGE("rcvMsg is nullptr");
197 return;
198 }
199 const AppExecFwk::InnerEvent::Pointer &process = rcvMsg->controlHolder->fileLoaded;
200 IccFileData *result = &(rcvMsg->fileData);
201 std::shared_ptr<IccControllerHolder> hd = rcvMsg->controlHolder;
202 if (hd == nullptr) {
203 TELEPHONY_LOGE("hd is nullptr");
204 return;
205 }
206 TELEPHONY_LOGI("ProcessReadRecord %{public}d %{public}d %{public}d %{public}s", hd->getAllFile, hd->fileNum,
207 hd->countFiles, result->resultData.c_str());
208 path = CheckRightPath(hd->filePath, hd->fileId);
209 if (hd->getAllFile) {
210 hd->fileResults.push_back(result->resultData);
211 hd->fileNum++;
212 if (hd->fileNum > hd->countFiles) {
213 SendMultiRecordResult(process, hd->fileResults);
214 } else {
215 SimIoRequestInfo msg;
216 msg.command = CONTROLLER_REQ_READ_RECORD;
217 msg.fileId = hd->fileId;
218 msg.p1 = hd->fileNum;
219 msg.p2 = ICC_FILE_CURRENT_MODE;
220 msg.p3 = hd->fileSize;
221 msg.data = IccFileController::NULLSTR;
222 msg.path = path;
223 msg.pin2 = "";
224 telRilManager_->GetSimIO(slotId_, msg, BuildCallerInfo(MSG_SIM_OBTAIN_FIXED_ELEMENTARY_FILE_DONE, hd));
225 }
226 } else {
227 SendResponse(rcvMsg->controlHolder, &(rcvMsg->fileData));
228 }
229 }
230
ProcessReadBinary(const AppExecFwk::InnerEvent::Pointer & event)231 void IccFileController::ProcessReadBinary(const AppExecFwk::InnerEvent::Pointer &event)
232 {
233 TELEPHONY_LOGD("IccFileController MSG_SIM_OBTAIN_TRANSPARENT_ELEMENTARY_FILE_DONE");
234 std::unique_ptr<IccFromRilMsg> rcvMsg = event->GetUniqueObject<IccFromRilMsg>();
235 if (rcvMsg == nullptr || rcvMsg->controlHolder == nullptr) {
236 TELEPHONY_LOGE("rcvMsg or rcvMsg->controlHolder is nullptr");
237 return;
238 }
239 SendResponse(rcvMsg->controlHolder, &(rcvMsg->fileData));
240 }
241
ObtainElementFileForPublic(int efId)242 std::string IccFileController::ObtainElementFileForPublic(int efId)
243 {
244 std::string mf = MASTER_FILE_SIM;
245 if (efId == ELEMENTARY_FILE_ICCID || efId == ELEMENTARY_FILE_PL) {
246 return mf;
247 }
248 mf.append(DEDICATED_FILE_TELECOM);
249 if (efId == ELEMENTARY_FILE_ADN || efId == ELEMENTARY_FILE_FDN || efId == ELEMENTARY_FILE_MSISDN ||
250 efId == ELEMENTARY_FILE_SDN || efId == ELEMENTARY_FILE_EXT1 || efId == ELEMENTARY_FILE_EXT2 ||
251 efId == ELEMENTARY_FILE_EXT3) {
252 return mf;
253 }
254 if (efId == ELEMENTARY_FILE_PBR) {
255 mf.append(DEDICATED_FILE_DIALLING_NUMBERS);
256 return mf;
257 }
258 if (efId == ELEMENTARY_FILE_IMG) {
259 mf.append(DEDICATED_FILE_GRAPHICS);
260 return mf;
261 }
262 return IccFileController::NULLSTR;
263 }
264
265 // implementation ObtainBinaryFile
ObtainBinaryFile(int fileId,const AppExecFwk::InnerEvent::Pointer & event)266 void IccFileController::ObtainBinaryFile(int fileId, const AppExecFwk::InnerEvent::Pointer &event)
267 {
268 TELEPHONY_LOGD("IccFileController::ObtainBinaryFile start");
269 AppExecFwk::InnerEvent::Pointer process =
270 BuildCallerInfo(MSG_SIM_OBTAIN_SIZE_OF_TRANSPARENT_ELEMENTARY_FILE_DONE, fileId, 0, event);
271 if (telRilManager_ != nullptr) {
272 SimIoRequestInfo msg;
273 msg.command = CONTROLLER_REQ_GET_RESPONSE;
274 msg.fileId = fileId;
275 msg.p1 = 0;
276 msg.p2 = 0;
277 msg.p3 = GET_RESPONSE_ELEMENTARY_FILE_SIZE_BYTES;
278 msg.data = IccFileController::NULLSTR;
279 msg.path = ObtainElementFilePath(fileId);
280 msg.pin2 = "";
281 telRilManager_->GetSimIO(slotId_, msg, process);
282 }
283 TELEPHONY_LOGD("IccFileController::ObtainBinaryFile end");
284 }
285
ObtainBinaryFile(int fileId,int size,const AppExecFwk::InnerEvent::Pointer & event)286 void IccFileController::ObtainBinaryFile(int fileId, int size, const AppExecFwk::InnerEvent::Pointer &event)
287 {
288 AppExecFwk::InnerEvent::Pointer process =
289 BuildCallerInfo(MSG_SIM_OBTAIN_TRANSPARENT_ELEMENTARY_FILE_DONE, fileId, 0, event);
290 if (telRilManager_ != nullptr) {
291 SimIoRequestInfo msg;
292 msg.command = CONTROLLER_REQ_READ_BINARY;
293 msg.fileId = fileId;
294 msg.p1 = 0;
295 msg.p2 = 0;
296 msg.p3 = size;
297 msg.data = IccFileController::NULLSTR;
298 msg.path = ObtainElementFilePath(fileId);
299 msg.pin2 = "";
300 telRilManager_->GetSimIO(slotId_, msg, process);
301 }
302 }
303
304 // implementation ObtainLinearFixedFile
ObtainLinearFixedFile(int fileId,const std::string & path,int fileNum,const AppExecFwk::InnerEvent::Pointer & event)305 void IccFileController::ObtainLinearFixedFile(
306 int fileId, const std::string &path, int fileNum, const AppExecFwk::InnerEvent::Pointer &event)
307 {
308 std::string filePath = CheckRightPath(path, fileId);
309 std::shared_ptr<IccControllerHolder> ctrlHolder = std::make_shared<IccControllerHolder>(fileId, fileNum, filePath);
310 ctrlHolder->fileLoaded = std::move(const_cast<AppExecFwk::InnerEvent::Pointer &>(event));
311 AppExecFwk::InnerEvent::Pointer process =
312 BuildCallerInfo(MSG_SIM_OBTAIN_SIZE_OF_FIXED_ELEMENTARY_FILE_DONE, ctrlHolder);
313 if (telRilManager_ != nullptr) {
314 SimIoRequestInfo msg;
315 msg.command = CONTROLLER_REQ_GET_RESPONSE;
316 msg.fileId = fileId;
317 msg.p1 = 0;
318 msg.p2 = 0;
319 msg.p3 = GET_RESPONSE_ELEMENTARY_FILE_SIZE_BYTES;
320 msg.data = IccFileController::NULLSTR;
321 msg.path = filePath;
322 msg.pin2 = "";
323 telRilManager_->GetSimIO(slotId_, msg, process);
324 }
325 }
326
ObtainLinearFixedFile(int fileId,int fileNum,const AppExecFwk::InnerEvent::Pointer & event)327 void IccFileController::ObtainLinearFixedFile(int fileId, int fileNum, const AppExecFwk::InnerEvent::Pointer &event)
328 {
329 ObtainLinearFixedFile(fileId, ObtainElementFilePath(fileId), fileNum, event);
330 }
331
332 // implementation ObtainAllLinearFixedFile
ObtainAllLinearFixedFile(int fileId,const std::string & path,const AppExecFwk::InnerEvent::Pointer & event)333 void IccFileController::ObtainAllLinearFixedFile(
334 int fileId, const std::string &path, const AppExecFwk::InnerEvent::Pointer &event)
335 {
336 std::string filePath = CheckRightPath(path, fileId);
337 std::shared_ptr<IccControllerHolder> ctrlHolder = std::make_shared<IccControllerHolder>(fileId, filePath);
338 ctrlHolder->fileLoaded = std::move(const_cast<AppExecFwk::InnerEvent::Pointer &>(event));
339 AppExecFwk::InnerEvent::Pointer process =
340 BuildCallerInfo(MSG_SIM_OBTAIN_SIZE_OF_FIXED_ELEMENTARY_FILE_DONE, ctrlHolder);
341 if (telRilManager_ != nullptr) {
342 SimIoRequestInfo msg;
343 msg.command = CONTROLLER_REQ_GET_RESPONSE;
344 msg.fileId = fileId;
345 msg.p1 = 0;
346 msg.p2 = 0;
347 msg.p3 = GET_RESPONSE_ELEMENTARY_FILE_SIZE_BYTES;
348 msg.data = IccFileController::NULLSTR;
349 msg.path = filePath;
350 msg.pin2 = "";
351 telRilManager_->GetSimIO(slotId_, msg, process);
352 }
353 }
354
ObtainAllLinearFixedFile(int fileId,const AppExecFwk::InnerEvent::Pointer & event)355 void IccFileController::ObtainAllLinearFixedFile(int fileId, const AppExecFwk::InnerEvent::Pointer &event)
356 {
357 ObtainAllLinearFixedFile(fileId, ObtainElementFilePath(fileId), event);
358 }
359
ObtainLinearFileSize(int fileId,const std::string & path,const AppExecFwk::InnerEvent::Pointer & event)360 void IccFileController::ObtainLinearFileSize(
361 int fileId, const std::string &path, const AppExecFwk::InnerEvent::Pointer &event)
362 {
363 std::string filePath = CheckRightPath(path, fileId);
364 std::shared_ptr<IccControllerHolder> ctrlHolder = std::make_shared<IccControllerHolder>(fileId, filePath);
365 ctrlHolder->fileLoaded = std::move(const_cast<AppExecFwk::InnerEvent::Pointer &>(event));
366 AppExecFwk::InnerEvent::Pointer process =
367 BuildCallerInfo(MSG_SIM_OBTAIN_SIZE_OF_LINEAR_ELEMENTARY_FILE_DONE, ctrlHolder);
368 if (telRilManager_ != nullptr) {
369 SimIoRequestInfo msg;
370 msg.command = CONTROLLER_REQ_GET_RESPONSE;
371 msg.fileId = fileId;
372 msg.p1 = 0;
373 msg.p2 = 0;
374 msg.p3 = GET_RESPONSE_ELEMENTARY_FILE_SIZE_BYTES;
375 msg.data = IccFileController::NULLSTR;
376 msg.path = filePath;
377 msg.pin2 = "";
378 telRilManager_->GetSimIO(slotId_, msg, process);
379 }
380 }
381
ObtainLinearFileSize(int fileId,const AppExecFwk::InnerEvent::Pointer & event)382 void IccFileController::ObtainLinearFileSize(int fileId, const AppExecFwk::InnerEvent::Pointer &event)
383 {
384 ObtainLinearFileSize(fileId, ObtainElementFilePath(fileId), event);
385 }
386
UpdateLinearFixedFile(int fileId,const std::string & path,int fileNum,std::string data,int dataLength,const std::string pin2,const AppExecFwk::InnerEvent::Pointer & onComplete)387 void IccFileController::UpdateLinearFixedFile(int fileId, const std::string &path, int fileNum, std::string data,
388 int dataLength, const std::string pin2, const AppExecFwk::InnerEvent::Pointer &onComplete)
389 {
390 std::string filePath = CheckRightPath(path, fileId);
391 std::shared_ptr<IccControllerHolder> ctrlHolder = std::make_shared<IccControllerHolder>(fileId);
392 ctrlHolder->fileLoaded = std::move(const_cast<AppExecFwk::InnerEvent::Pointer &>(onComplete));
393 AppExecFwk::InnerEvent::Pointer process = BuildCallerInfo(MSG_SIM_UPDATE_LINEAR_FIXED_FILE_DONE, ctrlHolder);
394 if (telRilManager_ != nullptr) {
395 SimIoRequestInfo msg;
396 msg.command = CONTROLLER_REQ_UPDATE_RECORD;
397 msg.fileId = fileId;
398 msg.p1 = fileNum;
399 msg.p2 = ICC_FILE_CURRENT_MODE;
400 msg.p3 = dataLength;
401 msg.data = data;
402 msg.path = filePath;
403 msg.pin2 = pin2;
404 telRilManager_->GetSimIO(slotId_, msg, process);
405 }
406 }
407
UpdateLinearFixedFile(int fileId,int fileNum,const std::string data,int dataLength,const std::string pin2,const AppExecFwk::InnerEvent::Pointer & onComplete)408 void IccFileController::UpdateLinearFixedFile(int fileId, int fileNum, const std::string data, int dataLength,
409 const std::string pin2, const AppExecFwk::InnerEvent::Pointer &onComplete)
410 {
411 std::shared_ptr<IccControllerHolder> ctrlHolder = std::make_shared<IccControllerHolder>(fileId);
412 ctrlHolder->fileLoaded = std::move(const_cast<AppExecFwk::InnerEvent::Pointer &>(onComplete));
413 AppExecFwk::InnerEvent::Pointer process = BuildCallerInfo(MSG_SIM_UPDATE_LINEAR_FIXED_FILE_DONE, ctrlHolder);
414 if (telRilManager_ != nullptr) {
415 SimIoRequestInfo msg;
416 msg.command = CONTROLLER_REQ_UPDATE_RECORD;
417 msg.fileId = fileId;
418 msg.p1 = fileNum;
419 msg.p2 = ICC_FILE_CURRENT_MODE;
420 msg.p3 = dataLength;
421 msg.data = data;
422 msg.path = ObtainElementFilePath(fileId);
423 msg.pin2 = pin2;
424 telRilManager_->GetSimIO(slotId_, msg, process);
425 }
426 }
427
UpdateBinaryFile(int fileId,const std::string data,int dataLength,const AppExecFwk::InnerEvent::Pointer & onComplete)428 void IccFileController::UpdateBinaryFile(
429 int fileId, const std::string data, int dataLength, const AppExecFwk::InnerEvent::Pointer &onComplete)
430 {
431 std::shared_ptr<IccControllerHolder> ctrlHolder = std::make_shared<IccControllerHolder>(fileId);
432 ctrlHolder->fileLoaded = std::move(const_cast<AppExecFwk::InnerEvent::Pointer &>(onComplete));
433 AppExecFwk::InnerEvent::Pointer process =
434 BuildCallerInfo(MSG_SIM_UPDATE_TRANSPARENT_ELEMENTARY_FILE_DONE, ctrlHolder);
435 if (telRilManager_ != nullptr) {
436 SimIoRequestInfo msg;
437 msg.command = CONTROLLER_REQ_UPDATE_BINARY;
438 msg.fileId = fileId;
439 msg.p1 = 0;
440 msg.p2 = 0;
441 msg.p3 = dataLength;
442 msg.data = data;
443 msg.path = ObtainElementFilePath(fileId);
444 msg.pin2 = "";
445 telRilManager_->GetSimIO(slotId_, msg, process);
446 }
447 }
448
SendResponse(std::shared_ptr<IccControllerHolder> holder,const IccFileData * fd)449 void IccFileController::SendResponse(std::shared_ptr<IccControllerHolder> holder, const IccFileData *fd)
450 {
451 if (holder == nullptr || fd == nullptr) {
452 TELEPHONY_LOGE("IccFileController::SendResponse result is null");
453 return;
454 }
455 AppExecFwk::InnerEvent::Pointer &response = holder->fileLoaded;
456 bool isNull = (response == nullptr);
457 auto owner = response->GetOwner();
458 if (owner == nullptr) {
459 TELEPHONY_LOGE("owner is nullptr");
460 return;
461 }
462 std::unique_ptr<FileToControllerMsg> cmdData = response->GetUniqueObject<FileToControllerMsg>();
463 uint32_t id = response->GetInnerEventId();
464 bool needShare = (id == MSG_SIM_OBTAIN_ICC_FILE_DONE);
465 std::unique_ptr<ControllerToFileMsg> objectUnique = nullptr;
466 std::shared_ptr<ControllerToFileMsg> objectShare = nullptr;
467 TELEPHONY_LOGD("IccFileController::SendResponse start response %{public}d %{public}d", isNull, needShare);
468 if (needShare) {
469 objectShare = std::make_shared<ControllerToFileMsg>(cmdData.get(), fd);
470 } else {
471 objectUnique = std::make_unique<ControllerToFileMsg>(cmdData.get(), fd);
472 }
473
474 if ((objectUnique == nullptr) && (objectShare == nullptr)) {
475 TELEPHONY_LOGE("IccFileController::SendResponse create ControllerToFileMsg is null");
476 return;
477 }
478
479 isNull = (owner == nullptr);
480 TELEPHONY_LOGD("IccFileController::SendResponse owner: %{public}d evtId: %{public}d", isNull, id);
481 SendEvent(owner, id, needShare, objectShare, objectUnique);
482 TELEPHONY_LOGD("IccFileController::SendResponse send end");
483 }
484
SendEfLinearResult(const AppExecFwk::InnerEvent::Pointer & response,const int val[],int len)485 void IccFileController::SendEfLinearResult(const AppExecFwk::InnerEvent::Pointer &response, const int val[], int len)
486 {
487 if (response == nullptr) {
488 TELEPHONY_LOGE("response is nullptr!");
489 return;
490 }
491 std::shared_ptr<AppExecFwk::EventHandler> handler = response->GetOwner();
492 if (handler == nullptr) {
493 TELEPHONY_LOGE("handler is nullptr!");
494 return;
495 }
496 std::unique_ptr<FileToControllerMsg> cmdData = response->GetUniqueObject<FileToControllerMsg>();
497 std::shared_ptr<EfLinearResult> object = std::make_shared<EfLinearResult>(cmdData.get());
498 object->valueData[0] = val[0];
499 object->valueData[1] = val[1];
500 object->valueData[MAX_FILE_INDEX] = val[MAX_FILE_INDEX];
501 uint32_t id = response->GetInnerEventId();
502 int eventParam = 0;
503 AppExecFwk::InnerEvent::Pointer event = AppExecFwk::InnerEvent::Get(id, object, eventParam);
504 if (event == nullptr) {
505 TELEPHONY_LOGE("event is nullptr!");
506 return;
507 }
508 TelEventHandler::SendTelEvent(handler, event);
509 }
510
SendMultiRecordResult(const AppExecFwk::InnerEvent::Pointer & response,std::vector<std::string> & strValue)511 void IccFileController::SendMultiRecordResult(
512 const AppExecFwk::InnerEvent::Pointer &response, std::vector<std::string> &strValue)
513 {
514 if (response == nullptr) {
515 TELEPHONY_LOGE("response is nullptr!");
516 return;
517 }
518 std::shared_ptr<AppExecFwk::EventHandler> handler = response->GetOwner();
519 if (handler == nullptr) {
520 TELEPHONY_LOGE("handler is nullptr!");
521 return;
522 }
523 std::unique_ptr<FileToControllerMsg> cmdData = response->GetUniqueObject<FileToControllerMsg>();
524 std::shared_ptr<MultiRecordResult> object = std::make_shared<MultiRecordResult>(cmdData.get());
525 object->fileResults.assign(strValue.begin(), strValue.end());
526 object->resultLength = static_cast<int>(strValue.size());
527 uint32_t id = response->GetInnerEventId();
528 int eventParam = 0;
529 TELEPHONY_LOGI("IccFileController::SendMultiRecordResult send end");
530 AppExecFwk::InnerEvent::Pointer event = AppExecFwk::InnerEvent::Get(id, object, eventParam);
531 if (event == nullptr) {
532 TELEPHONY_LOGE("event is nullptr!");
533 return;
534 }
535 TelEventHandler::SendTelEvent(handler, event);
536 }
537
BuildCallerInfo(int eventId,std::shared_ptr<IccControllerHolder> & holderObject)538 AppExecFwk::InnerEvent::Pointer IccFileController::BuildCallerInfo(
539 int eventId, std::shared_ptr<IccControllerHolder> &holderObject)
540 {
541 std::unique_ptr<IccToRilMsg> msgTo = std::make_unique<IccToRilMsg>(holderObject);
542 if (msgTo == nullptr) {
543 TELEPHONY_LOGE("IccFileController::BuildCallerInfo1 create null pointer");
544 return AppExecFwk::InnerEvent::Pointer(nullptr, nullptr);
545 }
546 int64_t eventParam = 0;
547 AppExecFwk::InnerEvent::Pointer event = AppExecFwk::InnerEvent::Get(eventId, msgTo, eventParam);
548 if (event == nullptr) {
549 TELEPHONY_LOGE("event is nullptr!");
550 return AppExecFwk::InnerEvent::Pointer(nullptr, nullptr);
551 }
552 event->SetOwner(shared_from_this());
553 return event;
554 }
555
BuildCallerInfo(int eventId,int arg1,int arg2,std::shared_ptr<IccControllerHolder> & holderObject)556 AppExecFwk::InnerEvent::Pointer IccFileController::BuildCallerInfo(
557 int eventId, int arg1, int arg2, std::shared_ptr<IccControllerHolder> &holderObject)
558 {
559 std::unique_ptr<IccToRilMsg> msgTo = std::make_unique<IccToRilMsg>(holderObject);
560 if (msgTo == nullptr) {
561 TELEPHONY_LOGE("IccFileController::BuildCallerInfo2 create null pointer");
562 return AppExecFwk::InnerEvent::Pointer(nullptr, nullptr);
563 }
564 msgTo->arg1 = arg1;
565 msgTo->arg2 = arg2;
566 int64_t eventParam = 0;
567 AppExecFwk::InnerEvent::Pointer event = AppExecFwk::InnerEvent::Get(eventId, msgTo, eventParam);
568 if (event == nullptr) {
569 TELEPHONY_LOGE("event is nullptr!");
570 return AppExecFwk::InnerEvent::Pointer(nullptr, nullptr);
571 }
572 event->SetOwner(shared_from_this());
573 return event;
574 }
575
BuildCallerInfo(int eventId,int arg1,int arg2,const AppExecFwk::InnerEvent::Pointer & msg)576 AppExecFwk::InnerEvent::Pointer IccFileController::BuildCallerInfo(
577 int eventId, int arg1, int arg2, const AppExecFwk::InnerEvent::Pointer &msg)
578 {
579 std::shared_ptr<IccControllerHolder> ctrlHolder = std::make_shared<IccControllerHolder>(arg1);
580 if (ctrlHolder == nullptr) {
581 TELEPHONY_LOGE("ctrlHolder is nullptr!");
582 return AppExecFwk::InnerEvent::Pointer(nullptr, nullptr);
583 }
584 ctrlHolder->fileLoaded = std::move(const_cast<AppExecFwk::InnerEvent::Pointer &>(msg));
585 if (ctrlHolder->fileLoaded == nullptr) {
586 TELEPHONY_LOGE("ctrlHolder->fileLoaded is nullptr!");
587 return AppExecFwk::InnerEvent::Pointer(nullptr, nullptr);
588 }
589 bool isNull = ctrlHolder->fileLoaded->GetOwner() == nullptr;
590 TELEPHONY_LOGD("IccFileController::BuildCallerInfo stage init owner: %{public}d", isNull);
591 std::unique_ptr<IccToRilMsg> msgTo = std::make_unique<IccToRilMsg>(ctrlHolder);
592 if (msgTo == nullptr) {
593 TELEPHONY_LOGE("IccFileController::BuildCallerInfo3 create null pointer");
594 return AppExecFwk::InnerEvent::Pointer(nullptr, nullptr);
595 }
596 TELEPHONY_LOGD("IccFileController::BuildCallerInfo stage end");
597 msgTo->arg1 = arg1;
598 msgTo->arg2 = arg2;
599 int64_t eventParam = 0;
600 AppExecFwk::InnerEvent::Pointer event = AppExecFwk::InnerEvent::Get(eventId, msgTo, eventParam);
601 if (event == nullptr) {
602 TELEPHONY_LOGE("event is nullptr!");
603 return AppExecFwk::InnerEvent::Pointer(nullptr, nullptr);
604 }
605 event->SetOwner(shared_from_this());
606 return event;
607 }
608
ParseFileSize(int val[],int len,const unsigned char * data)609 void IccFileController::ParseFileSize(int val[], int len, const unsigned char *data)
610 {
611 if (data == nullptr) {
612 TELEPHONY_LOGE("ParseFileSize null data");
613 return;
614 }
615 if (len > MAX_FILE_INDEX) {
616 GetFileAndDataSize(data, val[0], val[1]);
617 if (val[0] != 0) {
618 val[MAX_FILE_INDEX] = val[1] / val[0];
619 }
620 }
621 TELEPHONY_LOGD("ParseFileSize result %{public}d, %{public}d %{public}d", val[0], val[1], val[MAX_FILE_INDEX]);
622 }
IsValidRecordSizeData(const unsigned char * data)623 bool IccFileController::IsValidRecordSizeData(const unsigned char *data)
624 {
625 if (data == nullptr) {
626 TELEPHONY_LOGE("IccFileTypeMismatch ERROR nullptr");
627 return false;
628 }
629 if (ICC_ELEMENTARY_FILE != data[TYPE_OF_FILE]) {
630 TELEPHONY_LOGE("IccFileTypeMismatch ERROR TYPE_OF_FILE");
631 return false;
632 }
633 if (ELEMENTARY_FILE_TYPE_LINEAR_FIXED != data[STRUCTURE_OF_DATA]) {
634 TELEPHONY_LOGE("IccFileTypeMismatch ERROR STRUCTURE_OF_DATA");
635 return false;
636 }
637 return true;
638 }
IsValidBinarySizeData(const unsigned char * data)639 bool IccFileController::IsValidBinarySizeData(const unsigned char *data)
640 {
641 if (data == nullptr) {
642 TELEPHONY_LOGE("IccFileTypeMismatch ERROR nullptr");
643 return false;
644 }
645 if (ICC_ELEMENTARY_FILE != data[TYPE_OF_FILE]) {
646 TELEPHONY_LOGE("IccFileTypeMismatch ERROR TYPE_OF_FILE");
647 return false;
648 }
649 if (ELEMENTARY_FILE_TYPE_TRANSPARENT != data[STRUCTURE_OF_DATA]) {
650 TELEPHONY_LOGE("IccFileTypeMismatch ERROR STRUCTURE_OF_DATA");
651 return false;
652 }
653 return true;
654 }
GetFileAndDataSize(const unsigned char * data,int & fileSize,int & dataSize)655 void IccFileController::GetFileAndDataSize(const unsigned char *data, int &fileSize, int &dataSize)
656 {
657 if (data == nullptr) {
658 TELEPHONY_LOGE("GetFileAndDataSize null data");
659 return;
660 }
661 fileSize = data[LENGTH_OF_RECORD] & BYTE_NUM;
662 dataSize = ((data[SIZE_ONE_OF_FILE] & BYTE_NUM) << OFFSET) + (data[SIZE_TWO_OF_FILE] & BYTE_NUM);
663 }
GetDataSize(const unsigned char * data,int & dataSize)664 void IccFileController::GetDataSize(const unsigned char *data, int &dataSize)
665 {
666 if (data == nullptr) {
667 TELEPHONY_LOGE("GetDataSize null data");
668 return;
669 }
670 dataSize = ((data[SIZE_ONE_OF_FILE] & BYTE_NUM) << OFFSET) + (data[SIZE_TWO_OF_FILE] & BYTE_NUM);
671 }
672
SetRilManager(std::shared_ptr<Telephony::ITelRilManager> ril)673 void IccFileController::SetRilManager(std::shared_ptr<Telephony::ITelRilManager> ril)
674 {
675 telRilManager_ = ril;
676 if (telRilManager_ == nullptr) {
677 TELEPHONY_LOGE("IccFileController set NULL TelRilManager!!");
678 }
679 }
680
CheckRightPath(const std::string & path,int fileId)681 std::string IccFileController::CheckRightPath(const std::string &path, int fileId)
682 {
683 if (path.empty()) {
684 return ObtainElementFilePath(fileId);
685 } else {
686 return path;
687 }
688 }
689
ProcessErrorResponse(const AppExecFwk::InnerEvent::Pointer & event)690 bool IccFileController::ProcessErrorResponse(const AppExecFwk::InnerEvent::Pointer &event)
691 {
692 std::shared_ptr<IccFromRilMsg> rcvMsg = event->GetSharedObject<IccFromRilMsg>();
693 if (rcvMsg == nullptr || rcvMsg->controlHolder == nullptr) {
694 return false;
695 }
696 AppExecFwk::InnerEvent::Pointer &response = rcvMsg->controlHolder->fileLoaded;
697 if (response == nullptr) {
698 return false;
699 }
700 auto owner = response->GetOwner();
701 if (owner == nullptr) {
702 TELEPHONY_LOGE("owner is nullptr");
703 return false;
704 }
705 uint32_t id = response->GetInnerEventId();
706 std::unique_ptr<FileToControllerMsg> cmdData = response->GetUniqueObject<FileToControllerMsg>();
707 bool needShare = (id == MSG_SIM_OBTAIN_ICC_FILE_DONE);
708 std::unique_ptr<ControllerToFileMsg> objectUnique = nullptr;
709 std::shared_ptr<ControllerToFileMsg> objectShare = nullptr;
710 TELEPHONY_LOGD("ProcessErrorResponse start response %{public}d", needShare);
711 if (needShare) {
712 objectShare = std::make_shared<ControllerToFileMsg>(cmdData.get(), nullptr);
713 if (objectShare == nullptr) {
714 return false;
715 }
716 objectShare->exception = rcvMsg->fileData.exception;
717 } else {
718 objectUnique = std::make_unique<ControllerToFileMsg>(cmdData.get(), nullptr);
719 objectUnique->exception = rcvMsg->fileData.exception;
720 }
721
722 if ((objectUnique == nullptr) && (objectShare == nullptr)) {
723 TELEPHONY_LOGE("ProcessErrorResponse create ControllerToFileMsg is null");
724 return true;
725 }
726
727 TELEPHONY_LOGI("ProcessErrorResponse owner: evtId: %{public}d", id);
728 SendEvent(owner, id, needShare, objectShare, objectUnique);
729 TELEPHONY_LOGD("ProcessErrorResponse send end");
730 return true;
731 }
732
SendEvent(std::shared_ptr<AppExecFwk::EventHandler> handler,uint32_t id,bool needShare,std::shared_ptr<ControllerToFileMsg> objectShare,std::unique_ptr<ControllerToFileMsg> & objectUnique)733 void IccFileController::SendEvent(std::shared_ptr<AppExecFwk::EventHandler> handler, uint32_t id, bool needShare,
734 std::shared_ptr<ControllerToFileMsg> objectShare, std::unique_ptr<ControllerToFileMsg> &objectUnique)
735 {
736 if (needShare) {
737 TelEventHandler::SendTelEvent(handler, id, objectShare);
738 return;
739 }
740 TelEventHandler::SendTelEvent(handler, id, objectUnique);
741 }
742
IsFixedNumberType(int efId)743 bool IccFileController::IsFixedNumberType(int efId)
744 {
745 bool fixed = false;
746 switch (efId) {
747 case ELEMENTARY_FILE_ADN:
748 case ELEMENTARY_FILE_FDN:
749 case ELEMENTARY_FILE_USIM_ADN:
750 case ELEMENTARY_FILE_USIM_IAP:
751 fixed = true;
752 return fixed;
753 default:
754 break;
755 }
756 return fixed;
757 }
758
~IccFileController()759 IccFileController::~IccFileController() {}
760 } // namespace Telephony
761 } // namespace OHOS
762