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.
25 #include "tapi_common.h"
26 #include "TapiUtility.h"
27 #include "TelNetwork.h"
31 #include "ITapiNetwork.h"
33 static int _convert_act_to_systemtype(int act)
37 return TAPI_NETWORK_SYSTEM_GSM;
41 return TAPI_NETWORK_SYSTEM_GPRS;
45 return TAPI_NETWORK_SYSTEM_EGPRS;
49 return TAPI_NETWORK_SYSTEM_UMTS;
53 return TAPI_NETWORK_SYSTEM_GSM_AND_UMTS;
57 return TAPI_NETWORK_SYSTEM_IS95A;
61 return TAPI_NETWORK_SYSTEM_IS95B;
65 return TAPI_NETWORK_SYSTEM_CDMA_1X;
69 return TAPI_NETWORK_SYSTEM_EVDO_REV_0;
73 return TAPI_NETWORK_SYSTEM_1X_EVDO_REV_0_HYBRID;
77 return TAPI_NETWORK_SYSTEM_EVDO_REV_A;
81 return TAPI_NETWORK_SYSTEM_1X_EVDO_REV_A_HYBRID;
85 return TAPI_NETWORK_SYSTEM_EVDV;
92 return TAPI_NETWORK_SYSTEM_NO_SRV;
95 static void on_response_search_network(GObject *source_object, GAsyncResult *res, gpointer user_data)
98 GDBusConnection *conn = NULL;
99 struct tapi_resp_data *evt_cb_data = user_data;
103 TelNetworkPlmnList_t list;
105 GVariant *dbus_result = NULL;
106 GVariant *value = NULL;
107 GVariantIter *iter = NULL;
108 GVariantIter *iter_row = NULL;
109 const gchar *key = NULL;
111 memset(&list, 0, sizeof(TelNetworkPlmnList_t));
113 conn = G_DBUS_CONNECTION (source_object);
115 dbus_result = g_dbus_connection_call_finish(conn, res, &error);
117 if (evt_cb_data->cb_fn) {
118 evt_cb_data->cb_fn(evt_cb_data->handle, -1, NULL, evt_cb_data->user_data);
125 g_variant_get (dbus_result, "(aa{sv}i)", &iter, &result);
127 list.networks_count = g_variant_iter_n_children(iter);
130 while (g_variant_iter_next(iter, "a{sv}", &iter_row)) {
131 while (g_variant_iter_loop(iter_row, "{sv}", &key, &value)) {
132 if (!g_strcmp0(key, "plmn")) {
133 list.network_list[i].plmn_id = atoi(g_variant_get_string(value, NULL));
135 if (!g_strcmp0(key, "act")) {
136 list.network_list[i].access_technology = _convert_act_to_systemtype(g_variant_get_int32(value));
138 if (!g_strcmp0(key, "type")) {
139 list.network_list[i].type_of_plmn = g_variant_get_int32(value);
141 if (!g_strcmp0(key, "name")) {
142 strncpy(list.network_list[i].network_name, g_variant_get_string(value, NULL), 40);
146 g_variant_iter_free(iter_row);
148 g_variant_iter_free(iter);
150 if (evt_cb_data->cb_fn) {
151 evt_cb_data->cb_fn(evt_cb_data->handle, result, &list, evt_cb_data->user_data);
157 static void on_response_get_network_selection_mode(GObject *source_object, GAsyncResult *res, gpointer user_data)
159 GError *error = NULL;
160 GDBusConnection *conn = NULL;
161 struct tapi_resp_data *evt_cb_data = user_data;
164 GVariant *dbus_result;
167 conn = G_DBUS_CONNECTION (source_object);
168 dbus_result = g_dbus_connection_call_finish(conn, res, &error);
170 g_variant_get (dbus_result, "(ii)", &mode, &result);
172 if (evt_cb_data->cb_fn) {
173 evt_cb_data->cb_fn(evt_cb_data->handle, result, &mode, evt_cb_data->user_data);
179 static void on_response_default_set(GObject *source_object, GAsyncResult *res, gpointer user_data)
181 GError *error = NULL;
182 GDBusConnection *conn = NULL;
183 struct tapi_resp_data *evt_cb_data = user_data;
186 GVariant *dbus_result;
188 conn = G_DBUS_CONNECTION (source_object);
189 dbus_result = g_dbus_connection_call_finish(conn, res, &error);
191 g_variant_get (dbus_result, "(i)", &result);
193 if (evt_cb_data->cb_fn) {
194 evt_cb_data->cb_fn(evt_cb_data->handle, result, NULL, evt_cb_data->user_data);
200 static void on_response_get_network_preferred_plmn(GDBusConnection *conn, GAsyncResult *res, gpointer user_data)
202 GError *error = NULL;
203 struct tapi_resp_data *evt_cb_data = user_data;
207 TelNetworkPreferredPlmnList_t list;
209 GVariant *dbus_result = NULL;
210 GVariant *value = NULL;
211 GVariantIter *iter = NULL;
212 GVariantIter *iter_row = NULL;
213 const gchar *key = NULL;
215 memset(&list, 0, sizeof(TelNetworkPreferredPlmnList_t));
217 dbus_result = g_dbus_connection_call_finish(conn, res, &error);
219 dbg("dbus_result = %p", dbus_result);
220 dbg("res = %p", res);
221 dbg("conn = %p", conn);
225 if (evt_cb_data->cb_fn) {
226 evt_cb_data->cb_fn(evt_cb_data->handle, result, &list, evt_cb_data->user_data);
233 g_variant_get (dbus_result, "(aa{sv}i)", &iter, &result);
235 list.NumOfPrefPlmns = g_variant_iter_n_children(iter);
237 if (list.NumOfPrefPlmns == 0) {
238 dbg("num_of_.. = 0");
239 if (evt_cb_data->cb_fn) {
240 evt_cb_data->cb_fn(evt_cb_data->handle, result, &list, evt_cb_data->user_data);
248 while (g_variant_iter_next(iter, "a{sv}", &iter_row)) {
249 while (g_variant_iter_loop(iter_row, "{sv}", &key, &value)) {
250 if (!g_strcmp0(key, "plmn")) {
251 strncpy(list.PrefPlmnRecord[i].Plmn, g_variant_get_string(value, NULL), 6);
253 if (!g_strcmp0(key, "act")) {
254 list.PrefPlmnRecord[i].SystemType = _convert_act_to_systemtype(g_variant_get_int32(value));
256 if (!g_strcmp0(key, "ef_index")) {
257 list.PrefPlmnRecord[i].Index = g_variant_get_int32(value);
259 if (!g_strcmp0(key, "name")) {
260 strncpy(list.PrefPlmnRecord[i].network_name, g_variant_get_string(value, NULL), 40);
264 g_variant_iter_free(iter_row);
266 g_variant_iter_free(iter);
268 if (evt_cb_data->cb_fn) {
269 evt_cb_data->cb_fn(evt_cb_data->handle, result, &list, evt_cb_data->user_data);
275 static void on_response_get_network_band(GObject *source_object, GAsyncResult *res, gpointer user_data)
277 GError *error = NULL;
278 GDBusConnection *conn = NULL;
279 struct tapi_resp_data *evt_cb_data = user_data;
282 GVariant *dbus_result;
286 conn = G_DBUS_CONNECTION (source_object);
287 dbus_result = g_dbus_connection_call_finish(conn, res, &error);
289 g_variant_get (dbus_result, "(iii)", &band, &mode, &result);
291 if (evt_cb_data->cb_fn) {
292 evt_cb_data->cb_fn(evt_cb_data->handle, result, &band, evt_cb_data->user_data);
298 static void on_response_get_network_mode(GObject *source_object, GAsyncResult *res, gpointer user_data)
300 GError *error = NULL;
301 GDBusConnection *conn = NULL;
302 struct tapi_resp_data *evt_cb_data = user_data;
305 GVariant *dbus_result;
308 conn = G_DBUS_CONNECTION (source_object);
309 dbus_result = g_dbus_connection_call_finish(conn, res, &error);
311 g_variant_get (dbus_result, "(ii)", &mode, &result);
313 if (evt_cb_data->cb_fn) {
314 evt_cb_data->cb_fn(evt_cb_data->handle, result, &mode, evt_cb_data->user_data);
320 static void on_response_get_network_service_domain(GObject *source_object, GAsyncResult *res, gpointer user_data)
322 GError *error = NULL;
323 GDBusConnection *conn = NULL;
324 struct tapi_resp_data *evt_cb_data = user_data;
327 GVariant *dbus_result;
330 conn = G_DBUS_CONNECTION (source_object);
331 dbus_result = g_dbus_connection_call_finish(conn, res, &error);
333 g_variant_get (dbus_result, "(ii)", &domain, &result);
335 if (evt_cb_data->cb_fn) {
336 evt_cb_data->cb_fn(evt_cb_data->handle, result, &domain, evt_cb_data->user_data);
342 static void on_response_get_network_serving(GObject *source_object, GAsyncResult *res, gpointer user_data)
344 GError *error = NULL;
345 GDBusConnection *conn = NULL;
346 struct tapi_resp_data *evt_cb_data = user_data;
349 TelNetworkServing_t data;
351 GVariant *dbus_result;
354 memset(&data, 0, sizeof(TelNetworkServing_t));
356 conn = G_DBUS_CONNECTION (source_object);
357 dbus_result = g_dbus_connection_call_finish(conn, res, &error);
359 g_variant_get (dbus_result, "(isii)",
366 snprintf(data.plmn, 7, "%s", plmn);
370 if (evt_cb_data->cb_fn) {
371 evt_cb_data->cb_fn(evt_cb_data->handle, result, &data, evt_cb_data->user_data);
377 EXPORT_API int tel_search_network(TapiHandle *handle, tapi_response_cb callback, void *user_data)
379 struct tapi_resp_data *evt_cb_data = NULL;
381 dbg("Func Entrance");
383 MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
385 g_dbus_connection_call(handle->dbus_connection,
386 DBUS_TELEPHONY_SERVICE , handle->path, DBUS_TELEPHONY_NETWORK_INTERFACE,
387 "Search", NULL, NULL,
388 G_DBUS_CALL_FLAGS_NONE, 180000, NULL,
389 on_response_search_network, evt_cb_data);
391 return TAPI_API_SUCCESS;
394 EXPORT_API int tel_get_network_selection_mode(struct tapi_handle *handle, tapi_response_cb callback, void *user_data)
396 struct tapi_resp_data *evt_cb_data = NULL;
398 dbg("Func Entrance");
400 MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
402 g_dbus_connection_call(handle->dbus_connection,
403 DBUS_TELEPHONY_SERVICE , handle->path, DBUS_TELEPHONY_NETWORK_INTERFACE,
404 "GetSelectionMode", NULL, NULL,
405 G_DBUS_CALL_FLAGS_NONE, -1, NULL,
406 on_response_get_network_selection_mode, evt_cb_data);
408 return TAPI_API_SUCCESS;
411 EXPORT_API int tel_select_network_automatic(struct tapi_handle *handle, tapi_response_cb callback, void *user_data)
413 struct tapi_resp_data *evt_cb_data = NULL;
416 dbg("Func Entrance");
418 MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
420 param = g_variant_new("(isi)",
425 g_dbus_connection_call(handle->dbus_connection,
426 DBUS_TELEPHONY_SERVICE , handle->path, DBUS_TELEPHONY_NETWORK_INTERFACE,
427 "SetSelectionMode", param, NULL,
428 G_DBUS_CALL_FLAGS_NONE, -1, NULL,
429 on_response_default_set, evt_cb_data);
431 return TAPI_API_SUCCESS;
434 EXPORT_API int tel_select_network_manual(struct tapi_handle *handle, const char *plmn, int act, tapi_response_cb callback, void *user_data)
436 struct tapi_resp_data *evt_cb_data = NULL;
439 dbg("Func Entrance");
441 MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
443 param = g_variant_new("(isi)",
448 g_dbus_connection_call(handle->dbus_connection,
449 DBUS_TELEPHONY_SERVICE , handle->path, DBUS_TELEPHONY_NETWORK_INTERFACE,
450 "SetSelectionMode", param, NULL,
451 G_DBUS_CALL_FLAGS_NONE, -1, NULL,
452 on_response_default_set, evt_cb_data);
454 return TAPI_API_SUCCESS;
457 EXPORT_API int tel_set_network_preferred_plmn(
459 TelNetworkPreferredPlmnOp_t operation,
460 TelNetworkPreferredPlmnInfo_t *info,
461 tapi_response_cb callback,
464 struct tapi_resp_data *evt_cb_data = NULL;
468 dbg("Func Entrance");
470 MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
472 switch (info->SystemType) {
473 case TAPI_NETWORK_SYSTEM_GSM:
477 case TAPI_NETWORK_SYSTEM_UMTS:
481 case TAPI_NETWORK_SYSTEM_GPRS:
485 case TAPI_NETWORK_SYSTEM_EGPRS:
489 case TAPI_NETWORK_SYSTEM_GSM_AND_UMTS:
498 param = g_variant_new("(iiis)",
504 g_dbus_connection_call(handle->dbus_connection,
505 DBUS_TELEPHONY_SERVICE , handle->path, DBUS_TELEPHONY_NETWORK_INTERFACE,
506 "SetPreferredPlmn", param, NULL,
507 G_DBUS_CALL_FLAGS_NONE, -1, NULL,
508 on_response_default_set, evt_cb_data);
510 return TAPI_API_SUCCESS;
513 EXPORT_API int tel_get_network_preferred_plmn(TapiHandle *handle, tapi_response_cb callback, void *user_data)
515 struct tapi_resp_data *evt_cb_data = NULL;
517 dbg("Func Entrance");
519 MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
521 g_dbus_connection_call(handle->dbus_connection,
522 DBUS_TELEPHONY_SERVICE , handle->path, DBUS_TELEPHONY_NETWORK_INTERFACE,
523 "GetPreferredPlmn", NULL, NULL,
524 G_DBUS_CALL_FLAGS_NONE, -1, NULL,
525 (GAsyncReadyCallback) on_response_get_network_preferred_plmn, evt_cb_data);
527 return TAPI_API_SUCCESS;
530 EXPORT_API int tel_set_network_band(TapiHandle *handle, TelNetworkBandPreferred_t mode, TelNetworkBand_t band, tapi_response_cb callback, void *user_data)
532 struct tapi_resp_data *evt_cb_data = NULL;
535 dbg("Func Entrance");
537 MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
539 param = g_variant_new("(ii)",
543 g_dbus_connection_call(handle->dbus_connection,
544 DBUS_TELEPHONY_SERVICE , handle->path, DBUS_TELEPHONY_NETWORK_INTERFACE,
545 "SetBand", param, NULL,
546 G_DBUS_CALL_FLAGS_NONE, -1, NULL,
547 on_response_default_set, evt_cb_data);
549 return TAPI_API_SUCCESS;
552 EXPORT_API int tel_get_network_band(TapiHandle *handle, tapi_response_cb callback, void *user_data)
554 struct tapi_resp_data *evt_cb_data = NULL;
556 dbg("Func Entrance");
558 MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
560 g_dbus_connection_call(handle->dbus_connection,
561 DBUS_TELEPHONY_SERVICE , handle->path, DBUS_TELEPHONY_NETWORK_INTERFACE,
562 "GetBand", NULL, NULL,
563 G_DBUS_CALL_FLAGS_NONE, -1, NULL,
564 on_response_get_network_band, evt_cb_data);
566 return TAPI_API_SUCCESS;
569 EXPORT_API int tel_set_network_mode(TapiHandle *handle, int mode, tapi_response_cb callback, void *user_data)
571 struct tapi_resp_data *evt_cb_data = NULL;
574 dbg("Func Entrance");
576 MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
578 param = g_variant_new("(i)",
581 g_dbus_connection_call(handle->dbus_connection,
582 DBUS_TELEPHONY_SERVICE , handle->path, DBUS_TELEPHONY_NETWORK_INTERFACE,
583 "SetMode", param, NULL,
584 G_DBUS_CALL_FLAGS_NONE, -1, NULL,
585 on_response_default_set, evt_cb_data);
587 return TAPI_API_SUCCESS;
590 EXPORT_API int tel_get_network_mode(TapiHandle *handle, tapi_response_cb callback, void *user_data)
592 struct tapi_resp_data *evt_cb_data = NULL;
594 dbg("Func Entrance");
596 MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
598 g_dbus_connection_call(handle->dbus_connection,
599 DBUS_TELEPHONY_SERVICE , handle->path, DBUS_TELEPHONY_NETWORK_INTERFACE,
600 "GetMode", NULL, NULL,
601 G_DBUS_CALL_FLAGS_NONE, -1, NULL,
602 on_response_get_network_mode, evt_cb_data);
604 return TAPI_API_SUCCESS;
607 EXPORT_API int tel_set_network_service_domain(TapiHandle *handle, TelNetworkServiceDomain_t domain, tapi_response_cb callback, void *user_data)
609 struct tapi_resp_data *evt_cb_data = NULL;
612 dbg("Func Entrance");
614 MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
616 param = g_variant_new("(i)", domain);
618 g_dbus_connection_call(handle->dbus_connection,
619 DBUS_TELEPHONY_SERVICE , handle->path, DBUS_TELEPHONY_NETWORK_INTERFACE,
620 "SetServiceDomain", param, NULL,
621 G_DBUS_CALL_FLAGS_NONE, -1, NULL,
622 on_response_default_set, evt_cb_data);
624 return TAPI_API_SUCCESS;
627 EXPORT_API int tel_get_network_service_domain(TapiHandle *handle, tapi_response_cb callback, void *user_data)
629 struct tapi_resp_data *evt_cb_data = NULL;
631 dbg("Func Entrance");
633 MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
635 g_dbus_connection_call(handle->dbus_connection,
636 DBUS_TELEPHONY_SERVICE , handle->path, DBUS_TELEPHONY_NETWORK_INTERFACE,
637 "GetServiceDomain", NULL, NULL,
638 G_DBUS_CALL_FLAGS_NONE, -1, NULL,
639 on_response_get_network_service_domain, evt_cb_data);
641 return TAPI_API_SUCCESS;
644 EXPORT_API int tel_cancel_network_manual_search(TapiHandle *handle, tapi_response_cb callback, void *user_data)
646 struct tapi_resp_data *evt_cb_data = NULL;
648 dbg("Func Entrance");
650 MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
652 g_dbus_connection_call(handle->dbus_connection,
653 DBUS_TELEPHONY_SERVICE , handle->path, DBUS_TELEPHONY_NETWORK_INTERFACE,
654 "SearchCancel", NULL, NULL,
655 G_DBUS_CALL_FLAGS_NONE, -1, NULL,
656 on_response_default_set, evt_cb_data);
658 return TAPI_API_SUCCESS;
661 EXPORT_API int tel_get_network_serving(TapiHandle *handle, tapi_response_cb callback, void *user_data)
663 struct tapi_resp_data *evt_cb_data = NULL;
665 dbg("Func Entrance");
667 MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
669 g_dbus_connection_call(handle->dbus_connection,
670 DBUS_TELEPHONY_SERVICE , handle->path, DBUS_TELEPHONY_NETWORK_INTERFACE,
671 "GetServingNetwork", NULL, NULL,
672 G_DBUS_CALL_FLAGS_NONE, -1, NULL,
673 on_response_get_network_serving, evt_cb_data);
675 return TAPI_API_SUCCESS;