4 * Copyright (c) 2010 - 2015 Samsung Electronics Co., Ltd. All rights reserved.
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
20 #include <glib-object.h>
22 #include <tapi_common.h>
24 #include <ITapiPhonebook.h>
25 #include <TapiUtility.h>
27 #include <vconf-internal-telephony-keys.h>
31 #include "ctsvc_internal.h"
32 #include "ctsvc_struct.h"
33 #include "ctsvc_db_schema.h"
34 #include "ctsvc_db_sqlite.h"
35 #include "ctsvc_server_socket.h"
36 #include "ctsvc_server_sqlite.h"
37 #include "ctsvc_server_utils.h"
38 #include "ctsvc_server_sim.h"
39 #include "ctsvc_db_utils.h"
40 #include "ctsvc_list.h"
41 #include "ctsvc_db_access_control.h"
42 #include "ctsvc_db_query.h"
44 /* #define CTSVC_SIM_FIELD_FULL_SUPPORT// support ANR,EMAIL2,3,NICK NAME */
45 #define DEFAULT_ADDRESS_BOOK_ID 0
47 #define CTSVC_TAPI_SIM_PB_MAX 0xFFFF
49 #define TAPI_PB_MAX_FILE_CNT TAPI_PB_3G_PBC+1
51 #define CTSVC_2GSIM_NAME TAPI_PB_3G_NAME
52 #define CTSVC_2GSIM_NUMBER TAPI_PB_3G_NUMBER
56 unsigned int index_max;
57 unsigned int text_max;
58 unsigned int used_count;
67 * it is used when inserting/seaching phonelog
74 /* Tapi handle to control each SIM slot */
78 TelSimPbType_t sim_type;
80 /* Each sim file info (max index, max text length, used count) */
81 sim_file_s file_record[TAPI_PB_MAX_FILE_CNT];
83 /* Number of Imported SIM contact*/
87 * Set true after read SIM meta info
88 * in case of private : set true after reading all SIM contact and save to DB
93 * unique info of SIM : iccid
94 * It should be save to phone log table
95 * in order to find which SIM is used to the call/message log
102 static GSList *__ctsvc_sim_info = NULL;
103 static void *greturn_data = NULL;
104 static bool __ctsvc_tapi_cb = false;
105 static bool sim_import_cancel = false;
107 static TapiHandle* __ctsvc_server_sim_get_tapi_handle(ctsvc_sim_info_s *info)
109 if (NULL == info->handle) {
111 vconf_get_bool(VCONFKEY_TELEPHONY_READY, &bReady);
114 /* LCOV_EXCL_START */
115 ERR("telephony is not ready ");
119 info->handle = tel_init(info->cp_name);
120 RETVM_IF(NULL == info->handle, NULL, "tel_init() Fail");
127 static inline void __ctsvc_server_sim_set_return_data(void *data)
132 static inline void* __ctsvc_server_sim_get_return_data(void)
134 RETV_IF(NULL == greturn_data, NULL);
139 static void __ctsvc_server_sim_record_destroy(sim_contact_s *record)
141 RET_IF(NULL == record);
144 free(record->number);
148 free(record->email1);
149 free(record->email2);
150 free(record->email3);
151 free(record->email4);
157 static sim_contact_s * __ctsvc_server_sim_record_clone(TelSimPbRecord_t *sim_record)
159 sim_contact_s *record = calloc(1, sizeof(sim_contact_s));
160 if (NULL == record) {
161 /* LCOV_EXCL_START */
162 ERR("calloc() Fail");
167 record->sim_index = sim_record->index;
168 record->name = SAFE_STRDUP((char*)sim_record->name);
169 record->nickname = SAFE_STRDUP((char*)sim_record->sne);
170 record->number = SAFE_STRDUP((char*)sim_record->number);
171 record->anr1 = SAFE_STRDUP((char*)sim_record->anr1);
172 record->anr2 = SAFE_STRDUP((char*)sim_record->anr2);
173 record->anr3 = SAFE_STRDUP((char*)sim_record->anr3);
174 record->email1 = SAFE_STRDUP((char*)sim_record->email1);
175 record->email2 = SAFE_STRDUP((char*)sim_record->email2);
176 record->email3 = SAFE_STRDUP((char*)sim_record->email3);
177 record->email4 = SAFE_STRDUP((char*)sim_record->email4);
182 static inline int __ctsvc_server_sim_record_add_num(contacts_record_h *record, char *number)
186 RETVM_IF(NULL == number, CONTACTS_ERROR_INVALID_PARAMETER, "invalid number");
188 ret = contacts_record_create(_contacts_number._uri, record);
189 RETVM_IF(ret < CONTACTS_ERROR_NONE, ret, "contacts_record_create() Fail(%d)", ret);
190 ret = contacts_record_set_str(*record, _contacts_number.number, number);
191 RETVM_IF(ret < CONTACTS_ERROR_NONE, ret, "contacts_record_set_str() Fail(%d)", ret);
192 ret = contacts_record_set_int(*record, _contacts_number.type, CONTACTS_NUMBER_TYPE_OTHER);
193 RETVM_IF(ret < CONTACTS_ERROR_NONE, ret, "contacts_record_set_int() Fail(%d)", ret);
198 static inline int __ctsvc_server_sim_record_add_email(contacts_record_h *record, char *email)
202 RETVM_IF(NULL == email, CONTACTS_ERROR_INVALID_PARAMETER, "invalid email");
204 ret = contacts_record_create(_contacts_email._uri, record);
205 RETVM_IF(ret < CONTACTS_ERROR_NONE, ret, "contacts_record_create() Fail(%d)", ret);
206 ret = contacts_record_set_str(*record, _contacts_email.email, email);
207 RETVM_IF(ret < CONTACTS_ERROR_NONE, ret, "contacts_record_set_str() Fail(%d)", ret);
208 ret = contacts_record_set_int(*record, _contacts_email.type, CONTACTS_EMAIL_TYPE_OTHER);
209 RETVM_IF(ret < CONTACTS_ERROR_NONE, ret, "contacts_record_set_int() Fail(%d)", ret);
214 static int __ctsvc_server_sim_ctsvc_record_clone(sim_contact_s *record,
215 int addressbook_id, contacts_record_h *contact)
219 char sim_id[20] = {0};
220 contacts_record_h name = NULL;
221 contacts_record_h number = NULL;
222 contacts_record_h email = NULL;
224 RETV_IF(NULL == contact, CONTACTS_ERROR_INVALID_PARAMETER);
226 RETV_IF(NULL == record, CONTACTS_ERROR_INVALID_PARAMETER);
227 RETVM_IF(record->sim_index <= 0, CONTACTS_ERROR_INVALID_PARAMETER, "The index(%d) is invalid", record->sim_index);
229 DBG("insert record->sim_index %d", record->sim_index);
231 ret = contacts_record_create(_contacts_contact._uri, contact);
232 RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "contacts_record_create Fail(%d)", ret);
233 snprintf(sim_id, sizeof(sim_id), "%d", record->sim_index);
234 contacts_record_set_str(*contact, _contacts_contact.uid, sim_id);
237 contacts_record_create(_contacts_name._uri, &name);
239 contacts_record_set_str(name, _contacts_name.first, (char *)record->name);
240 contacts_record_add_child_record(*contact, _contacts_contact.name, name);
244 #ifdef CTSVC_SIM_FIELD_FULL_SUPPORT
245 contacts_record_h nick = NULL;
246 if (record->nickname) {
247 contacts_record_create(_contacts_nickname._uri, &nick);
249 contacts_record_set_str(nick, _contacts_nickname.name, (char *)record->nickname);
250 contacts_record_add_child_record(*contact, _contacts_contact.nickname, nick);
253 #endif /* CTSVC_SIM_FIELD_FULL_SUPPORT */
255 ret = __ctsvc_server_sim_record_add_num(&number, (char *)record->number);
256 if (CONTACTS_ERROR_NONE == ret)
257 contacts_record_add_child_record(*contact, _contacts_contact.number, number);
259 #ifdef CTSVC_SIM_FIELD_FULL_SUPPORT
260 ret = __ctsvc_server_sim_record_add_num(&number, (char *)record->anr1);
261 if (CONTACTS_ERROR_NONE == ret)
262 contacts_record_add_child_record(*contact, _contacts_contact.number, number);
264 ret = __ctsvc_server_sim_record_add_num(&number, (char *)record->anr2);
265 if (CONTACTS_ERROR_NONE == ret)
266 contacts_record_add_child_record(*contact, _contacts_contact.number, number);
268 ret = __ctsvc_server_sim_record_add_num(&number, (char *)record->anr3);
269 if (CONTACTS_ERROR_NONE == ret)
270 contacts_record_add_child_record(*contact, _contacts_contact.number, number);
271 #endif /* CTSVC_SIM_FIELD_FULL_SUPPORT */
273 ret = __ctsvc_server_sim_record_add_email(&email, (char *)record->email1);
274 if (CONTACTS_ERROR_NONE == ret)
275 contacts_record_add_child_record(*contact, _contacts_contact.email, email);
277 #ifdef CTSVC_SIM_FIELD_FULL_SUPPORT
278 ret = __ctsvc_server_sim_record_add_email(&email, (char *)record->email2);
279 if (CONTACTS_ERROR_NONE == ret)
280 contacts_record_add_child_record(*contact, _contacts_contact.email, email);
282 ret = __ctsvc_server_sim_record_add_email(&email, (char *)record->email3);
283 if (CONTACTS_ERROR_NONE == ret)
284 contacts_record_add_child_record(*contact, _contacts_contact.email, email);
286 ret = __ctsvc_server_sim_record_add_email(&email, (char *)record->email4);
287 if (CONTACTS_ERROR_NONE == ret)
288 contacts_record_add_child_record(*contact, _contacts_contact.email, email);
289 #endif /* CTSVC_SIM_FIELD_FULL_SUPPORT */
291 contacts_record_set_int(*contact, _contacts_contact.address_book_id, addressbook_id);
296 static ctsvc_sim_info_s* __ctsvc_server_sim_get_info_by_tapi_handle(TapiHandle *handle)
298 GSList *cursor = NULL;
299 for (cursor = __ctsvc_sim_info; cursor; cursor = cursor->next) {
300 ctsvc_sim_info_s *info = cursor->data;
301 if (info->handle == handle)
307 static ctsvc_sim_info_s* __ctsvc_server_sim_get_info_by_sim_slot_no(int slot_no)
309 GSList *cursor = NULL;
314 for (cursor = __ctsvc_sim_info; cursor; cursor = cursor->next) {
315 ctsvc_sim_info_s *info = cursor->data;
316 if (info->sim_slot_no == slot_no) {
317 if (NULL == __ctsvc_server_sim_get_tapi_handle(info))
325 int ctsvc_server_sim_get_info_id_by_sim_slot_no(int slot_no)
327 GSList *cursor = NULL;
332 for (cursor = __ctsvc_sim_info; cursor; cursor = cursor->next) {
333 ctsvc_sim_info_s *info = cursor->data;
334 if (info->sim_slot_no == slot_no) {
335 if (NULL == __ctsvc_server_sim_get_tapi_handle(info))
337 return info->sim_info_id;
343 int ctsvc_server_sim_get_sim_slot_no_by_info_id(int sim_info_id)
345 GSList *cursor = NULL;
346 for (cursor = __ctsvc_sim_info; cursor; cursor = cursor->next) {
347 ctsvc_sim_info_s *info = cursor->data;
348 if (info->sim_info_id == sim_info_id) {
349 if (NULL == __ctsvc_server_sim_get_tapi_handle(info))
351 return info->sim_slot_no;
357 static void __ctsvc_server_sim_init_import_info(ctsvc_sim_info_s *info)
359 RET_IF(NULL == info);
361 info->imported_cnt = 0;
364 static int __ctsvc_server_sim_insert_record_to_db(sim_contact_s *record)
368 contacts_record_h contact = NULL;
370 ret = __ctsvc_server_sim_ctsvc_record_clone(record, DEFAULT_ADDRESS_BOOK_ID, &contact);
371 if (CONTACTS_ERROR_NONE != ret) {
372 /* LCOV_EXCL_START */
373 ERR("__ctsvc_server_sim_ctsvc_record_clone() Fail(%d)", ret);
374 return CONTACTS_ERROR_INTERNAL;
378 ret = ctsvc_db_insert_record(contact, NULL);
379 contacts_record_destroy(contact, true);
380 if (CONTACTS_ERROR_NONE != ret) {
381 /* LCOV_EXCL_START */
382 ERR("ctsvc_db_insert_record() Fail(%d)", ret);
387 return CONTACTS_ERROR_NONE;
390 static void __ctsvc_server_sim_import_contact_cb(TapiHandle *handle, int result, void *data, void *user_data)
394 TelSimPbAccessResult_t access_rt = result;
395 TelSimPbRecord_t *sim_info = data;
396 sim_contact_s *record = NULL;
397 ctsvc_sim_info_s *info;
399 if (NULL == sim_info) {
400 /* LCOV_EXCL_START */
401 ERR("sim_info is NULL, result = %d", access_rt);
402 ret = ctsvc_server_socket_return(__ctsvc_server_sim_get_return_data(), CONTACTS_ERROR_SYSTEM, 0, NULL);
403 WARN_IF(CONTACTS_ERROR_NONE != ret, "ctsvc_server_socket_return() Fail(%d)", ret);
404 __ctsvc_server_sim_set_return_data(NULL);
409 info = __ctsvc_server_sim_get_info_by_tapi_handle(handle);
411 /* LCOV_EXCL_START */
412 ERR("__ctsvc_server_sim_get_info_by_tapi_handle() Fail");
413 ret = ctsvc_server_socket_return(__ctsvc_server_sim_get_return_data(), CONTACTS_ERROR_INTERNAL, 0, NULL);
414 WARN_IF(CONTACTS_ERROR_NONE != ret, "ctsvc_server_socket_return() Fail(%d)", ret);
415 __ctsvc_server_sim_set_return_data(NULL);
420 if (sim_import_cancel) {
421 DBG("SIM contacts import is canceled");
422 ret = ctsvc_server_socket_return(__ctsvc_server_sim_get_return_data(), CONTACTS_ERROR_NONE, 0, NULL);
423 WARN_IF(CONTACTS_ERROR_NONE != ret, "ctsvc_server_socket_return() Fail(%d)", ret);
424 __ctsvc_server_sim_init_import_info(info);
425 __ctsvc_server_sim_set_return_data(NULL);
426 sim_import_cancel = false;
430 if (TAPI_SIM_PB_INVALID_INDEX == access_rt) {
433 start_index = (int)user_data;
434 DBG("TAPI_SIM_PB_INVALID_INDEX : start_index = %d", start_index);
436 if (info->file_record[TAPI_PB_3G_NAME].index_max < start_index) {
437 /* LCOV_EXCL_START */
438 ERR("start_index is invalid start_index = %d, total = %d", start_index,
439 info->file_record[TAPI_PB_3G_NAME].index_max);
440 ret = ctsvc_server_socket_return(__ctsvc_server_sim_get_return_data(), CONTACTS_ERROR_INTERNAL, 0, NULL);
441 WARN_IF(CONTACTS_ERROR_NONE != ret, "ctsvc_server_socket_return() Fail(%d)", ret);
442 __ctsvc_server_sim_init_import_info(info);
443 __ctsvc_server_sim_set_return_data(NULL);
447 ret = tel_read_sim_pb_record(handle, info->sim_type, start_index,
448 __ctsvc_server_sim_import_contact_cb, (void*)start_index);
449 if (TAPI_API_SUCCESS != ret) {
450 /* LCOV_EXCL_START */
451 ERR("SIM phonebook access Fail(%d) start_indext(%d)", access_rt, start_index);
452 ret = ctsvc_server_socket_return(__ctsvc_server_sim_get_return_data(), CONTACTS_ERROR_SYSTEM, 0, NULL);
453 WARN_IF(CONTACTS_ERROR_NONE != ret, "ctsvc_server_socket_return() Fail(%d)", ret);
454 __ctsvc_server_sim_init_import_info(info);
455 __ctsvc_server_sim_set_return_data(NULL);
462 if (TAPI_SIM_PB_SUCCESS != access_rt) {
463 /* LCOV_EXCL_START */
464 ERR("SIM phonebook access Fail(%d)", access_rt);
465 ret = ctsvc_server_socket_return(__ctsvc_server_sim_get_return_data(), CONTACTS_ERROR_SYSTEM, 0, NULL);
466 WARN_IF(CONTACTS_ERROR_NONE != ret, "ctsvc_server_socket_return() Fail(%d)", ret);
467 __ctsvc_server_sim_init_import_info(info);
468 __ctsvc_server_sim_set_return_data(NULL);
473 switch (sim_info->phonebook_type) {
474 case TAPI_SIM_PB_ADN:
475 case TAPI_SIM_PB_3GSIM:
476 record = __ctsvc_server_sim_record_clone(sim_info);
477 ret = __ctsvc_server_sim_insert_record_to_db(record);
478 __ctsvc_server_sim_record_destroy(record);
479 if (CONTACTS_ERROR_NONE != ret)
480 WARN("__ctsvc_server_sim_insert_record_to_db() Fail(%d)", ret);
482 info->imported_cnt++;
483 ctsvc_server_socket_invoke_cb(__ctsvc_server_sim_get_return_data(),
484 info->file_record[TAPI_PB_3G_NAME].used_count, info->imported_cnt);
486 case TAPI_SIM_PB_FDN:
487 case TAPI_SIM_PB_SDN:
489 /* LCOV_EXCL_START */
490 ERR("Unknown storage type(%d)", sim_info->phonebook_type);
491 ret = ctsvc_server_socket_return(__ctsvc_server_sim_get_return_data(), CONTACTS_ERROR_SYSTEM, 0, NULL);
492 WARN_IF(CONTACTS_ERROR_NONE != ret, "ctsvc_server_socket_return() Fail(%d)", ret);
493 __ctsvc_server_sim_init_import_info(info);
494 __ctsvc_server_sim_set_return_data(NULL);
499 if (sim_info->next_index && CTSVC_TAPI_SIM_PB_MAX != sim_info->next_index) {
500 DBG("NextIndex = %d", sim_info->next_index);
501 ret = tel_read_sim_pb_record(__ctsvc_server_sim_get_tapi_handle(info), sim_info->phonebook_type,
502 sim_info->next_index, __ctsvc_server_sim_import_contact_cb, NULL);
504 if (TAPI_API_SUCCESS != ret) {
505 /* LCOV_EXCL_START */
506 ERR("tel_read_sim_pb_record() Fail(%d)", ret);
507 ret = ctsvc_server_socket_return(__ctsvc_server_sim_get_return_data(), CONTACTS_ERROR_SYSTEM, 0, NULL);
508 WARN_IF(CONTACTS_ERROR_NONE != ret, "ctsvc_server_socket_return() Fail(%d)", ret);
509 __ctsvc_server_sim_init_import_info(info);
510 __ctsvc_server_sim_set_return_data(NULL);
515 if (info->file_record[TAPI_PB_3G_NAME].used_count == info->imported_cnt) {
516 ret = ctsvc_server_socket_return(__ctsvc_server_sim_get_return_data(), CONTACTS_ERROR_NONE, 0, NULL);
518 ERR("ctsvc_server_sim_import_contact() Fail(expectd %d but got %d)", info->file_record[TAPI_PB_3G_NAME].used_count, info->imported_cnt);
519 ret = ctsvc_server_socket_return(__ctsvc_server_sim_get_return_data(), CONTACTS_ERROR_SYSTEM, 0, NULL);
521 WARN_IF(CONTACTS_ERROR_NONE != ret, "ctsvc_server_socket_return() Fail(%d)", ret);
522 __ctsvc_server_sim_init_import_info(info);
523 __ctsvc_server_sim_set_return_data(NULL);
527 int ctsvc_server_sim_import_contact(void *data, int sim_slot_no)
530 int ret = TAPI_API_SUCCESS;
531 ctsvc_sim_info_s *info;
532 unsigned int sim_slot_cnt = g_slist_length(__ctsvc_sim_info);
534 RETV_IF(sim_slot_cnt <= sim_slot_no, CONTACTS_ERROR_INVALID_PARAMETER);
536 info = __ctsvc_server_sim_get_info_by_sim_slot_no(sim_slot_no);
537 RETV_IF(NULL == info, CONTACTS_ERROR_SYSTEM);
538 RETV_IF(false == info->initialized, CONTACTS_ERROR_NO_DATA);
539 RETVM_IF(__ctsvc_server_sim_get_return_data(), CONTACTS_ERROR_SYSTEM,
540 "Server is already processing with sim");
542 __ctsvc_server_sim_set_return_data(data);
544 if (0 == info->file_record[TAPI_PB_3G_NAME].used_count) {
545 ret = ctsvc_server_socket_return(__ctsvc_server_sim_get_return_data(), CONTACTS_ERROR_NO_DATA, 0, NULL);
546 WARN_IF(CONTACTS_ERROR_NONE != ret, "helper_socket_return() Fail(%d)", ret);
547 __ctsvc_server_sim_set_return_data(NULL);
551 ret = tel_read_sim_pb_record(__ctsvc_server_sim_get_tapi_handle(info), info->sim_type, 1,
552 __ctsvc_server_sim_import_contact_cb, NULL);
553 if (TAPI_API_SUCCESS != ret) {
554 /* LCOV_EXCL_START */
555 ERR("tel_read_sim_pb_record = %d", ret);
556 __ctsvc_server_sim_set_return_data(NULL);
557 return CONTACTS_ERROR_SYSTEM;
561 return CONTACTS_ERROR_NONE;
564 void ctsvc_server_sim_cancel_import()
566 sim_import_cancel = true;
569 int ctsvc_server_socket_get_sim_init_status(void *data, int sim_slot_no)
572 ctsvc_sim_info_s *info;
573 unsigned int sim_slot_cnt = g_slist_length(__ctsvc_sim_info);
575 RETV_IF(sim_slot_cnt <= sim_slot_no, CONTACTS_ERROR_INVALID_PARAMETER);
577 info = __ctsvc_server_sim_get_info_by_sim_slot_no(sim_slot_no);
578 RETVM_IF(NULL == info, CONTACTS_ERROR_SYSTEM, "sim init is not completed");
579 return ctsvc_server_socket_return_sim_int(data, (int)(info->initialized));
582 static void __ctsvc_server_sim_sdn_read_cb(TapiHandle *handle, int result, void *data, void *user_data)
586 TelSimPbAccessResult_t access_rt = result;
587 TelSimPbRecord_t *sim_info = data;
588 ctsvc_sim_info_s *info = (ctsvc_sim_info_s*)user_data;
590 RET_IF(NULL == sim_info);
592 if (TAPI_SIM_PB_SUCCESS != access_rt) {
593 if (TAPI_SIM_PB_SDN == sim_info->phonebook_type &&
594 TAPI_SIM_PB_INVALID_INDEX == access_rt) {
595 DBG("Index = %d", sim_info->index);
596 ret = tel_read_sim_pb_record(handle, sim_info->phonebook_type, sim_info->index+1,
597 __ctsvc_server_sim_sdn_read_cb, info);
598 RETM_IF(TAPI_API_SUCCESS != ret, "tel_read_sim_pb_record() Fail(%d)", ret);
600 /* LCOV_EXCL_START */
601 ERR("SIM phonebook access Fail(%d)", access_rt);
602 ctsvc_server_trim_memory();
607 switch (sim_info->phonebook_type) {
608 case TAPI_SIM_PB_SDN:
609 ret = ctsvc_server_insert_sdn_contact((char *)sim_info->name, (char *)sim_info->number, info->sim_slot_no);
610 WARN_IF(CONTACTS_ERROR_NONE != ret, "ctsvc_server_insert_sdn_contact() Fail(%d)", ret);
612 case TAPI_SIM_PB_ADN:
613 case TAPI_SIM_PB_3GSIM:
614 case TAPI_SIM_PB_FDN:
616 /* LCOV_EXCL_START */
617 ERR("Not SDN type(%d)", sim_info->phonebook_type);
618 ctsvc_server_trim_memory();
623 if (sim_info->next_index && CTSVC_TAPI_SIM_PB_MAX != sim_info->next_index) {
624 DBG("NextIndex = %d", sim_info->next_index);
625 ret = tel_read_sim_pb_record(handle, sim_info->phonebook_type, sim_info->next_index,
626 __ctsvc_server_sim_sdn_read_cb, info);
627 if (TAPI_API_SUCCESS != ret) {
628 /* LCOV_EXCL_START */
629 ERR("tel_read_sim_pb_record() Fail(%d)", ret);
630 ctsvc_server_trim_memory();
635 ctsvc_server_trim_memory();
639 static void __ctsvc_server_sim_sdn_count_cb(TapiHandle *handle, int result, void *data, void *user_data)
643 TelSimPbAccessResult_t access_rt = result;
644 TelSimPbStorageInfo_t *ps = data;
645 ctsvc_sim_info_s *info = (ctsvc_sim_info_s*)user_data;
647 RETM_IF(TAPI_SIM_PB_SUCCESS != access_rt, "TelSimPbAccessResult:%d", access_rt);
648 RETM_IF(NULL == ps, "ps is NULL. TelSimPbAccessResult:%d", access_rt);
650 if (0 < ps->UsedRecordCount) {
651 ret = tel_read_sim_pb_record(info->handle, TAPI_SIM_PB_SDN, 1, __ctsvc_server_sim_sdn_read_cb, info);
652 if (TAPI_API_SUCCESS != ret) {
653 /* LCOV_EXCL_START */
654 ERR("tel_read_sim_pb_record() Fail(%d)", ret);
655 ctsvc_server_trim_memory();
660 /* LCOV_EXCL_START */
661 ERR("ps->UsedRecordCount:0. No SDN!!!!");
664 ctsvc_server_trim_memory();
667 static int __ctsvc_server_sim_sdn_read(ctsvc_sim_info_s *info)
671 int card_changed = 0;
672 TelSimCardStatus_t sim_status;
674 RETVM_IF(__ctsvc_server_sim_get_return_data(), CONTACTS_ERROR_INTERNAL,
675 "Server is already processing with sim");
677 ret = tel_get_sim_init_info(info->handle, &sim_status, &card_changed);
678 if (TAPI_API_SUCCESS != ret) {
679 /* LCOV_EXCL_START */
680 ERR("tel_get_sim_init_info() Fail(%d)", ret);
681 DBG("sim_status = %d, card_changed = %d", sim_status, card_changed);
682 ctsvc_server_trim_memory();
683 return CONTACTS_ERROR_SYSTEM;
687 if (TAPI_SIM_STATUS_CARD_NOT_PRESENT == sim_status ||
688 TAPI_SIM_STATUS_CARD_REMOVED == sim_status) {
689 ret = ctsvc_server_delete_sdn_contact(info->sim_slot_no);
690 if (CONTACTS_ERROR_NONE != ret) {
691 /* LCOV_EXCL_START */
692 ERR("ctsvc_server_delete_sdn_contact() Fail(%d)", ret);
693 ctsvc_server_trim_memory();
697 } else if (TAPI_SIM_STATUS_SIM_INIT_COMPLETED == sim_status) {
698 ret = ctsvc_server_delete_sdn_contact(info->sim_slot_no);
699 if (CONTACTS_ERROR_NONE != ret) {
700 /* LCOV_EXCL_START */
701 ERR("ctsvc_server_delete_sdn_contact() Fail(%d)", ret);
702 ctsvc_server_trim_memory();
707 ret = tel_get_sim_pb_count(info->handle, TAPI_SIM_PB_SDN, __ctsvc_server_sim_sdn_count_cb, info);
708 if (TAPI_API_SUCCESS != ret) {
709 /* LCOV_EXCL_START */
710 ERR("tel_get_sim_pb_meta_info() Fail(%d)", ret);
711 ctsvc_server_trim_memory();
712 return CONTACTS_ERROR_SYSTEM;
716 /* LCOV_EXCL_START */
717 ERR("sim_status Fail(%d)", sim_status);
718 return CONTACTS_ERROR_SYSTEM;
722 return CONTACTS_ERROR_NONE;
725 static void __ctsvc_server_sim_get_meta_info_cb(TapiHandle *handle, int result, void *data, void *user_data)
730 int type = TAPI_PB_3G_NAME;
731 TelSimPbAccessResult_t access_rt = result;
732 ctsvc_sim_info_s *info = (ctsvc_sim_info_s*)user_data;
734 DBG("sim slot id :%d, sim_type = %d", info->sim_slot_no, info->sim_type);
735 if (TAPI_SIM_PB_3GSIM == info->sim_type) {
736 TelSimPbCapabilityInfo_t *capa = data;
737 RETM_IF(NULL == capa, "capa is NULL result =%d", access_rt);
739 for (i = 0; i < capa->FileTypeCount; i++) {
740 type = capa->FileTypeInfo[i].field_type;
742 info->file_record[type].support = true;
743 info->file_record[type].index_max = capa->FileTypeInfo[i].index_max;
744 info->file_record[type].text_max = capa->FileTypeInfo[i].text_max;
745 info->file_record[type].used_count = capa->FileTypeInfo[i].used_count;
747 INFO(" field_type[%d] : index_max(%d), text_max(%d), used_count(%d)", type,
748 info->file_record[type].index_max,
749 info->file_record[type].text_max,
750 info->file_record[type].used_count);
752 } else if (TAPI_SIM_PB_ADN == info->sim_type) {
753 TelSimPbEntryInfo_t *pe = data;
754 RETM_IF(NULL == pe, "pe is NULL result =%d", access_rt);
756 info->file_record[CTSVC_2GSIM_NAME].support = true;
757 info->file_record[CTSVC_2GSIM_NAME].index_max = pe->PbIndexMax;
758 info->file_record[CTSVC_2GSIM_NAME].text_max = pe->PbTextLenMax;
759 info->file_record[CTSVC_2GSIM_NAME].used_count = pe->PbUsedCount;
760 DBG(" CTSVC_2GSIM_NAME : index_max(%d), text_max(%d), used_count(%d)",
761 pe->PbIndexMax, pe->PbTextLenMax, pe->PbUsedCount);
763 info->file_record[CTSVC_2GSIM_NUMBER].support = true;
764 info->file_record[CTSVC_2GSIM_NUMBER].index_max = pe->PbIndexMax;
765 info->file_record[CTSVC_2GSIM_NUMBER].text_max = pe->PbNumLenMax;
766 info->file_record[CTSVC_2GSIM_NUMBER].used_count = pe->PbUsedCount;
767 DBG(" CTSVC_2GSIM_NUMBER : index_max(%d), text_max(%d), used_count(%d)",
768 pe->PbIndexMax, pe->PbNumLenMax, pe->PbUsedCount);
770 INFO(" field_type[%d] : index_max(%d), text_max(%d), used_count(%d)", CTSVC_2GSIM_NAME,
771 info->file_record[CTSVC_2GSIM_NAME].index_max,
772 info->file_record[CTSVC_2GSIM_NAME].text_max,
773 info->file_record[CTSVC_2GSIM_NAME].used_count);
775 /* LCOV_EXCL_START */
776 ERR("sim_type [%d]error ", info->sim_type);
781 if (false == info->initialized) {
782 info->initialized = true;
783 ret = __ctsvc_server_sim_sdn_read(info);
784 WARN_IF(CONTACTS_ERROR_NONE != ret, "__ctsvc_server_sim_sdn_read() Fail(%d)", ret);
788 static void __ctsvc_server_sim_get_iccid_cb(TapiHandle *handle, int result, void *data,
791 TelSimAccessResult_t access_rt = result;
792 TelSimIccIdInfo_t *iccid = data;
793 ctsvc_sim_info_s *info = user_data;
797 RETM_IF(TAPI_SIM_ACCESS_SUCCESS != access_rt, "tel_get_sim_iccid Fail(%d)", access_rt);
799 DBG("%d, %s", iccid->icc_length, iccid->icc_num);
801 info->sim_unique_id = strdup(iccid->icc_num);
803 ret = ctsvc_server_get_sim_id(info->sim_unique_id, &id);
804 if (CONTACTS_ERROR_NONE == ret)
805 info->sim_info_id = id;
808 static int __ctsvc_server_sim_get_type_and_iccid(ctsvc_sim_info_s *info)
812 TelSimCardType_t cardtype = TAPI_SIM_PB_UNKNOWNN;
815 ret = tel_get_sim_type(info->handle, &cardtype);
816 RETVM_IF(TAPI_API_SUCCESS != ret, CONTACTS_ERROR_SYSTEM, "tel_get_sim_type Fail(%d)slot no(%d)", ret, info->sim_slot_no);
817 if (TAPI_SIM_CARD_TYPE_USIM == cardtype) {
818 info->sim_type = TAPI_SIM_PB_3GSIM;
819 } else if (TAPI_SIM_CARD_TYPE_GSM == cardtype) {
820 info->sim_type = TAPI_SIM_PB_ADN;
822 /* LCOV_EXCL_START */
823 ERR("cardtype(%d)is invalid!!!", cardtype);
824 return CONTACTS_ERROR_SYSTEM;
828 /* set iccid : unique info of SIM */
829 ret = tel_get_sim_iccid(info->handle, __ctsvc_server_sim_get_iccid_cb, info);
830 RETVM_IF(TAPI_API_SUCCESS != ret, CONTACTS_ERROR_SYSTEM, "tel_get_sim_iccid Fail(%d)", ret);
832 return CONTACTS_ERROR_NONE;
835 static int __ctsvc_server_sim_init_meta_info(ctsvc_sim_info_s *info)
837 int ret = TAPI_API_SUCCESS;
838 int err = CONTACTS_ERROR_NONE;
840 RETV_IF(NULL == info, CONTACTS_ERROR_INVALID_PARAMETER);
842 if (TAPI_SIM_PB_UNKNOWNN == info->sim_type) {
843 err = __ctsvc_server_sim_get_type_and_iccid(info);
844 WARN_IF(CONTACTS_ERROR_NONE != err, "__ctsvc_server_sim_get_type_and_iccid() Fail(%d)", err);
847 if (TAPI_SIM_PB_3GSIM == info->sim_type) {
848 ret = tel_get_sim_pb_usim_meta_info(info->handle, __ctsvc_server_sim_get_meta_info_cb, info);
849 } else if (TAPI_SIM_PB_ADN == info->sim_type) {
850 ret = tel_get_sim_pb_meta_info(info->handle, info->sim_type, __ctsvc_server_sim_get_meta_info_cb, info);
852 /* LCOV_EXCL_START */
853 ERR("info->sim_type is invalid(%d) stop sim init !!!", info->sim_type);
854 return CONTACTS_ERROR_SYSTEM;
858 RETVM_IF(TAPI_API_SUCCESS != ret, CONTACTS_ERROR_SYSTEM,
859 "tel_get_sim_(usim)_meta_info(type:%d) Fail(%d)", info->sim_type, ret);
861 return CONTACTS_ERROR_NONE;
864 static void __ctsvc_server_sim_noti_pb_status(TapiHandle *handle, const char *noti_id, void *data, void *user_data)
868 ctsvc_sim_info_s *info = (ctsvc_sim_info_s*)user_data;
869 TelSimPbStatus_t *pb_status = (TelSimPbStatus_t *)data;
870 RET_IF(NULL == pb_status);
871 INFO("received pb status noti : b_3g[%d], b_adn[%d], b_fdn[%d]", pb_status->pb_list.b_3g, pb_status->pb_list.b_adn, pb_status->pb_list.b_fdn);
873 if ((1 == pb_status->pb_list.b_3g) || (1 == pb_status->pb_list.b_adn)) {
874 if (info->initialized)
876 ret = __ctsvc_server_sim_init_meta_info(info);
877 WARN_IF(CONTACTS_ERROR_NONE != ret, "__ctsvc_server_sim_init_meta_info() Fail(%d)", ret);
878 } else if ((1 == pb_status->pb_list.b_fdn) && (0 == pb_status->pb_list.b_adn)
879 && (TAPI_SIM_PB_ADN == info->sim_type)) {
880 /* FDN on : can not import sim contacts */
881 INFO("This is sim card is 2G and FDN on status. sim phonebook will be block");
882 info->initialized = false;
883 __ctsvc_server_sim_init_import_info(info);
885 /* LCOV_EXCL_START */
886 ERR("This noti did not control !!!");
891 static void __ctsvc_server_sim_noti_sim_refreshed(TapiHandle *handle, const char *noti_id, void *data, void *user_data)
894 ctsvc_sim_info_s *info = (ctsvc_sim_info_s*)user_data;
896 INFO("Recieved SIM Refresh event");
897 info->initialized = false;
898 __ctsvc_server_sim_init_import_info(info);
901 static void __ctsvc_server_sim_get_info(ctsvc_sim_info_s *info)
905 TelSimPbList_t pb_list = {0,};
907 ret = __ctsvc_server_sim_get_type_and_iccid(info);
908 WARN_IF(CONTACTS_ERROR_NONE != ret, "__ctsvc_server_sim_get_type_and_iccid() Fail(%d)", ret);
909 ret = tel_get_sim_pb_init_info(info->handle, &sim_stat, &pb_list);
910 if (TAPI_API_SUCCESS == ret && ((1 == pb_list.b_3g) || (1 == pb_list.b_adn))) {
911 ret = __ctsvc_server_sim_init_meta_info(info);
912 WARN_IF(CONTACTS_ERROR_NONE != ret, "__ctsvc_server_sim_init_meta_info() Fail(%d)", ret);
915 ret = tel_register_noti_event(info->handle, TAPI_NOTI_PB_STATUS, __ctsvc_server_sim_noti_pb_status, info);
916 WARN_IF(TAPI_API_SUCCESS != ret, "tel_register_noti_event() Fail(%d)", ret);
918 ret = tel_register_noti_event(info->handle, TAPI_NOTI_SIM_REFRESHED, __ctsvc_server_sim_noti_sim_refreshed, info);
919 WARN_IF(TAPI_API_SUCCESS != ret, "tel_register_noti_event() Fail(%d)", ret);
922 static void __ctsvc_server_sim_status_events_cb(TapiHandle *handle, const char *noti_id, void *data, void *user_data)
926 RET_IF(NULL == data);
927 RET_IF(NULL == user_data);
929 TelSimCardStatus_t status = *(int *)data;
930 ctsvc_sim_info_s *info = (ctsvc_sim_info_s *)user_data;
932 if (TAPI_SIM_STATUS_SIM_INIT_COMPLETED != status) {
933 /* LCOV_EXCL_START */
934 ERR("sim is not ready (%d)", status);
938 INFO("sim is Ready");
940 ret = tel_deregister_noti_event(info->handle, TAPI_NOTI_SIM_STATUS);
941 WARN_IF(TAPI_API_SUCCESS != ret, "tel_deregister_noti_event() Fail(%d)", ret);
943 ctsvc_server_stop_timeout();
944 __ctsvc_server_sim_get_info(info);
945 ctsvc_server_start_timeout();
948 static int __ctsvc_server_sim_init_info()
951 char **cp_name = NULL;
953 unsigned int cp_index = 0;
955 #if !GLIB_CHECK_VERSION(2, 35, 0)
958 cp_name = tel_get_cp_name_list();
959 RETVM_IF(NULL == cp_name, CONTACTS_ERROR_SYSTEM, "tel_get_cp_name_list() Fail");
961 ret = ctsvc_server_delete_sdn_contact(-1);
962 WARN_IF(CONTACTS_ERROR_NONE != ret, "ctsvc_server_delete_sdn_contact() Fail(%d)", ret);
964 while (cp_name[cp_index])
968 while (cp_name[cp_index]) {
969 TelSimCardStatus_t status = TAPI_SIM_STATUS_CARD_ERROR;
970 int card_changed = 0;
971 ctsvc_sim_info_s *info = calloc(1, sizeof(ctsvc_sim_info_s));
973 /* LCOV_EXCL_START */
974 ERR("calloc() Fail");
976 return CONTACTS_ERROR_OUT_OF_MEMORY;
979 info->cp_name = strdup(cp_name[cp_index]);
980 INFO("SIM cp_name[%d] : %s", cp_index, info->cp_name);
981 info->sim_slot_no = cp_index;
982 info->sim_info_id = -1;
983 info->sim_type = TAPI_SIM_PB_UNKNOWNN;
984 info->initialized = false;
985 info->sim_unique_id = NULL;
987 /* initialize file_record meta info */
988 for (i = 0; i < TAPI_PB_MAX_FILE_CNT; i++) {
989 info->file_record[i].support = false;
990 info->file_record[i].index_max = 0;
991 info->file_record[i].text_max = 0;
992 info->file_record[i].used_count = 0;
995 __ctsvc_server_sim_get_tapi_handle(info);
996 if (NULL == info->handle) {
997 /* LCOV_EXCL_START */
998 ERR("__ctsvc_server_sim_get_tapi_handle() Fail");
1000 /* LCOV_EXCL_STOP */
1002 __ctsvc_sim_info = g_slist_append(__ctsvc_sim_info, (void*)info);
1005 ret = tel_get_sim_init_info(info->handle, &status, &card_changed);
1006 if (TAPI_API_SUCCESS != ret || TAPI_SIM_STATUS_SIM_INIT_COMPLETED != status) {
1007 /* LCOV_EXCL_START */
1008 ERR("tel_get_sim_init_info() ret(%d), status(%d)", ret, status);
1009 ret = tel_register_noti_event(info->handle, TAPI_NOTI_SIM_STATUS, __ctsvc_server_sim_status_events_cb, info);
1010 /* LCOV_EXCL_STOP */
1011 if (TAPI_API_SUCCESS != ret)
1012 /* LCOV_EXCL_START */
1013 ERR("tel_register_noti_event() Fail(%d)", ret);
1014 /* LCOV_EXCL_STOP */
1016 __ctsvc_server_sim_get_info(info);
1020 g_strfreev(cp_name);
1022 return CONTACTS_ERROR_NONE;
1025 static void __ctsvc_server_telephony_ready_cb(keynode_t *key, void *data)
1028 vconf_get_bool(VCONFKEY_TELEPHONY_READY, &bReady);
1031 /* LCOV_EXCL_START */
1032 ERR("telephony is not ready ");
1034 /* LCOV_EXCL_STOP */
1036 INFO("telephony is Ready");
1038 vconf_ignore_key_changed(VCONFKEY_TELEPHONY_READY, __ctsvc_server_telephony_ready_cb);
1039 __ctsvc_tapi_cb = false;
1041 ctsvc_server_stop_timeout();
1042 __ctsvc_server_sim_init_info();
1043 ctsvc_server_start_timeout();
1047 int ctsvc_server_sim_init()
1050 vconf_get_bool(VCONFKEY_TELEPHONY_READY, &bReady);
1053 /* LCOV_EXCL_START */
1054 ERR("telephony is not ready ");
1055 vconf_notify_key_changed(VCONFKEY_TELEPHONY_READY, __ctsvc_server_telephony_ready_cb, NULL);
1056 __ctsvc_tapi_cb = true;
1057 return CONTACTS_ERROR_NONE;
1058 /* LCOV_EXCL_STOP */
1061 return __ctsvc_server_sim_init_info();
1064 int ctsvc_server_sim_final(void)
1067 GSList *info_cursor = NULL;
1070 if (__ctsvc_tapi_cb)
1071 vconf_ignore_key_changed(VCONFKEY_TELEPHONY_READY, __ctsvc_server_telephony_ready_cb);
1073 for (info_cursor = __ctsvc_sim_info; info_cursor; info_cursor = info_cursor->next) {
1074 ctsvc_sim_info_s *info = info_cursor->data;
1075 free(info->cp_name);
1076 free(info->sim_unique_id);
1079 ret = tel_deregister_noti_event(info->handle, TAPI_NOTI_SIM_STATUS);
1080 WARN_IF(TAPI_API_SUCCESS != ret, "tel_deregister_noti_event() Fail(%d)", ret);
1081 ret = tel_deinit(info->handle);
1082 WARN_IF(TAPI_API_SUCCESS != ret, "tel_deinit() Fail(%d)", ret);
1085 __ctsvc_server_sim_init_import_info(info);
1090 return CONTACTS_ERROR_NONE;