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.
25 #include "tapi_common.h"
26 #include "TapiUtility.h"
27 #include "TelNetwork.h"
31 #include "ITapiNetwork.h"
33 static int _convert_systemtype_to_act(int type)
36 case TAPI_NETWORK_SYSTEM_GSM:
39 case TAPI_NETWORK_SYSTEM_GPRS:
42 case TAPI_NETWORK_SYSTEM_EGPRS:
45 case TAPI_NETWORK_SYSTEM_PCS1900:
48 case TAPI_NETWORK_SYSTEM_UMTS:
51 case TAPI_NETWORK_SYSTEM_GSM_AND_UMTS:
54 case TAPI_NETWORK_SYSTEM_IS95A:
57 case TAPI_NETWORK_SYSTEM_IS95B:
60 case TAPI_NETWORK_SYSTEM_CDMA_1X:
63 case TAPI_NETWORK_SYSTEM_EVDO_REV_0:
66 case TAPI_NETWORK_SYSTEM_1X_EVDO_REV_0_HYBRID:
69 case TAPI_NETWORK_SYSTEM_EVDO_REV_A:
72 case TAPI_NETWORK_SYSTEM_1X_EVDO_REV_A_HYBRID:
75 case TAPI_NETWORK_SYSTEM_EVDO_REV_B:
78 case TAPI_NETWORK_SYSTEM_1X_EVDO_REV_B_HYBRID:
81 case TAPI_NETWORK_SYSTEM_EVDV:
84 case TAPI_NETWORK_SYSTEM_EHRPD:
87 case TAPI_NETWORK_SYSTEM_LTE:
97 static int _convert_act_to_systemtype(int act)
101 return TAPI_NETWORK_SYSTEM_GSM;
104 return TAPI_NETWORK_SYSTEM_GPRS;
107 return TAPI_NETWORK_SYSTEM_EGPRS;
110 return TAPI_NETWORK_SYSTEM_UMTS;
113 return TAPI_NETWORK_SYSTEM_GSM_AND_UMTS;
116 return TAPI_NETWORK_SYSTEM_IS95A;
119 return TAPI_NETWORK_SYSTEM_IS95B;
122 return TAPI_NETWORK_SYSTEM_CDMA_1X;
125 return TAPI_NETWORK_SYSTEM_EVDO_REV_0;
128 return TAPI_NETWORK_SYSTEM_1X_EVDO_REV_0_HYBRID;
131 return TAPI_NETWORK_SYSTEM_EVDO_REV_A;
134 return TAPI_NETWORK_SYSTEM_1X_EVDO_REV_A_HYBRID;
137 return TAPI_NETWORK_SYSTEM_EVDO_REV_B;
140 return TAPI_NETWORK_SYSTEM_1X_EVDO_REV_B_HYBRID;
143 return TAPI_NETWORK_SYSTEM_EVDV;
146 return TAPI_NETWORK_SYSTEM_EHRPD;
149 return TAPI_NETWORK_SYSTEM_LTE;
155 return TAPI_NETWORK_SYSTEM_NO_SRV;
158 static void on_signal_registration_status (TapiHandle *handle, GVariant *param,
159 char *noti_id, struct tapi_evt_cb *evt_cb_data)
161 TelNetworkRegistrationStatus_t noti;
163 g_variant_get(param, "(iiib)", ¬i.cs, ¬i.ps, ¬i.type, ¬i.is_roaming);
165 CALLBACK_CALL(¬i);
168 static void on_signal_strength (TapiHandle *handle, GVariant *param,
169 char *noti_id, struct tapi_evt_cb *evt_cb_data)
171 struct tel_noti_network_signal_strength noti;
173 g_variant_get(param, "(i)", ¬i.dbm);
175 CALLBACK_CALL(¬i);
178 static void on_signal_cell_info (TapiHandle *handle, GVariant *param,
179 char *noti_id, struct tapi_evt_cb *evt_cb_data)
181 struct tel_noti_network_cell_info noti;
183 memset(¬i, 0, sizeof(struct tel_noti_network_cell_info));
184 g_variant_get(param, "(ii)", ¬i.lac, ¬i.cell_id);
186 CALLBACK_CALL(¬i);
189 static void on_signal_change (TapiHandle *handle, GVariant *param,
190 char *noti_id, struct tapi_evt_cb *evt_cb_data)
192 struct tel_noti_network_change noti;
195 memset(¬i, 0, sizeof(struct tel_noti_network_change));
197 g_variant_get(param, "(is)", &act, &plmn);
199 noti.act = _convert_act_to_systemtype(act);
202 snprintf(noti.plmn, 7, "%s", plmn);
206 CALLBACK_CALL(¬i);
209 static void on_signal_time_info (TapiHandle *handle, GVariant *param,
210 char *noti_id, struct tapi_evt_cb *evt_cb_data)
212 struct tel_noti_network_time_info noti;
215 memset(¬i, 0, sizeof(struct tel_noti_network_time_info));
216 g_variant_get(param, "(iiiiiiiiibs)", ¬i.year, ¬i.month, ¬i.day,
217 ¬i.hour, ¬i.minute, ¬i.second,
218 ¬i.wday, ¬i.gmtoff, ¬i.dstoff, ¬i.isdst,
222 snprintf(noti.plmn, 7, "%s", plmn);
226 CALLBACK_CALL(¬i);
229 static void on_signal_identity (TapiHandle *handle, GVariant *param,
230 char *noti_id, struct tapi_evt_cb *evt_cb_data)
232 struct tel_noti_network_identity noti;
233 char *plmn = NULL, *s_name = NULL, *f_name = NULL;
235 memset(¬i, 0, sizeof(struct tel_noti_network_identity));
237 g_variant_get(param, "(sss)", &plmn, &s_name, &f_name);
240 snprintf(noti.plmn, 7, "%s", plmn);
244 snprintf(noti.short_name, 17, "%s", s_name);
248 snprintf(noti.full_name, 33, "%s", f_name);
252 CALLBACK_CALL(¬i);
255 static void on_emergency_callback_mode (TapiHandle *handle, GVariant *param,
256 char *noti_id, struct tapi_evt_cb *evt_cb_data)
258 struct tel_noti_network_emergency_callback_mode noti;
260 memset(¬i, 0, sizeof(struct tel_noti_network_emergency_callback_mode));
262 g_variant_get(param, "(i)", ¬i.mode);
264 CALLBACK_CALL(¬i);
267 static void on_signal_default_data_subscription (TapiHandle *handle, GVariant *param,
268 char *noti_id, struct tapi_evt_cb *evt_cb_data)
270 struct tel_noti_network_default_data_subs noti;
272 memset(¬i, 0, sizeof(struct tel_noti_network_default_data_subs));
274 g_variant_get(param, "(i)", ¬i.default_subs);
276 CALLBACK_CALL(¬i);
279 static void on_signal_default_subscription (TapiHandle *handle, GVariant *param,
280 char *noti_id, struct tapi_evt_cb *evt_cb_data)
282 struct tel_noti_network_default_subs noti;
284 memset(¬i, 0, sizeof(struct tel_noti_network_default_subs));
286 g_variant_get(param, "(i)", ¬i.default_subs);
288 CALLBACK_CALL(¬i);
291 static struct signal_map signals[] = {
292 { "RegistrationStatus", on_signal_registration_status },
293 { "SignalStrength", on_signal_strength },
294 { "CellInfo", on_signal_cell_info },
295 { "Change", on_signal_change },
296 { "TimeInfo", on_signal_time_info },
297 { "Identity", on_signal_identity },
298 { "EmergencyCallbackMode", on_emergency_callback_mode },
299 { "DefaultDataSubscription", on_signal_default_data_subscription },
300 { "DefaultSubscription", on_signal_default_subscription },
303 void _process_network_event(const gchar *sig, GVariant *param,
304 TapiHandle *handle, char *noti_id, struct tapi_evt_cb *evt_cb_data)
307 TAPI_RETURN_IF_FAIL(evt_cb_data);
309 for (i = 0; i < sizeof (signals) / sizeof (struct signal_map); i++) {
310 dbg("Received (%s)(%s) signal from telephony", handle->cp_name, sig);
311 if (!g_strcmp0 (sig, signals[i].signal_name)) {
312 signals[i].callback (handle, param, noti_id, evt_cb_data);
317 dbg("not handled NETWORK noti[%s]",sig );
320 static gboolean _check_plmn(const char *plmn)
322 unsigned int plmn_len = 0;
329 plmn_len = strlen(plmn);
330 if (plmn_len < 5 || plmn_len > 6) {
331 err("PLMN length(%d) is invalid", plmn_len);
338 static gboolean _check_operation(TelNetworkPreferredPlmnOp_t operation)
341 case TAPI_NETWORK_PREF_PLMN_ADD:
342 case TAPI_NETWORK_PREF_PLMN_EDIT:
343 case TAPI_NETWORK_PREF_PLMN_DELETE:
347 err("Default Case executed. Unknown PLMN Op");
350 err("operation %d is not supported", operation);
354 static gboolean _check_network_mode(int mode)
356 if (mode == TAPI_NETWORK_MODE_AUTO) {
359 if (mode & TAPI_NETWORK_MODE_GSM) {
360 mode &= ~TAPI_NETWORK_MODE_GSM;
362 if (mode & TAPI_NETWORK_MODE_WCDMA) {
363 mode &= ~TAPI_NETWORK_MODE_WCDMA;
365 if (mode & TAPI_NETWORK_MODE_1XRTT) {
366 mode &= ~TAPI_NETWORK_MODE_1XRTT;
368 if (mode & TAPI_NETWORK_MODE_LTE) {
369 mode &= ~TAPI_NETWORK_MODE_LTE;
371 if (mode & TAPI_NETWORK_MODE_EVDO) {
372 mode &= ~TAPI_NETWORK_MODE_EVDO;
377 err("mode %d is not supported", mode);
381 static gboolean _check_emergency_callback_mode(TelNetworkEmergencyCallbackMode_t mode)
384 case TAPI_NETWORK_EMERGENCY_CALLBACK_MODE_ENTER:
385 case TAPI_NETWORK_EMERGENCY_CALLBACK_MODE_EXIT:
389 err("Default Case executed. Unknown Emergency callback mode");
392 err("emergency callback mode %d is not supported", mode);
396 static gboolean _check_roaming_preference(TelNetworkPrefNetType_t roam_pref)
399 case TAPI_NETWORK_PREF_NET_TYPE_HOME_ONLY:
400 case TAPI_NETWORK_PREF_NET_TYPE_AFFILIATED:
401 case TAPI_NETWORK_PREF_NET_TYPE_AUTOMATIC:
402 case TAPI_NETWORK_PREF_NET_TYPE_AUTOMATIC_A:
403 case TAPI_NETWORK_PREF_NET_TYPE_AUTOMATIC_B:
404 case TAPI_NETWORK_PREF_NET_TYPE_ROAM_DOMESTIC:
405 case TAPI_NETWORK_PREF_NET_TYPE_ROAM_INTERNATIONAL:
406 case TAPI_NETWORK_PREF_NET_TYPE_ROAM_DUAL:
407 case TAPI_NETWORK_PREF_NET_TYPE_BLANK:
411 err("Default Case executed. Unknown roaming preference");
414 err("roam_pref %d is not supported", roam_pref);
418 static void on_response_search_network (GObject *source_object,
419 GAsyncResult *res, gpointer user_data)
421 GError *error = NULL;
422 struct tapi_resp_data *evt_cb_data = user_data;
426 TelNetworkPlmnList_t list;
428 GVariant *dbus_result = NULL;
429 GVariant *value = NULL;
430 GVariantIter *iter = NULL;
431 GVariantIter *iter_row = NULL;
432 const gchar *key = NULL;
434 memset (&list, 0, sizeof(TelNetworkPlmnList_t));
436 dbus_result = g_dbus_connection_call_finish (
437 G_DBUS_CONNECTION (source_object), res, &error);
440 g_variant_get (dbus_result, "(aa{sv}i)", &iter, &result);
442 list.networks_count = g_variant_iter_n_children(iter);
445 while (g_variant_iter_next(iter, "a{sv}", &iter_row)) {
446 while (g_variant_iter_loop(iter_row, "{sv}", &key, &value)) {
447 if (!g_strcmp0(key, "plmn")) {
448 strncpy(list.network_list[i].plmn, g_variant_get_string(value, NULL), TAPI_NETWORK_PLMN_LEN_MAX);
449 list.network_list[i].plmn_id = atoi(g_variant_get_string(value, NULL));
451 if (!g_strcmp0(key, "act")) {
452 list.network_list[i].access_technology = _convert_act_to_systemtype(g_variant_get_int32(value));
454 if (!g_strcmp0(key, "type")) {
455 list.network_list[i].type_of_plmn = g_variant_get_int32(value);
457 if (!g_strcmp0(key, "name")) {
458 strncpy(list.network_list[i].network_name, g_variant_get_string(value, NULL), 40);
462 g_variant_iter_free(iter_row);
464 g_variant_iter_free(iter);
466 if (evt_cb_data->cb_fn) {
467 evt_cb_data->cb_fn(evt_cb_data->handle, result, &list, evt_cb_data->user_data);
471 g_variant_unref(dbus_result);
474 static void on_response_get_network_selection_mode (GObject *source_object,
475 GAsyncResult *res, gpointer user_data)
477 GError *error = NULL;
478 struct tapi_resp_data *evt_cb_data = user_data;
481 GVariant *dbus_result;
484 dbus_result = g_dbus_connection_call_finish (
485 G_DBUS_CONNECTION (source_object), res, &error);
488 g_variant_get (dbus_result, "(ii)", &mode, &result);
490 if (evt_cb_data->cb_fn) {
491 evt_cb_data->cb_fn(evt_cb_data->handle, result, &mode, evt_cb_data->user_data);
495 g_variant_unref(dbus_result);
498 static void on_response_default_set (GObject *source_object, GAsyncResult *res,
501 GError *error = NULL;
502 struct tapi_resp_data *evt_cb_data = user_data;
505 GVariant *dbus_result;
507 dbus_result = g_dbus_connection_call_finish (
508 G_DBUS_CONNECTION (source_object), res, &error);
511 g_variant_get (dbus_result, "(i)", &result);
513 if (evt_cb_data->cb_fn) {
514 evt_cb_data->cb_fn(evt_cb_data->handle, result, NULL, evt_cb_data->user_data);
518 g_variant_unref(dbus_result);
521 static void on_response_get_network_preferred_plmn (GObject *source_object,
522 GAsyncResult *res, gpointer user_data)
524 GError *error = NULL;
525 struct tapi_resp_data *evt_cb_data = user_data;
529 TelNetworkPreferredPlmnList_t list;
531 GVariant *dbus_result = NULL;
532 GVariant *value = NULL;
533 GVariantIter *iter = NULL;
534 GVariantIter *iter_row = NULL;
535 const gchar *key = NULL;
537 memset (&list, 0, sizeof(TelNetworkPreferredPlmnList_t));
539 dbus_result = g_dbus_connection_call_finish (
540 G_DBUS_CONNECTION (source_object), res, &error);
543 g_variant_get (dbus_result, "(aa{sv}i)", &iter, &result);
545 list.NumOfPrefPlmns = g_variant_iter_n_children(iter);
547 if (list.NumOfPrefPlmns == 0) {
548 dbg("num_of_.. = 0");
549 if (evt_cb_data->cb_fn) {
550 evt_cb_data->cb_fn(evt_cb_data->handle, result, &list, evt_cb_data->user_data);
558 while (g_variant_iter_next(iter, "a{sv}", &iter_row)) {
559 while (g_variant_iter_loop(iter_row, "{sv}", &key, &value)) {
560 if (!g_strcmp0(key, "plmn")) {
561 strncpy(list.PrefPlmnRecord[i].Plmn, g_variant_get_string(value, NULL), 6);
563 if (!g_strcmp0(key, "act")) {
564 list.PrefPlmnRecord[i].SystemType = _convert_act_to_systemtype(g_variant_get_int32(value));
566 if (!g_strcmp0(key, "index")) {
567 list.PrefPlmnRecord[i].Index = g_variant_get_int32(value);
569 if (!g_strcmp0(key, "name")) {
570 strncpy(list.PrefPlmnRecord[i].network_name, g_variant_get_string(value, NULL), 40);
574 g_variant_iter_free(iter_row);
576 g_variant_iter_free(iter);
578 if (evt_cb_data->cb_fn) {
579 evt_cb_data->cb_fn(evt_cb_data->handle, result, &list, evt_cb_data->user_data);
583 g_variant_unref(dbus_result);
586 static void on_response_get_network_mode (GObject *source_object,
587 GAsyncResult *res, gpointer user_data)
589 GError *error = NULL;
590 struct tapi_resp_data *evt_cb_data = user_data;
593 GVariant *dbus_result;
596 dbus_result = g_dbus_connection_call_finish (
597 G_DBUS_CONNECTION (source_object), res, &error);
600 g_variant_get (dbus_result, "(ii)", &mode, &result);
602 if (evt_cb_data->cb_fn) {
603 evt_cb_data->cb_fn(evt_cb_data->handle, result, &mode, evt_cb_data->user_data);
607 g_variant_unref(dbus_result);
610 static void on_response_get_network_serving (GObject *source_object,
611 GAsyncResult *res, gpointer user_data)
613 GError *error = NULL;
614 struct tapi_resp_data *evt_cb_data = user_data;
617 TelNetworkServing_t data;
619 GVariant *dbus_result;
622 memset (&data, 0, sizeof(TelNetworkServing_t));
624 dbus_result = g_dbus_connection_call_finish (
625 G_DBUS_CONNECTION (source_object), res, &error);
628 g_variant_get (dbus_result, "(isii)",
634 data.act = _convert_act_to_systemtype(data.act);
637 snprintf(data.plmn, 7, "%s", plmn);
641 if (evt_cb_data->cb_fn) {
642 evt_cb_data->cb_fn(evt_cb_data->handle, result, &data, evt_cb_data->user_data);
646 g_variant_unref(dbus_result);
649 static void on_response_get_neighboring_cell_info (GObject *source_object,
650 GAsyncResult *res, gpointer user_data)
652 GError *error = NULL;
653 struct tapi_resp_data *evt_cb_data = user_data;
655 int geran_index = 0, umts_index = 0;
657 TelNetworkNeighboringCellInfo_t list;
659 GVariant *dbus_result = NULL;
660 GVariant *value = NULL;
661 GVariantIter *iter = NULL;
662 GVariantIter *iter_row = NULL;
663 const gchar *key = NULL;
664 gint v0, v1, v2, v3, v4;
666 memset (&list, 0, sizeof(TelNetworkNeighboringCellInfo_t));
668 dbus_result = g_dbus_connection_call_finish (
669 G_DBUS_CONNECTION (source_object), res, &error);
672 g_variant_get (dbus_result, "(aa{sv}i)", &iter, &result);
674 while (g_variant_iter_next(iter, "a{sv}", &iter_row)) {
675 while (g_variant_iter_loop(iter_row, "{sv}", &key, &value)) {
676 if (!g_strcmp0(key, "serving")) {
677 g_variant_get(value, "(iii)", &v0,&v1,&v2);
678 list.serving.act = _convert_act_to_systemtype(v0);
679 list.serving.mcc = v1;
680 list.serving.mnc = v2;
682 else if (!g_strcmp0(key, "g_serving")) {
683 g_variant_get(value, "(iiiii)", &v0,&v1,&v2,&v3,&v4);
684 list.serving.cell.geran.cell_id = v0;
685 list.serving.cell.geran.lac = v1;
686 list.serving.cell.geran.bcch = v2;
687 list.serving.cell.geran.bsic = v3;
688 list.serving.cell.geran.rxlev = v4;
690 else if (!g_strcmp0(key, "u_serving")) {
691 g_variant_get(value, "(iiiii)", &v0,&v1,&v2,&v3,&v4);
692 list.serving.cell.umts.cell_id = v0;
693 list.serving.cell.umts.lac = v1;
694 list.serving.cell.umts.arfcn = v2;
695 list.serving.cell.umts.psc = v3;
696 list.serving.cell.umts.rscp = v4;
698 else if (!g_strcmp0(key, "l_serving")) {
699 g_variant_get(value, "(iiiii)", &v0,&v1,&v2,&v3,&v4);
700 list.serving.cell.lte.cell_id = v0;
701 list.serving.cell.lte.lac = v1;
702 list.serving.cell.lte.earfcn = v2;
703 list.serving.cell.lte.tac = v3;
704 list.serving.cell.lte.rssi = v4;
706 else if (!g_strcmp0(key, "geran")) {
707 g_variant_get(value, "(iiiii)", &v0,&v1,&v2,&v3,&v4);
708 list.geran_list[geran_index].cell_id = v0;
709 list.geran_list[geran_index].lac = v1;
710 list.geran_list[geran_index].bcch = v2;
711 list.geran_list[geran_index].bsic = v3;
712 list.geran_list[geran_index].rxlev = v4;
715 else if (!g_strcmp0(key, "umts")) {
716 g_variant_get(value, "(iiiii)", &v0,&v1,&v2,&v3,&v4);
717 list.umts_list[umts_index].cell_id = v0;
718 list.umts_list[umts_index].lac = v1;
719 list.umts_list[umts_index].arfcn = v2;
720 list.umts_list[umts_index].psc = v3;
721 list.umts_list[umts_index].rscp = v4;
725 g_variant_iter_free(iter_row);
727 g_variant_iter_free(iter);
729 list.geran_list_count = geran_index;
730 list.umts_list_count = umts_index;
731 dbg("act=%d, count(geran:%d, umts:%d)", list.serving.act, geran_index, umts_index);
733 if (evt_cb_data->cb_fn) {
734 evt_cb_data->cb_fn(evt_cb_data->handle, result, &list, evt_cb_data->user_data);
738 g_variant_unref(dbus_result);
741 static void on_response_select_network (GObject *source_object, GAsyncResult *res,
744 GError *error = NULL;
745 struct tapi_resp_data *evt_cb_data = user_data;
747 GVariant *dbus_result;
749 dbus_result = g_dbus_connection_call_finish (G_DBUS_CONNECTION (source_object), res, &error);
751 g_variant_get (dbus_result, "(i)", &result);
753 /* Map result received from libtcore to TapiResult_t */
755 result = TAPI_API_SUCCESS;
759 result = TAPI_API_NETWORK_PLMN_NOT_ALLOWED;
762 result = TAPI_API_NETWORK_ROAMING_NOT_ALLOWED;
769 if (evt_cb_data->cb_fn) {
770 evt_cb_data->cb_fn(evt_cb_data->handle, result, NULL, evt_cb_data->user_data);
773 g_variant_unref(dbus_result);
776 static void on_response_get_network_roaming_preference (GObject *source_object,
777 GAsyncResult *res, gpointer user_data)
779 GError *error = NULL;
780 struct tapi_resp_data *evt_cb_data = user_data;
783 GVariant *dbus_result;
784 TelNetworkPrefNetType_t roam_pref;
786 dbus_result = g_dbus_connection_call_finish (
787 G_DBUS_CONNECTION (source_object), res, &error);
790 g_variant_get (dbus_result, "(ii)", &roam_pref, &result);
792 if (evt_cb_data->cb_fn) {
793 evt_cb_data->cb_fn(evt_cb_data->handle, result, &roam_pref, evt_cb_data->user_data);
797 g_variant_unref(dbus_result);
800 EXPORT_API int tel_search_network(TapiHandle *handle, tapi_response_cb callback, void *user_data)
802 struct tapi_resp_data *evt_cb_data = NULL;
804 TAPI_RET_ERR_NUM_IF_FAIL(handle != NULL && callback != NULL, TAPI_API_INVALID_PTR);
806 MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
808 msg("[%s] network_search requested", handle->cp_name);
810 g_dbus_connection_call(handle->dbus_connection,
811 DBUS_TELEPHONY_SERVICE , handle->path, DBUS_TELEPHONY_NETWORK_INTERFACE,
812 "Search", NULL, NULL,
813 G_DBUS_CALL_FLAGS_NONE, TAPI_UNRESTRICTED_TIMEOUT, handle->ca,
814 on_response_search_network, evt_cb_data);
816 return TAPI_API_SUCCESS;
819 EXPORT_API int tel_get_network_selection_mode(struct tapi_handle *handle, tapi_response_cb callback, void *user_data)
821 struct tapi_resp_data *evt_cb_data = NULL;
823 dbg("Func Entrance");
825 TAPI_RET_ERR_NUM_IF_FAIL(handle != NULL && callback != NULL, TAPI_API_INVALID_PTR);
827 MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
829 g_dbus_connection_call(handle->dbus_connection,
830 DBUS_TELEPHONY_SERVICE , handle->path, DBUS_TELEPHONY_NETWORK_INTERFACE,
831 "GetSelectionMode", NULL, NULL,
832 G_DBUS_CALL_FLAGS_NONE, TAPI_DEFAULT_TIMEOUT, handle->ca,
833 on_response_get_network_selection_mode, evt_cb_data);
835 return TAPI_API_SUCCESS;
838 EXPORT_API int tel_select_network_automatic(struct tapi_handle *handle, tapi_response_cb callback, void *user_data)
840 struct tapi_resp_data *evt_cb_data = NULL;
843 TAPI_RET_ERR_NUM_IF_FAIL(handle != NULL, TAPI_API_INVALID_PTR);
845 MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
847 param = g_variant_new("(isi)",
852 msg("[%s] automatic selection requested", handle->cp_name);
854 g_dbus_connection_call(handle->dbus_connection,
855 DBUS_TELEPHONY_SERVICE , handle->path, DBUS_TELEPHONY_NETWORK_INTERFACE,
856 "SetSelectionMode", param, NULL,
857 G_DBUS_CALL_FLAGS_NONE, TAPI_UNRESTRICTED_TIMEOUT, handle->ca,
858 on_response_default_set, evt_cb_data);
860 return TAPI_API_SUCCESS;
863 EXPORT_API int tel_select_network_manual(struct tapi_handle *handle, const char *plmn, int type, tapi_response_cb callback, void *user_data)
865 struct tapi_resp_data *evt_cb_data = NULL;
868 TAPI_RET_ERR_NUM_IF_FAIL(handle != NULL && _check_plmn(plmn), TAPI_API_INVALID_PTR);
870 MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
872 param = g_variant_new("(isi)",
875 _convert_systemtype_to_act(type));
877 msg("[%s] manual selection requested plmn:[%s] type:[%d]",handle->cp_name, plmn?plmn:"", type);
879 g_dbus_connection_call(handle->dbus_connection,
880 DBUS_TELEPHONY_SERVICE , handle->path, DBUS_TELEPHONY_NETWORK_INTERFACE,
881 "SetSelectionMode", param, NULL,
882 G_DBUS_CALL_FLAGS_NONE, TAPI_UNRESTRICTED_TIMEOUT, handle->ca,
883 on_response_select_network, evt_cb_data);
885 return TAPI_API_SUCCESS;
888 EXPORT_API int tel_set_network_preferred_plmn(
890 TelNetworkPreferredPlmnOp_t operation,
891 TelNetworkPreferredPlmnInfo_t *info,
892 tapi_response_cb callback,
895 struct tapi_resp_data *evt_cb_data = NULL;
899 TAPI_RET_ERR_NUM_IF_FAIL(handle != NULL && info != NULL &&
900 _check_operation(operation) &&
901 _check_plmn((const char *)&info->Plmn), TAPI_API_INVALID_PTR);
903 dbg("Func Entrance");
905 MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
907 switch (info->SystemType) {
908 case TAPI_NETWORK_SYSTEM_GSM:
912 case TAPI_NETWORK_SYSTEM_UMTS:
916 case TAPI_NETWORK_SYSTEM_GPRS:
920 case TAPI_NETWORK_SYSTEM_EGPRS:
924 case TAPI_NETWORK_SYSTEM_GSM_AND_UMTS:
933 param = g_variant_new("(iiis)",
939 g_dbus_connection_call(handle->dbus_connection,
940 DBUS_TELEPHONY_SERVICE , handle->path, DBUS_TELEPHONY_NETWORK_INTERFACE,
941 "SetPreferredPlmn", param, NULL,
942 G_DBUS_CALL_FLAGS_NONE, TAPI_DEFAULT_TIMEOUT, handle->ca,
943 on_response_default_set, evt_cb_data);
945 return TAPI_API_SUCCESS;
948 EXPORT_API int tel_get_network_preferred_plmn(TapiHandle *handle, tapi_response_cb callback, void *user_data)
950 struct tapi_resp_data *evt_cb_data = NULL;
952 dbg("Func Entrance");
954 TAPI_RET_ERR_NUM_IF_FAIL(handle != NULL && callback != NULL, TAPI_API_INVALID_PTR);
956 MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
958 g_dbus_connection_call(handle->dbus_connection,
959 DBUS_TELEPHONY_SERVICE , handle->path, DBUS_TELEPHONY_NETWORK_INTERFACE,
960 "GetPreferredPlmn", NULL, NULL,
961 G_DBUS_CALL_FLAGS_NONE, TAPI_DEFAULT_TIMEOUT, handle->ca,
962 on_response_get_network_preferred_plmn, evt_cb_data);
964 return TAPI_API_SUCCESS;
967 EXPORT_API int tel_set_network_mode(TapiHandle *handle, int mode, tapi_response_cb callback, void *user_data)
969 struct tapi_resp_data *evt_cb_data = NULL;
972 TAPI_RET_ERR_NUM_IF_FAIL(handle != NULL &&
973 _check_network_mode(mode), TAPI_API_INVALID_PTR);
975 MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
977 param = g_variant_new("(i)",
980 msg("[%s] requested mode:[0x%x]", handle->cp_name, mode);
982 g_dbus_connection_call(handle->dbus_connection,
983 DBUS_TELEPHONY_SERVICE , handle->path, DBUS_TELEPHONY_NETWORK_INTERFACE,
984 "SetMode", param, NULL,
985 G_DBUS_CALL_FLAGS_NONE, TAPI_UNRESTRICTED_TIMEOUT, handle->ca,
986 on_response_default_set, evt_cb_data);
988 return TAPI_API_SUCCESS;
991 EXPORT_API int tel_get_network_mode(TapiHandle *handle, tapi_response_cb callback, void *user_data)
993 struct tapi_resp_data *evt_cb_data = NULL;
995 TAPI_RET_ERR_NUM_IF_FAIL(handle != NULL && callback != NULL, TAPI_API_INVALID_PTR);
997 MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
999 dbg("[%s] Func Entrance", handle->cp_name);
1001 g_dbus_connection_call(handle->dbus_connection,
1002 DBUS_TELEPHONY_SERVICE , handle->path, DBUS_TELEPHONY_NETWORK_INTERFACE,
1003 "GetMode", NULL, NULL,
1004 G_DBUS_CALL_FLAGS_NONE, TAPI_DEFAULT_TIMEOUT, handle->ca,
1005 on_response_get_network_mode, evt_cb_data);
1007 return TAPI_API_SUCCESS;
1010 EXPORT_API int tel_cancel_network_manual_search(TapiHandle *handle, tapi_response_cb callback, void *user_data)
1012 struct tapi_resp_data *evt_cb_data = NULL;
1014 TAPI_RET_ERR_NUM_IF_FAIL(handle != NULL, TAPI_API_INVALID_PTR);
1016 MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
1018 msg("[%s] network search cancel requested", handle->cp_name);
1020 g_dbus_connection_call(handle->dbus_connection,
1021 DBUS_TELEPHONY_SERVICE , handle->path, DBUS_TELEPHONY_NETWORK_INTERFACE,
1022 "SearchCancel", NULL, NULL,
1023 G_DBUS_CALL_FLAGS_NONE, TAPI_DEFAULT_TIMEOUT, handle->ca,
1024 on_response_default_set, evt_cb_data);
1026 return TAPI_API_SUCCESS;
1029 EXPORT_API int tel_get_network_serving(TapiHandle *handle, tapi_response_cb callback, void *user_data)
1031 struct tapi_resp_data *evt_cb_data = NULL;
1033 TAPI_RET_ERR_NUM_IF_FAIL(handle != NULL && callback != NULL, TAPI_API_INVALID_PTR);
1035 MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
1037 dbg("[%s] Func Entrance", handle->cp_name);
1039 g_dbus_connection_call(handle->dbus_connection,
1040 DBUS_TELEPHONY_SERVICE , handle->path, DBUS_TELEPHONY_NETWORK_INTERFACE,
1041 "GetServingNetwork", NULL, NULL,
1042 G_DBUS_CALL_FLAGS_NONE, TAPI_DEFAULT_TIMEOUT, handle->ca,
1043 on_response_get_network_serving, evt_cb_data);
1045 return TAPI_API_SUCCESS;
1048 EXPORT_API int tel_get_network_neighboring_cell_info(TapiHandle *handle, tapi_response_cb callback, void *user_data)
1050 struct tapi_resp_data *evt_cb_data = NULL;
1052 TAPI_RET_ERR_NUM_IF_FAIL(handle != NULL && callback != NULL, TAPI_API_INVALID_PTR);
1054 MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
1056 dbg("[%s] Func Entrance", handle->cp_name);
1058 g_dbus_connection_call(handle->dbus_connection,
1059 DBUS_TELEPHONY_SERVICE , handle->path, DBUS_TELEPHONY_NETWORK_INTERFACE,
1060 "GetNgbrCellInfo", NULL, NULL,
1061 G_DBUS_CALL_FLAGS_NONE, TAPI_DEFAULT_TIMEOUT, handle->ca,
1062 on_response_get_neighboring_cell_info, evt_cb_data);
1064 return TAPI_API_SUCCESS;
1067 EXPORT_API int tel_set_network_default_data_subscription(TapiHandle *handle, tapi_response_cb callback, void *user_data)
1069 struct tapi_resp_data *evt_cb_data = NULL;
1071 TAPI_RET_ERR_NUM_IF_FAIL(handle, TAPI_API_INVALID_PTR);
1072 TAPI_RET_ERR_NUM_IF_FAIL(callback, TAPI_API_INVALID_PTR);
1074 MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
1076 msg("[%s] Func Entrance", handle->cp_name);
1079 g_dbus_connection_call(handle->dbus_connection,
1080 DBUS_TELEPHONY_SERVICE , handle->path, DBUS_TELEPHONY_NETWORK_INTERFACE,
1081 "SetDefaultDataSubscription", NULL, NULL,
1082 G_DBUS_CALL_FLAGS_NONE, TAPI_DEFAULT_TIMEOUT, handle->ca,
1083 on_response_default_set, evt_cb_data);
1085 return TAPI_API_SUCCESS;
1088 EXPORT_API int tel_set_network_emergency_callback_mode(TapiHandle *handle, TelNetworkEmergencyCallbackMode_t mode, tapi_response_cb callback, void *user_data)
1090 struct tapi_resp_data *evt_cb_data = NULL;
1093 TAPI_RET_ERR_NUM_IF_FAIL(handle != NULL &&
1094 _check_emergency_callback_mode(mode), TAPI_API_INVALID_PTR);
1096 MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
1098 param = g_variant_new("(i)", mode);
1100 msg("[%s] emergency callback mode :[%d]", handle->cp_name, mode);
1102 g_dbus_connection_call(handle->dbus_connection,
1103 DBUS_TELEPHONY_SERVICE , handle->path, DBUS_TELEPHONY_NETWORK_INTERFACE,
1104 "SetEmergencyCallbackMode", param, NULL,
1105 G_DBUS_CALL_FLAGS_NONE, TAPI_DEFAULT_TIMEOUT, handle->ca,
1106 on_response_default_set, evt_cb_data);
1108 return TAPI_API_SUCCESS;
1111 EXPORT_API int tel_set_network_roaming_preference(TapiHandle *handle, TelNetworkPrefNetType_t roam_pref, tapi_response_cb callback, void *user_data)
1113 struct tapi_resp_data *evt_cb_data = NULL;
1116 TAPI_RET_ERR_NUM_IF_FAIL(handle != NULL &&
1117 _check_roaming_preference(roam_pref), TAPI_API_INVALID_PTR);
1119 MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
1121 param = g_variant_new("(i)", roam_pref);
1123 msg("[%s] roam_pref:[%d]", handle->cp_name, roam_pref);
1125 g_dbus_connection_call(handle->dbus_connection,
1126 DBUS_TELEPHONY_SERVICE , handle->path, DBUS_TELEPHONY_NETWORK_INTERFACE,
1127 "SetRoamingPreference", param, NULL,
1128 G_DBUS_CALL_FLAGS_NONE, TAPI_DEFAULT_TIMEOUT, handle->ca,
1129 on_response_default_set, evt_cb_data);
1131 return TAPI_API_SUCCESS;
1135 EXPORT_API int tel_get_network_roaming_preference(TapiHandle *handle, tapi_response_cb callback, void *user_data)
1137 struct tapi_resp_data *evt_cb_data = NULL;
1139 TAPI_RET_ERR_NUM_IF_FAIL(handle != NULL && callback != NULL, TAPI_API_INVALID_PTR);
1141 MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
1143 dbg("[%s] Func Entrance", handle->cp_name);
1145 g_dbus_connection_call(handle->dbus_connection,
1146 DBUS_TELEPHONY_SERVICE , handle->path, DBUS_TELEPHONY_NETWORK_INTERFACE,
1147 "GetRoamingPreference", NULL, NULL,
1148 G_DBUS_CALL_FLAGS_NONE, TAPI_DEFAULT_TIMEOUT, handle->ca,
1149 on_response_get_network_roaming_preference, evt_cb_data);
1151 return TAPI_API_SUCCESS;
1155 EXPORT_API int tel_get_network_default_data_subscription(TapiHandle *handle, TelNetworkDefaultDataSubs_t *default_subscription)
1157 GError *gerr = NULL;
1158 GVariant *sync_gv = NULL;
1161 TapiResult_t ret = TAPI_API_OPERATION_FAILED;
1163 TAPI_RET_ERR_NUM_IF_FAIL(handle, TAPI_API_INVALID_PTR);
1164 TAPI_RET_ERR_NUM_IF_FAIL(default_subscription, TAPI_API_INVALID_PTR);
1166 sync_gv = g_dbus_connection_call_sync(handle->dbus_connection,
1167 DBUS_TELEPHONY_SERVICE, handle->path, DBUS_TELEPHONY_NETWORK_INTERFACE,
1168 "GetDefaultDataSubscription", NULL, NULL,
1169 G_DBUS_CALL_FLAGS_NONE, TAPI_DEFAULT_TIMEOUT, handle->ca,
1172 g_variant_get(sync_gv, "(ii)", &subs, &result);
1175 *default_subscription = subs;
1177 *default_subscription = TAPI_NETWORK_DEFAULT_DATA_SUBS_UNKNOWN;
1179 msg("'default' Data Subscription: [%d]", subs);
1181 g_variant_unref(sync_gv);
1182 ret = TAPI_API_SUCCESS;
1184 err("Get Data Subscription failed: [%s]", gerr->message);
1191 EXPORT_API int tel_set_network_default_subscription(TapiHandle *handle, tapi_response_cb callback, void *user_data)
1193 struct tapi_resp_data *evt_cb_data = NULL;
1195 TAPI_RET_ERR_NUM_IF_FAIL(handle, TAPI_API_INVALID_PTR);
1196 TAPI_RET_ERR_NUM_IF_FAIL(callback, TAPI_API_INVALID_PTR);
1198 MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
1200 dbg("[%s] Set 'default' Subscription (for CS)", handle->cp_name);
1203 g_dbus_connection_call(handle->dbus_connection,
1204 DBUS_TELEPHONY_SERVICE , handle->path, DBUS_TELEPHONY_NETWORK_INTERFACE,
1205 "SetDefaultSubscription", NULL, NULL,
1206 G_DBUS_CALL_FLAGS_NONE, TAPI_DEFAULT_TIMEOUT, handle->ca,
1207 on_response_default_set, evt_cb_data);
1209 return TAPI_API_SUCCESS;
1212 EXPORT_API int tel_get_network_default_subscription(TapiHandle *handle, TelNetworkDefaultSubs_t *default_subscription)
1214 GError *gerr = NULL;
1215 GVariant *sync_gv = NULL;
1218 TapiResult_t ret = TAPI_API_OPERATION_FAILED;
1220 TAPI_RET_ERR_NUM_IF_FAIL(handle, TAPI_API_INVALID_PTR);
1221 TAPI_RET_ERR_NUM_IF_FAIL(default_subscription, TAPI_API_INVALID_PTR);
1223 sync_gv = g_dbus_connection_call_sync(handle->dbus_connection,
1224 DBUS_TELEPHONY_SERVICE, handle->path, DBUS_TELEPHONY_NETWORK_INTERFACE,
1225 "GetDefaultSubscription", NULL, NULL,
1226 G_DBUS_CALL_FLAGS_NONE, TAPI_DEFAULT_TIMEOUT, handle->ca,
1229 g_variant_get(sync_gv, "(ii)", &subs, &result);
1232 *default_subscription = subs;
1234 *default_subscription = TAPI_NETWORK_DEFAULT_SUBS_UNKNOWN;
1235 dbg("'default' Subscription (for CS): [%d]", subs);
1237 g_variant_unref(sync_gv);
1238 ret = TAPI_API_SUCCESS;
1240 err("Get 'default' Subscription (for CS) failed: [%s]", gerr->message);