2 * tel-plugin-packetservice
4 * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
6 * Contact: DongHoo Park <donghoo.park@samsung.com>
7 * Arun Shukla <arun.shukla@samsung.com>
9 * Licensed under the Apache License, Version 2.0 (the "License");
10 * you may not use this file except in compliance with the License.
11 * You may obtain a copy of the License at
13 * http://www.apache.org/licenses/LICENSE-2.0
15 * Unless required by applicable law or agreed to in writing, software
16 * distributed under the License is distributed on an "AS IS" BASIS,
17 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18 * See the License for the specific language governing permissions and
19 * limitations under the License.
23 #include "ps_common.h"
24 #include "generated-code.h"
26 #include <tzplatform_config.h>
29 #include <user_request.h>
30 #include <core_object.h>
31 #include <co_context.h>
34 #define MODULE_TAG "PS-MODEM"
36 #define PROP_DEFAULT FALSE
37 #define PROP_DEFAULT_STR NULL
38 #define DATABASE_PATH_0 tzplatform_mkpath(TZ_SYS_DB, ".dnet.db")
39 #define DATABASE_PATH_1 tzplatform_mkpath(TZ_SYS_DB, ".dnet2.db")
41 struct ps_thread_data {
46 static void __ps_modem_emit_property_changed_signal(ps_modem_t *modem);
47 static void __ps_modem_emit_service_added_signal(ps_modem_t *modem, gpointer service);
48 /*static void __ps_modem_emit_service_removed_signal(ps_modem_t *modem, gpointer service);*/
49 static void _ps_modem_setup_interface(PacketServiceModem *modem, ps_modem_t *modem_data);
51 static void __ps_modem_create_service(GDBusConnection *conn, TcorePlugin *p,
52 gpointer modem, CoreObject *co_modem);
53 static void __ps_modem_remove_service(ps_modem_t *modem, gpointer service);
54 static void __ps_modem_get_ps_setting_from_storage(ps_modem_t *object);
55 static void __ps_modem_processing_modem_event(gpointer object);
57 static gboolean __ps_modem_set_powered(ps_modem_t *modem, int value);
58 static gboolean __ps_modem_set_sim_complete(ps_modem_t *modem, gboolean value, gchar *operator);
60 static gboolean __ps_modem_thread_finish_cb(gpointer data)
62 struct ps_thread_data *thread_data = data;
68 err("thread_data is NULL !!");
72 modem = thread_data->modem;
74 ps_dbg_ex_co(_ps_modem_ref_co_modem(modem), "Thread %p return is complete", thread_data->selfi);
76 _ps_get_co_modem_values(thread_data->modem);
77 _ps_modem_set_reset_profile(thread_data->modem, FALSE);
78 packet_service_modem_complete_reset_profile(thread_data->modem->if_obj, thread_data->modem->invocation, TRUE);
80 g_thread_join(thread_data->selfi);
81 ps_info_ex_co(_ps_modem_ref_co_modem(modem), "Clean up of thread %p is complete", thread_data->selfi);
82 thread_data->modem->invocation = NULL;
83 _ps_modem_remove_profile_reset_gsource(thread_data->modem);
84 thread_data->modem = NULL;
85 thread_data->selfi = NULL;
88 /* Try to re-connect default contexts after reset profile is complete */
89 g_hash_table_iter_init(&iter, modem->services);
90 while (g_hash_table_iter_next(&iter, &key, &value) == TRUE)
91 _ps_service_connect_default_context(value);
96 static gpointer __ps_modem_regenerate_database(gpointer data)
99 ps_modem_t *modem = data;
100 struct ps_thread_data *thread_data = NULL;
101 gchar *command = NULL;
103 thread_data = g_try_malloc0(sizeof(*thread_data));
105 ps_err_ex_co(_ps_modem_ref_co_modem(modem), "memory alloc is fail !!!");
108 thread_data->modem = modem;
109 thread_data->selfi = g_thread_self();
111 _ps_context_reset_profile_table(modem->cp_name);
112 /* Re-generate global APN database */
113 if (g_str_has_suffix(modem->cp_name, "1"))
114 command = g_strdup_printf("/usr/bin/sqlite3 %s < /usr/share/ps-plugin/dnet_db_init.sql", DATABASE_PATH_1);
116 command = g_strdup_printf("/usr/bin/sqlite3 %s < /usr/share/ps-plugin/dnet_db_init.sql", DATABASE_PATH_0);
117 rv = ps_util_system_command(command);
118 ps_dbg_ex_co(modem->co_modem, "system command sent, rv(%d)", rv);
119 rv = _ps_context_fill_profile_table_from_ini_file(modem->cp_name);
121 if (TRUE == ps_util_thread_dispatch(g_main_context_default(), G_PRIORITY_LOW, (GSourceFunc)__ps_modem_thread_finish_cb, thread_data))
122 ps_info_ex_co(_ps_modem_ref_co_modem(modem), "Thread %p processing is complete", thread_data->selfi);
129 void __remove_modem_handler(gpointer data)
131 ps_modem_t *modem = data;
134 warn("Modem is NULL");
138 ps_info_ex_co(_ps_modem_ref_co_modem(modem), "Entered");
140 #ifdef TIZEN_SUPPORT_REQUEST_HOOK_PDP_CONTROL
141 __ps_modem_cp_reset_send_pending_request_response(modem);
143 /*Need to remove the compelete hash table*/
144 g_hash_table_remove_all(modem->services);
146 /*Need to UNexport and Unref the master Object */
147 g_dbus_interface_skeleton_unexport(G_DBUS_INTERFACE_SKELETON(modem->if_obj));
149 g_object_unref(modem->if_obj);
151 /*Need to free memory allocated for the internal structure*/
152 #ifdef TIZEN_SUPPORT_REQUEST_HOOK_PDP_CONTROL
153 g_queue_free(modem->work_queue);
156 g_free(modem->operator);
157 g_free(modem->cp_name);
159 _ps_modem_remove_profile_reset_gsource(modem);
167 static void __ps_modem_emit_property_changed_signal(ps_modem_t *modem)
170 GVariantBuilder properties;
172 ps_dbg_ex_co(_ps_modem_ref_co_modem(modem), "get modem properties");
174 gv = _ps_modem_get_properties(modem, &properties);
175 packet_service_modem_emit_property_changed(modem->if_obj, gv);
180 static void __ps_modem_emit_service_added_signal(ps_modem_t *modem, gpointer service)
183 GVariantBuilder property;
185 ps_dbg_ex_co(_ps_modem_ref_co_modem(modem), "get service properties");
187 gv = _ps_service_get_properties(service, &property);
188 packet_service_modem_emit_service_added(modem->if_obj, gv);
191 /* blocked may be used later
192 static void __ps_modem_emit_service_removed_signal(ps_modem_t *modem, gpointer service)
194 ps_service_t *psservice = service;
195 packet_service_modem_emit_service_removed(modem->if_obj, psservice->path);
200 static void __ps_modem_create_service(GDBusConnection *conn, TcorePlugin *p,
201 gpointer modem, CoreObject *co_modem)
203 gchar *t_path = NULL;
204 GObject *object = NULL;
206 CoreObject *co_ps = NULL;
207 CoreObject *co_network = NULL;
208 TcorePlugin *target_plg = NULL;
210 target_plg = tcore_object_ref_plugin(co_modem);
211 co_ps = tcore_plugin_ref_core_object(target_plg, CORE_OBJECT_TYPE_PS);
212 co_network = tcore_plugin_ref_core_object(target_plg, CORE_OBJECT_TYPE_NETWORK);
213 if (!co_ps || !co_network)
216 t_path = g_strdup_printf("%s/%s", _ps_modem_ref_path(modem), "umts_ps");
217 if (NULL != g_hash_table_lookup(((ps_modem_t *) modem)->services, t_path)) {
218 ps_dbg_ex_co(co_modem, "service (%s) already exist!!!", t_path);
222 ps_info_ex_co(co_modem, "service path (%s)", t_path);
223 object = _ps_service_create_service(conn, p, modem, co_network, co_ps, t_path);
224 if (object == NULL) {
225 ps_err_ex_co(co_modem, "Failed to create service ");
230 g_hash_table_insert(((ps_modem_t *) modem)->services, g_strdup(t_path), object);
231 ps_dbg_ex_co(co_modem, "service (%p) insert to hash", object);
232 __ps_modem_emit_service_added_signal((ps_modem_t *) modem, object);
238 static void __ps_modem_remove_service(ps_modem_t *modem, gpointer service)
240 ps_service_t *psservice = service;
242 ps_dbg_ex_co(_ps_modem_ref_co_modem(modem), "Entered");
244 /*Unexporting the interface for the modem*/
245 if (psservice->if_obj) {
246 g_dbus_interface_skeleton_unexport(G_DBUS_INTERFACE_SKELETON(psservice->if_obj));
247 g_object_unref(psservice->if_obj);
248 psservice->if_obj = NULL;
251 g_hash_table_remove(modem->services, _ps_service_ref_path(service));
253 ps_info_ex_co(_ps_modem_ref_co_modem(modem), "Successfully removed the service from the modem");
257 static gboolean __ps_modem_set_powered(ps_modem_t *modem, gboolean value)
259 g_return_val_if_fail(modem != NULL, FALSE);
261 if (modem->powered != value) {
262 modem->powered = value;
263 ps_info_ex_co(_ps_modem_ref_co_modem(modem), "modem(%p) powered(%d)", modem, modem->powered);
264 __ps_modem_emit_property_changed_signal(modem);
269 static gboolean __ps_modem_set_sim_complete(ps_modem_t *modem, gboolean value, gchar *operator)
271 g_return_val_if_fail(modem != NULL, FALSE);
273 if (modem->sim_init != value) {
274 /* Update SIM init status */
275 modem->sim_init = value;
276 if (value && operator != NULL && !modem->operator)
277 modem->operator = g_strdup(operator);
278 ps_info_ex_co(_ps_modem_ref_co_modem(modem), "modem [%p] SIM-Init [%s]", modem, (modem->sim_init ? "INITIALIZED" : "UNINITIALIZED"));
280 __ps_modem_emit_property_changed_signal(modem);
286 static gboolean __ps_modem_set_flght_mode(ps_modem_t *modem, gboolean value)
288 g_return_val_if_fail(modem != NULL, FALSE);
290 if (modem->flight_mode != value) {
291 modem->flight_mode = value;
292 ps_info_ex_co(_ps_modem_ref_co_modem(modem), "modem(%p) flight_mode(%d)", modem, modem->flight_mode);
293 __ps_modem_emit_property_changed_signal(modem);
294 __ps_modem_processing_modem_event(modem);
300 static void __ps_modem_get_ps_setting_from_storage(ps_modem_t *object)
302 gboolean key_3g_enable = FALSE, key_roaming_allowed = FALSE;
303 gboolean key_nw_restrict_mode = FALSE;
304 gint key_ps_mode = 0;
305 ps_modem_t *modem = NULL;
306 CoreObject *co_modem;
308 modem = (ps_modem_t *) object;
309 co_modem = _ps_modem_ref_co_modem(modem);
310 key_3g_enable = _ps_master_get_storage_value_bool(modem->p_master, KEY_3G_ENABLE);
311 key_roaming_allowed = _ps_master_get_storage_value_bool(modem->p_master, KEY_DATA_ROAMING_SETTING);
312 key_ps_mode = _ps_master_get_storage_value_int(modem->p_master, KEY_POWER_SAVING_MODE);
313 key_nw_restrict_mode = _ps_master_get_storage_value_bool(modem->p_master, KEY_NETWORK_RESTRICT_MODE);
315 _ps_modem_set_data_allowed(modem, key_3g_enable);
316 _ps_modem_set_data_roaming_allowed(modem, key_roaming_allowed);
318 #if defined(TIZEN_UPS_ENABLED)
319 _ps_modem_set_psmode(modem, key_ps_mode);
321 ps_dbg_ex_co(co_modem, "data allowed(%d) roaming allowed(%d) power saving mode(%d), network restrict mode (%d)",
322 key_3g_enable, key_roaming_allowed, key_ps_mode, key_nw_restrict_mode);
326 static void __ps_modem_processing_modem_event(gpointer object)
328 ps_modem_t *modem = object;
331 #ifdef PREPAID_SIM_APN_SUPPORT
335 g_return_if_fail(modem != NULL);
337 if (!modem->services)
340 g_hash_table_iter_init(&iter, modem->services);
341 while (g_hash_table_iter_next(&iter, &key, &value) == TRUE) {
342 gboolean s_roaming = FALSE;
344 s_roaming = _ps_service_get_roaming(value);
345 _ps_update_cellular_state_key(value);
347 if (modem->powered == PS_MODEM_STATE_OFFLINE) {
348 _ps_service_remove_contexts(value);
349 _ps_free_co_ps_event(value);
350 _ps_free_co_network_event(value);
351 __ps_modem_remove_service(modem, value);
355 if (modem->flight_mode) {
356 _ps_service_disconnect_contexts(value);
358 } else if (!modem->data_allowed || (s_roaming && !modem->roaming_allowed)) {
359 _ps_service_disconnect_internet_mms_tethering_contexts(value);
363 /* only available case */
364 #ifdef PREPAID_SIM_APN_SUPPORT
365 ret = _ps_service_connect_last_connected_context(value);
368 return; /* No need to activate default context */
370 _ps_service_connect_default_context(value);
376 gpointer _ps_modem_create_modem(GDBusConnection *conn, TcorePlugin *p, gpointer master,
377 char *modem_name, gpointer co_modem , gchar *cp_name)
379 PacketServiceModem *modem;
380 ps_modem_t *new_modem;
381 GError *error = NULL;
383 ps_dbg_ex_co(co_modem, "modem object create");
384 g_return_val_if_fail(conn != NULL, NULL);
385 g_return_val_if_fail(master != NULL, NULL);
387 /*creating the master object for the interface com.tcore.ps.modem*/
388 modem = packet_service_modem_skeleton_new();
390 /*Initializing the modem list for internal referencing*/
391 new_modem = g_try_malloc0(sizeof(ps_modem_t));
392 if (NULL == new_modem) {
393 ps_err_ex_co(co_modem, "Unable to allocate memory for modem");
397 #ifdef TIZEN_SUPPORT_REQUEST_HOOK_PDP_CONTROL
398 /*Add work queue to keep user request in case of handling active PDP context*/
399 new_modem->hook_flag = 0x00;
400 new_modem->work_queue = g_queue_new();
401 if (NULL == new_modem->work_queue) {
402 ps_err_ex_co(co_modem, "Unable to get work queue for modem");
407 new_modem->conn = conn;
408 new_modem->p_master = master;
410 new_modem->co_modem = co_modem;
411 new_modem->path = g_strdup(modem_name);
412 new_modem->cp_name = g_strdup(cp_name);
413 new_modem->if_obj = modem;
414 new_modem->services = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, __remove_service_handler);
416 __ps_modem_get_ps_setting_from_storage(new_modem);
417 _ps_hook_co_modem_event(new_modem);
418 _ps_get_co_modem_values(new_modem);
420 /*Setting the interface call backs functions*/
421 _ps_modem_setup_interface(modem, new_modem);
423 /*exporting the interface object to the path mention for modem*/
424 g_dbus_interface_skeleton_export((G_DBUS_INTERFACE_SKELETON(modem)),
429 g_assert_no_error(error);
431 #ifdef TIZEN_SUPPORT_REQUEST_HOOK_PDP_CONTROL
432 /* Adding hooks for special Network Requests */
433 tcore_server_add_request_hook(tcore_plugin_ref_server(p),
435 ps_handle_hook, new_modem);
436 tcore_server_add_request_hook(tcore_plugin_ref_server(p),
437 TREQ_NETWORK_SET_PLMN_SELECTION_MODE,
438 ps_handle_hook, new_modem);
439 tcore_server_add_request_hook(tcore_plugin_ref_server(p),
440 TREQ_NETWORK_SET_MODE,
441 ps_handle_hook, new_modem);
442 tcore_server_add_request_hook(tcore_plugin_ref_server(p),
443 TREQ_NETWORK_SET_CANCEL_MANUAL_SEARCH,
444 ps_handle_hook, new_modem);
445 tcore_server_add_request_hook(tcore_plugin_ref_server(p),
446 TREQ_NETWORK_SET_DEFAULT_DATA_SUBSCRIPTION,
447 ps_handle_hook, new_modem);
448 tcore_server_add_request_hook(tcore_plugin_ref_server(p),
449 TREQ_SIM_SET_POWERSTATE,
450 ps_handle_hook, new_modem);
451 tcore_server_add_request_hook(tcore_plugin_ref_server(p),
452 TREQ_MODEM_SET_FLIGHTMODE,
453 ps_handle_hook, new_modem);
454 tcore_server_add_request_hook(tcore_plugin_ref_server(p),
455 TREQ_MODEM_POWER_OFF,
456 ps_handle_hook, new_modem);
457 tcore_server_add_request_hook(tcore_plugin_ref_server(p),
458 TREQ_MODEM_POWER_LOW,
459 ps_handle_hook, new_modem);
460 tcore_server_add_request_hook(tcore_plugin_ref_server(p),
462 ps_handle_hook, new_modem);
465 ps_info_ex_co(co_modem, "Successfully created the modem");
469 void _ps_modem_destroy_modem(GDBusConnection *conn, gpointer object)
471 ps_modem_t *modem = object;
475 GSList *list_iter = NULL;
477 g_return_if_fail(modem != NULL);
479 if (modem->services == NULL)
482 ps_dbg_ex_co(_ps_modem_ref_co_modem(modem), "Clearing all services");
483 g_hash_table_iter_init(&iter, modem->services);
484 while (g_hash_table_iter_next(&iter, &key, &value) == TRUE) {
485 /* Update Cellular state */
486 _ps_service_set_ps_attached(value, FALSE);
487 _ps_update_cellular_state_key(value);
489 /* Remove contexts */
490 _ps_service_remove_contexts(value);
493 _ps_free_co_ps_event(value);
494 _ps_free_co_network_event(value);
496 /* To avoid hashtable assertion */
497 list = g_slist_append(list, value);
500 for (list_iter = list; list_iter; list_iter = g_slist_next(list_iter)) {
501 /* Remove services */
502 __ps_modem_remove_service(modem, list_iter->data);
505 g_slist_free(modem->contexts);
507 /* Clear modem hooks */
508 _ps_free_co_modem_event(modem);
511 gboolean _ps_modem_processing_flight_mode(gpointer object, gboolean enable)
513 ps_modem_t *modem = object;
515 g_return_val_if_fail(modem != NULL, FALSE);
517 if (modem->flight_mode == enable)
520 __ps_modem_set_flght_mode(modem, enable);
524 gboolean _ps_modem_processing_power_enable(gpointer object, int modem_state)
526 ps_modem_t *modem = object;
528 g_return_val_if_fail(modem != NULL, FALSE);
530 ps_info_ex_co(_ps_modem_ref_co_modem(modem), "modem->powered [%d], Modem->sim_init [%d], modem_state [%d]",
531 modem->powered, modem->sim_init, modem_state);
533 if (modem->powered == modem_state)
536 __ps_modem_set_powered(modem, modem_state);
538 if (modem_state == PS_MODEM_STATE_ONLINE) {
539 __ps_modem_create_service(modem->conn, modem->plg, modem, modem->co_modem);
540 if (modem->sim_init == TRUE && modem->operator != NULL) {
541 GSList *contexts = (GSList*)_ps_modem_ref_contexts(modem);
543 if (contexts != NULL) {
546 ps_warn_ex_co(_ps_modem_ref_co_modem(modem), "contexts exist, SIM init complete before Modem Power On event.");
547 g_hash_table_iter_init(&iter, modem->services);
548 while (g_hash_table_iter_next(&iter, &key, &value) == TRUE) {
549 _ps_service_set_number_of_pdn_cnt(value, modem->operator);
550 _ps_service_ref_contexts(value, contexts, modem->operator);
551 _ps_service_set_attach_apn(value);
555 } else if (modem_state == PS_MODEM_STATE_OFFLINE) {
556 __ps_modem_processing_modem_event(modem);
557 /* SIM init should be set to FALSE during CP silent reset.
558 * and will be updated when SIM initialized complete notification is received.
564 gboolean _ps_modem_processing_sim_complete(gpointer object, gboolean complete, gchar *operator)
566 ps_modem_t *modem = object;
567 CoreObject *co_modem;
568 g_return_val_if_fail(modem != NULL, FALSE);
570 co_modem = _ps_modem_ref_co_modem(modem);
571 ps_dbg_ex_co(co_modem, "Entered: sim_init[%d]", modem->sim_init);
573 if (modem->sim_init == complete && !modem->reset_profile) {
574 ps_dbg_ex_co(co_modem, "No change in SIM state");
577 gboolean different_sim = FALSE;
579 if (operator && (g_strcmp0(modem->operator, operator) != 0)) {
580 ps_info_ex_co(co_modem, "Previous operator: [%s] Present operator: [%s]", modem->operator, operator);
581 g_free(modem->operator);
583 modem->operator = g_strdup(operator);
584 different_sim = TRUE;
588 /* free modem operator */
589 if (FALSE == complete) {
590 g_free(modem->operator);
591 modem->operator = NULL;
594 /* Update SIM state */
595 __ps_modem_set_sim_complete(modem, complete, operator);
596 /* Tizen Telephony makes dummy profile for CDMA by default */
597 _ps_context_create_cdma_profile(modem->operator, modem->cp_name);
599 /* Modem power off notification coming due to which profile are removed */
600 /* and needed to be re inserted in db with sim off notification */
602 * Context table creation
604 * Create context if -
606 * Initialzed SIM is different (if same SIM is re-initialized then need not create context)
607 * Delete context if sim_init = FALSE;
608 * This will be coming when SIM power off or CARD error is received.
610 if (modem->sim_init == TRUE) {
611 if ((different_sim || modem->reset_profile) && (modem->operator != NULL)) {
614 ps_dbg_ex_co(co_modem, "Creating Hash table...");
615 contexts = _ps_context_create_hashtable(object, modem->roaming);
616 if (contexts != NULL) {
620 g_hash_table_iter_init(&iter, modem->services);
621 while (g_hash_table_iter_next(&iter, &key, &value) == TRUE) {
622 _ps_service_set_number_of_pdn_cnt(value, modem->operator);
623 _ps_service_ref_contexts(value, contexts, modem->operator);
624 _ps_service_set_attach_apn(value);
627 ps_err_ex_co(co_modem, "Failed to create HASH table");
635 if (!modem->services)
638 g_hash_table_iter_init(&iter, modem->services);
639 while (g_hash_table_iter_next(&iter, &key, &value) == TRUE) {
640 ps_info_ex_co(co_modem, "Remove contexts on service(%p)", value);
641 _ps_service_remove_contexts(value);
646 ps_dbg_ex_co(_ps_modem_ref_co_modem(modem), "Exiting");
650 gboolean _ps_modem_set_reset_profile(gpointer object, gboolean value)
652 ps_modem_t *modem = object;
654 g_return_val_if_fail(modem != NULL, FALSE);
656 if (modem->reset_profile != value) {
657 modem->reset_profile = value;
658 ps_info_ex_co(_ps_modem_ref_co_modem(modem), "modem(%p) reset_profile(%d)", modem, modem->reset_profile);
664 gboolean _ps_modem_get_reset_profile(gpointer object)
666 ps_modem_t *modem = object;
668 g_return_val_if_fail(modem != NULL, FALSE);
670 ps_info_ex_co(_ps_modem_ref_co_modem(modem), "modem(%p) reset_profile(%d)", modem, modem->reset_profile);
672 return modem->reset_profile;
675 GSource *_ps_modem_get_profile_reset_gsource(gpointer object)
677 ps_modem_t *modem = object;
679 g_return_val_if_fail(modem != NULL, NULL);
681 return modem->reset_profile_gsource;
684 gboolean _ps_modem_set_profile_reset_gsource(gpointer object, GSource *source)
686 ps_modem_t *modem = object;
688 g_return_val_if_fail(modem != NULL, FALSE);
690 modem->reset_profile_gsource = source;
695 gboolean _ps_modem_remove_profile_reset_gsource(gpointer object)
697 ps_modem_t *modem = object;
699 g_return_val_if_fail(modem != NULL, FALSE);
701 if (NULL != modem->reset_profile_gsource) {
702 g_source_unref(modem->reset_profile_gsource);
703 modem->reset_profile_gsource = NULL;
709 gboolean _ps_modem_set_sim_enabled(gpointer object, gboolean value)
711 ps_modem_t *modem = object;
713 g_return_val_if_fail(modem != NULL, FALSE);
715 if (modem->sim_init != value) {
716 modem->sim_init = value;
717 ps_info_ex_co(_ps_modem_ref_co_modem(modem), "modem(%p) sim_enabled(%d)", modem, modem->sim_init);
722 gboolean _ps_modem_connect_default_context(gpointer object)
724 ps_modem_t *modem = object;
728 g_return_val_if_fail(modem != NULL, FALSE);
730 g_hash_table_iter_init(&iter, modem->services);
731 while (g_hash_table_iter_next(&iter, &key, &value) == TRUE)
732 _ps_service_connect_default_context(value);
737 gboolean _ps_modem_set_data_allowed(gpointer object, gboolean value)
739 ps_modem_t *modem = object;
741 g_return_val_if_fail(modem != NULL, FALSE);
743 if (modem->data_allowed != value) {
744 modem->data_allowed = value;
745 ps_info_ex_co(_ps_modem_ref_co_modem(modem), "modem(%p) data allowed(%d)", modem, modem->data_allowed);
746 __ps_modem_emit_property_changed_signal(modem);
747 __ps_modem_processing_modem_event(modem);
753 gboolean _ps_modem_get_data_allowed(gpointer object)
755 ps_modem_t *modem = object;
756 g_return_val_if_fail(modem != NULL, FALSE);
758 return modem->data_allowed;
761 gboolean _ps_modem_set_data_roaming_allowed(gpointer object, gboolean roaming_allowed)
763 ps_modem_t *modem = object;
765 g_return_val_if_fail(modem != NULL, FALSE);
767 if (modem->roaming_allowed != roaming_allowed) {
768 modem->roaming_allowed = roaming_allowed;
769 ps_info_ex_co(_ps_modem_ref_co_modem(modem), "modem(%p) roaming allowed(%d)", modem, modem->roaming_allowed);
770 __ps_modem_emit_property_changed_signal(modem);
772 if (!modem->services)
776 __ps_modem_processing_modem_event(modem);
782 gboolean _ps_modem_set_psmode(gpointer object, gint value)
784 ps_modem_t *modem = object;
786 g_return_val_if_fail(modem != NULL, FALSE);
788 if (modem->ps_mode != value) {
789 modem->ps_mode = value;
790 ps_info_ex_co(_ps_modem_ref_co_modem(modem), "modem(%p) power saving mode(%d)", modem, modem->ps_mode);
796 gboolean _ps_modem_get_roaming(gpointer object)
798 ps_modem_t *modem = object;
799 g_return_val_if_fail(modem != NULL, FALSE);
801 return modem->roaming;
804 void _ps_modem_set_roaming(gpointer object, gboolean value)
806 ps_modem_t *modem = object;
807 g_return_if_fail(modem != NULL);
809 if (modem->roaming != value) {
810 modem->roaming = value;
811 ps_info_ex_co(_ps_modem_ref_co_modem(modem), "modem(%p) roaming(%d)", modem, modem->roaming);
815 gint _ps_modem_get_roaming_apn_support(gpointer object)
817 ps_modem_t *modem = object;
819 g_return_val_if_fail(modem != NULL, FALSE);
821 return modem->roaming_apn_support;
824 void _ps_modem_set_roaming_apn_support(gpointer object, gboolean value)
826 ps_modem_t *modem = object;
827 g_return_if_fail(modem != NULL);
829 if (modem->roaming_apn_support != value) {
830 modem->roaming_apn_support = value;
831 ps_info_ex_co(_ps_modem_ref_co_modem(modem), "modem(%p) roaming_apn_support(%d)", modem, modem->roaming);
835 gint _ps_modem_get_psmode(gpointer object)
837 ps_modem_t *modem = object;
839 g_return_val_if_fail(modem != NULL, FALSE);
841 return modem->ps_mode;
844 #ifdef TIZEN_SUPPORT_REQUEST_HOOK_PDP_CONTROL
845 guchar _ps_modem_get_hook_flag(gpointer object)
847 ps_modem_t *modem = object;
849 g_return_val_if_fail(modem != NULL, FALSE);
851 return modem->hook_flag;
855 gboolean _ps_modem_get_data_roaming_allowed(gpointer object)
857 ps_modem_t *modem = object;
858 g_return_val_if_fail(modem != NULL, FALSE);
860 return modem->roaming_allowed;
863 gboolean _ps_modem_get_flght_mode(gpointer object)
865 ps_modem_t *modem = object;
866 g_return_val_if_fail(modem != NULL, FALSE);
868 return modem->flight_mode;
871 gboolean _ps_modem_get_sim_init(gpointer object)
873 ps_modem_t *modem = object;
874 g_return_val_if_fail(modem != NULL, FALSE);
876 return modem->sim_init;
879 gboolean _ps_modem_get_power(gpointer object)
881 ps_modem_t *modem = object;
882 g_return_val_if_fail(modem != NULL, FALSE);
884 return modem->powered;
887 char *_ps_modem_ref_operator(gpointer object)
889 ps_modem_t *modem = object;
890 g_return_val_if_fail(modem != NULL, FALSE);
892 return modem->operator;
895 ps_subs_type _ps_modem_get_subs_type(gpointer object)
897 ps_modem_t *modem = object;
898 const gchar *cp_name;
900 g_return_val_if_fail(modem != NULL, FALSE);
902 cp_name = modem->cp_name;
903 if (g_str_has_suffix(cp_name, "0"))
904 return PS_SUBS_PRIMARY;
905 else if (g_str_has_suffix(cp_name, "1"))
906 return PS_SUBS_SECONDARY;
907 else if (g_str_has_suffix(cp_name, "2"))
908 return PS_SUBS_TERTIARY;
913 gboolean _ps_modem_get_properties_handler(gpointer object, GVariantBuilder *properties)
915 ps_modem_t *modem = object;
917 g_return_val_if_fail(modem != NULL, FALSE);
918 g_return_val_if_fail(properties != NULL, FALSE);
920 ps_info_ex_co(_ps_modem_ref_co_modem(modem), "get modem properties");
922 g_variant_builder_open(properties, G_VARIANT_TYPE("a{ss}"));
923 g_variant_builder_add(properties, "{ss}", "path", modem->path);
926 g_variant_builder_add(properties, "{ss}", "operator", modem->operator);
927 g_variant_builder_add(properties, "{ss}", "powered", BOOL2STRING(modem->powered));
928 g_variant_builder_add(properties, "{ss}", "sim_init", BOOL2STRING(modem->sim_init));
929 g_variant_builder_add(properties, "{ss}", "flight_mode", BOOL2STRING(modem->flight_mode));
930 g_variant_builder_add(properties, "{ss}", "roaming_allowed", BOOL2STRING(modem->roaming_allowed));
931 g_variant_builder_add(properties, "{ss}", "data_allowed", BOOL2STRING(modem->data_allowed));
932 g_variant_builder_close(properties);
934 ps_dbg_ex_co(_ps_modem_ref_co_modem(modem), "Exiting");
938 GVariant *_ps_modem_get_properties(gpointer object, GVariantBuilder *properties)
940 ps_modem_t *modem = object;
942 g_return_val_if_fail(modem != NULL, FALSE);
943 g_return_val_if_fail(properties != NULL, FALSE);
945 ps_info_ex_co(_ps_modem_ref_co_modem(modem), "get modem properties");
947 g_variant_builder_init(properties, G_VARIANT_TYPE("a{ss}"));
949 g_variant_builder_add(properties, "{ss}", "path", modem->path);
952 g_variant_builder_add(properties, "{ss}", "operator", modem->operator);
953 g_variant_builder_add(properties, "{ss}", "powered", BOOL2STRING(modem->powered));
954 g_variant_builder_add(properties, "{ss}", "sim_init", BOOL2STRING(modem->sim_init));
955 g_variant_builder_add(properties, "{ss}", "flight_mode", BOOL2STRING(modem->flight_mode));
956 g_variant_builder_add(properties, "{ss}", "roaming_allowed", BOOL2STRING(modem->roaming_allowed));
957 g_variant_builder_add(properties, "{ss}", "data_allowed", BOOL2STRING(modem->data_allowed));
959 ps_dbg_ex_co(_ps_modem_ref_co_modem(modem), "Exiting");
960 return g_variant_builder_end(properties);
963 gpointer _ps_modem_ref_master(gpointer object)
965 ps_modem_t *modem = object;
966 g_return_val_if_fail(modem != NULL, NULL);
968 return modem->p_master;
971 GHashTable *_ps_modem_ref_services(gpointer object)
973 ps_modem_t *modem = object;
974 g_return_val_if_fail(modem != NULL, NULL);
976 return modem->services;
979 char *_ps_modem_ref_path(gpointer object)
981 ps_modem_t *modem = object;
982 g_return_val_if_fail(modem != NULL, NULL);
987 gpointer _ps_modem_ref_plugin(gpointer object)
989 ps_modem_t *modem = object;
990 g_return_val_if_fail(modem != NULL, NULL);
995 gpointer _ps_modem_ref_dbusconn(gpointer object)
997 ps_modem_t *modem = object;
998 g_return_val_if_fail(modem != NULL, NULL);
1003 gpointer _ps_modem_ref_co_modem(gpointer object)
1005 ps_modem_t *modem = object;
1006 g_return_val_if_fail(modem != NULL, NULL);
1008 return modem->co_modem;
1011 #ifdef TIZEN_SUPPORT_REQUEST_HOOK_PDP_CONTROL
1012 gpointer _ps_modem_ref_work_queue(gpointer object)
1014 ps_modem_t *modem = object;
1015 g_return_val_if_fail(modem != NULL, NULL);
1017 return modem->work_queue;
1021 gchar *_ps_modem_ref_cp_name(gpointer object)
1023 ps_modem_t *modem = object;
1024 g_return_val_if_fail(modem != NULL, NULL);
1026 return modem->cp_name;
1029 gpointer _ps_modem_ref_contexts(gpointer object)
1031 ps_modem_t *modem = object;
1032 g_return_val_if_fail(modem != NULL, NULL);
1033 return modem->contexts;
1036 static gboolean on_modem_get_properties(PacketServiceModem *obj_modem,
1037 GDBusMethodInvocation *invocation,
1040 GVariant *gv = NULL;
1041 GVariantBuilder properties;
1042 ps_modem_t *modem = user_data;
1043 CoreObject *co_modem = _ps_modem_ref_co_modem(modem);
1045 ps_info_ex_co(co_modem, "get modem properties");
1047 gv = _ps_modem_get_properties(user_data, &properties);
1048 packet_service_modem_complete_get_properties(obj_modem, invocation, gv);
1052 static gboolean on_modem_get_services(PacketServiceModem *obj_modem,
1053 GDBusMethodInvocation *invocation,
1056 GVariantBuilder b_service;
1059 GHashTableIter iter;
1060 gpointer key, value;
1061 ps_modem_t *modem = user_data;
1062 CoreObject *co_modem = _ps_modem_ref_co_modem(modem);
1064 ps_info_ex_co(co_modem, "modem get service interface");
1066 if (modem->services == NULL) {
1067 FAIL_RESPONSE(invocation, PS_ERR_INTERNAL);
1071 g_variant_builder_init(&b_service, G_VARIANT_TYPE("a{sa{ss}}"));
1072 g_hash_table_iter_init(&iter, modem->services);
1073 while (g_hash_table_iter_next(&iter, &key, &value) == TRUE) {
1076 g_variant_builder_open(&b_service, G_VARIANT_TYPE("{sa{ss}}"));
1077 path = _ps_service_ref_path(value);
1078 ps_dbg_ex_co(co_modem, "path added [%s]", path);
1079 g_variant_builder_add(&b_service, "s", g_strdup(path));
1080 if (FALSE == _ps_service_get_properties_handler(value, &b_service)) {
1081 g_variant_builder_close(&b_service);
1082 FAIL_RESPONSE(invocation, PS_ERR_INTERNAL);
1085 g_variant_builder_close(&b_service);
1088 services = g_variant_builder_end(&b_service);
1089 packet_service_modem_complete_get_services(obj_modem, invocation, services);
1093 static gboolean on_modem_go_dormant_all(PacketServiceModem *obj_modem,
1094 GDBusMethodInvocation *invocation,
1099 GHashTableIter iter;
1100 gpointer key, value;
1101 ps_modem_t *modem = user_data;
1102 CoreObject *co_modem = _ps_modem_ref_co_modem(modem);
1104 ps_info_ex_co(co_modem, "modem go dormant all interface");
1106 if (modem->services == NULL) {
1107 FAIL_RESPONSE(invocation, PS_ERR_INTERNAL);
1111 g_hash_table_iter_init(&iter, modem->services);
1112 while (g_hash_table_iter_next(&iter, &key, &value) == TRUE) {
1113 ps_service_t *service = value;
1114 ps_dbg_ex_co(co_modem, "service (%p), send dormant request, ", service);
1115 result = tcore_ps_send_dormant_request(service->co_ps, NULL);
1118 packet_service_modem_complete_go_dormant_all(obj_modem, invocation, result);
1122 static gboolean on_modem_get_profile_list(PacketServiceModem *obj_modem,
1123 GDBusMethodInvocation *invocation,
1126 guint len = 0, index;
1127 gchar **strv = NULL;
1128 GSList *profiles = NULL;
1129 GSList *profiles_temp = NULL;
1130 ps_modem_t *modem = user_data;
1131 CoreObject *co_modem = _ps_modem_ref_co_modem(modem);
1133 ps_info_ex_co(co_modem, "master get the profile list");
1135 if (modem->contexts == NULL) {
1136 ps_err_ex_co(co_modem, "no profiles");
1137 FAIL_RESPONSE(invocation, PS_ERR_NO_PROFILE);
1141 for (index = 0; index < g_slist_length(modem->contexts); index++) {
1142 gchar *s_path = NULL;
1143 gpointer value = g_slist_nth_data(modem->contexts, index);
1145 s_path = _ps_context_ref_path(value);
1146 ps_dbg_ex_co(co_modem, "value(%p), path(%s)", value, s_path);
1148 profiles = g_slist_append(profiles, g_strdup((const char *)s_path));
1151 if (profiles == NULL) {
1152 ps_warn_ex_co(co_modem, "no profiles");
1153 FAIL_RESPONSE(invocation, PS_ERR_NO_PROFILE);
1157 len = g_slist_length(profiles);
1158 strv = g_new(gchar *, len+1);
1162 * - Shouldn't move profiles GSList position directly
1164 for (index = 0; index < len; index++) {
1165 profiles_temp = g_slist_nth(profiles, index);
1166 if(profiles_temp == NULL)
1168 strv[index] = g_strdup(profiles_temp->data);
1171 packet_service_modem_complete_get_profile_list(obj_modem,
1172 invocation, (const gchar *const *)strv);
1175 g_slist_free_full(profiles, g_free);
1176 ps_dbg_ex_co(co_modem, "Exiting");
1180 static gboolean on_modem_add_profile(PacketServiceModem *obj_modem,
1181 GDBusMethodInvocation *invocation,
1185 GVariantIter g_iter;
1189 gboolean rv = FALSE;
1190 gchar *operator = NULL;
1191 ps_modem_t *modem = user_data;
1192 CoreObject *co_modem = _ps_modem_ref_co_modem(modem);
1193 GHashTable *profile_property = NULL;
1195 ps_info_ex_co(co_modem, "add profile request");
1197 operator = _ps_modem_ref_operator(modem);
1200 ps_warn_ex_co(co_modem, "there is no active modem");
1201 FAIL_RESPONSE(invocation, PS_ERR_INTERNAL);
1205 /*Create a hash table for the profile property as all function already use ghash table */
1206 profile_property = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
1207 g_variant_iter_init(&g_iter, property);
1208 while (g_variant_iter_next(&g_iter, "{ss}", &g_key, &g_value)) {
1210 ps_info_ex_co(co_modem, " '%s' value '%s'", g_key, g_value);
1211 g_hash_table_insert(profile_property, g_strdup(g_key), g_strdup(g_value));
1212 /* must free data for ourselves */
1217 rv = _ps_context_add_context(modem, operator, profile_property);
1219 ps_err_ex_co(co_modem, "Failed to add the Profile");
1220 FAIL_RESPONSE(invocation, PS_ERR_INTERNAL);
1221 g_hash_table_destroy(profile_property);
1225 packet_service_modem_complete_add_profile(obj_modem, invocation, TRUE);
1227 g_hash_table_destroy(profile_property);
1228 ps_dbg_ex_co(co_modem, "Exiting");
1232 gboolean _ps_modem_initiate_reset_profile(gpointer value)
1234 CoreObject *co_modem;
1235 ps_modem_t *modem = value;
1236 GHashTableIter iter;
1237 gpointer key, key_value;
1239 g_return_val_if_fail(modem != NULL, FALSE);
1241 co_modem = _ps_modem_ref_co_modem(modem);
1243 ps_dbg_ex_co(co_modem, "Reseting the hash table");
1244 if (modem->powered != PS_MODEM_STATE_ONLINE) {
1246 ps_context_t *pscontext;
1248 count = g_slist_length(modem->contexts);
1249 /* Remove contexts directly as there is no service */
1250 for (index = 0; index < count; index++) {
1251 pscontext = g_slist_nth_data(modem->contexts, index);
1252 ps_warn_ex_co(co_modem, "Remove context(%p)", pscontext);
1253 _ps_context_remove_context(pscontext);
1255 g_slist_free(modem->contexts);
1256 modem->contexts = NULL;
1258 g_hash_table_iter_init(&iter, modem->services);
1259 while (g_hash_table_iter_next(&iter, &key, &value) == TRUE) {
1260 ps_service_t *service;
1261 service = (ps_service_t *)value;
1262 ps_warn_ex_co(co_modem, "Remove contexts on service(%p)", value);
1263 g_slist_free(service->contexts);
1264 service->contexts = NULL;
1267 /* Remove contexts through only service. */
1268 g_hash_table_iter_init(&iter, modem->services);
1269 while (g_hash_table_iter_next(&iter, &key, &value) == TRUE) {
1270 ps_warn_ex_co(co_modem, "Remove contexts on service(%p)", value);
1271 _ps_service_remove_contexts(value);
1275 if (modem->type == 0) {
1277 gchar *name = g_strdup_printf("REGEN-DB-%s", modem->cp_name);
1279 thread = g_thread_new(name, __ps_modem_regenerate_database, modem);
1281 if (thread == NULL) {
1282 ps_err_ex_co(co_modem, "Thread is not created");
1283 FAIL_RESPONSE(modem->invocation , PS_ERR_INTERNAL);
1284 _ps_modem_remove_profile_reset_gsource(modem);
1286 ps_dbg_ex_co(co_modem, "Thread(%p) is created", thread);
1291 /* Create contexts again. */
1292 _ps_get_co_modem_values(modem);
1293 _ps_modem_set_reset_profile(modem, FALSE);
1294 packet_service_modem_complete_reset_profile(modem->if_obj, modem->invocation, TRUE);
1295 modem->invocation = NULL;
1297 _ps_modem_remove_profile_reset_gsource(modem);
1299 /* Try to re-connect default contexts after reset profile is complete */
1300 g_hash_table_iter_init(&iter, modem->services);
1301 while (g_hash_table_iter_next(&iter, &key, &key_value) == TRUE) {
1302 /* only available case */
1303 _ps_service_connect_default_context(key_value);
1306 ps_dbg_ex_co(co_modem, "Exiting");
1310 static gboolean on_modem_reset_profile(PacketServiceModem *obj_modem,
1311 GDBusMethodInvocation *invocation,
1316 gboolean contexts_active;
1317 ps_modem_t *modem = user_data;
1318 CoreObject *co_modem = _ps_modem_ref_co_modem(modem);
1322 ps_info_ex_co(co_modem, "reset profile request type(%d)", type);
1324 if (_ps_modem_get_reset_profile(modem) == TRUE) {
1325 ps_err_ex_co(co_modem, "Reset Profile is already in Progress");
1326 packet_service_modem_complete_reset_profile(obj_modem, invocation, FALSE);
1327 ps_dbg_ex_co(co_modem, "Exiting");
1331 _ps_modem_set_reset_profile(modem, TRUE);
1333 co_ps = tcore_plugin_ref_core_object(tcore_object_ref_plugin(_ps_modem_ref_co_modem(modem)),
1334 CORE_OBJECT_TYPE_PS);
1336 modem->invocation = invocation;
1339 contexts_active = tcore_ps_any_context_activating_activated(co_ps, &state);
1341 if (contexts_active == TRUE) {
1342 ps_info_ex_co(co_modem, "Contexts are in [%d] state", state);
1343 if (state == CONTEXT_STATE_ACTIVATED) {
1344 ps_dbg_ex_co(co_modem, "Contexts are in Actived state. Sending Diconnect Notification to all connected contexts");
1345 rv = tcore_ps_deactivate_contexts(co_ps);
1346 if (rv != TCORE_RETURN_SUCCESS)
1347 ps_err_ex_co(co_modem, "fail to deactivation");
1348 } else if (state == CONTEXT_STATE_ACTIVATING) {
1349 ps_dbg_ex_co(co_modem, "Contexts are in Activating state. Wait for them to connect");
1352 ps_info_ex_co(co_modem, "No contexts are in activating or activated state. Profiles reset is being initiated");
1353 _ps_modem_initiate_reset_profile(modem);
1360 static void _ps_modem_setup_interface(PacketServiceModem *modem, ps_modem_t *modem_data)
1362 ps_dbg_ex_co(_ps_modem_ref_co_modem(modem_data), "Entered");
1364 g_signal_connect(modem,
1365 "handle-get-properties",
1366 G_CALLBACK(on_modem_get_properties),
1369 g_signal_connect(modem,
1370 "handle-get-services",
1371 G_CALLBACK(on_modem_get_services),
1374 g_signal_connect(modem,
1375 "handle-go-dormant-all",
1376 G_CALLBACK(on_modem_go_dormant_all),
1379 g_signal_connect(modem,
1380 "handle-get-profile-list",
1381 G_CALLBACK(on_modem_get_profile_list),
1384 g_signal_connect(modem,
1385 "handle-add-profile",
1386 G_CALLBACK(on_modem_add_profile),
1389 g_signal_connect(modem,
1390 "handle-reset-profile",
1391 G_CALLBACK(on_modem_reset_profile),