4 * Copyright (c) 2014 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 void move_str (char *dest, unsigned int len, gchar *src)
39 if (strlen (src) == 0)
42 snprintf (dest, len, "%s", src);
45 static void on_response_get_sim_pb_count(GObject *source_object, GAsyncResult *res, gpointer user_data)
48 GDBusConnection *conn = NULL;
49 GVariant *dbus_result;
51 struct tapi_resp_data *evt_cb_data = user_data;
52 TelSimPbAccessResult_t result = TAPI_SIM_PB_SUCCESS;
53 TelSimPbStorageInfo_t pb_cnt ;
54 gint used = 0, total = 0;
56 memset(&pb_cnt, 0, sizeof(TelSimPbStorageInfo_t));
58 conn = G_DBUS_CONNECTION (source_object);
59 dbus_result = g_dbus_connection_call_finish(conn, res, &error);
62 g_variant_get (dbus_result, "(iiii)",
64 &pb_cnt.StorageFileType,
68 pb_cnt.UsedRecordCount = used;
69 pb_cnt.TotalRecordCount = total;
71 if (evt_cb_data->cb_fn) {
72 evt_cb_data->cb_fn(evt_cb_data->handle, result, &pb_cnt, evt_cb_data->user_data);
76 g_variant_unref(dbus_result);
79 static void on_response_get_sim_pb_meta_info(GObject *source_object, GAsyncResult *res, gpointer user_data)
82 GDBusConnection *conn = NULL;
83 GVariant *dbus_result;
85 struct tapi_resp_data *evt_cb_data = user_data;
86 TelSimPbAccessResult_t result = TAPI_SIM_PB_SUCCESS;
87 TelSimPbEntryInfo_t pb_entry ;
89 gint imin = 0, imax = 0, nmax = 0, tmax = 0, used = 0;
91 memset(&pb_entry, 0, sizeof(TelSimPbEntryInfo_t));
93 conn = G_DBUS_CONNECTION (source_object);
94 dbus_result = g_dbus_connection_call_finish(conn, res, &error);
97 g_variant_get (dbus_result, "(iiiiiii)",
99 &pb_entry.StorageFileType,
106 pb_entry.PbIndexMin = imin;
107 pb_entry.PbIndexMax = imax;
108 pb_entry.PbNumLenMax =nmax;
109 pb_entry.PbTextLenMax = tmax;
110 pb_entry.PbUsedCount = used;
112 if (evt_cb_data->cb_fn) {
113 evt_cb_data->cb_fn(evt_cb_data->handle, result, &pb_entry, evt_cb_data->user_data);
117 g_variant_unref(dbus_result);
120 static void on_response_get_sim_pb_usim_meta_info(GObject *source_object, GAsyncResult *res, gpointer user_data)
122 GError *error = NULL;
123 GDBusConnection *conn = NULL;
124 GVariant *dbus_result;
125 GVariant *value = NULL;
126 GVariantIter *iter = NULL;
127 GVariantIter *iter_row = NULL;
128 const gchar *key = NULL;
129 struct tapi_resp_data *evt_cb_data = user_data;
130 TelSimPbAccessResult_t result = TAPI_SIM_PB_SUCCESS;
131 TelSimPbCapabilityInfo_t list ;
134 dbg("Func Entrance");
135 memset(&list, 0, sizeof(TelSimPbCapabilityInfo_t));
137 conn = G_DBUS_CONNECTION (source_object);
138 dbus_result = g_dbus_connection_call_finish(conn, res, &error);
141 g_variant_get(dbus_result, "(iaa{sv})", &result, &iter);
142 list.FileTypeCount = g_variant_iter_n_children(iter);
145 while (g_variant_iter_next(iter, "a{sv}", &iter_row)) {
146 while (g_variant_iter_loop(iter_row, "{sv}", &key, &value)) {
147 if (!g_strcmp0(key, "field_type")) {
148 list.FileTypeInfo[i].field_type = g_variant_get_int32(value);
150 if (!g_strcmp0(key, "index_max")) {
151 list.FileTypeInfo[i].index_max = g_variant_get_int32(value);
153 if (!g_strcmp0(key, "text_max")) {
154 list.FileTypeInfo[i].text_max = g_variant_get_int32(value);
156 if (!g_strcmp0(key, "used_count")) {
157 list.FileTypeInfo[i].used_count = g_variant_get_int32(value);
161 g_variant_iter_free(iter_row);
163 g_variant_iter_free(iter);
165 if (evt_cb_data->cb_fn) {
166 evt_cb_data->cb_fn(evt_cb_data->handle, result, &list, evt_cb_data->user_data);
170 g_variant_unref(dbus_result);
173 static void on_response_read_sim_pb_record(GObject *source_object, GAsyncResult *res, gpointer user_data)
175 GError *error = NULL;
176 GDBusConnection *conn = NULL;
177 GVariant *dbus_result;
179 struct tapi_resp_data *evt_cb_data = user_data;
180 TelSimPbAccessResult_t result = TAPI_SIM_PB_SUCCESS;
181 TelSimPbRecord_t pb_rec ;
185 gchar *number = NULL;
190 gchar *email1 = NULL;
191 gchar *email2 = NULL;
192 gchar *email3 = NULL;
193 gchar *email4 = NULL;
195 memset(&pb_rec, 0, sizeof(TelSimPbRecord_t));
197 conn = G_DBUS_CONNECTION (source_object);
198 dbus_result = g_dbus_connection_call_finish(conn, res, &error);
201 g_variant_get (dbus_result, "(iiiisisisisisisissssi)",
203 &pb_rec.phonebook_type,
222 &pb_rec.group_index);
225 pb_rec.next_index = ni;
227 move_str ((char *)pb_rec.name, TAPI_SIM_PB_RECORD_NAME_MAX_LEN, name);
228 move_str ((char *)pb_rec.number, TAPI_SIM_PB_RECORD_NUMBER_MAX_LEN, number);
229 move_str ((char *)pb_rec.sne, TAPI_SIM_PB_RECORD_NAME_MAX_LEN, sne);
230 move_str ((char *)pb_rec.anr1, TAPI_SIM_PB_RECORD_NUMBER_MAX_LEN, anr1);
231 move_str ((char *)pb_rec.anr2, TAPI_SIM_PB_RECORD_NUMBER_MAX_LEN, anr2);
232 move_str ((char *)pb_rec.anr3, TAPI_SIM_PB_RECORD_NUMBER_MAX_LEN, anr3);
233 move_str ((char *)pb_rec.email1, TAPI_SIM_PB_RECORD_EMAIL_MAX_LEN, email1);
234 move_str ((char *)pb_rec.email2, TAPI_SIM_PB_RECORD_EMAIL_MAX_LEN, email2);
235 move_str ((char *)pb_rec.email3, TAPI_SIM_PB_RECORD_EMAIL_MAX_LEN, email3);
237 msg("type[%d], index[%d], next_index[%d]", pb_rec.phonebook_type,
238 pb_rec.index, pb_rec.next_index);
239 dbg("name[%s], dcs[%d]", pb_rec.name, pb_rec.dcs);
240 dbg("number[%s], ton[%d]", pb_rec.number, pb_rec.ton);
242 if (pb_rec.phonebook_type==TAPI_SIM_PB_3GSIM) {
243 dbg("sne[%s], sne_dcs[%d]", pb_rec.sne, pb_rec.sne_dcs);
244 dbg("anr1([%d][%s]),anr2([%d][%s]),anr3([%d][%s])",
245 pb_rec.anr1_ton, pb_rec.anr1, pb_rec.anr2_ton, pb_rec.anr2,
246 pb_rec.anr3_ton, pb_rec.anr3);
247 dbg("email[%s] [%s][%s][%s]", pb_rec.email1, pb_rec.email2,
248 pb_rec.email3, pb_rec.email4);
249 dbg("group_index[%d], pb_control[%d]", pb_rec.group_index,
253 if (evt_cb_data->cb_fn) {
254 evt_cb_data->cb_fn(evt_cb_data->handle, result, &pb_rec, evt_cb_data->user_data);
269 g_variant_unref(dbus_result);
272 static void on_response_update_sim_pb_record(GObject *source_object, GAsyncResult *res, gpointer user_data)
274 GError *error = NULL;
275 GDBusConnection *conn = NULL;
276 GVariant *dbus_result;
278 struct tapi_resp_data *evt_cb_data = user_data;
279 TelSimPbAccessResult_t result = TAPI_SIM_PB_SUCCESS;
281 conn = G_DBUS_CONNECTION (source_object);
282 dbus_result = g_dbus_connection_call_finish(conn, res, &error);
285 g_variant_get (dbus_result, "(i)", &result);
287 if (evt_cb_data->cb_fn) {
288 evt_cb_data->cb_fn(evt_cb_data->handle, result, NULL, evt_cb_data->user_data);
292 g_variant_unref(dbus_result);
295 static void on_response_delete_sim_pb_record(GObject *source_object, GAsyncResult *res, gpointer user_data)
297 GError *error = NULL;
298 GDBusConnection *conn = NULL;
299 GVariant *dbus_result;
301 struct tapi_resp_data *evt_cb_data = user_data;
302 TelSimPbAccessResult_t result = TAPI_SIM_PB_SUCCESS;
304 conn = G_DBUS_CONNECTION (source_object);
305 dbus_result = g_dbus_connection_call_finish(conn, res, &error);
308 g_variant_get (dbus_result, "(i)", &result);
310 if (evt_cb_data->cb_fn) {
311 evt_cb_data->cb_fn(evt_cb_data->handle, result, NULL, evt_cb_data->user_data);
315 g_variant_unref(dbus_result);
318 EXPORT_API int tel_get_sim_pb_init_info(TapiHandle *handle, int *init_completed, TelSimPbList_t *pb_list)
321 GVariant *sync_gv = NULL;
324 TAPI_RET_ERR_NUM_IF_FAIL(handle, TAPI_API_INVALID_PTR);
325 TAPI_RET_ERR_NUM_IF_FAIL(init_completed, TAPI_API_INVALID_PTR);
326 TAPI_RET_ERR_NUM_IF_FAIL(pb_list, TAPI_API_INVALID_PTR);
328 sync_gv = g_dbus_connection_call_sync(handle->dbus_connection, DBUS_TELEPHONY_SERVICE,
329 handle->path, DBUS_TELEPHONY_PB_INTERFACE, "GetInitStatus", NULL, NULL,
330 G_DBUS_CALL_FLAGS_NONE, TAPI_DEFAULT_TIMEOUT, handle->ca, &gerr);
333 g_variant_get(sync_gv, "(ibbbbbb)",
341 *init_completed = init_status;
342 g_variant_unref(sync_gv);
345 err("Operation Failed - Error: (%s)", gerr->message);
347 return TAPI_API_OPERATION_FAILED;
350 dbg("b_(fdn[%d] adn[%d] sdn[%d] 3g[%d] aas[%d] gas[%d])",
351 pb_list->b_fdn,pb_list->b_adn,pb_list->b_sdn,pb_list->b_3g,pb_list->b_aas,pb_list->b_gas);
353 return TAPI_API_SUCCESS;
356 EXPORT_API int tel_get_sim_pb_count(TapiHandle *handle, TelSimPbType_t pb_type, tapi_response_cb callback, void *user_data)
358 struct tapi_resp_data *evt_cb_data = NULL;
359 GVariant *param = NULL;
361 dbg("Func Entrance");
363 TAPI_RET_ERR_NUM_IF_FAIL(handle, TAPI_API_INVALID_PTR);
364 TAPI_RET_ERR_NUM_IF_FAIL(callback, TAPI_API_INVALID_PTR);
366 if ( (pb_type != TAPI_SIM_PB_FDN) && (pb_type != TAPI_SIM_PB_ADN) && (pb_type != TAPI_SIM_PB_SDN)
367 && (pb_type != TAPI_SIM_PB_3GSIM) && (pb_type != TAPI_SIM_PB_AAS) && (pb_type != TAPI_SIM_PB_GAS))
368 return TAPI_API_INVALID_INPUT;
370 MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
372 param = g_variant_new("(i)", pb_type);
374 g_dbus_connection_call(handle->dbus_connection,
375 DBUS_TELEPHONY_SERVICE , handle->path, DBUS_TELEPHONY_PB_INTERFACE,
376 "GetCount", param, NULL,
377 G_DBUS_CALL_FLAGS_NONE, TAPI_DEFAULT_TIMEOUT, handle->ca,
378 on_response_get_sim_pb_count, evt_cb_data);
380 return TAPI_API_SUCCESS;
383 EXPORT_API int tel_get_sim_pb_meta_info(TapiHandle *handle, TelSimPbType_t pb_type, tapi_response_cb callback, void *user_data)
385 struct tapi_resp_data *evt_cb_data = NULL;
386 GVariant *param = NULL;
388 dbg("Func Entrance");
390 TAPI_RET_ERR_NUM_IF_FAIL(handle, TAPI_API_INVALID_PTR);
391 TAPI_RET_ERR_NUM_IF_FAIL(callback, TAPI_API_INVALID_PTR);
393 if ( (pb_type != TAPI_SIM_PB_FDN) && (pb_type != TAPI_SIM_PB_ADN) && (pb_type != TAPI_SIM_PB_SDN)
394 && (pb_type != TAPI_SIM_PB_3GSIM) && (pb_type != TAPI_SIM_PB_AAS) && (pb_type != TAPI_SIM_PB_GAS))
395 return TAPI_API_INVALID_INPUT;
397 MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
399 param = g_variant_new("(i)", pb_type);
401 g_dbus_connection_call(handle->dbus_connection,
402 DBUS_TELEPHONY_SERVICE , handle->path, DBUS_TELEPHONY_PB_INTERFACE,
403 "GetInfo", param, NULL,
404 G_DBUS_CALL_FLAGS_NONE, TAPI_DEFAULT_TIMEOUT, handle->ca,
405 on_response_get_sim_pb_meta_info, evt_cb_data);
407 return TAPI_API_SUCCESS;
410 EXPORT_API int tel_get_sim_pb_usim_meta_info(TapiHandle *handle, tapi_response_cb callback, void *user_data)
412 struct tapi_resp_data *evt_cb_data = NULL;
413 GVariant *param = NULL;
415 dbg("Func Entrance");
417 TAPI_RET_ERR_NUM_IF_FAIL(handle, TAPI_API_INVALID_PTR);
418 TAPI_RET_ERR_NUM_IF_FAIL(callback, TAPI_API_INVALID_PTR);
420 MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
422 g_dbus_connection_call(handle->dbus_connection,
423 DBUS_TELEPHONY_SERVICE , handle->path, DBUS_TELEPHONY_PB_INTERFACE,
424 "GetUsimMetaInfo", param, NULL,
425 G_DBUS_CALL_FLAGS_NONE, TAPI_DEFAULT_TIMEOUT, handle->ca,
426 on_response_get_sim_pb_usim_meta_info, evt_cb_data);
428 return TAPI_API_SUCCESS;
431 EXPORT_API int tel_read_sim_pb_record(TapiHandle *handle, TelSimPbType_t pb_type, unsigned short pb_index, tapi_response_cb callback, void *user_data)
433 struct tapi_resp_data *evt_cb_data = NULL;
434 GVariant *param = NULL;
436 msg("read type:[%d] index:[%d]", pb_type, pb_index);
438 TAPI_RET_ERR_NUM_IF_FAIL(handle, TAPI_API_INVALID_PTR);
439 TAPI_RET_ERR_NUM_IF_FAIL(callback, TAPI_API_INVALID_PTR);
442 return TAPI_API_INVALID_INPUT;
444 if ( (pb_type != TAPI_SIM_PB_FDN) && (pb_type != TAPI_SIM_PB_ADN) && (pb_type != TAPI_SIM_PB_SDN)
445 && (pb_type != TAPI_SIM_PB_3GSIM) && (pb_type != TAPI_SIM_PB_AAS) && (pb_type != TAPI_SIM_PB_GAS))
446 return TAPI_API_INVALID_INPUT;
448 MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
450 param = g_variant_new("(ii)", pb_type, pb_index);
452 g_dbus_connection_call(handle->dbus_connection,
453 DBUS_TELEPHONY_SERVICE , handle->path, DBUS_TELEPHONY_PB_INTERFACE,
454 "ReadRecord", param, NULL,
455 G_DBUS_CALL_FLAGS_NONE, TAPI_DEFAULT_TIMEOUT, handle->ca,
456 on_response_read_sim_pb_record, evt_cb_data);
458 return TAPI_API_SUCCESS;
461 EXPORT_API int tel_update_sim_pb_record(TapiHandle *handle, const TelSimPbRecord_t *req_data, tapi_response_cb callback, void *user_data)
463 struct tapi_resp_data *evt_cb_data = NULL;
464 GVariant *param = NULL;
466 dbg("Func Entrance");
468 TAPI_RET_ERR_NUM_IF_FAIL(handle, TAPI_API_INVALID_PTR);
469 TAPI_RET_ERR_NUM_IF_FAIL((req_data != NULL) , TAPI_API_INVALID_PTR);
471 if (req_data->index == 0) {
472 return TAPI_API_INVALID_INPUT;
475 if ((req_data->phonebook_type != TAPI_SIM_PB_FDN)
476 && (req_data->phonebook_type != TAPI_SIM_PB_ADN) && (req_data->phonebook_type != TAPI_SIM_PB_SDN)
477 && (req_data->phonebook_type != TAPI_SIM_PB_3GSIM) && (req_data->phonebook_type != TAPI_SIM_PB_AAS)
478 && (req_data->phonebook_type != TAPI_SIM_PB_GAS)) {
479 return TAPI_API_INVALID_INPUT;
482 MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
484 msg("type[%d], index[%d], next_index[%d]",req_data->phonebook_type, req_data->index, req_data->next_index);
485 dbg("name[%s], dcs[%d]",req_data->name, req_data->dcs);
486 dbg("number[%s], ton[%d]",req_data->number, req_data->ton);
488 if(req_data->phonebook_type == TAPI_SIM_PB_3GSIM) {
489 dbg("sne[%s] sne_dcs[%d]",req_data->sne, req_data->sne_dcs);
490 dbg("anr1([%d][%s]),anr2([%d][%s]),anr3([%d][%s])",
491 req_data->anr1_ton,req_data->anr1,req_data->anr2_ton,req_data->anr2,req_data->anr3_ton,req_data->anr3);
492 dbg("email[%s] [%s][%s][%s]",req_data->email1,req_data->email2,req_data->email3,req_data->email4);
493 dbg("group_index[%d], pb_control[%d]",req_data->group_index,req_data->pb_control);
496 param = g_variant_new("(iisisisisisisissssi)",
497 req_data->phonebook_type,
515 req_data->group_index);
517 g_dbus_connection_call(handle->dbus_connection,
518 DBUS_TELEPHONY_SERVICE , handle->path, DBUS_TELEPHONY_PB_INTERFACE,
519 "UpdateRecord", param, NULL,
520 G_DBUS_CALL_FLAGS_NONE, TAPI_DEFAULT_TIMEOUT, handle->ca,
521 on_response_update_sim_pb_record, evt_cb_data);
523 return TAPI_API_SUCCESS;
527 EXPORT_API int tel_delete_sim_pb_record(TapiHandle *handle, TelSimPbType_t pb_type, unsigned short pb_index, tapi_response_cb callback, void *user_data)
529 struct tapi_resp_data *evt_cb_data = NULL;
530 GVariant *param = NULL;
532 msg("delete type:[%d] index:[%d]", pb_type, pb_index);
534 TAPI_RET_ERR_NUM_IF_FAIL(handle, TAPI_API_INVALID_PTR);
538 return TAPI_API_INVALID_INPUT;
540 if ( (pb_type != TAPI_SIM_PB_FDN) && (pb_type != TAPI_SIM_PB_ADN) && (pb_type != TAPI_SIM_PB_SDN)
541 && (pb_type != TAPI_SIM_PB_3GSIM) && (pb_type != TAPI_SIM_PB_AAS) && (pb_type != TAPI_SIM_PB_GAS))
542 return TAPI_API_INVALID_INPUT;
544 MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
546 param = g_variant_new("(ii)", pb_type, pb_index);
548 g_dbus_connection_call(handle->dbus_connection,
549 DBUS_TELEPHONY_SERVICE , handle->path, DBUS_TELEPHONY_PB_INTERFACE,
550 "DeleteRecord", param, NULL,
551 G_DBUS_CALL_FLAGS_NONE, TAPI_DEFAULT_TIMEOUT, handle->ca,
552 on_response_delete_sim_pb_record, evt_cb_data);
554 return TAPI_API_SUCCESS;