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);
123 g_variant_get (dbus_result, "(aa{sv}i)", &iter, &result);
125 list.networks_count = g_variant_iter_n_children(iter);
128 while (g_variant_iter_next(iter, "a{sv}", &iter_row)) {
129 while (g_variant_iter_loop(iter_row, "{sv}", &key, &value)) {
130 if (!g_strcmp0(key, "plmn")) {
131 list.network_list[i].plmn_id = atoi(g_variant_get_string(value, NULL));
133 if (!g_strcmp0(key, "act")) {
134 list.network_list[i].access_technology = _convert_act_to_systemtype(g_variant_get_int32(value));
136 if (!g_strcmp0(key, "type")) {
137 list.network_list[i].type_of_plmn = g_variant_get_int32(value);
139 if (!g_strcmp0(key, "name")) {
140 strncpy(list.network_list[i].network_name, g_variant_get_string(value, NULL), 40);
144 g_variant_iter_free(iter_row);
146 g_variant_iter_free(iter);
148 if (evt_cb_data->cb_fn) {
149 evt_cb_data->cb_fn(evt_cb_data->handle, result, &list, evt_cb_data->user_data);
153 static void on_response_get_network_selection_mode(GObject *source_object, GAsyncResult *res, gpointer user_data)
155 GError *error = NULL;
156 GDBusConnection *conn = NULL;
157 struct tapi_resp_data *evt_cb_data = user_data;
160 GVariant *dbus_result;
163 conn = G_DBUS_CONNECTION (source_object);
164 dbus_result = g_dbus_connection_call_finish(conn, res, &error);
166 g_variant_get (dbus_result, "(ii)", &mode, &result);
168 if (evt_cb_data->cb_fn) {
169 evt_cb_data->cb_fn(evt_cb_data->handle, result, &mode, evt_cb_data->user_data);
173 static void on_response_default_set(GObject *source_object, GAsyncResult *res, gpointer user_data)
175 GError *error = NULL;
176 GDBusConnection *conn = NULL;
177 struct tapi_resp_data *evt_cb_data = user_data;
180 GVariant *dbus_result;
182 conn = G_DBUS_CONNECTION (source_object);
183 dbus_result = g_dbus_connection_call_finish(conn, res, &error);
185 g_variant_get (dbus_result, "(i)", &result);
187 if (evt_cb_data->cb_fn) {
188 evt_cb_data->cb_fn(evt_cb_data->handle, result, NULL, evt_cb_data->user_data);
192 static void on_response_get_network_preferred_plmn(GDBusConnection *conn, GAsyncResult *res, gpointer user_data)
194 GError *error = NULL;
195 struct tapi_resp_data *evt_cb_data = user_data;
199 TelNetworkPreferredPlmnList_t list;
201 GVariant *dbus_result = NULL;
202 GVariant *value = NULL;
203 GVariantIter *iter = NULL;
204 GVariantIter *iter_row = NULL;
205 const gchar *key = NULL;
207 memset(&list, 0, sizeof(TelNetworkPreferredPlmnList_t));
209 dbus_result = g_dbus_connection_call_finish(conn, res, &error);
211 dbg("dbus_result = %p", dbus_result);
212 dbg("res = %p", res);
213 dbg("conn = %p", conn);
217 if (evt_cb_data->cb_fn) {
218 evt_cb_data->cb_fn(evt_cb_data->handle, result, &list, evt_cb_data->user_data);
223 g_variant_get (dbus_result, "(aa{sv}i)", &iter, &result);
225 list.NumOfPrefPlmns = g_variant_iter_n_children(iter);
227 if (list.NumOfPrefPlmns == 0) {
228 dbg("num_of_.. = 0");
229 if (evt_cb_data->cb_fn) {
230 evt_cb_data->cb_fn(evt_cb_data->handle, result, &list, evt_cb_data->user_data);
236 while (g_variant_iter_next(iter, "a{sv}", &iter_row)) {
237 while (g_variant_iter_loop(iter_row, "{sv}", &key, &value)) {
238 if (!g_strcmp0(key, "plmn")) {
239 strncpy(list.PrefPlmnRecord[i].Plmn, g_variant_get_string(value, NULL), 6);
241 if (!g_strcmp0(key, "act")) {
242 list.PrefPlmnRecord[i].SystemType = _convert_act_to_systemtype(g_variant_get_int32(value));
244 if (!g_strcmp0(key, "ef_index")) {
245 list.PrefPlmnRecord[i].Index = g_variant_get_int32(value);
247 if (!g_strcmp0(key, "name")) {
248 strncpy(list.PrefPlmnRecord[i].network_name, g_variant_get_string(value, NULL), 40);
252 g_variant_iter_free(iter_row);
254 g_variant_iter_free(iter);
256 if (evt_cb_data->cb_fn) {
257 evt_cb_data->cb_fn(evt_cb_data->handle, result, &list, evt_cb_data->user_data);
261 static void on_response_get_network_band(GObject *source_object, GAsyncResult *res, gpointer user_data)
263 GError *error = NULL;
264 GDBusConnection *conn = NULL;
265 struct tapi_resp_data *evt_cb_data = user_data;
268 GVariant *dbus_result;
272 conn = G_DBUS_CONNECTION (source_object);
273 dbus_result = g_dbus_connection_call_finish(conn, res, &error);
275 g_variant_get (dbus_result, "(iii)", &band, &mode, &result);
277 if (evt_cb_data->cb_fn) {
278 evt_cb_data->cb_fn(evt_cb_data->handle, result, &band, evt_cb_data->user_data);
282 static void on_response_get_network_mode(GObject *source_object, GAsyncResult *res, gpointer user_data)
284 GError *error = NULL;
285 GDBusConnection *conn = NULL;
286 struct tapi_resp_data *evt_cb_data = user_data;
289 GVariant *dbus_result;
292 conn = G_DBUS_CONNECTION (source_object);
293 dbus_result = g_dbus_connection_call_finish(conn, res, &error);
295 g_variant_get (dbus_result, "(ii)", &mode, &result);
297 if (evt_cb_data->cb_fn) {
298 evt_cb_data->cb_fn(evt_cb_data->handle, result, &mode, evt_cb_data->user_data);
302 static void on_response_get_network_service_domain(GObject *source_object, GAsyncResult *res, gpointer user_data)
304 GError *error = NULL;
305 GDBusConnection *conn = NULL;
306 struct tapi_resp_data *evt_cb_data = user_data;
309 GVariant *dbus_result;
312 conn = G_DBUS_CONNECTION (source_object);
313 dbus_result = g_dbus_connection_call_finish(conn, res, &error);
315 g_variant_get (dbus_result, "(ii)", &domain, &result);
317 if (evt_cb_data->cb_fn) {
318 evt_cb_data->cb_fn(evt_cb_data->handle, result, &domain, evt_cb_data->user_data);
322 static void on_response_get_network_serving(GObject *source_object, GAsyncResult *res, gpointer user_data)
324 GError *error = NULL;
325 GDBusConnection *conn = NULL;
326 struct tapi_resp_data *evt_cb_data = user_data;
329 TelNetworkServing_t data;
331 GVariant *dbus_result;
334 memset(&data, 0, sizeof(TelNetworkServing_t));
336 conn = G_DBUS_CONNECTION (source_object);
337 dbus_result = g_dbus_connection_call_finish(conn, res, &error);
339 g_variant_get (dbus_result, "(isii)",
346 snprintf(data.plmn, 7, "%s", plmn);
350 if (evt_cb_data->cb_fn) {
351 evt_cb_data->cb_fn(evt_cb_data->handle, result, &data, evt_cb_data->user_data);
355 EXPORT_API int tel_search_network(TapiHandle *handle, tapi_response_cb callback, void *user_data)
357 struct tapi_resp_data *evt_cb_data = NULL;
359 dbg("Func Entrance");
361 MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
363 g_dbus_connection_call(handle->dbus_connection,
364 DBUS_TELEPHONY_SERVICE , handle->path, DBUS_TELEPHONY_NETWORK_INTERFACE,
365 "Search", NULL, NULL,
366 G_DBUS_CALL_FLAGS_NONE, 60000, NULL,
367 on_response_search_network, evt_cb_data);
369 return TAPI_API_SUCCESS;
372 EXPORT_API int tel_get_network_selection_mode(struct tapi_handle *handle, tapi_response_cb callback, void *user_data)
374 struct tapi_resp_data *evt_cb_data = NULL;
376 dbg("Func Entrance");
378 MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
380 g_dbus_connection_call(handle->dbus_connection,
381 DBUS_TELEPHONY_SERVICE , handle->path, DBUS_TELEPHONY_NETWORK_INTERFACE,
382 "GetSelectionMode", NULL, NULL,
383 G_DBUS_CALL_FLAGS_NONE, -1, NULL,
384 on_response_get_network_selection_mode, evt_cb_data);
386 return TAPI_API_SUCCESS;
389 EXPORT_API int tel_select_network_automatic(struct tapi_handle *handle, tapi_response_cb callback, void *user_data)
391 struct tapi_resp_data *evt_cb_data = NULL;
394 dbg("Func Entrance");
396 MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
398 param = g_variant_new("(isi)",
403 g_dbus_connection_call(handle->dbus_connection,
404 DBUS_TELEPHONY_SERVICE , handle->path, DBUS_TELEPHONY_NETWORK_INTERFACE,
405 "SetSelectionMode", param, NULL,
406 G_DBUS_CALL_FLAGS_NONE, -1, NULL,
407 on_response_default_set, evt_cb_data);
409 return TAPI_API_SUCCESS;
412 EXPORT_API int tel_select_network_manual(struct tapi_handle *handle, const char *plmn, int act, tapi_response_cb callback, void *user_data)
414 struct tapi_resp_data *evt_cb_data = NULL;
417 dbg("Func Entrance");
419 MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
421 param = g_variant_new("(isi)",
426 g_dbus_connection_call(handle->dbus_connection,
427 DBUS_TELEPHONY_SERVICE , handle->path, DBUS_TELEPHONY_NETWORK_INTERFACE,
428 "SetSelectionMode", param, NULL,
429 G_DBUS_CALL_FLAGS_NONE, -1, NULL,
430 on_response_default_set, evt_cb_data);
432 return TAPI_API_SUCCESS;
435 EXPORT_API int tel_set_network_preferred_plmn(
437 TelNetworkPreferredPlmnOp_t operation,
438 TelNetworkPreferredPlmnInfo_t *info,
439 tapi_response_cb callback,
442 struct tapi_resp_data *evt_cb_data = NULL;
446 dbg("Func Entrance");
448 MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
450 switch (info->SystemType) {
451 case TAPI_NETWORK_SYSTEM_GSM:
455 case TAPI_NETWORK_SYSTEM_UMTS:
459 case TAPI_NETWORK_SYSTEM_GPRS:
463 case TAPI_NETWORK_SYSTEM_EGPRS:
467 case TAPI_NETWORK_SYSTEM_GSM_AND_UMTS:
476 param = g_variant_new("(iiis)",
482 g_dbus_connection_call(handle->dbus_connection,
483 DBUS_TELEPHONY_SERVICE , handle->path, DBUS_TELEPHONY_NETWORK_INTERFACE,
484 "SetPreferredPlmn", param, NULL,
485 G_DBUS_CALL_FLAGS_NONE, -1, NULL,
486 on_response_default_set, evt_cb_data);
488 return TAPI_API_SUCCESS;
491 EXPORT_API int tel_get_network_preferred_plmn(TapiHandle *handle, tapi_response_cb callback, void *user_data)
493 struct tapi_resp_data *evt_cb_data = NULL;
495 dbg("Func Entrance");
497 MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
499 g_dbus_connection_call(handle->dbus_connection,
500 DBUS_TELEPHONY_SERVICE , handle->path, DBUS_TELEPHONY_NETWORK_INTERFACE,
501 "GetPreferredPlmn", NULL, NULL,
502 G_DBUS_CALL_FLAGS_NONE, -1, NULL,
503 (GAsyncReadyCallback) on_response_get_network_preferred_plmn, evt_cb_data);
505 return TAPI_API_SUCCESS;
508 EXPORT_API int tel_set_network_band(TapiHandle *handle, TelNetworkBandPreferred_t mode, TelNetworkBand_t band, tapi_response_cb callback, void *user_data)
510 struct tapi_resp_data *evt_cb_data = NULL;
513 dbg("Func Entrance");
515 MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
517 param = g_variant_new("(ii)",
521 g_dbus_connection_call(handle->dbus_connection,
522 DBUS_TELEPHONY_SERVICE , handle->path, DBUS_TELEPHONY_NETWORK_INTERFACE,
523 "SetBand", param, NULL,
524 G_DBUS_CALL_FLAGS_NONE, -1, NULL,
525 on_response_default_set, evt_cb_data);
527 return TAPI_API_SUCCESS;
530 EXPORT_API int tel_get_network_band(TapiHandle *handle, tapi_response_cb callback, void *user_data)
532 struct tapi_resp_data *evt_cb_data = NULL;
534 dbg("Func Entrance");
536 MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
538 g_dbus_connection_call(handle->dbus_connection,
539 DBUS_TELEPHONY_SERVICE , handle->path, DBUS_TELEPHONY_NETWORK_INTERFACE,
540 "GetBand", NULL, NULL,
541 G_DBUS_CALL_FLAGS_NONE, -1, NULL,
542 on_response_get_network_band, evt_cb_data);
544 return TAPI_API_SUCCESS;
547 EXPORT_API int tel_set_network_mode(TapiHandle *handle, int mode, tapi_response_cb callback, void *user_data)
549 struct tapi_resp_data *evt_cb_data = NULL;
552 dbg("Func Entrance");
554 MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
556 param = g_variant_new("(i)",
559 g_dbus_connection_call(handle->dbus_connection,
560 DBUS_TELEPHONY_SERVICE , handle->path, DBUS_TELEPHONY_NETWORK_INTERFACE,
561 "SetMode", param, NULL,
562 G_DBUS_CALL_FLAGS_NONE, -1, NULL,
563 on_response_default_set, evt_cb_data);
565 return TAPI_API_SUCCESS;
568 EXPORT_API int tel_get_network_mode(TapiHandle *handle, tapi_response_cb callback, void *user_data)
570 struct tapi_resp_data *evt_cb_data = NULL;
572 dbg("Func Entrance");
574 MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
576 g_dbus_connection_call(handle->dbus_connection,
577 DBUS_TELEPHONY_SERVICE , handle->path, DBUS_TELEPHONY_NETWORK_INTERFACE,
578 "GetMode", NULL, NULL,
579 G_DBUS_CALL_FLAGS_NONE, -1, NULL,
580 on_response_get_network_mode, evt_cb_data);
582 return TAPI_API_SUCCESS;
585 EXPORT_API int tel_set_network_service_domain(TapiHandle *handle, TelNetworkServiceDomain_t domain, tapi_response_cb callback, void *user_data)
587 struct tapi_resp_data *evt_cb_data = NULL;
590 dbg("Func Entrance");
592 MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
594 param = g_variant_new("(i)", domain);
596 g_dbus_connection_call(handle->dbus_connection,
597 DBUS_TELEPHONY_SERVICE , handle->path, DBUS_TELEPHONY_NETWORK_INTERFACE,
598 "SetServiceDomain", param, NULL,
599 G_DBUS_CALL_FLAGS_NONE, -1, NULL,
600 on_response_default_set, evt_cb_data);
602 return TAPI_API_SUCCESS;
605 EXPORT_API int tel_get_network_service_domain(TapiHandle *handle, tapi_response_cb callback, void *user_data)
607 struct tapi_resp_data *evt_cb_data = NULL;
609 dbg("Func Entrance");
611 MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
613 g_dbus_connection_call(handle->dbus_connection,
614 DBUS_TELEPHONY_SERVICE , handle->path, DBUS_TELEPHONY_NETWORK_INTERFACE,
615 "GetServiceDomain", NULL, NULL,
616 G_DBUS_CALL_FLAGS_NONE, -1, NULL,
617 on_response_get_network_service_domain, evt_cb_data);
619 return TAPI_API_SUCCESS;
622 EXPORT_API int tel_cancel_network_manual_search(TapiHandle *handle, tapi_response_cb callback, void *user_data)
624 struct tapi_resp_data *evt_cb_data = NULL;
626 dbg("Func Entrance");
628 MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
630 g_dbus_connection_call(handle->dbus_connection,
631 DBUS_TELEPHONY_SERVICE , handle->path, DBUS_TELEPHONY_NETWORK_INTERFACE,
632 "SearchCancel", NULL, NULL,
633 G_DBUS_CALL_FLAGS_NONE, -1, NULL,
634 on_response_default_set, evt_cb_data);
636 return TAPI_API_SUCCESS;
639 EXPORT_API int tel_get_network_serving(TapiHandle *handle, tapi_response_cb callback, void *user_data)
641 struct tapi_resp_data *evt_cb_data = NULL;
643 dbg("Func Entrance");
645 MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
647 g_dbus_connection_call(handle->dbus_connection,
648 DBUS_TELEPHONY_SERVICE , handle->path, DBUS_TELEPHONY_NETWORK_INTERFACE,
649 "GetServingNetwork", NULL, NULL,
650 G_DBUS_CALL_FLAGS_NONE, -1, NULL,
651 on_response_get_network_serving, evt_cb_data);
653 return TAPI_API_SUCCESS;