4 * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
6 * Contact: Ja-young Gu <jygu@samsung.com>
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
26 #include "tapi_common.h"
27 #include "TapiUtility.h"
32 #include "ITapiPhonebook.h"
34 static int _tel_check_pb_state(TapiHandle *handle)
37 GVariant *sync_gv = NULL;
38 int api_err = TAPI_API_SUCCESS;
39 TelSimPbList_t pb_list;
42 sync_gv = g_dbus_connection_call_sync(handle->dbus_connection, DBUS_TELEPHONY_SERVICE,
43 handle->path, DBUS_TELEPHONY_PB_INTERFACE, "GetInitStatus", NULL, NULL,
44 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &gerr);
47 g_variant_get(sync_gv, "(ibbbbbb)",
57 api_err = TAPI_API_SUCCESS;
59 api_err = TAPI_API_INVALID_OPERATION;
62 dbg( "g_dbus_conn failed in _tel_check_pb_state. error (%s)", gerr->message);
64 return TAPI_API_OPERATION_FAILED;
70 static void on_response_get_sim_pb_count(GObject *source_object, GAsyncResult *res, gpointer user_data)
73 GDBusConnection *conn = NULL;
74 GVariant *dbus_result;
76 struct tapi_resp_data *evt_cb_data = user_data;
77 TelSimPbAccessResult_t result = TAPI_SIM_PB_SUCCESS;
78 TelSimPbStorageInfo_t pb_cnt ;
79 gint used = 0, total = 0;
81 memset(&pb_cnt, 0, sizeof(TelSimPbStorageInfo_t));
83 conn = G_DBUS_CONNECTION (source_object);
84 dbus_result = g_dbus_connection_call_finish(conn, res, &error);
88 if (evt_cb_data->cb_fn) {
89 evt_cb_data->cb_fn(evt_cb_data->handle, -1, NULL, evt_cb_data->user_data);
99 g_variant_get (dbus_result, "(iiii)",
101 &pb_cnt.StorageFileType,
105 pb_cnt.UsedRecordCount = used;
106 pb_cnt.TotalRecordCount = total;
108 if (evt_cb_data->cb_fn) {
109 evt_cb_data->cb_fn(evt_cb_data->handle, result, &pb_cnt, evt_cb_data->user_data);
115 static void on_response_get_sim_pb_meta_info(GObject *source_object, GAsyncResult *res, gpointer user_data)
117 GError *error = NULL;
118 GDBusConnection *conn = NULL;
119 GVariant *dbus_result;
121 struct tapi_resp_data *evt_cb_data = user_data;
122 TelSimPbAccessResult_t result = TAPI_SIM_PB_SUCCESS;
123 TelSimPbEntryInfo_t pb_entry ;
125 gint imin = 0, imax = 0, nmax = 0, tmax = 0;
127 memset(&pb_entry, 0, sizeof(TelSimPbEntryInfo_t));
129 conn = G_DBUS_CONNECTION (source_object);
130 dbus_result = g_dbus_connection_call_finish(conn, res, &error);
134 if (evt_cb_data->cb_fn) {
135 evt_cb_data->cb_fn(evt_cb_data->handle, -1, NULL, evt_cb_data->user_data);
145 g_variant_get (dbus_result, "(iiiiii)",
147 &pb_entry.StorageFileType,
153 pb_entry.PbIndexMin = imin;
154 pb_entry.PbIndexMax = imax;
155 pb_entry.PbNumLenMax =nmax;
156 pb_entry.PbTextLenMax = tmax;
158 if (evt_cb_data->cb_fn) {
159 evt_cb_data->cb_fn(evt_cb_data->handle, result, &pb_entry, evt_cb_data->user_data);
165 static void on_response_get_sim_pb_usim_meta_info(GObject *source_object, GAsyncResult *res, gpointer user_data)
167 GError *error = NULL;
168 GDBusConnection *conn = NULL;
169 GVariant *dbus_result;
170 GVariant *value = NULL;
171 GVariantIter *iter = NULL;
172 GVariantIter *iter_row = NULL;
173 const gchar *key = NULL;
174 struct tapi_resp_data *evt_cb_data = user_data;
175 TelSimPbAccessResult_t result = TAPI_SIM_PB_SUCCESS;
176 TelSimPbCapabilityInfo_t list ;
179 dbg("Func Entrance");
180 memset(&list, 0, sizeof(TelSimPbCapabilityInfo_t));
182 conn = G_DBUS_CONNECTION (source_object);
183 dbus_result = g_dbus_connection_call_finish(conn, res, &error);
187 if (evt_cb_data->cb_fn) {
188 evt_cb_data->cb_fn(evt_cb_data->handle, -1, NULL, evt_cb_data->user_data);
198 g_variant_get(dbus_result, "(iaa{sv})", &result, &iter);
199 list.FileTypeCount = g_variant_iter_n_children(iter);
202 while (g_variant_iter_next(iter, "a{sv}", &iter_row)) {
203 while (g_variant_iter_loop(iter_row, "{sv}", &key, &value)) {
204 if (!g_strcmp0(key, "field_type")) {
205 list.FileTypeInfo[i].field_type = g_variant_get_int32(value);
207 if (!g_strcmp0(key, "index_max")) {
208 list.FileTypeInfo[i].index_max = g_variant_get_int32(value);
210 if (!g_strcmp0(key, "text_max")) {
211 list.FileTypeInfo[i].text_max = g_variant_get_int32(value);
213 if (!g_strcmp0(key, "used_count")) {
214 list.FileTypeInfo[i].used_count = g_variant_get_int32(value);
218 g_variant_iter_free(iter_row);
220 g_variant_iter_free(iter);
222 if (evt_cb_data->cb_fn) {
223 evt_cb_data->cb_fn(evt_cb_data->handle, result, &list, evt_cb_data->user_data);
229 static void on_response_read_sim_pb_record(GObject *source_object, GAsyncResult *res, gpointer user_data)
231 GError *error = NULL;
232 GDBusConnection *conn = NULL;
233 GVariant *dbus_result;
235 struct tapi_resp_data *evt_cb_data = user_data;
236 TelSimPbAccessResult_t result = TAPI_SIM_PB_SUCCESS;
237 TelSimPbRecord_t pb_rec ;
241 gchar *number = NULL;
246 gchar *email1 = NULL;
247 gchar *email2 = NULL;
248 gchar *email3 = NULL;
249 gchar *email4 = NULL;
251 memset(&pb_rec, 0, sizeof(TelSimPbRecord_t));
253 conn = G_DBUS_CONNECTION (source_object);
254 dbus_result = g_dbus_connection_call_finish(conn, res, &error);
258 if (evt_cb_data->cb_fn) {
259 evt_cb_data->cb_fn(evt_cb_data->handle, -1, NULL, evt_cb_data->user_data);
269 g_variant_get (dbus_result, "(iiiisisisisisisissssi)",
271 &pb_rec.phonebook_type,
290 &pb_rec.group_index);
293 pb_rec.next_index = ni;
296 snprintf((char*)pb_rec.name, strlen(name) + 1, "%s", name);
299 snprintf((char*)pb_rec.number, strlen(number) + 1, "%s", number);
302 snprintf((char*)pb_rec.sne, strlen(sne) + 1, "%s", sne);
305 snprintf((char*)pb_rec.anr1, strlen(anr1) + 1, "%s", anr1);
308 snprintf((char*)pb_rec.anr2, strlen(anr2) + 1, "%s", anr2);
311 snprintf((char*)pb_rec.anr3, strlen(anr3) + 1, "%s", anr3);
314 snprintf((char*)pb_rec.email1, strlen(email1) + 1, "%s", email1);
317 snprintf((char*)pb_rec.email2, strlen(email2) + 1, "%s", email2);
320 snprintf((char*)pb_rec.email3, strlen(email3) + 1, "%s", email3);
322 dbg("pb_rec.phonebook_type[%d]",pb_rec.phonebook_type );
323 dbg("pb_rec.index[%d]",pb_rec.index );
324 dbg("pb_rec.next_index[%d]",pb_rec.next_index );
325 dbg("pb_rec.name[%s]",pb_rec.name );
326 dbg("pb_rec.dcs[%d]",pb_rec.dcs );
327 dbg("pb_rec.number[%s]",pb_rec.number );
328 dbg("pb_rec.ton[%d]",pb_rec.ton );
330 if(pb_rec.phonebook_type==TAPI_SIM_PB_3GSIM) {
331 dbg("pb_rec.sne[%s]",pb_rec.sne );
332 dbg("pb_rec.sne_dcs[%d]",pb_rec.sne_dcs );
333 dbg("pb_rec.anr1[%s]",pb_rec.anr1 );
334 dbg("pb_rec.anr1_ton[%d]",pb_rec.anr1_ton );
335 dbg("pb_rec.anr2[%s]",pb_rec.anr2 );
336 dbg("pb_rec.anr2_ton[%d]",pb_rec.anr2_ton );
337 dbg("pb_rec.anr3[%s]",pb_rec.anr3 );
338 dbg("pb_rec.anr3_ton[%d]",pb_rec.anr3_ton );
339 dbg("pb_rec.email1[%s]",pb_rec.email1 );
340 dbg("pb_rec.email2[%s]",pb_rec.email2 );
341 dbg("pb_rec.email3[%s]",pb_rec.email3 );
342 dbg("pb_rec.email4[%s]",pb_rec.email4 );
343 dbg("pb_rec.group_index[%d]",pb_rec.group_index );
344 dbg("pb_rec.pb_control[%d]",pb_rec.pb_control );
347 if (evt_cb_data->cb_fn) {
348 evt_cb_data->cb_fn(evt_cb_data->handle, result, &pb_rec, evt_cb_data->user_data);
354 static void on_response_update_sim_pb_record(GObject *source_object, GAsyncResult *res, gpointer user_data)
356 GError *error = NULL;
357 GDBusConnection *conn = NULL;
358 GVariant *dbus_result;
360 struct tapi_resp_data *evt_cb_data = user_data;
361 TelSimPbAccessResult_t result = TAPI_SIM_PB_SUCCESS;
363 conn = G_DBUS_CONNECTION (source_object);
364 dbus_result = g_dbus_connection_call_finish(conn, res, &error);
368 if (evt_cb_data->cb_fn) {
369 evt_cb_data->cb_fn(evt_cb_data->handle, -1, NULL, evt_cb_data->user_data);
379 g_variant_get (dbus_result, "(i)", &result);
381 if (evt_cb_data->cb_fn) {
382 evt_cb_data->cb_fn(evt_cb_data->handle, result, NULL, evt_cb_data->user_data);
388 static void on_response_delete_sim_pb_record(GObject *source_object, GAsyncResult *res, gpointer user_data)
390 GError *error = NULL;
391 GDBusConnection *conn = NULL;
392 GVariant *dbus_result;
394 struct tapi_resp_data *evt_cb_data = user_data;
395 TelSimPbAccessResult_t result = TAPI_SIM_PB_SUCCESS;
397 conn = G_DBUS_CONNECTION (source_object);
398 dbus_result = g_dbus_connection_call_finish(conn, res, &error);
402 if (evt_cb_data->cb_fn) {
403 evt_cb_data->cb_fn(evt_cb_data->handle, -1, NULL, evt_cb_data->user_data);
413 g_variant_get (dbus_result, "(i)", &result);
415 if (evt_cb_data->cb_fn) {
416 evt_cb_data->cb_fn(evt_cb_data->handle, result, NULL, evt_cb_data->user_data);
422 EXPORT_API int tel_get_sim_pb_init_info(TapiHandle *handle, int *init_completed, TelSimPbList_t *pb_list)
425 GVariant *sync_gv = NULL;
426 int api_err = TAPI_API_SUCCESS;
429 dbg("Func Entrance");
431 TAPI_RETURN_VAL_IF_FAIL(init_completed, TAPI_API_INVALID_PTR);
432 TAPI_RETURN_VAL_IF_FAIL(pb_list, TAPI_API_INVALID_PTR);
434 sync_gv = g_dbus_connection_call_sync(handle->dbus_connection, DBUS_TELEPHONY_SERVICE,
435 handle->path, DBUS_TELEPHONY_PB_INTERFACE, "GetInitStatus", NULL, NULL,
436 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &gerr);
439 g_variant_get(sync_gv, "(ibbbbbb)",
447 *init_completed = init_status;
450 dbg("pb_list->b_fdn[%d]", pb_list->b_fdn)
451 dbg("pb_list->b_adn[%d]", pb_list->b_adn)
452 dbg("pb_list->b_sdn[%d]", pb_list->b_sdn)
453 dbg("pb_list->b_3g[%d]", pb_list->b_3g)
454 dbg("pb_list->b_aas[%d]", pb_list->b_aas)
455 dbg("pb_list->b_gas[%d]", pb_list->b_gas)
460 EXPORT_API int tel_get_sim_pb_count(TapiHandle *handle, TelSimPbType_t pb_type, tapi_response_cb callback, void *user_data)
462 struct tapi_resp_data *evt_cb_data = NULL;
463 GVariant *param = NULL;
466 dbg("Func Entrance");
467 pb_ready = _tel_check_pb_state(handle);
471 if ( (pb_type != TAPI_SIM_PB_FDN) && (pb_type != TAPI_SIM_PB_ADN) && (pb_type != TAPI_SIM_PB_SDN)
472 && (pb_type != TAPI_SIM_PB_3GSIM) && (pb_type != TAPI_SIM_PB_AAS) && (pb_type != TAPI_SIM_PB_GAS))
473 return TAPI_API_INVALID_INPUT;
475 MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
477 param = g_variant_new("(i)", pb_type);
479 g_dbus_connection_call(handle->dbus_connection,
480 DBUS_TELEPHONY_SERVICE , handle->path, DBUS_TELEPHONY_PB_INTERFACE,
481 "GetCount", param, NULL,
482 G_DBUS_CALL_FLAGS_NONE, -1, handle->ca,
483 on_response_get_sim_pb_count, evt_cb_data);
485 return TAPI_API_SUCCESS;
488 EXPORT_API int tel_get_sim_pb_meta_info(TapiHandle *handle, TelSimPbType_t pb_type, tapi_response_cb callback, void *user_data)
490 struct tapi_resp_data *evt_cb_data = NULL;
491 GVariant *param = NULL;
494 dbg("Func Entrance");
495 pb_ready = _tel_check_pb_state(handle);
499 if ( (pb_type != TAPI_SIM_PB_FDN) && (pb_type != TAPI_SIM_PB_ADN) && (pb_type != TAPI_SIM_PB_SDN)
500 && (pb_type != TAPI_SIM_PB_3GSIM) && (pb_type != TAPI_SIM_PB_AAS) && (pb_type != TAPI_SIM_PB_GAS))
501 return TAPI_API_INVALID_INPUT;
503 MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
505 param = g_variant_new("(i)", pb_type);
507 g_dbus_connection_call(handle->dbus_connection,
508 DBUS_TELEPHONY_SERVICE , handle->path, DBUS_TELEPHONY_PB_INTERFACE,
509 "GetInfo", param, NULL,
510 G_DBUS_CALL_FLAGS_NONE, -1, handle->ca,
511 on_response_get_sim_pb_meta_info, evt_cb_data);
513 return TAPI_API_SUCCESS;
516 EXPORT_API int tel_get_sim_pb_usim_meta_info(TapiHandle *handle, tapi_response_cb callback, void *user_data)
518 struct tapi_resp_data *evt_cb_data = NULL;
519 GVariant *param = NULL;
522 dbg("Func Entrance");
523 pb_ready = _tel_check_pb_state(handle);
527 MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
529 g_dbus_connection_call(handle->dbus_connection,
530 DBUS_TELEPHONY_SERVICE , handle->path, DBUS_TELEPHONY_PB_INTERFACE,
531 "GetUsimMetaInfo", param, NULL,
532 G_DBUS_CALL_FLAGS_NONE, -1, handle->ca,
533 on_response_get_sim_pb_usim_meta_info, evt_cb_data);
535 return TAPI_API_SUCCESS;
538 EXPORT_API int tel_read_sim_pb_record(TapiHandle *handle, TelSimPbType_t pb_type, unsigned short index, tapi_response_cb callback, void *user_data)
540 struct tapi_resp_data *evt_cb_data = NULL;
541 GVariant *param = NULL;
544 dbg("Func Entrance");
545 pb_ready = _tel_check_pb_state(handle);
550 return TAPI_API_INVALID_INPUT;
552 if ( (pb_type != TAPI_SIM_PB_FDN) && (pb_type != TAPI_SIM_PB_ADN) && (pb_type != TAPI_SIM_PB_SDN)
553 && (pb_type != TAPI_SIM_PB_3GSIM) && (pb_type != TAPI_SIM_PB_AAS) && (pb_type != TAPI_SIM_PB_GAS))
554 return TAPI_API_INVALID_INPUT;
556 MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
558 param = g_variant_new("(ii)", pb_type, index);
560 g_dbus_connection_call(handle->dbus_connection,
561 DBUS_TELEPHONY_SERVICE , handle->path, DBUS_TELEPHONY_PB_INTERFACE,
562 "ReadRecord", param, NULL,
563 G_DBUS_CALL_FLAGS_NONE, -1, handle->ca,
564 on_response_read_sim_pb_record, evt_cb_data);
566 return TAPI_API_SUCCESS;
569 EXPORT_API int tel_update_sim_pb_record(TapiHandle *handle, const TelSimPbRecord_t *req_data, tapi_response_cb callback, void *user_data)
571 struct tapi_resp_data *evt_cb_data = NULL;
572 GVariant *param = NULL;
575 dbg("Func Entrance");
576 pb_ready = _tel_check_pb_state(handle);
580 TAPI_RETURN_VAL_IF_FAIL((req_data != NULL) , TAPI_API_INVALID_PTR);
582 if (req_data->index == 0) {
583 return TAPI_API_INVALID_INPUT;
586 if ((req_data->phonebook_type != TAPI_SIM_PB_FDN)
587 && (req_data->phonebook_type != TAPI_SIM_PB_ADN) && (req_data->phonebook_type != TAPI_SIM_PB_SDN)
588 && (req_data->phonebook_type != TAPI_SIM_PB_3GSIM) && (req_data->phonebook_type != TAPI_SIM_PB_AAS)
589 && (req_data->phonebook_type != TAPI_SIM_PB_GAS)) {
590 return TAPI_API_INVALID_INPUT;
593 MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
595 dbg("req_data->phonebook_type[%d]",req_data->phonebook_type );
596 dbg("req_data->index[%d]",req_data->index );
597 dbg("req_data->name[%s]",req_data->name );
598 dbg("req_data->dcs[%d]",req_data->dcs );
599 dbg("req_data->number[%s]",req_data->number );
600 dbg("req_data->ton[%d]",req_data->ton );
602 if(req_data->phonebook_type == TAPI_SIM_PB_3GSIM) {
603 dbg("req_data->sne[%s]",req_data->sne );
604 dbg("req_data->sne_dcs[%d]",req_data->sne_dcs );
605 dbg("req_data->anr1[%s]",req_data->anr1 );
606 dbg("req_data->anr1_ton[%d]",req_data->anr1_ton );
607 dbg("req_data->anr2[%s]",req_data->anr2 );
608 dbg("req_data->anr2_ton[%d]",req_data->anr2_ton );
609 dbg("req_data->anr3[%s]",req_data->anr3 );
610 dbg("req_data->anr3_ton[%d]",req_data->anr3_ton );
611 dbg("req_data->email1[%s]",req_data->email1 );
612 dbg("req_data->email2[%s]",req_data->email2 );
613 dbg("req_data->email3[%s]",req_data->email3 );
614 dbg("req_data->email4[%s]",req_data->email4 );
615 dbg("req_data->group_index[%d]",req_data->group_index );
616 dbg("req_data->pb_control[%d]",req_data->pb_control );
619 param = g_variant_new("(iisisisisisisissssi)",
620 req_data->phonebook_type,
638 req_data->group_index);
640 g_dbus_connection_call(handle->dbus_connection,
641 DBUS_TELEPHONY_SERVICE , handle->path, DBUS_TELEPHONY_PB_INTERFACE,
642 "UpdateRecord", param, NULL,
643 G_DBUS_CALL_FLAGS_NONE, -1, handle->ca,
644 on_response_update_sim_pb_record, evt_cb_data);
646 return TAPI_API_SUCCESS;
650 EXPORT_API int tel_delete_sim_pb_record(TapiHandle *handle, TelSimPbType_t pb_type, unsigned short index, tapi_response_cb callback, void *user_data)
652 struct tapi_resp_data *evt_cb_data = NULL;
653 GVariant *param = NULL;
656 dbg("Func Entrance");
657 pb_ready = _tel_check_pb_state(handle);
662 return TAPI_API_INVALID_INPUT;
664 if ( (pb_type != TAPI_SIM_PB_FDN) && (pb_type != TAPI_SIM_PB_ADN) && (pb_type != TAPI_SIM_PB_SDN)
665 && (pb_type != TAPI_SIM_PB_3GSIM) && (pb_type != TAPI_SIM_PB_AAS) && (pb_type != TAPI_SIM_PB_GAS))
666 return TAPI_API_INVALID_INPUT;
668 MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
670 param = g_variant_new("(ii)", pb_type, index);
672 g_dbus_connection_call(handle->dbus_connection,
673 DBUS_TELEPHONY_SERVICE , handle->path, DBUS_TELEPHONY_PB_INTERFACE,
674 "DeleteRecord", param, NULL,
675 G_DBUS_CALL_FLAGS_NONE, -1, handle->ca,
676 on_response_delete_sim_pb_record, evt_cb_data);
678 return TAPI_API_SUCCESS;