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 PROP_DEFAULT FALSE
35 #define PROP_DEFAULT_STR NULL
36 #define DATABASE_PATH_0 tzplatform_mkpath(TZ_SYS_DB, ".dnet.db")
37 #define DATABASE_PATH_1 tzplatform_mkpath(TZ_SYS_DB, ".dnet2.db")
39 struct ps_thread_data {
44 static void __ps_modem_emit_property_changed_signal(ps_modem_t *modem);
45 static void __ps_modem_emit_service_added_signal(ps_modem_t *modem, gpointer service);
46 /*static void __ps_modem_emit_service_removed_signal(ps_modem_t *modem, gpointer service);*/
47 static void _ps_modem_setup_interface(PacketServiceModem *modem, ps_modem_t *modem_data);
49 static void __ps_modem_create_service(GDBusConnection *conn, TcorePlugin *p,
50 gpointer modem, CoreObject *co_modem);
51 static void __ps_modem_remove_service(ps_modem_t *modem, gpointer service);
52 static void __ps_modem_get_ps_setting_from_storage(ps_modem_t *object);
53 static void __ps_modem_processing_modem_event(gpointer object);
55 static gboolean __ps_modem_set_powered(ps_modem_t *modem, int value);
56 static gboolean __ps_modem_set_sim_complete(ps_modem_t *modem, gboolean value, gchar *operator);
58 static gboolean __ps_modem_thread_finish_cb(gpointer data)
60 struct ps_thread_data *thread_data = data;
66 err("thread_data is NULL !!");
70 modem = thread_data->modem;
72 dbg("Thread %p return is complete", thread_data->selfi);
74 _ps_get_co_modem_values(thread_data->modem);
75 _ps_modem_set_reset_profile(thread_data->modem, FALSE);
76 packet_service_modem_complete_reset_profile(thread_data->modem->if_obj, thread_data->modem->invocation, TRUE);
78 g_thread_join(thread_data->selfi);
79 dbg("Clean up of thread %p is complete", thread_data->selfi);
80 thread_data->modem->invocation = NULL;
81 _ps_modem_remove_profile_reset_gsource(thread_data->modem);
82 thread_data->modem = NULL;
83 thread_data->selfi = NULL;
86 /* Try to re-connect default contexts after reset profile is complete */
87 g_hash_table_iter_init(&iter, modem->services);
88 while (g_hash_table_iter_next(&iter, &key, &value) == TRUE)
89 _ps_service_connect_default_context(value);
94 static gpointer __ps_modem_regenerate_database(gpointer data)
97 ps_modem_t *modem = data;
98 struct ps_thread_data *thread_data = NULL;
99 gchar *command = NULL;
101 thread_data = g_try_malloc0(sizeof(*thread_data));
103 err("mamory alloc is fail !!!");
106 thread_data->modem = modem;
107 thread_data->selfi = g_thread_self();
109 _ps_context_reset_profile_table(modem->cp_name);
110 /* Re-generate global APN database */
111 if (g_str_has_suffix(modem->cp_name, "1"))
112 command = g_strdup_printf("/usr/bin/sqlite3 %s < /usr/share/ps-plugin/dnet_db_init.sql", DATABASE_PATH_1);
114 command = g_strdup_printf("/usr/bin/sqlite3 %s < /usr/share/ps-plugin/dnet_db_init.sql", DATABASE_PATH_0);
115 rv = ps_util_system_command(command);
116 ps_dbg_ex_co(modem->co_modem, "system command sent, rv(%d)", rv);
117 rv = _ps_context_fill_profile_table_from_ini_file(modem->cp_name);
119 if (TRUE == ps_util_thread_dispatch(g_main_context_default(), G_PRIORITY_LOW, (GSourceFunc)__ps_modem_thread_finish_cb, thread_data))
120 dbg("Thread %p processing is complete", thread_data->selfi);
127 void __remove_modem_handler(gpointer data)
129 ps_modem_t *modem = data;
131 ps_dbg_ex_co(_ps_modem_ref_co_modem(modem), "Entered");
133 dbg("Modem is NULL");
137 __ps_modem_cp_reset_send_pending_request_response(modem);
139 /*Need to remove the compelete hash table*/
140 g_hash_table_remove_all(modem->services);
142 /*Need to UNexport and Unref the master Object */
143 g_dbus_interface_skeleton_unexport(G_DBUS_INTERFACE_SKELETON(modem->if_obj));
145 g_object_unref(modem->if_obj);
147 /*Need to free memory allocated for the internal structure*/
148 g_queue_free(modem->work_queue);
150 g_free(modem->operator);
151 g_free(modem->cp_name);
153 _ps_modem_remove_profile_reset_gsource(modem);
161 static void __ps_modem_emit_property_changed_signal(ps_modem_t *modem)
164 GVariantBuilder properties;
166 ps_dbg_ex_co(_ps_modem_ref_co_modem(modem), "get modem properties");
168 gv = _ps_modem_get_properties(modem, &properties);
169 packet_service_modem_emit_property_changed(modem->if_obj, gv);
174 static void __ps_modem_emit_service_added_signal(ps_modem_t *modem, gpointer service)
177 GVariantBuilder property;
179 ps_dbg_ex_co(_ps_modem_ref_co_modem(modem), "get service properties");
181 gv = _ps_service_get_properties(service, &property);
182 packet_service_modem_emit_service_added(modem->if_obj, gv);
185 /* blocked may be used later
186 static void __ps_modem_emit_service_removed_signal(ps_modem_t *modem, gpointer service)
188 ps_service_t *psservice = service;
189 packet_service_modem_emit_service_removed(modem->if_obj, psservice->path);
194 static void __ps_modem_create_service(GDBusConnection *conn, TcorePlugin *p,
195 gpointer modem, CoreObject *co_modem)
197 gchar *t_path = NULL;
198 GObject *object = NULL;
200 CoreObject *co_ps = NULL;
201 CoreObject *co_network = NULL;
202 TcorePlugin *target_plg = NULL;
204 target_plg = tcore_object_ref_plugin(co_modem);
205 co_ps = tcore_plugin_ref_core_object(target_plg, CORE_OBJECT_TYPE_PS);
206 co_network = tcore_plugin_ref_core_object(target_plg, CORE_OBJECT_TYPE_NETWORK);
207 if (!co_ps || !co_network)
210 t_path = g_strdup_printf("%s/%s", _ps_modem_ref_path(modem), "umts_ps");
211 if (NULL != g_hash_table_lookup(((ps_modem_t *) modem)->services, t_path)) {
212 ps_dbg_ex_co(co_modem, "service (%s) already exist!!!", t_path);
216 ps_dbg_ex_co(co_modem, "service path (%s)", t_path);
217 object = _ps_service_create_service(conn, p, modem, co_network, co_ps, t_path);
218 if (object == NULL) {
219 ps_err_ex_co(co_modem, "Failed to create service ");
224 g_hash_table_insert(((ps_modem_t *) modem)->services, g_strdup(t_path), object);
225 ps_dbg_ex_co(co_modem, "service (%p) insert to hash", object);
226 __ps_modem_emit_service_added_signal((ps_modem_t *) modem, object);
232 static void __ps_modem_remove_service(ps_modem_t *modem, gpointer service)
234 ps_service_t *psservice = service;
236 ps_dbg_ex_co(_ps_modem_ref_co_modem(modem), "Entered");
238 /*Unexporting the interface for the modem*/
239 if (psservice->if_obj) {
240 g_dbus_interface_skeleton_unexport(G_DBUS_INTERFACE_SKELETON(psservice->if_obj));
241 g_object_unref(psservice->if_obj);
242 psservice->if_obj = NULL;
245 g_hash_table_remove(modem->services, _ps_service_ref_path(service));
247 dbg("Successfully removed the service from the modem");
251 static gboolean __ps_modem_set_powered(ps_modem_t *modem, gboolean value)
253 g_return_val_if_fail(modem != NULL, FALSE);
255 modem->powered = value;
256 ps_dbg_ex_co(_ps_modem_ref_co_modem(modem), "modem(%p) powered(%d)", modem, modem->powered);
257 __ps_modem_emit_property_changed_signal(modem);
261 static gboolean __ps_modem_set_sim_complete(ps_modem_t *modem, gboolean value, gchar *operator)
263 g_return_val_if_fail(modem != NULL, FALSE);
265 /* Update SIM init status */
266 modem->sim_init = value;
267 if (value && operator != NULL && !modem->operator)
268 modem->operator = g_strdup(operator);
269 ps_dbg_ex_co(_ps_modem_ref_co_modem(modem), "modem [%p] SIM-Init [%s]", modem, (modem->sim_init ? "INITIALIZED" : "UNINITIALIZED"));
271 __ps_modem_emit_property_changed_signal(modem);
276 static gboolean __ps_modem_set_flght_mode(ps_modem_t *modem, gboolean value)
278 g_return_val_if_fail(modem != NULL, FALSE);
280 modem->flight_mode = value;
281 ps_dbg_ex_co(_ps_modem_ref_co_modem(modem), "modem(%p) flight_mode(%d)", modem, modem->flight_mode);
282 __ps_modem_emit_property_changed_signal(modem);
283 __ps_modem_processing_modem_event(modem);
288 static void __ps_modem_get_ps_setting_from_storage(ps_modem_t *object)
290 gboolean key_3g_enable = FALSE, key_roaming_allowed = FALSE;
291 gboolean key_nw_restrict_mode = FALSE;
292 gint key_ps_mode = 0;
293 ps_modem_t *modem = NULL;
294 CoreObject *co_modem;
295 #if defined(TIZEN_UPS_ENABLED)
296 struct treq_modem_set_flightmode data = {0};
299 modem = (ps_modem_t *) object;
300 co_modem = _ps_modem_ref_co_modem(modem);
301 key_3g_enable = _ps_master_get_storage_value_bool(modem->p_master, KEY_3G_ENABLE);
302 key_roaming_allowed = _ps_master_get_storage_value_bool(modem->p_master, KEY_DATA_ROAMING_SETTING);
303 key_ps_mode = _ps_master_get_storage_value_int(modem->p_master, KEY_POWER_SAVING_MODE);
304 key_nw_restrict_mode = _ps_master_get_storage_value_bool(modem->p_master, KEY_NETWORK_RESTRICT_MODE);
306 _ps_modem_set_data_allowed(modem, key_3g_enable);
307 _ps_modem_set_data_roaming_allowed(modem, key_roaming_allowed);
309 #if defined(TIZEN_UPS_ENABLED)
310 _ps_modem_set_psmode(modem, key_ps_mode);
311 if (key_ps_mode == POWER_SAVING_MODE_NORMAL) {
312 dbg("set flight mode off");
314 } else if (key_ps_mode == POWER_SAVING_MODE_WEARABLE) {
315 dbg("set flight mode on");
318 err("Not supported");
321 _ps_modem_send_filght_mode_request(modem, &data);
324 ps_dbg_ex_co(co_modem, "data allowed(%d) roaming allowed(%d) power saving mode(%d), network restrict mode (%d)",
325 key_3g_enable, key_roaming_allowed, key_ps_mode, key_nw_restrict_mode);
329 static void __ps_modem_processing_modem_event(gpointer object)
331 ps_modem_t *modem = object;
334 #ifdef PREPAID_SIM_APN_SUPPORT
338 g_return_if_fail(modem != NULL);
340 if (!modem->services)
343 g_hash_table_iter_init(&iter, modem->services);
344 while (g_hash_table_iter_next(&iter, &key, &value) == TRUE) {
345 gboolean s_roaming = FALSE;
347 s_roaming = _ps_service_get_roaming(value);
348 _ps_update_cellular_state_key(value);
350 if (modem->powered == PS_MODEM_STATE_OFFLINE) {
351 _ps_service_remove_contexts(value);
352 _ps_free_co_ps_event(value);
353 _ps_free_co_network_event(value);
354 __ps_modem_remove_service(modem, value);
358 if (modem->flight_mode || (s_roaming && !modem->roaming_allowed)) {
359 _ps_service_disconnect_contexts(value);
361 } else if (!modem->data_allowed) {
362 _ps_service_disconnect_internet_mms_contexts(value);
366 /* only available case */
367 #ifdef PREPAID_SIM_APN_SUPPORT
368 ret = _ps_service_connect_last_connected_context(value);
371 return; /* No need to activate default context */
373 _ps_service_connect_default_context(value);
379 gpointer _ps_modem_create_modem(GDBusConnection *conn, TcorePlugin *p, gpointer master,
380 char *modem_name, gpointer co_modem , gchar *cp_name)
382 PacketServiceModem *modem;
383 ps_modem_t *new_modem;
384 GError *error = NULL;
386 ps_dbg_ex_co(co_modem, "modem object create");
387 g_return_val_if_fail(conn != NULL, NULL);
388 g_return_val_if_fail(master != NULL, NULL);
390 /*creating the master object for the interface com.tcore.ps.modem*/
391 modem = packet_service_modem_skeleton_new();
393 /*Initializing the modem list for internal referencing*/
394 new_modem = g_try_malloc0(sizeof(ps_modem_t));
395 if (NULL == new_modem) {
396 ps_err_ex_co(co_modem, "Unable to allocate memory for modem");
400 /*Add work queue to keep user request in case of handling active PDP context*/
401 new_modem->hook_flag = 0x00;
402 new_modem->work_queue = g_queue_new();
403 if (NULL == new_modem->work_queue) {
404 ps_err_ex_co(co_modem, "Unable to get work queue for modem");
409 new_modem->conn = conn;
410 new_modem->p_master = master;
412 new_modem->co_modem = co_modem;
413 new_modem->path = g_strdup(modem_name);
414 new_modem->cp_name = g_strdup(cp_name);
415 new_modem->if_obj = modem;
416 new_modem->services = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, __remove_service_handler);
418 __ps_modem_get_ps_setting_from_storage(new_modem);
419 _ps_hook_co_modem_event(new_modem);
420 _ps_get_co_modem_values(new_modem);
422 /*Setting the interface call backs functions*/
423 _ps_modem_setup_interface(modem, new_modem);
425 /*exporting the interface object to the path mention for modem*/
426 g_dbus_interface_skeleton_export((G_DBUS_INTERFACE_SKELETON(modem)),
431 g_assert_no_error(error);
433 /* Adding hooks for special Network Requests */
434 tcore_server_add_request_hook(tcore_plugin_ref_server(p),
436 ps_handle_hook, new_modem);
437 tcore_server_add_request_hook(tcore_plugin_ref_server(p),
438 TREQ_NETWORK_SET_PLMN_SELECTION_MODE,
439 ps_handle_hook, new_modem);
440 tcore_server_add_request_hook(tcore_plugin_ref_server(p),
441 TREQ_NETWORK_SET_MODE,
442 ps_handle_hook, new_modem);
443 tcore_server_add_request_hook(tcore_plugin_ref_server(p),
444 TREQ_NETWORK_SET_CANCEL_MANUAL_SEARCH,
445 ps_handle_hook, new_modem);
446 tcore_server_add_request_hook(tcore_plugin_ref_server(p),
447 TREQ_NETWORK_SET_DEFAULT_DATA_SUBSCRIPTION,
448 ps_handle_hook, new_modem);
449 tcore_server_add_request_hook(tcore_plugin_ref_server(p),
450 TREQ_SIM_SET_POWERSTATE,
451 ps_handle_hook, new_modem);
452 tcore_server_add_request_hook(tcore_plugin_ref_server(p),
453 TREQ_MODEM_SET_FLIGHTMODE,
454 ps_handle_hook, new_modem);
455 tcore_server_add_request_hook(tcore_plugin_ref_server(p),
456 TREQ_MODEM_POWER_OFF,
457 ps_handle_hook, new_modem);
458 tcore_server_add_request_hook(tcore_plugin_ref_server(p),
459 TREQ_MODEM_POWER_LOW,
460 ps_handle_hook, new_modem);
461 tcore_server_add_request_hook(tcore_plugin_ref_server(p),
463 ps_handle_hook, new_modem);
465 ps_err_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 dbg("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_send_filght_mode_request(gpointer value, void *data)
513 CoreObject *co_modem = NULL, *co_ps = NULL;
514 UserRequest *ur = NULL;
515 ps_modem_t *modem = value;
518 co_modem = _ps_modem_ref_co_modem(modem);
519 co_ps = tcore_plugin_ref_core_object(tcore_object_ref_plugin(co_modem), CORE_OBJECT_TYPE_PS);
520 /* deactivate contexts first. */
521 rv = tcore_ps_deactivate_contexts(co_ps);
522 if (rv != TCORE_RETURN_SUCCESS)
523 ps_dbg_ex_co(co_ps, "fail to deactivation");
525 tcore_ps_set_online(co_ps, FALSE);
527 ur = tcore_user_request_new(NULL, NULL);
528 tcore_user_request_set_data(ur, sizeof(struct treq_modem_set_flightmode), data);
529 tcore_user_request_set_command(ur, TREQ_MODEM_SET_FLIGHTMODE);
530 if (TCORE_RETURN_SUCCESS != tcore_object_dispatch_request(co_modem, ur)) {
531 err("fail to send user request");
532 tcore_user_request_unref(ur);
538 gboolean _ps_modem_processing_flight_mode(gpointer object, gboolean enable)
540 ps_modem_t *modem = object;
542 g_return_val_if_fail(modem != NULL, FALSE);
544 if (modem->flight_mode == enable)
547 __ps_modem_set_flght_mode(modem, enable);
551 gboolean _ps_modem_processing_power_enable(gpointer object, int modem_state)
553 ps_modem_t *modem = object;
555 g_return_val_if_fail(modem != NULL, FALSE);
557 dbg("modem->powered [%d], Modem->sim_init [%d], modem_state [%d]",
558 modem->powered, modem->sim_init, modem_state);
560 if (modem->powered == modem_state)
563 __ps_modem_set_powered(modem, modem_state);
565 if (modem_state == PS_MODEM_STATE_ONLINE) {
566 __ps_modem_create_service(modem->conn, modem->plg, modem, modem->co_modem);
567 if (modem->sim_init == TRUE && modem->operator != NULL) {
568 GSList *contexts = (GSList*)_ps_modem_ref_contexts(modem);
570 if (contexts != NULL) {
573 warn("[WARN] contexts exist, SIM init complete before Modem Power On event.");
574 g_hash_table_iter_init(&iter, modem->services);
575 while (g_hash_table_iter_next(&iter, &key, &value) == TRUE) {
576 _ps_service_set_number_of_pdn_cnt(value, modem->operator);
577 _ps_service_ref_contexts(value, contexts, modem->operator);
578 _ps_service_set_attach_apn(value);
582 } else if (modem_state == PS_MODEM_STATE_OFFLINE) {
583 __ps_modem_processing_modem_event(modem);
584 /* SIM init should be set to FALSE during CP silent reset.
585 * and will be updated when SIM initialized complete notification is received.
591 gboolean _ps_modem_processing_sim_complete(gpointer object, gboolean complete, gchar *operator)
593 ps_modem_t *modem = object;
594 CoreObject *co_modem;
595 g_return_val_if_fail(modem != NULL, FALSE);
597 co_modem = _ps_modem_ref_co_modem(modem);
598 ps_dbg_ex_co(co_modem, "Entered: sim_init[%d]", modem->sim_init);
600 if (modem->sim_init == complete && !modem->reset_profile) {
601 ps_dbg_ex_co(co_modem, "No change in SIM state");
604 gboolean different_sim = FALSE;
606 if (operator && (g_strcmp0(modem->operator, operator) != 0)) {
607 ps_dbg_ex_co(co_modem, "Previous operator: [%s] Present operator: [%s]", modem->operator, operator);
608 g_free(modem->operator);
610 modem->operator = g_strdup(operator);
611 different_sim = TRUE;
615 /* free modem operator */
616 if (FALSE == complete) {
617 g_free(modem->operator);
618 modem->operator = NULL;
621 /* Update SIM state */
622 __ps_modem_set_sim_complete(modem, complete, operator);
623 /* Tizen Telephony makes dummy profile for CDMA by default */
624 _ps_context_create_cdma_profile(modem->operator, modem->cp_name);
626 /* Modem power off notification coming due to which profile are removed */
627 /* and needed to be re inserted in db with sim off notification */
629 * Context table creation
631 * Create context if -
633 * Initialzed SIM is different (if same SIM is re-initialized then need not create context)
634 * Delete context if sim_init = FALSE;
635 * This will be coming when SIM power off or CARD error is received.
637 if (modem->sim_init == TRUE) {
638 if ((different_sim || modem->reset_profile) && (modem->operator != NULL)) {
641 ps_dbg_ex_co(co_modem, "Creating Hash table...");
642 contexts = _ps_context_create_hashtable(object, modem->roaming);
643 if (contexts != NULL) {
647 g_hash_table_iter_init(&iter, modem->services);
648 while (g_hash_table_iter_next(&iter, &key, &value) == TRUE) {
649 _ps_service_set_number_of_pdn_cnt(value, modem->operator);
650 _ps_service_ref_contexts(value, contexts, modem->operator);
651 _ps_service_set_attach_apn(value);
654 ps_dbg_ex_co(co_modem, "Failed to create HASH table");
662 if (!modem->services)
665 g_hash_table_iter_init(&iter, modem->services);
666 while (g_hash_table_iter_next(&iter, &key, &value) == TRUE) {
667 ps_dbg_ex_co(co_modem, "Remove contexts on service(%p)", value);
668 _ps_service_remove_contexts(value);
677 gboolean _ps_modem_set_reset_profile(gpointer object, gboolean value)
679 ps_modem_t *modem = object;
681 g_return_val_if_fail(modem != NULL, FALSE);
683 modem->reset_profile = value;
684 dbg("modem(%p) reset_profile(%d)", modem, modem->reset_profile);
688 gboolean _ps_modem_get_reset_profile(gpointer object)
690 ps_modem_t *modem = object;
692 g_return_val_if_fail(modem != NULL, FALSE);
694 dbg("modem(%p) reset_profile(%d)", modem, modem->reset_profile);
696 return modem->reset_profile;
699 GSource *_ps_modem_get_profile_reset_gsource(gpointer object)
701 ps_modem_t *modem = object;
703 g_return_val_if_fail(modem != NULL, NULL);
705 return modem->reset_profile_gsource;
708 gboolean _ps_modem_set_profile_reset_gsource(gpointer object, GSource *source)
710 ps_modem_t *modem = object;
712 g_return_val_if_fail(modem != NULL, FALSE);
714 modem->reset_profile_gsource = source;
719 gboolean _ps_modem_remove_profile_reset_gsource(gpointer object)
721 ps_modem_t *modem = object;
723 g_return_val_if_fail(modem != NULL, FALSE);
725 if (NULL != modem->reset_profile_gsource) {
726 g_source_unref(modem->reset_profile_gsource);
727 modem->reset_profile_gsource = NULL;
733 gboolean _ps_modem_set_sim_enabled(gpointer object, gboolean value)
735 ps_modem_t *modem = object;
737 g_return_val_if_fail(modem != NULL, FALSE);
739 modem->sim_init = value;
740 ps_dbg_ex_co(_ps_modem_ref_co_modem(modem), "modem(%p) sim_enabled(%d)", modem, modem->sim_init);
744 gboolean _ps_modem_set_data_allowed(gpointer object, gboolean value)
746 ps_modem_t *modem = object;
748 g_return_val_if_fail(modem != NULL, FALSE);
750 modem->data_allowed = value;
751 ps_dbg_ex_co(_ps_modem_ref_co_modem(modem), "modem(%p) data allowed(%d)", modem, modem->data_allowed);
752 __ps_modem_emit_property_changed_signal(modem);
753 __ps_modem_processing_modem_event(modem);
758 gboolean _ps_modem_get_data_allowed(gpointer object)
760 ps_modem_t *modem = object;
761 g_return_val_if_fail(modem != NULL, FALSE);
763 return modem->data_allowed;
766 gboolean _ps_modem_set_data_roaming_allowed(gpointer object, gboolean roaming_allowed)
768 ps_modem_t *modem = object;
770 g_return_val_if_fail(modem != NULL, FALSE);
772 modem->roaming_allowed = roaming_allowed;
773 ps_dbg_ex_co(_ps_modem_ref_co_modem(modem), "modem(%p) roaming allowed(%d)", modem, modem->roaming_allowed);
774 __ps_modem_emit_property_changed_signal(modem);
776 if (!modem->services)
780 __ps_modem_processing_modem_event(modem);
785 gboolean _ps_modem_set_psmode(gpointer object, gint value)
787 ps_modem_t *modem = object;
789 g_return_val_if_fail(modem != NULL, FALSE);
791 modem->ps_mode = value;
792 ps_dbg_ex_co(_ps_modem_ref_co_modem(modem), "modem(%p) power saving mode(%d)", modem, modem->ps_mode);
797 gboolean _ps_modem_get_roaming(gpointer object)
799 ps_modem_t *modem = object;
800 g_return_val_if_fail(modem != NULL, FALSE);
802 return modem->roaming;
805 void _ps_modem_set_roaming(gpointer object, gboolean value)
807 ps_modem_t *modem = object;
808 g_return_if_fail(modem != NULL);
810 modem->roaming = value;
811 ps_dbg_ex_co(_ps_modem_ref_co_modem(modem), "modem(%p) roaming(%d)", modem, modem->roaming);
816 gint _ps_modem_get_roaming_apn_support(gpointer object)
818 ps_modem_t *modem = object;
820 g_return_val_if_fail(modem != NULL, FALSE);
822 return modem->roaming_apn_support;
825 void _ps_modem_set_roaming_apn_support(gpointer object, gboolean value)
827 ps_modem_t *modem = object;
828 g_return_if_fail(modem != NULL);
830 modem->roaming_apn_support = value;
831 ps_dbg_ex_co(_ps_modem_ref_co_modem(modem), "modem(%p) roaming_apn_support(%d)", modem, modem->roaming);
834 gint _ps_modem_get_psmode(gpointer object)
836 ps_modem_t *modem = object;
838 g_return_val_if_fail(modem != NULL, FALSE);
840 return modem->ps_mode;
843 guchar _ps_modem_get_hook_flag(gpointer object)
845 ps_modem_t *modem = object;
847 g_return_val_if_fail(modem != NULL, FALSE);
849 return modem->hook_flag;
852 gboolean _ps_modem_get_data_roaming_allowed(gpointer object)
854 ps_modem_t *modem = object;
855 g_return_val_if_fail(modem != NULL, FALSE);
857 return modem->roaming_allowed;
860 gboolean _ps_modem_get_flght_mode(gpointer object)
862 ps_modem_t *modem = object;
863 g_return_val_if_fail(modem != NULL, FALSE);
865 return modem->flight_mode;
868 void _ps_modem_set_flght_mode_ups(gpointer object, gboolean value)
870 ps_modem_t *modem = object;
871 g_return_if_fail(modem != NULL);
873 modem->flight_mode_ups = value;
874 dbg("modem(%p) flight_mode_ups(%d)", modem, modem->flight_mode_ups);
879 gboolean _ps_modem_get_flght_mode_ups(gpointer object)
881 ps_modem_t *modem = object;
882 g_return_val_if_fail(modem != NULL, FALSE);
884 return modem->flight_mode_ups;
887 gboolean _ps_modem_get_sim_init(gpointer object)
889 ps_modem_t *modem = object;
890 g_return_val_if_fail(modem != NULL, FALSE);
892 return modem->sim_init;
895 gboolean _ps_modem_get_power(gpointer object)
897 ps_modem_t *modem = object;
898 g_return_val_if_fail(modem != NULL, FALSE);
900 return modem->powered;
903 char *_ps_modem_ref_operator(gpointer object)
905 ps_modem_t *modem = object;
906 g_return_val_if_fail(modem != NULL, FALSE);
908 return modem->operator;
911 ps_subs_type _ps_modem_get_subs_type(gpointer object)
913 ps_modem_t *modem = object;
914 const gchar *cp_name;
916 g_return_val_if_fail(modem != NULL, FALSE);
918 cp_name = modem->cp_name;
919 if (g_str_has_suffix(cp_name, "0"))
920 return PS_SUBS_PRIMARY;
921 else if (g_str_has_suffix(cp_name, "1"))
922 return PS_SUBS_SECONDARY;
923 else if (g_str_has_suffix(cp_name, "2"))
924 return PS_SUBS_TERTIARY;
929 gboolean _ps_modem_get_properties_handler(gpointer object, GVariantBuilder *properties)
931 ps_modem_t *modem = object;
933 ps_dbg_ex_co(_ps_modem_ref_co_modem(modem), "get modem properties");
934 g_return_val_if_fail(modem != NULL, FALSE);
935 g_return_val_if_fail(properties != NULL, FALSE);
937 g_variant_builder_open(properties, G_VARIANT_TYPE("a{ss}"));
938 g_variant_builder_add(properties, "{ss}", "path", modem->path);
941 g_variant_builder_add(properties, "{ss}", "operator", modem->operator);
942 g_variant_builder_add(properties, "{ss}", "powered", BOOL2STRING(modem->powered));
943 g_variant_builder_add(properties, "{ss}", "sim_init", BOOL2STRING(modem->sim_init));
944 g_variant_builder_add(properties, "{ss}", "flight_mode", BOOL2STRING(modem->flight_mode));
945 g_variant_builder_add(properties, "{ss}", "roaming_allowed", BOOL2STRING(modem->roaming_allowed));
946 g_variant_builder_add(properties, "{ss}", "data_allowed", BOOL2STRING(modem->data_allowed));
947 g_variant_builder_close(properties);
953 GVariant *_ps_modem_get_properties(gpointer object, GVariantBuilder *properties)
955 ps_modem_t *modem = object;
957 ps_dbg_ex_co(_ps_modem_ref_co_modem(modem), "get modem properties");
958 g_return_val_if_fail(modem != NULL, FALSE);
959 g_return_val_if_fail(properties != NULL, FALSE);
961 g_variant_builder_init(properties, G_VARIANT_TYPE("a{ss}"));
963 g_variant_builder_add(properties, "{ss}", "path", modem->path);
966 g_variant_builder_add(properties, "{ss}", "operator", modem->operator);
967 g_variant_builder_add(properties, "{ss}", "powered", BOOL2STRING(modem->powered));
968 g_variant_builder_add(properties, "{ss}", "sim_init", BOOL2STRING(modem->sim_init));
969 g_variant_builder_add(properties, "{ss}", "flight_mode", BOOL2STRING(modem->flight_mode));
970 g_variant_builder_add(properties, "{ss}", "roaming_allowed", BOOL2STRING(modem->roaming_allowed));
971 g_variant_builder_add(properties, "{ss}", "data_allowed", BOOL2STRING(modem->data_allowed));
974 return g_variant_builder_end(properties);
977 GHashTable *_ps_modem_ref_services(gpointer object)
979 ps_modem_t *modem = object;
980 g_return_val_if_fail(modem != NULL, NULL);
982 return modem->services;
985 char *_ps_modem_ref_path(gpointer object)
987 ps_modem_t *modem = object;
988 g_return_val_if_fail(modem != NULL, NULL);
993 gpointer _ps_modem_ref_plugin(gpointer object)
995 ps_modem_t *modem = object;
996 g_return_val_if_fail(modem != NULL, NULL);
1001 gpointer _ps_modem_ref_dbusconn(gpointer object)
1003 ps_modem_t *modem = object;
1004 g_return_val_if_fail(modem != NULL, NULL);
1009 gpointer _ps_modem_ref_co_modem(gpointer object)
1011 ps_modem_t *modem = object;
1012 g_return_val_if_fail(modem != NULL, NULL);
1014 return modem->co_modem;
1017 gpointer _ps_modem_ref_work_queue(gpointer object)
1019 ps_modem_t *modem = object;
1020 g_return_val_if_fail(modem != NULL, NULL);
1022 return modem->work_queue;
1025 gchar *_ps_modem_ref_cp_name(gpointer object)
1027 ps_modem_t *modem = object;
1028 g_return_val_if_fail(modem != NULL, NULL);
1030 return modem->cp_name;
1033 gpointer _ps_modem_ref_contexts(gpointer object)
1035 ps_modem_t *modem = object;
1036 g_return_val_if_fail(modem != NULL, NULL);
1037 return modem->contexts;
1040 static gboolean on_modem_get_properties(PacketServiceModem *obj_modem,
1041 GDBusMethodInvocation *invocation,
1044 GVariant *gv = NULL;
1045 GVariantBuilder properties;
1047 dbg("get modem properties");
1049 gv = _ps_modem_get_properties(user_data, &properties);
1050 packet_service_modem_complete_get_properties(obj_modem, invocation, gv);
1054 static gboolean on_modem_get_services(PacketServiceModem *obj_modem,
1055 GDBusMethodInvocation *invocation,
1058 GVariantBuilder b_service;
1061 GHashTableIter iter;
1062 gpointer key, value;
1063 ps_modem_t *modem = user_data;
1064 CoreObject *co_modem = _ps_modem_ref_co_modem(modem);
1066 ps_dbg_ex_co(co_modem, "modem get service interface");
1068 if (modem->services == NULL) {
1069 FAIL_RESPONSE(invocation, PS_ERR_INTERNAL);
1073 g_variant_builder_init(&b_service, G_VARIANT_TYPE("a{sa{ss}}"));
1074 g_hash_table_iter_init(&iter, modem->services);
1075 while (g_hash_table_iter_next(&iter, &key, &value) == TRUE) {
1078 g_variant_builder_open(&b_service, G_VARIANT_TYPE("{sa{ss}}"));
1079 path = _ps_service_ref_path(value);
1080 ps_dbg_ex_co(co_modem, "path added [%s]", path);
1081 g_variant_builder_add(&b_service, "s", g_strdup(path));
1082 if (FALSE == _ps_service_get_properties_handler(value, &b_service)) {
1083 g_variant_builder_close(&b_service);
1084 FAIL_RESPONSE(invocation, PS_ERR_INTERNAL);
1087 g_variant_builder_close(&b_service);
1090 services = g_variant_builder_end(&b_service);
1091 packet_service_modem_complete_get_services(obj_modem, invocation, services);
1095 static gboolean on_modem_go_dormant_all(PacketServiceModem *obj_modem,
1096 GDBusMethodInvocation *invocation,
1101 GHashTableIter iter;
1102 gpointer key, value;
1103 ps_modem_t *modem = user_data;
1105 dbg("modem go dormant all interface");
1107 if (modem->services == NULL) {
1108 FAIL_RESPONSE(invocation, PS_ERR_INTERNAL);
1112 g_hash_table_iter_init(&iter, modem->services);
1113 while (g_hash_table_iter_next(&iter, &key, &value) == TRUE) {
1114 ps_service_t *service = value;
1115 dbg("service (%p), send dormant request, ", service);
1116 result = tcore_ps_send_dormant_request(service->co_ps, NULL);
1119 packet_service_modem_complete_go_dormant_all(obj_modem, invocation, result);
1123 static gboolean on_modem_get_profile_list(PacketServiceModem *obj_modem,
1124 GDBusMethodInvocation *invocation,
1127 int profile_index = 0;
1129 guint len = 0, index;
1130 gchar **strv = NULL;
1131 GSList *profiles = NULL;
1132 ps_modem_t *modem = user_data;
1133 CoreObject *co_modem = _ps_modem_ref_co_modem(modem);
1135 ps_dbg_ex_co(co_modem, "master get the profile list");
1137 if (modem->contexts == NULL) {
1138 ps_err_ex_co(co_modem, "no profiles");
1139 FAIL_RESPONSE(invocation, PS_ERR_NO_PROFILE);
1143 for (index = 0; index < g_slist_length(modem->contexts); index++) {
1144 gchar *s_path = NULL;
1145 gpointer value = g_slist_nth_data(modem->contexts, index);
1147 s_path = _ps_context_ref_path(value);
1148 ps_dbg_ex_co(co_modem, "value(%p), path(%s)", value, s_path);
1150 profiles = g_slist_append(profiles, g_strdup((const char *)s_path));
1153 if (profiles == NULL) {
1154 ps_dbg_ex_co(co_modem, "no profiles");
1155 FAIL_RESPONSE(invocation, PS_ERR_NO_PROFILE);
1159 len = g_slist_length(profiles);
1160 strv = g_new(gchar *, len+1);
1163 strv[profile_index] = g_strdup(profiles->data);
1166 profiles = profiles->next;
1168 strv[profile_index] = NULL;
1170 packet_service_modem_complete_get_profile_list(obj_modem,
1171 invocation, (const gchar *const *)strv);
1174 profiles = g_slist_nth(profiles, 0);
1175 g_slist_free_full(profiles, g_free);
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_dbg_ex_co(co_modem, "add profile request");
1197 operator = _ps_modem_ref_operator(modem);
1200 ps_dbg_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 fucntion 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_dbg_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);
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 /* Remove contexts through only service. */
1245 g_hash_table_iter_init(&iter, modem->services);
1246 while (g_hash_table_iter_next(&iter, &key, &value) == TRUE) {
1247 ps_dbg_ex_co(co_modem, "Remove contexts on service(%p)", value);
1248 _ps_service_remove_contexts(value);
1251 if (modem->type == 0) {
1253 gchar *name = g_strdup_printf("REGEN-DB-%s", modem->cp_name);
1255 thread = g_thread_new(name, __ps_modem_regenerate_database, modem);
1257 if (thread == NULL) {
1258 dbg("Thread is not created");
1259 FAIL_RESPONSE(modem->invocation , PS_ERR_INTERNAL);
1260 _ps_modem_remove_profile_reset_gsource(modem);
1262 dbg("Thread(%p) is created", thread);
1267 /* Create contexts again. */
1268 _ps_get_co_modem_values(modem);
1269 _ps_modem_set_reset_profile(modem, FALSE);
1270 packet_service_modem_complete_reset_profile(modem->if_obj, modem->invocation, TRUE);
1271 modem->invocation = NULL;
1273 _ps_modem_remove_profile_reset_gsource(modem);
1275 /* Try to re-connect default contexts after reset profile is complete */
1276 g_hash_table_iter_init(&iter, modem->services);
1277 while (g_hash_table_iter_next(&iter, &key, &key_value) == TRUE) {
1278 /* only available case */
1279 _ps_service_connect_default_context(key_value);
1282 ps_dbg_ex_co(co_modem, "Exiting");
1286 static gboolean on_modem_reset_profile(PacketServiceModem *obj_modem,
1287 GDBusMethodInvocation *invocation,
1292 gboolean contexts_active;
1293 ps_modem_t *modem = user_data;
1294 CoreObject *co_modem = _ps_modem_ref_co_modem(modem);
1298 ps_dbg_ex_co(co_modem, "reset profile request type(%d)", type);
1300 if (_ps_modem_get_reset_profile(modem) == TRUE) {
1301 ps_err_ex_co(co_modem, "Reset Profile is already in Progress");
1302 packet_service_modem_complete_reset_profile(obj_modem, invocation, FALSE);
1303 ps_dbg_ex_co(co_modem, "Exiting");
1307 _ps_modem_set_reset_profile(modem, TRUE);
1309 co_ps = tcore_plugin_ref_core_object(tcore_object_ref_plugin(_ps_modem_ref_co_modem(modem)),
1310 CORE_OBJECT_TYPE_PS);
1312 modem->invocation = invocation;
1315 contexts_active = tcore_ps_any_context_activating_activated(co_ps, &state);
1317 if (contexts_active == TRUE) {
1318 ps_dbg_ex_co(co_modem, "Contexts are in [%d] state", state);
1319 if (state == CONTEXT_STATE_ACTIVATED) {
1320 ps_dbg_ex_co(co_modem, "Contexts are in Actived state. Sending Diconnect Notification to all connected contexts");
1321 rv = tcore_ps_deactivate_contexts(co_ps);
1322 if (rv != TCORE_RETURN_SUCCESS)
1323 ps_dbg_ex_co(co_modem, "fail to deactivation");
1324 } else if (state == CONTEXT_STATE_ACTIVATING) {
1325 ps_dbg_ex_co(co_modem, "Contexts are in Activating state. Wait for them to connect");
1328 ps_dbg_ex_co(co_modem, "No contexts are in activating or activated state");
1329 ps_dbg_ex_co(co_modem, "Profiles reset is being initiated");
1330 _ps_modem_initiate_reset_profile(modem);
1337 static void _ps_modem_setup_interface(PacketServiceModem *modem, ps_modem_t *modem_data)
1339 ps_dbg_ex_co(_ps_modem_ref_co_modem(modem_data), "Entered");
1341 g_signal_connect(modem,
1342 "handle-get-properties",
1343 G_CALLBACK(on_modem_get_properties),
1346 g_signal_connect(modem,
1347 "handle-get-services",
1348 G_CALLBACK(on_modem_get_services),
1351 g_signal_connect(modem,
1352 "handle-go-dormant-all",
1353 G_CALLBACK(on_modem_go_dormant_all),
1356 g_signal_connect(modem,
1357 "handle-get-profile-list",
1358 G_CALLBACK(on_modem_get_profile_list),
1361 g_signal_connect(modem,
1362 "handle-add-profile",
1363 G_CALLBACK(on_modem_add_profile),
1366 g_signal_connect(modem,
1367 "handle-reset-profile",
1368 G_CALLBACK(on_modem_reset_profile),