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 TAPI_INVOKE_NOTI_CALLBACK(¬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 TAPI_INVOKE_NOTI_CALLBACK(¬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 TAPI_INVOKE_NOTI_CALLBACK(¬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 TAPI_INVOKE_NOTI_CALLBACK(¬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 TAPI_INVOKE_NOTI_CALLBACK(¬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 TAPI_INVOKE_NOTI_CALLBACK(¬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 TAPI_INVOKE_NOTI_CALLBACK(¬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 TAPI_INVOKE_NOTI_CALLBACK(¬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 TAPI_INVOKE_NOTI_CALLBACK(¬i);
291 static void on_signal_cell_id(TapiHandle *handle, GVariant *param,
292 char *noti_id, struct tapi_evt_cb *evt_cb_data)
295 g_variant_get(param, "(i)", &cell_id);
296 TAPI_INVOKE_NOTI_CALLBACK(&cell_id);
299 static void on_signal_lac(TapiHandle *handle, GVariant *param,
300 char *noti_id, struct tapi_evt_cb *evt_cb_data)
303 g_variant_get(param, "(i)", &lac);
304 TAPI_INVOKE_NOTI_CALLBACK(&lac);
307 static void on_signal_tac(TapiHandle *handle, GVariant *param,
308 char *noti_id, struct tapi_evt_cb *evt_cb_data)
311 g_variant_get(param, "(i)", &tac);
312 TAPI_INVOKE_NOTI_CALLBACK(&tac);
315 static void on_signal_system_id(TapiHandle *handle, GVariant *param,
316 char *noti_id, struct tapi_evt_cb *evt_cb_data)
319 g_variant_get(param, "(i)", &system_id);
320 TAPI_INVOKE_NOTI_CALLBACK(&system_id);
323 static void on_signal_network_id(TapiHandle *handle, GVariant *param,
324 char *noti_id, struct tapi_evt_cb *evt_cb_data)
327 g_variant_get(param, "(i)", &network_id);
328 TAPI_INVOKE_NOTI_CALLBACK(&network_id);
331 static void on_signal_bs_id(TapiHandle *handle, GVariant *param,
332 char *noti_id, struct tapi_evt_cb *evt_cb_data)
335 g_variant_get(param, "(i)", &bs_id);
336 TAPI_INVOKE_NOTI_CALLBACK(&bs_id);
339 static void on_signal_bs_latitude(TapiHandle *handle, GVariant *param,
340 char *noti_id, struct tapi_evt_cb *evt_cb_data)
343 g_variant_get(param, "(i)", &bs_latitude);
344 TAPI_INVOKE_NOTI_CALLBACK(&bs_latitude);
347 static void on_signal_bs_longitude(TapiHandle *handle, GVariant *param,
348 char *noti_id, struct tapi_evt_cb *evt_cb_data)
351 g_variant_get(param, "(i)", &bs_longitude);
352 TAPI_INVOKE_NOTI_CALLBACK(&bs_longitude);
355 static struct signal_map signals[] = {
356 { "RegistrationStatus", on_signal_registration_status },
357 { "SignalStrength", on_signal_strength },
358 { "CellInfo", on_signal_cell_info },
359 { "Change", on_signal_change },
360 { "TimeInfo", on_signal_time_info },
361 { "Identity", on_signal_identity },
362 { "EmergencyCallbackMode", on_emergency_callback_mode },
363 { "DefaultDataSubscription", on_signal_default_data_subscription },
364 { "DefaultSubscription", on_signal_default_subscription },
365 { "CellId", on_signal_cell_id },
366 { "Lac", on_signal_lac },
367 { "Tac", on_signal_tac },
368 { "SystemId", on_signal_system_id },
369 { "NetworkId", on_signal_network_id },
370 { "BsId", on_signal_bs_id },
371 { "BsLatitude", on_signal_bs_latitude },
372 { "BsLongitude", on_signal_bs_longitude },
375 void _process_network_event(const gchar *sig, GVariant *param,
376 TapiHandle *handle, char *noti_id, struct tapi_evt_cb *evt_cb_data)
379 TAPI_RETURN_IF_FAIL(evt_cb_data);
381 for (i = 0; i < sizeof(signals) / sizeof(struct signal_map); i++) {
382 dbg("Received (%s)(%s) signal from telephony", handle->cp_name, sig);
383 if (!g_strcmp0(sig, signals[i].signal_name)) {
384 signals[i].callback(handle, param, noti_id, evt_cb_data);
389 dbg("not handled NETWORK noti[%s]", sig);
392 static gboolean _check_plmn(const char *plmn)
394 unsigned int plmn_len = 0;
401 plmn_len = strlen(plmn);
402 if (plmn_len < 5 || plmn_len > 6) {
403 err("PLMN length(%d) is invalid", plmn_len);
410 static gboolean _check_operation(TelNetworkPreferredPlmnOp_t operation)
413 case TAPI_NETWORK_PREF_PLMN_ADD:
414 case TAPI_NETWORK_PREF_PLMN_EDIT:
415 case TAPI_NETWORK_PREF_PLMN_DELETE:
419 err("Default Case executed. Unknown PLMN Op");
422 err("operation %d is not supported", operation);
426 static gboolean _check_network_mode(int mode)
428 if (mode == TAPI_NETWORK_MODE_AUTO) {
431 if (mode & TAPI_NETWORK_MODE_GSM)
432 mode &= ~TAPI_NETWORK_MODE_GSM;
434 if (mode & TAPI_NETWORK_MODE_WCDMA)
435 mode &= ~TAPI_NETWORK_MODE_WCDMA;
437 if (mode & TAPI_NETWORK_MODE_1XRTT)
438 mode &= ~TAPI_NETWORK_MODE_1XRTT;
440 if (mode & TAPI_NETWORK_MODE_LTE)
441 mode &= ~TAPI_NETWORK_MODE_LTE;
443 if (mode & TAPI_NETWORK_MODE_EVDO)
444 mode &= ~TAPI_NETWORK_MODE_EVDO;
450 err("mode %d is not supported", mode);
454 static gboolean _check_emergency_callback_mode(TelNetworkEmergencyCallbackMode_t mode)
457 case TAPI_NETWORK_EMERGENCY_CALLBACK_MODE_ENTER:
458 case TAPI_NETWORK_EMERGENCY_CALLBACK_MODE_EXIT:
463 err("Default Case executed. Unknown Emergency callback mode");
466 err("emergency callback mode %d is not supported", mode);
470 static gboolean _check_roaming_preference(TelNetworkPrefNetType_t roam_pref)
473 case TAPI_NETWORK_PREF_NET_TYPE_HOME_ONLY:
474 case TAPI_NETWORK_PREF_NET_TYPE_AFFILIATED:
475 case TAPI_NETWORK_PREF_NET_TYPE_AUTOMATIC:
476 case TAPI_NETWORK_PREF_NET_TYPE_AUTOMATIC_A:
477 case TAPI_NETWORK_PREF_NET_TYPE_AUTOMATIC_B:
478 case TAPI_NETWORK_PREF_NET_TYPE_ROAM_DOMESTIC:
479 case TAPI_NETWORK_PREF_NET_TYPE_ROAM_INTERNATIONAL:
480 case TAPI_NETWORK_PREF_NET_TYPE_ROAM_DUAL:
481 case TAPI_NETWORK_PREF_NET_TYPE_BLANK:
486 err("Default Case executed. Unknown roaming preference");
490 err("roam_pref %d is not supported", roam_pref);
494 static void on_response_search_network(GObject *source_object,
495 GAsyncResult *res, gpointer user_data)
497 GError *error = NULL;
498 struct tapi_resp_data *evt_cb_data = user_data;
502 TelNetworkPlmnList_t list;
504 GVariant *dbus_result = NULL;
505 GVariant *value = NULL;
506 GVariantIter *iter = NULL;
507 GVariantIter *iter_row = NULL;
508 const gchar *key = NULL;
510 memset(&list, 0, sizeof(TelNetworkPlmnList_t));
512 dbus_result = g_dbus_connection_call_finish(G_DBUS_CONNECTION(source_object), res, &error);
513 TAPI_RESP_CHECK_ERROR(error, evt_cb_data);
515 g_variant_get(dbus_result, "(aa{sv}i)", &iter, &result);
517 list.networks_count = g_variant_iter_n_children(iter);
520 while (g_variant_iter_next(iter, "a{sv}", &iter_row)) {
521 while (g_variant_iter_loop(iter_row, "{sv}", &key, &value)) {
522 if (!g_strcmp0(key, "plmn")) {
523 strncpy(list.network_list[i].plmn, g_variant_get_string(value, NULL), TAPI_NETWORK_PLMN_LEN_MAX);
524 list.network_list[i].plmn_id = atoi(g_variant_get_string(value, NULL));
525 } else if (!g_strcmp0(key, "act")) {
526 list.network_list[i].access_technology = _convert_act_to_systemtype(g_variant_get_int32(value));
527 } else if (!g_strcmp0(key, "type")) {
528 list.network_list[i].type_of_plmn = g_variant_get_int32(value);
529 } else if (!g_strcmp0(key, "name")) {
530 strncpy(list.network_list[i].network_name, g_variant_get_string(value, NULL), 40);
534 g_variant_iter_free(iter_row);
536 g_variant_iter_free(iter);
538 TAPI_INVOKE_RESP_CALLBACK(evt_cb_data, result, &list);
541 g_variant_unref(dbus_result);
544 static void on_response_get_network_selection_mode(GObject *source_object,
545 GAsyncResult *res, gpointer user_data)
547 GError *error = NULL;
548 struct tapi_resp_data *evt_cb_data = user_data;
551 GVariant *dbus_result;
554 dbus_result = g_dbus_connection_call_finish(G_DBUS_CONNECTION(source_object), res, &error);
555 TAPI_RESP_CHECK_ERROR(error, evt_cb_data);
557 g_variant_get(dbus_result, "(ii)", &mode, &result);
559 TAPI_INVOKE_RESP_CALLBACK(evt_cb_data, result, &mode);
562 g_variant_unref(dbus_result);
565 static void on_response_default_set(GObject *source_object, GAsyncResult *res,
568 GError *error = NULL;
569 struct tapi_resp_data *evt_cb_data = user_data;
572 GVariant *dbus_result;
574 dbus_result = g_dbus_connection_call_finish(G_DBUS_CONNECTION(source_object), res, &error);
575 TAPI_RESP_CHECK_ERROR(error, evt_cb_data);
577 g_variant_get(dbus_result, "(i)", &result);
579 TAPI_INVOKE_RESP_CALLBACK(evt_cb_data, result, NULL);
582 g_variant_unref(dbus_result);
585 static void on_response_get_network_preferred_plmn(GObject *source_object,
586 GAsyncResult *res, gpointer user_data)
588 GError *error = NULL;
589 struct tapi_resp_data *evt_cb_data = user_data;
593 TelNetworkPreferredPlmnList_t list;
595 GVariant *dbus_result = NULL;
596 GVariant *value = NULL;
597 GVariantIter *iter = NULL;
598 GVariantIter *iter_row = NULL;
599 const gchar *key = NULL;
601 memset(&list, 0, sizeof(TelNetworkPreferredPlmnList_t));
603 dbus_result = g_dbus_connection_call_finish(G_DBUS_CONNECTION(source_object), res, &error);
604 TAPI_RESP_CHECK_ERROR(error, evt_cb_data);
606 g_variant_get(dbus_result, "(aa{sv}i)", &iter, &result);
608 list.NumOfPrefPlmns = g_variant_iter_n_children(iter);
610 if (list.NumOfPrefPlmns == 0) {
611 dbg("num_of_.. = 0");
612 if (evt_cb_data->cb_fn)
613 evt_cb_data->cb_fn(evt_cb_data->handle, result, &list, evt_cb_data->user_data);
620 while (g_variant_iter_next(iter, "a{sv}", &iter_row)) {
621 while (g_variant_iter_loop(iter_row, "{sv}", &key, &value)) {
622 if (!g_strcmp0(key, "plmn"))
623 strncpy(list.PrefPlmnRecord[i].Plmn, g_variant_get_string(value, NULL), 6);
624 else if (!g_strcmp0(key, "act"))
625 list.PrefPlmnRecord[i].SystemType = _convert_act_to_systemtype(g_variant_get_int32(value));
626 else if (!g_strcmp0(key, "index"))
627 list.PrefPlmnRecord[i].Index = g_variant_get_int32(value);
628 else if (!g_strcmp0(key, "name"))
629 strncpy(list.PrefPlmnRecord[i].network_name, g_variant_get_string(value, NULL), 40);
632 g_variant_iter_free(iter_row);
634 g_variant_iter_free(iter);
636 TAPI_INVOKE_RESP_CALLBACK(evt_cb_data, result, &list);
639 g_variant_unref(dbus_result);
642 static void on_response_get_network_mode(GObject *source_object,
643 GAsyncResult *res, gpointer user_data)
645 GError *error = NULL;
646 struct tapi_resp_data *evt_cb_data = user_data;
649 GVariant *dbus_result;
652 dbus_result = g_dbus_connection_call_finish(G_DBUS_CONNECTION(source_object), res, &error);
653 TAPI_RESP_CHECK_ERROR(error, evt_cb_data);
655 g_variant_get(dbus_result, "(ii)", &mode, &result);
657 TAPI_INVOKE_RESP_CALLBACK(evt_cb_data, result, &mode);
660 g_variant_unref(dbus_result);
663 static void on_response_get_network_serving(GObject *source_object,
664 GAsyncResult *res, gpointer user_data)
666 GError *error = NULL;
667 struct tapi_resp_data *evt_cb_data = user_data;
670 TelNetworkServing_t data;
673 GVariant *value = NULL;
674 const gchar *key = NULL;
675 GVariant *dbus_result;
678 char v1, v2, v3, v6, v7;
680 memset(&data, 0, sizeof(TelNetworkServing_t));
682 dbus_result = g_dbus_connection_call_finish(G_DBUS_CONNECTION(source_object), res, &error);
683 TAPI_RESP_CHECK_ERROR(error, evt_cb_data);
685 g_variant_get(dbus_result, "(a{sv}i)", &iter, &result);
687 while (g_variant_iter_loop(iter, "{sv}", &key, &value)) {
688 if (!g_strcmp0(key, "serving")) {
689 g_variant_get(value, "(is)", &v0, &plmn);
690 data.act = _convert_act_to_systemtype(v0);
692 snprintf(data.plmn, 7, "%s", plmn);
695 } else if (!g_strcmp0(key, "g_serving")) {
696 g_variant_get(value, "(i)", &v0);
698 } else if (!g_strcmp0(key, "c_serving")) {
699 g_variant_get(value, "(iuuuiiuu)", &v0, &v1, &v2, &v3, &v4, &v5, &v6, &v7);
700 data.info.cdma_info.carrier = v0;
701 data.info.cdma_info.system_id = v1;
702 data.info.cdma_info.network_id = v2;
703 data.info.cdma_info.base_station_id = v3;
704 data.info.cdma_info.base_station_latitude = v4;
705 data.info.cdma_info.base_station_longitude = v5;
706 data.info.cdma_info.registration_zone = v6;
707 data.info.cdma_info.pilot_offset = v7;
710 g_variant_iter_free(iter);
712 TAPI_INVOKE_RESP_CALLBACK(evt_cb_data, result, &data);
715 g_variant_unref(dbus_result);
718 static void on_response_get_neighboring_cell_info(GObject *source_object,
719 GAsyncResult *res, gpointer user_data)
721 GError *error = NULL;
722 struct tapi_resp_data *evt_cb_data = user_data;
724 int geran_index = 0, umts_index = 0;
726 TelNetworkNeighboringCellInfo_t list;
728 GVariant *dbus_result = NULL;
729 GVariant *value = NULL;
730 GVariantIter *iter = NULL;
731 GVariantIter *iter_row = NULL;
732 const gchar *key = NULL;
733 gint v0, v1, v2, v3, v4, v5;
735 memset(&list, 0, sizeof(TelNetworkNeighboringCellInfo_t));
737 dbus_result = g_dbus_connection_call_finish(G_DBUS_CONNECTION(source_object), res, &error);
738 TAPI_RESP_CHECK_ERROR(error, evt_cb_data);
740 g_variant_get(dbus_result, "(aa{sv}i)", &iter, &result);
742 while (g_variant_iter_next(iter, "a{sv}", &iter_row)) {
743 while (g_variant_iter_loop(iter_row, "{sv}", &key, &value)) {
744 if (!g_strcmp0(key, "serving")) {
745 g_variant_get(value, "(iii)", &v0, &v1, &v2);
746 list.serving.act = _convert_act_to_systemtype(v0);
747 list.serving.mcc = v1;
748 list.serving.mnc = v2;
749 } else if (!g_strcmp0(key, "g_serving")) {
750 g_variant_get(value, "(iiiii)", &v0, &v1, &v2, &v3, &v4);
751 list.serving.cell.geran.cell_id = v0;
752 list.serving.cell.geran.lac = v1;
753 list.serving.cell.geran.bcch = v2;
754 list.serving.cell.geran.bsic = v3;
755 list.serving.cell.geran.rxlev = v4;
756 } else if (!g_strcmp0(key, "u_serving")) {
757 g_variant_get(value, "(iiiii)", &v0, &v1, &v2, &v3, &v4);
758 list.serving.cell.umts.cell_id = v0;
759 list.serving.cell.umts.lac = v1;
760 list.serving.cell.umts.arfcn = v2;
761 list.serving.cell.umts.psc = v3;
762 list.serving.cell.umts.rscp = v4;
763 } else if (!g_strcmp0(key, "l_serving")) {
764 g_variant_get(value, "(iiiii)", &v0, &v1, &v2, &v3, &v4);
765 list.serving.cell.lte.cell_id = v0;
766 list.serving.cell.lte.lac = v1;
767 list.serving.cell.lte.earfcn = v2;
768 list.serving.cell.lte.tac = v3;
769 list.serving.cell.lte.rssi = v4;
770 } else if (!g_strcmp0(key, "c_serving")) {
771 g_variant_get(value, "(uuuuii)", &v0, &v1, &v2, &v3, &v4, &v5);
772 list.serving.cell.cdma.system_id = v0;
773 list.serving.cell.cdma.network_id = v1;
774 list.serving.cell.cdma.base_station_id = v2;
775 list.serving.cell.cdma.reference_pn = v3;
776 list.serving.cell.cdma.base_station_latitude = v4;
777 list.serving.cell.cdma.base_station_longitude = v5;
778 } else if (!g_strcmp0(key, "geran")) {
779 g_variant_get(value, "(iiiii)", &v0, &v1, &v2, &v3, &v4);
780 list.geran_list[geran_index].cell_id = v0;
781 list.geran_list[geran_index].lac = v1;
782 list.geran_list[geran_index].bcch = v2;
783 list.geran_list[geran_index].bsic = v3;
784 list.geran_list[geran_index].rxlev = v4;
786 } else if (!g_strcmp0(key, "umts")) {
787 g_variant_get(value, "(iiiii)", &v0, &v1, &v2, &v3, &v4);
788 list.umts_list[umts_index].cell_id = v0;
789 list.umts_list[umts_index].lac = v1;
790 list.umts_list[umts_index].arfcn = v2;
791 list.umts_list[umts_index].psc = v3;
792 list.umts_list[umts_index].rscp = v4;
796 g_variant_iter_free(iter_row);
798 g_variant_iter_free(iter);
800 list.geran_list_count = geran_index;
801 list.umts_list_count = umts_index;
802 dbg("act=%d, count(geran:%d, umts:%d)", list.serving.act, geran_index, umts_index);
804 TAPI_INVOKE_RESP_CALLBACK(evt_cb_data, result, &list);
807 g_variant_unref(dbus_result);
810 static void on_response_select_network(GObject *source_object, GAsyncResult *res,
813 GError *error = NULL;
814 struct tapi_resp_data *evt_cb_data = user_data;
816 GVariant *dbus_result;
818 dbus_result = g_dbus_connection_call_finish(G_DBUS_CONNECTION(source_object), res, &error);
819 TAPI_RESP_CHECK_ERROR(error, evt_cb_data);
820 g_variant_get(dbus_result, "(i)", &result);
822 /* Map result received from libtcore to TapiResult_t */
824 result = TAPI_API_SUCCESS;
828 result = TAPI_API_NETWORK_PLMN_NOT_ALLOWED;
832 result = TAPI_API_NETWORK_ROAMING_NOT_ALLOWED;
841 TAPI_INVOKE_RESP_CALLBACK(evt_cb_data, result, NULL);
844 g_variant_unref(dbus_result);
847 static void on_response_get_network_roaming_preference(GObject *source_object,
848 GAsyncResult *res, gpointer user_data)
850 GError *error = NULL;
851 struct tapi_resp_data *evt_cb_data = user_data;
854 GVariant *dbus_result;
855 TelNetworkPrefNetType_t roam_pref;
857 dbus_result = g_dbus_connection_call_finish(G_DBUS_CONNECTION(source_object), res, &error);
858 TAPI_RESP_CHECK_ERROR(error, evt_cb_data);
860 g_variant_get(dbus_result, "(ii)", &roam_pref, &result);
862 TAPI_INVOKE_RESP_CALLBACK(evt_cb_data, result, &roam_pref);
865 g_variant_unref(dbus_result);
868 EXPORT_API int tel_search_network(TapiHandle *handle, tapi_response_cb callback, void *user_data)
870 struct tapi_resp_data *evt_cb_data = NULL;
872 TAPI_RET_ERR_NUM_IF_FAIL(handle != NULL && callback != NULL, TAPI_API_INVALID_PTR);
874 TAPI_MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
876 msg("[%s] network_search requested", handle->cp_name);
878 g_dbus_connection_call(handle->dbus_connection,
879 DBUS_TELEPHONY_SERVICE , handle->path, DBUS_TELEPHONY_NETWORK_INTERFACE,
880 "Search", NULL, NULL,
881 G_DBUS_CALL_FLAGS_NONE, TAPI_UNRESTRICTED_TIMEOUT, handle->ca,
882 on_response_search_network, evt_cb_data);
884 return TAPI_API_SUCCESS;
887 EXPORT_API int tel_get_network_selection_mode(struct tapi_handle *handle, tapi_response_cb callback, void *user_data)
889 struct tapi_resp_data *evt_cb_data = NULL;
891 dbg("Func Entrance");
893 TAPI_RET_ERR_NUM_IF_FAIL(handle != NULL && callback != NULL, TAPI_API_INVALID_PTR);
895 TAPI_MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
897 g_dbus_connection_call(handle->dbus_connection,
898 DBUS_TELEPHONY_SERVICE , handle->path, DBUS_TELEPHONY_NETWORK_INTERFACE,
899 "GetSelectionMode", NULL, NULL,
900 G_DBUS_CALL_FLAGS_NONE, TAPI_DEFAULT_TIMEOUT, handle->ca,
901 on_response_get_network_selection_mode, evt_cb_data);
903 return TAPI_API_SUCCESS;
906 EXPORT_API int tel_select_network_automatic(struct tapi_handle *handle, tapi_response_cb callback, void *user_data)
908 struct tapi_resp_data *evt_cb_data = NULL;
911 TAPI_RET_ERR_NUM_IF_FAIL(handle != NULL, TAPI_API_INVALID_PTR);
913 TAPI_MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
915 param = g_variant_new("(isi)",
920 msg("[%s] automatic selection requested", handle->cp_name);
922 g_dbus_connection_call(handle->dbus_connection,
923 DBUS_TELEPHONY_SERVICE , handle->path, DBUS_TELEPHONY_NETWORK_INTERFACE,
924 "SetSelectionMode", param, NULL,
925 G_DBUS_CALL_FLAGS_NONE, TAPI_UNRESTRICTED_TIMEOUT, handle->ca,
926 on_response_default_set, evt_cb_data);
928 return TAPI_API_SUCCESS;
931 EXPORT_API int tel_select_network_manual(struct tapi_handle *handle, const char *plmn, int type, tapi_response_cb callback, void *user_data)
933 struct tapi_resp_data *evt_cb_data = NULL;
936 TAPI_RET_ERR_NUM_IF_FAIL(handle != NULL && _check_plmn(plmn), TAPI_API_INVALID_PTR);
938 TAPI_MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
940 param = g_variant_new("(isi)",
943 _convert_systemtype_to_act(type));
945 msg("[%s] manual selection requested plmn:[%s] type:[%d]", handle->cp_name, plmn ? plmn : "", type);
947 g_dbus_connection_call(handle->dbus_connection,
948 DBUS_TELEPHONY_SERVICE , handle->path, DBUS_TELEPHONY_NETWORK_INTERFACE,
949 "SetSelectionMode", param, NULL,
950 G_DBUS_CALL_FLAGS_NONE, TAPI_UNRESTRICTED_TIMEOUT, handle->ca,
951 on_response_select_network, evt_cb_data);
953 return TAPI_API_SUCCESS;
956 EXPORT_API int tel_set_network_preferred_plmn(
958 TelNetworkPreferredPlmnOp_t operation,
959 TelNetworkPreferredPlmnInfo_t *info,
960 tapi_response_cb callback,
963 struct tapi_resp_data *evt_cb_data = NULL;
967 TAPI_RET_ERR_NUM_IF_FAIL(handle != NULL && info != NULL &&
968 _check_operation(operation) &&
969 _check_plmn((const char *)&info->Plmn), TAPI_API_INVALID_PTR);
971 dbg("Func Entrance");
973 TAPI_MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
975 switch (info->SystemType) {
976 case TAPI_NETWORK_SYSTEM_GSM:
980 case TAPI_NETWORK_SYSTEM_UMTS:
984 case TAPI_NETWORK_SYSTEM_GPRS:
988 case TAPI_NETWORK_SYSTEM_EGPRS:
992 case TAPI_NETWORK_SYSTEM_GSM_AND_UMTS:
1001 param = g_variant_new("(iiis)",
1007 g_dbus_connection_call(handle->dbus_connection,
1008 DBUS_TELEPHONY_SERVICE , handle->path, DBUS_TELEPHONY_NETWORK_INTERFACE,
1009 "SetPreferredPlmn", param, NULL,
1010 G_DBUS_CALL_FLAGS_NONE, TAPI_DEFAULT_TIMEOUT, handle->ca,
1011 on_response_default_set, evt_cb_data);
1013 return TAPI_API_SUCCESS;
1016 EXPORT_API int tel_get_network_preferred_plmn(TapiHandle *handle, tapi_response_cb callback, void *user_data)
1018 struct tapi_resp_data *evt_cb_data = NULL;
1020 dbg("Func Entrance");
1022 TAPI_RET_ERR_NUM_IF_FAIL(handle != NULL && callback != NULL, TAPI_API_INVALID_PTR);
1024 TAPI_MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
1026 g_dbus_connection_call(handle->dbus_connection,
1027 DBUS_TELEPHONY_SERVICE , handle->path, DBUS_TELEPHONY_NETWORK_INTERFACE,
1028 "GetPreferredPlmn", NULL, NULL,
1029 G_DBUS_CALL_FLAGS_NONE, TAPI_DEFAULT_TIMEOUT, handle->ca,
1030 on_response_get_network_preferred_plmn, evt_cb_data);
1032 return TAPI_API_SUCCESS;
1035 EXPORT_API int tel_set_network_mode(TapiHandle *handle, int mode, tapi_response_cb callback, void *user_data)
1037 struct tapi_resp_data *evt_cb_data = NULL;
1040 TAPI_RET_ERR_NUM_IF_FAIL(handle != NULL &&
1041 _check_network_mode(mode), TAPI_API_INVALID_PTR);
1043 TAPI_MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
1045 param = g_variant_new("(i)",
1048 msg("[%s] requested mode:[0x%x]", handle->cp_name, mode);
1050 g_dbus_connection_call(handle->dbus_connection,
1051 DBUS_TELEPHONY_SERVICE , handle->path, DBUS_TELEPHONY_NETWORK_INTERFACE,
1052 "SetMode", param, NULL,
1053 G_DBUS_CALL_FLAGS_NONE, TAPI_UNRESTRICTED_TIMEOUT, handle->ca,
1054 on_response_default_set, evt_cb_data);
1056 return TAPI_API_SUCCESS;
1059 EXPORT_API int tel_get_network_mode(TapiHandle *handle, tapi_response_cb callback, void *user_data)
1061 struct tapi_resp_data *evt_cb_data = NULL;
1063 TAPI_RET_ERR_NUM_IF_FAIL(handle != NULL && callback != NULL, TAPI_API_INVALID_PTR);
1065 TAPI_MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
1067 dbg("[%s] Func Entrance", handle->cp_name);
1069 g_dbus_connection_call(handle->dbus_connection,
1070 DBUS_TELEPHONY_SERVICE , handle->path, DBUS_TELEPHONY_NETWORK_INTERFACE,
1071 "GetMode", NULL, NULL,
1072 G_DBUS_CALL_FLAGS_NONE, TAPI_DEFAULT_TIMEOUT, handle->ca,
1073 on_response_get_network_mode, evt_cb_data);
1075 return TAPI_API_SUCCESS;
1078 EXPORT_API int tel_cancel_network_manual_search(TapiHandle *handle, tapi_response_cb callback, void *user_data)
1080 struct tapi_resp_data *evt_cb_data = NULL;
1082 TAPI_RET_ERR_NUM_IF_FAIL(handle != NULL, TAPI_API_INVALID_PTR);
1084 TAPI_MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
1086 msg("[%s] network search cancel requested", handle->cp_name);
1088 g_dbus_connection_call(handle->dbus_connection,
1089 DBUS_TELEPHONY_SERVICE , handle->path, DBUS_TELEPHONY_NETWORK_INTERFACE,
1090 "SearchCancel", NULL, NULL,
1091 G_DBUS_CALL_FLAGS_NONE, TAPI_DEFAULT_TIMEOUT, handle->ca,
1092 on_response_default_set, evt_cb_data);
1094 return TAPI_API_SUCCESS;
1097 EXPORT_API int tel_get_network_serving(TapiHandle *handle, tapi_response_cb callback, void *user_data)
1099 struct tapi_resp_data *evt_cb_data = NULL;
1101 TAPI_RET_ERR_NUM_IF_FAIL(handle != NULL && callback != NULL, TAPI_API_INVALID_PTR);
1103 TAPI_MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
1105 dbg("[%s] Func Entrance", handle->cp_name);
1107 g_dbus_connection_call(handle->dbus_connection,
1108 DBUS_TELEPHONY_SERVICE , handle->path, DBUS_TELEPHONY_NETWORK_INTERFACE,
1109 "GetServingNetwork", NULL, NULL,
1110 G_DBUS_CALL_FLAGS_NONE, TAPI_DEFAULT_TIMEOUT, handle->ca,
1111 on_response_get_network_serving, evt_cb_data);
1113 return TAPI_API_SUCCESS;
1116 EXPORT_API int tel_get_network_neighboring_cell_info(TapiHandle *handle, tapi_response_cb callback, void *user_data)
1118 struct tapi_resp_data *evt_cb_data = NULL;
1120 TAPI_RET_ERR_NUM_IF_FAIL(handle != NULL && callback != NULL, TAPI_API_INVALID_PTR);
1122 TAPI_MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
1124 dbg("[%s] Func Entrance", handle->cp_name);
1126 g_dbus_connection_call(handle->dbus_connection,
1127 DBUS_TELEPHONY_SERVICE , handle->path, DBUS_TELEPHONY_NETWORK_INTERFACE,
1128 "GetNgbrCellInfo", NULL, NULL,
1129 G_DBUS_CALL_FLAGS_NONE, TAPI_DEFAULT_TIMEOUT, handle->ca,
1130 on_response_get_neighboring_cell_info, evt_cb_data);
1132 return TAPI_API_SUCCESS;
1135 EXPORT_API int tel_set_network_default_data_subscription(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, TAPI_API_INVALID_PTR);
1140 TAPI_RET_ERR_NUM_IF_FAIL(callback, TAPI_API_INVALID_PTR);
1142 TAPI_MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
1144 msg("[%s] Func Entrance", handle->cp_name);
1147 g_dbus_connection_call(handle->dbus_connection,
1148 DBUS_TELEPHONY_SERVICE , handle->path, DBUS_TELEPHONY_NETWORK_INTERFACE,
1149 "SetDefaultDataSubscription", NULL, NULL,
1150 G_DBUS_CALL_FLAGS_NONE, TAPI_DEFAULT_TIMEOUT, handle->ca,
1151 on_response_default_set, evt_cb_data);
1153 return TAPI_API_SUCCESS;
1156 EXPORT_API int tel_set_network_emergency_callback_mode(TapiHandle *handle, TelNetworkEmergencyCallbackMode_t mode, tapi_response_cb callback, void *user_data)
1158 struct tapi_resp_data *evt_cb_data = NULL;
1161 TAPI_RET_ERR_NUM_IF_FAIL(handle != NULL &&
1162 _check_emergency_callback_mode(mode), TAPI_API_INVALID_PTR);
1164 TAPI_MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
1166 param = g_variant_new("(i)", mode);
1168 msg("[%s] emergency callback mode :[%d]", handle->cp_name, mode);
1170 g_dbus_connection_call(handle->dbus_connection,
1171 DBUS_TELEPHONY_SERVICE , handle->path, DBUS_TELEPHONY_NETWORK_INTERFACE,
1172 "SetEmergencyCallbackMode", param, NULL,
1173 G_DBUS_CALL_FLAGS_NONE, TAPI_DEFAULT_TIMEOUT, handle->ca,
1174 on_response_default_set, evt_cb_data);
1176 return TAPI_API_SUCCESS;
1179 EXPORT_API int tel_set_network_roaming_preference(TapiHandle *handle, TelNetworkPrefNetType_t roam_pref, tapi_response_cb callback, void *user_data)
1181 struct tapi_resp_data *evt_cb_data = NULL;
1184 TAPI_RET_ERR_NUM_IF_FAIL(handle != NULL &&
1185 _check_roaming_preference(roam_pref), TAPI_API_INVALID_PTR);
1187 TAPI_MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
1189 param = g_variant_new("(i)", roam_pref);
1191 msg("[%s] roam_pref:[%d]", handle->cp_name, roam_pref);
1193 g_dbus_connection_call(handle->dbus_connection,
1194 DBUS_TELEPHONY_SERVICE , handle->path, DBUS_TELEPHONY_NETWORK_INTERFACE,
1195 "SetRoamingPreference", param, NULL,
1196 G_DBUS_CALL_FLAGS_NONE, TAPI_DEFAULT_TIMEOUT, handle->ca,
1197 on_response_default_set, evt_cb_data);
1199 return TAPI_API_SUCCESS;
1203 EXPORT_API int tel_get_network_roaming_preference(TapiHandle *handle, tapi_response_cb callback, void *user_data)
1205 struct tapi_resp_data *evt_cb_data = NULL;
1207 TAPI_RET_ERR_NUM_IF_FAIL(handle != NULL && callback != NULL, TAPI_API_INVALID_PTR);
1209 TAPI_MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
1211 dbg("[%s] Func Entrance", handle->cp_name);
1213 g_dbus_connection_call(handle->dbus_connection,
1214 DBUS_TELEPHONY_SERVICE , handle->path, DBUS_TELEPHONY_NETWORK_INTERFACE,
1215 "GetRoamingPreference", NULL, NULL,
1216 G_DBUS_CALL_FLAGS_NONE, TAPI_DEFAULT_TIMEOUT, handle->ca,
1217 on_response_get_network_roaming_preference, evt_cb_data);
1219 return TAPI_API_SUCCESS;
1223 EXPORT_API int tel_get_network_default_data_subscription(TapiHandle *handle, TelNetworkDefaultDataSubs_t *default_subscription)
1225 GError *gerr = NULL;
1226 GVariant *sync_gv = NULL;
1229 TapiResult_t ret = TAPI_API_OPERATION_FAILED;
1231 TAPI_RET_ERR_NUM_IF_FAIL(handle, TAPI_API_INVALID_PTR);
1232 TAPI_RET_ERR_NUM_IF_FAIL(default_subscription, TAPI_API_INVALID_PTR);
1234 sync_gv = g_dbus_connection_call_sync(handle->dbus_connection,
1235 DBUS_TELEPHONY_SERVICE, handle->path, DBUS_TELEPHONY_NETWORK_INTERFACE,
1236 "GetDefaultDataSubscription", NULL, NULL,
1237 G_DBUS_CALL_FLAGS_NONE, TAPI_DEFAULT_TIMEOUT, handle->ca,
1240 g_variant_get(sync_gv, "(ii)", &subs, &result);
1243 *default_subscription = subs;
1245 *default_subscription = TAPI_NETWORK_DEFAULT_DATA_SUBS_UNKNOWN;
1247 msg("'default' Data Subscription: [%d]", subs);
1249 g_variant_unref(sync_gv);
1250 ret = TAPI_API_SUCCESS;
1252 err("Get Data Subscription failed: [%s]", gerr->message);
1253 if (strstr(gerr->message, "AccessDenied"))
1254 ret = TAPI_API_ACCESS_DENIED;
1261 EXPORT_API int tel_set_network_default_subscription(TapiHandle *handle, tapi_response_cb callback, void *user_data)
1263 struct tapi_resp_data *evt_cb_data = NULL;
1265 TAPI_RET_ERR_NUM_IF_FAIL(handle, TAPI_API_INVALID_PTR);
1266 TAPI_RET_ERR_NUM_IF_FAIL(callback, TAPI_API_INVALID_PTR);
1268 TAPI_MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
1270 dbg("[%s] Set 'default' Subscription (for CS)", handle->cp_name);
1273 g_dbus_connection_call(handle->dbus_connection,
1274 DBUS_TELEPHONY_SERVICE , handle->path, DBUS_TELEPHONY_NETWORK_INTERFACE,
1275 "SetDefaultSubscription", NULL, NULL,
1276 G_DBUS_CALL_FLAGS_NONE, TAPI_DEFAULT_TIMEOUT, handle->ca,
1277 on_response_default_set, evt_cb_data);
1279 return TAPI_API_SUCCESS;
1282 EXPORT_API int tel_get_network_default_subscription(TapiHandle *handle, TelNetworkDefaultSubs_t *default_subscription)
1284 GError *gerr = NULL;
1285 GVariant *sync_gv = NULL;
1288 TapiResult_t ret = TAPI_API_OPERATION_FAILED;
1290 TAPI_RET_ERR_NUM_IF_FAIL(handle, TAPI_API_INVALID_PTR);
1291 TAPI_RET_ERR_NUM_IF_FAIL(default_subscription, TAPI_API_INVALID_PTR);
1293 sync_gv = g_dbus_connection_call_sync(handle->dbus_connection,
1294 DBUS_TELEPHONY_SERVICE, handle->path, DBUS_TELEPHONY_NETWORK_INTERFACE,
1295 "GetDefaultSubscription", NULL, NULL,
1296 G_DBUS_CALL_FLAGS_NONE, TAPI_DEFAULT_TIMEOUT, handle->ca,
1299 g_variant_get(sync_gv, "(ii)", &subs, &result);
1302 *default_subscription = subs;
1304 *default_subscription = TAPI_NETWORK_DEFAULT_SUBS_UNKNOWN;
1305 dbg("'default' Subscription (for CS): [%d]", subs);
1307 g_variant_unref(sync_gv);
1308 ret = TAPI_API_SUCCESS;
1310 err("Get 'default' Subscription (for CS) failed: [%s]", gerr->message);
1311 if (strstr(gerr->message, "AccessDenied"))
1312 ret = TAPI_API_ACCESS_DENIED;