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.
22 #include "ps_common.h"
24 #include <tzplatform_config.h>
27 #include <user_request.h>
28 #include <core_object.h>
29 #include <co_context.h>
31 #include <co_network.h>
34 #include "ps_context.h"
35 #include "ps_master.h"
37 #include "ps_service.h"
38 #include "ps_tcore_interface.h"
40 #include "ps_modem_interface.h"
43 static void __ps_modem_processing_modem_event(ps_modem_t *modem);
46 void __remove_modem_handler(gpointer data)
48 ps_modem_t *modem = data;
51 warn("Modem is NULL");
55 ps_info_ex_modem(modem, "Entered");
57 #ifdef TIZEN_SUPPORT_REQUEST_HOOK_PDP_CONTROL
58 _ps_hook_cp_reset_send_pending_request_response(modem);
60 /*Need to remove the compelete hash table*/
61 g_hash_table_remove_all(modem->services);
63 /*Need to UNexport and Unref the master Object */
64 g_dbus_interface_skeleton_unexport(G_DBUS_INTERFACE_SKELETON(modem->if_obj));
66 g_object_unref(modem->if_obj);
68 /*Need to free memory allocated for the internal structure*/
69 #ifdef TIZEN_SUPPORT_REQUEST_HOOK_PDP_CONTROL
70 g_queue_free(modem->work_queue);
72 if (modem->deact_timer_src > 0) {
73 ps_info_ex_modem(modem, "remove connection retry timer (%d)", modem->deact_timer_src);
74 alarmmgr_remove_alarm(modem->deact_timer_src);
75 modem->deact_timer_src = -1;
79 g_free(modem->operator);
80 g_free(modem->cp_name);
82 _ps_modem_remove_profile_reset_gsource(modem);
89 static void __ps_modem_create_service(GDBusConnection *conn, TcorePlugin *p,
90 ps_modem_t *modem, CoreObject *co_modem)
93 ps_service_t *service = NULL;
94 CoreObject *co_ps = NULL;
95 CoreObject *co_network = NULL;
96 TcorePlugin *target_plg = NULL;
98 target_plg = tcore_object_ref_plugin(co_modem);
99 co_ps = tcore_plugin_ref_core_object(target_plg, CORE_OBJECT_TYPE_PS);
100 co_network = tcore_plugin_ref_core_object(target_plg, CORE_OBJECT_TYPE_NETWORK);
101 if (!co_ps || !co_network)
104 t_path = g_strdup_printf("%s/%s", _ps_modem_ref_path(modem), "umts_ps");
105 if (NULL != g_hash_table_lookup(modem->services, t_path)) {
106 ps_dbg_ex_modem(modem, "service (%s) already exist!!!", t_path);
110 ps_info_ex_modem(modem, "service path (%s)", t_path);
111 service = _ps_service_create_service(conn, p, modem, co_network, co_ps, t_path);
112 if (G_UNLIKELY(!service)) {
113 ps_err_ex_modem(modem, "Failed to create service ");
118 g_hash_table_insert(modem->services, g_strdup(t_path), service);
119 ps_dbg_ex_modem(modem, "service (%p) insert to hash", service);
120 ps_modem_emit_service_added_signal(modem, service);
125 static void __ps_modem_remove_service(ps_modem_t *modem, ps_service_t *service)
127 ps_dbg_ex_modem(modem, "Entered");
129 /*Unexporting the interface for the modem*/
130 if (service->if_obj) {
131 g_dbus_interface_skeleton_unexport(G_DBUS_INTERFACE_SKELETON(service->if_obj));
132 g_object_unref(service->if_obj);
133 service->if_obj = NULL;
136 g_hash_table_remove(modem->services, _ps_service_ref_path(service));
137 ps_info_ex_modem(modem, "Successfully removed the service from the modem");
140 static gboolean __ps_modem_set_powered(ps_modem_t *modem, gboolean value)
142 g_return_val_if_fail(modem != NULL, FALSE);
144 if (modem->powered != value) {
145 modem->powered = value;
146 ps_info_ex_modem(modem, "modem(%p) powered(%d)", modem, modem->powered);
147 ps_modem_emit_property_changed_signal(modem);
152 static gboolean __ps_modem_set_sim_complete(ps_modem_t *modem, gboolean value, gchar *operator)
154 g_return_val_if_fail(modem != NULL, FALSE);
156 if (modem->sim_init != value) {
157 /* Update SIM init status */
158 modem->sim_init = value;
159 if (value && operator != NULL && !modem->operator)
160 modem->operator = g_strdup(operator);
161 ps_info_ex_modem(modem, "modem [%p] SIM-Init [%s]", modem, (modem->sim_init ? "INITIALIZED" : "UNINITIALIZED"));
163 ps_modem_emit_property_changed_signal(modem);
169 static gboolean __ps_modem_set_flght_mode(ps_modem_t *modem, gboolean value)
171 g_return_val_if_fail(modem != NULL, FALSE);
173 if (modem->flight_mode != value) {
174 modem->flight_mode = value;
175 ps_info_ex_modem(modem, "modem(%p) flight_mode(%d)", modem, modem->flight_mode);
176 ps_modem_emit_property_changed_signal(modem);
177 __ps_modem_processing_modem_event(modem);
183 static void __ps_modem_get_ps_setting_from_storage(ps_modem_t *modem)
185 gboolean key_3g_enable = FALSE, key_roaming_allowed = FALSE;
186 gint key_ps_mode = 0, key_roaming_apn = 0;
188 key_3g_enable = _ps_master_get_storage_value_bool(modem->p_master, KEY_3G_ENABLE);
189 key_roaming_allowed = _ps_master_get_storage_value_bool(modem->p_master, KEY_DATA_ROAMING_SETTING);
190 key_ps_mode = _ps_master_get_storage_value_int(modem->p_master, KEY_POWER_SAVING_MODE);
192 _ps_modem_set_data_allowed(modem, key_3g_enable);
193 _ps_modem_set_data_roaming_allowed(modem, key_roaming_allowed);
194 _ps_modem_set_data_roaming_apn(modem, key_roaming_apn);
196 #if defined(TIZEN_UPS_ENABLED)
197 _ps_modem_set_psmode(modem, key_ps_mode);
199 ps_dbg_ex_modem(modem, "data allowed(%d) roaming allowed(%d) power saving mode(%d)",
200 key_3g_enable, key_roaming_allowed, key_ps_mode);
203 static void __ps_modem_processing_modem_event(ps_modem_t *modem)
207 #ifdef PREPAID_SIM_APN_SUPPORT
211 g_return_if_fail(modem != NULL);
213 if (!modem->services)
216 g_hash_table_iter_init(&iter, modem->services);
217 while (g_hash_table_iter_next(&iter, &key, &value) == TRUE) {
218 gboolean s_roaming = FALSE;
219 ps_service_t *service = value;
221 s_roaming = _ps_service_get_roaming(service);
222 _ps_update_cellular_state_key(service);
224 if (modem->powered == PS_MODEM_STATE_OFFLINE) {
225 _ps_service_remove_contexts(service);
226 _ps_free_co_ps_event(service);
227 _ps_free_co_network_event(service);
228 __ps_modem_remove_service(modem, service);
232 if (modem->flight_mode) {
233 _ps_service_disconnect_contexts(service);
235 } else if (!modem->data_allowed || (s_roaming && !modem->roaming_allowed)) {
236 _ps_service_disconnect_internet_mms_tethering_contexts(service);
240 /* only available case */
241 #ifdef PREPAID_SIM_APN_SUPPORT
242 ret = _ps_service_connect_last_connected_context(service);
243 ps_dbg_ex_modem(modem, "ret[%d]", ret);
245 return; /* No need to activate default context */
247 _ps_service_connect_default_context(service);
251 ps_modem_t *_ps_modem_create_modem(GDBusConnection *conn, TcorePlugin *p, ps_master_t *master,
252 char *modem_name, CoreObject *co_modem, gchar *cp_name)
254 ps_modem_t *new_modem;
256 g_return_val_if_fail(conn != NULL, NULL);
257 g_return_val_if_fail(master != NULL, NULL);
259 /*Initializing the modem list for internal referencing*/
260 new_modem = g_try_malloc0(sizeof(ps_modem_t));
261 if (G_UNLIKELY(!new_modem)) {
262 err("Unable to allocate memory for modem");
266 #ifdef TIZEN_SUPPORT_REQUEST_HOOK_PDP_CONTROL
267 /*Add work queue to keep user request in case of handling active PDP context*/
268 new_modem->hook_flag = 0x00;
269 new_modem->work_queue = g_queue_new();
270 if (G_UNLIKELY(!new_modem->work_queue)) {
271 err("Unable to get work queue for modem");
276 new_modem->conn = conn;
277 new_modem->p_master = master;
279 new_modem->co_modem = co_modem;
280 new_modem->path = g_strdup(modem_name);
281 new_modem->cp_name = g_strdup(cp_name);
282 if (g_str_has_suffix(cp_name, "0"))
283 new_modem->subs_type = PS_SUBS_PRIMARY;
285 new_modem->subs_type = PS_SUBS_SECONDARY;
286 new_modem->services = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, __remove_service_handler);
288 __ps_modem_get_ps_setting_from_storage(new_modem);
289 _ps_add_co_modem_event(new_modem);
290 _ps_get_co_modem_values(new_modem);
292 /*Setting the interface call backs functions*/
293 if (!ps_modem_setup_interface(new_modem)) {
298 ps_info_ex_modem(new_modem, "Successfully created the modem");
302 void _ps_modem_destroy_modem(GDBusConnection *conn, ps_modem_t *modem)
307 GSList *list_iter = NULL;
309 g_return_if_fail(modem != NULL);
311 if (modem->services == NULL)
314 ps_dbg_ex_modem(modem, "Clearing all services");
315 g_hash_table_iter_init(&iter, modem->services);
316 while (g_hash_table_iter_next(&iter, &key, &value) == TRUE) {
317 ps_service_t *service = value;
319 /* Update Cellular state */
320 _ps_service_set_ps_attached(service, FALSE);
321 _ps_update_cellular_state_key(service);
323 /* Remove contexts */
324 _ps_service_remove_contexts(service);
327 _ps_free_co_ps_event(service);
328 _ps_free_co_network_event(service);
330 /* To avoid hashtable assertion */
331 list = g_slist_append(list, service);
334 for (list_iter = list; list_iter; list_iter = g_slist_next(list_iter)) {
335 /* Remove services */
336 __ps_modem_remove_service(modem, list_iter->data);
339 g_slist_free(modem->contexts);
341 /* Clear modem hooks */
342 _ps_free_co_modem_event(modem);
344 gboolean _ps_modem_processing_flight_mode(ps_modem_t *modem, gboolean enable)
346 g_return_val_if_fail(modem != NULL, FALSE);
348 if (modem->flight_mode == enable)
351 __ps_modem_set_flght_mode(modem, enable);
355 gboolean _ps_modem_processing_power_enable(ps_modem_t *modem, int modem_state)
357 g_return_val_if_fail(modem != NULL, FALSE);
359 ps_info_ex_modem(modem, "modem->powered [%d], Modem->sim_init [%d], modem_state [%d]",
360 modem->powered, modem->sim_init, modem_state);
362 if (modem->powered == modem_state)
365 __ps_modem_set_powered(modem, modem_state);
367 if (modem_state == PS_MODEM_STATE_ONLINE) {
368 __ps_modem_create_service(modem->conn, modem->plg, modem, modem->co_modem);
369 if (modem->sim_init == TRUE && modem->operator != NULL) {
370 GSList *contexts = (GSList *)_ps_modem_ref_contexts(modem);
372 if (contexts != NULL) {
375 ps_warn_ex_modem(modem, "contexts exist, SIM init complete before Modem Power On event.");
376 g_hash_table_iter_init(&iter, modem->services);
377 while (g_hash_table_iter_next(&iter, &key, &value) == TRUE) {
378 ps_service_t *service = value;
379 _ps_service_set_number_of_pdn_cnt(service, modem->operator);
380 _ps_service_ref_contexts(service, contexts, modem->operator);
381 // _ps_service_set_attach_apn(service);
385 } else if (modem_state == PS_MODEM_STATE_OFFLINE) {
386 __ps_modem_processing_modem_event(modem);
387 /* SIM init should be set to FALSE during CP silent reset.
388 * and will be updated when SIM initialized complete notification is received.
394 gboolean _ps_modem_processing_no_sim(ps_modem_t *modem)
396 #ifdef TIZEN_SUPPORT_VOLTE
397 GSList *contexts = _ps_modem_ref_contexts(modem);
398 g_return_val_if_fail(modem != NULL, FALSE);
401 ps_dbg_ex_modem(modem, "Contexts exits");
405 ps_dbg_ex_modem(modem, "Entered");
407 if (!modem->operator)
408 modem->operator = g_strdup(PS_IMS_EMERGENCY_PROFILE_PLMN);
410 ps_dbg_ex_modem(modem, "Creating Hash table...");
411 contexts = _ps_context_create_hashtable(modem, modem->roaming);
412 if (contexts != NULL) {
416 g_hash_table_iter_init(&iter, modem->services);
417 while (g_hash_table_iter_next(&iter, &key, &value) == TRUE) {
418 ps_service_t *service = value;
419 _ps_service_set_number_of_pdn_cnt(service, modem->operator);
420 _ps_service_ref_contexts(service, contexts, modem->operator);
421 _ps_service_set_attach_apn(service);
424 ps_err_ex_modem(modem, "Failed to create HASH table");
428 ps_dbg_ex_modem(modem, "Exiting");
433 gboolean _ps_modem_processing_sim_complete(ps_modem_t *modem, gboolean complete, gchar *operator)
435 g_return_val_if_fail(modem != NULL, FALSE);
437 ps_dbg_ex_modem(modem, "Entered: sim_init[%d]", modem->sim_init);
439 if (modem->sim_init == complete && !modem->reset_profile) {
440 #ifdef TIZEN_SUPPORT_VOLTE
441 GSList *contexts = (GSList *)_ps_modem_ref_contexts(modem);
443 ps_dbg_ex_modem(modem, "No change in SIM state");
445 if (contexts != NULL) {
448 ps_warn_ex_modem(modem, "contexts exist, SIM init complete before Modem Power On event.");
449 g_hash_table_iter_init(&iter, modem->services);
450 while (g_hash_table_iter_next(&iter, &key, &value) == TRUE) {
451 ps_service_t *service = value;
452 _ps_service_set_number_of_pdn_cnt(service, modem->operator);
453 _ps_service_ref_contexts(service, contexts, modem->operator);
454 _ps_service_set_attach_apn(service);
459 ps_dbg_ex_modem(modem, "No change in SIM state");
463 gboolean different_sim = FALSE;
465 if (operator && (g_strcmp0(modem->operator, operator) != 0)) {
466 ps_info_ex_modem(modem, "Previous operator: [%s] Present operator: [%s]", modem->operator, operator);
467 g_free(modem->operator);
469 modem->operator = g_strdup(operator);
470 different_sim = TRUE;
474 /* free modem operator */
475 if (FALSE == complete) {
476 g_free(modem->operator);
477 modem->operator = NULL;
480 /* Update SIM state */
481 __ps_modem_set_sim_complete(modem, complete, operator);
482 /* Tizen Telephony makes dummy profile for CDMA by default */
483 _ps_context_create_cdma_profile(modem->operator, modem->cp_name);
485 /* Modem power off notification coming due to which profile are removed */
486 /* and needed to be re inserted in db with sim off notification */
488 * Context table creation
490 * Create context if -
492 * Initialzed SIM is different (if same SIM is re-initialized then need not create context)
493 * Delete context if sim_init = FALSE;
494 * This will be coming when SIM power off or CARD error is received.
496 if (modem->sim_init == TRUE) {
497 if ((different_sim || modem->reset_profile) && (modem->operator != NULL)) {
499 GSList *contexts = (GSList *)_ps_modem_ref_contexts(modem);
501 ps_dbg_ex_modem(modem, "Contexts exits");
505 ps_dbg_ex_modem(modem, "Creating Hash table...");
506 contexts = _ps_context_create_hashtable(modem, modem->roaming);
507 if (contexts != NULL) {
511 g_hash_table_iter_init(&iter, modem->services);
512 while (g_hash_table_iter_next(&iter, &key, &value) == TRUE) {
513 ps_service_t *service = value;
514 ps_master_t *master = _ps_modem_ref_master(modem);
515 _ps_service_set_number_of_pdn_cnt(service, modem->operator);
516 _ps_service_ref_contexts(service, contexts, modem->operator);
517 if (master && master->b_lte_supported)
518 _ps_service_set_attach_apn(service);
521 ps_err_ex_modem(modem, "Failed to create HASH table");
529 if (!modem->services)
532 g_hash_table_iter_init(&iter, modem->services);
533 while (g_hash_table_iter_next(&iter, &key, &value) == TRUE) {
534 ps_service_t *service = value;
535 ps_info_ex_modem(modem, "Remove contexts on service(%p)", service);
536 _ps_service_remove_contexts(service);
541 ps_dbg_ex_modem(modem, "Exiting");
545 gboolean _ps_modem_processing_sim_refresh(ps_modem_t *modem)
547 #ifdef TIZEN_SUPPORT_VOLTE
552 ps_dbg_ex_modem(modem, "Entered");
553 g_return_val_if_fail(modem != NULL, FALSE);
555 if (!modem->services)
558 g_hash_table_iter_init(&iter, modem->services);
559 while (g_hash_table_iter_next(&iter, &key, &value) == TRUE) {
560 ps_service_t *service = value;
561 for (index = 0; index < g_slist_length(service->contexts); index++) {
562 ps_context_t *context = g_slist_nth_data(service->contexts, index);
563 CoreObject *co_context = _ps_context_ref_co_context(context);
565 if (tcore_context_get_role(co_context) == CONTEXT_ROLE_IMS) {
566 gboolean ims_registered = FALSE, ims_deregistering = FALSE;
567 struct tel_network_ims_registration_info ims_reg_info = { 0, };
569 tcore_network_get_ims_reg_info(_ps_service_ref_co_network(service), &ims_reg_info);
570 if (ims_reg_info.feature_mask & NET_IMS_MASK_REGI)
571 ims_registered = TRUE;
572 ims_deregistering = tcore_network_get_ims_on_deregistering(_ps_service_ref_co_network(service));
574 ps_dbg_ex_svc(service, "ims_registered(%d), ims_deregistering(%d), context_state(%d), flight_mode(%d)",
575 ims_registered, ims_deregistering, tcore_context_get_state(co_context), modem->flight_mode);
577 if (!modem->flight_mode) {
578 if (ims_registered && !ims_deregistering) {
579 if (_ps_context_deregister_ims(context) == TCORE_RETURN_SUCCESS)
588 ps_dbg_ex_modem(modem, "Exiting");
592 gboolean _ps_modem_set_attach_apn(ps_modem_t *modem)
595 GSList *contexts = NULL;
597 g_return_val_if_fail(modem != NULL, FALSE);
598 contexts = (GSList *)_ps_modem_ref_contexts(modem);
599 ps_dbg_ex_modem(modem, "Entered");
601 for (index = 0; index < g_slist_length(modem->contexts); index++) {
602 ps_context_t *context = g_slist_nth_data(modem->contexts, index);
603 ps_service_t *service = _ps_context_ref_service(context);
604 CoreObject *co_context = _ps_context_ref_co_context(context);
607 tcore_ps_clear_context_id(_ps_service_ref_co_ps(service), co_context);
610 if (contexts != NULL) {
613 ps_warn_ex_modem(modem, "contexts exist, Set attach apn");
614 g_hash_table_iter_init(&iter, modem->services);
615 while (g_hash_table_iter_next(&iter, &key, &value) == TRUE) {
616 ps_service_t *service = value;
617 _ps_service_set_number_of_pdn_cnt(service, modem->operator);
618 _ps_service_ref_contexts(service, contexts, modem->operator);
619 _ps_service_set_attach_apn(service);
623 ps_dbg_ex_modem(modem, "Exiting");
628 int _ps_modem_get_data_roaming_apn(ps_modem_t *modem)
630 g_return_val_if_fail(modem != NULL, FALSE);
631 return modem->roaming_apn;
634 gboolean _ps_modem_set_data_roaming_apn(ps_modem_t *modem, int value)
636 g_return_val_if_fail(modem != NULL, FALSE);
638 if (modem->roaming_apn != value) {
639 modem->roaming_apn = value;
640 ps_info_ex_modem(modem, "modem(%p) roaming_apn(%d)", modem, modem->roaming_apn);
646 gboolean _ps_modem_get_reset_profile(ps_modem_t *modem)
648 g_return_val_if_fail(modem != NULL, FALSE);
650 ps_info_ex_modem(modem, "modem(%p) reset_profile(%d)", modem, modem->reset_profile);
652 return modem->reset_profile;
655 GSource *_ps_modem_get_profile_reset_gsource(ps_modem_t *modem)
657 g_return_val_if_fail(modem != NULL, NULL);
658 return modem->reset_profile_gsource;
661 gboolean _ps_modem_set_profile_reset_gsource(ps_modem_t *modem, GSource *source)
663 g_return_val_if_fail(modem != NULL, FALSE);
664 modem->reset_profile_gsource = source;
668 gboolean _ps_modem_remove_profile_reset_gsource(ps_modem_t *modem)
670 g_return_val_if_fail(modem != NULL, FALSE);
672 if (NULL != modem->reset_profile_gsource) {
673 g_source_unref(modem->reset_profile_gsource);
674 modem->reset_profile_gsource = NULL;
680 gboolean _ps_modem_set_sim_enabled(ps_modem_t *modem, gboolean value)
682 g_return_val_if_fail(modem != NULL, FALSE);
684 if (modem->sim_init != value) {
685 modem->sim_init = value;
686 ps_info_ex_modem(modem, "modem(%p) sim_enabled(%d)", modem, modem->sim_init);
691 gboolean _ps_modem_connect_default_context(ps_modem_t *modem)
696 g_return_val_if_fail(modem != NULL, FALSE);
698 g_hash_table_iter_init(&iter, modem->services);
699 while (g_hash_table_iter_next(&iter, &key, &value) == TRUE) {
700 ps_service_t *service = value;
701 _ps_service_connect_default_context(service);
707 gboolean _ps_modem_set_data_allowed(ps_modem_t *modem, gboolean value)
709 g_return_val_if_fail(modem != NULL, FALSE);
711 if (modem->data_allowed != value) {
712 modem->data_allowed = value;
713 ps_info_ex_modem(modem, "modem(%p) data allowed(%d)", modem, modem->data_allowed);
714 ps_modem_emit_property_changed_signal(modem);
715 __ps_modem_processing_modem_event(modem);
717 if (modem->data_allowed) {
719 gpointer key, service;
720 ps_context_t *def_context = NULL, *ims_context = NULL;
722 g_hash_table_iter_init(&iter, modem->services);
723 while (g_hash_table_iter_next(&iter, &key, &service) == TRUE) {
724 def_context = _ps_service_return_default_context(service, CONTEXT_ROLE_INTERNET);
726 _ps_context_set_alwayson_enable(def_context, TRUE);
727 ims_context = _ps_service_return_default_context(service, CONTEXT_ROLE_IMS);
729 _ps_context_set_alwayson_enable(ims_context, TRUE);
732 __ps_modem_processing_modem_event(modem);
739 gboolean _ps_modem_get_data_allowed(ps_modem_t *modem)
741 g_return_val_if_fail(modem != NULL, FALSE);
742 return modem->data_allowed;
745 gboolean _ps_modem_set_data_roaming_allowed(ps_modem_t *modem, gboolean roaming_allowed)
747 g_return_val_if_fail(modem != NULL, FALSE);
749 if (modem->roaming_allowed != roaming_allowed) {
750 modem->roaming_allowed = roaming_allowed;
751 ps_info_ex_modem(modem, "modem(%p) roaming allowed(%d)", modem, modem->roaming_allowed);
752 ps_modem_emit_property_changed_signal(modem);
754 if (!modem->services)
757 if (modem->roaming) {
759 gpointer key, service;
760 ps_context_t *def_context = NULL, *ims_context = NULL;
762 g_hash_table_iter_init(&iter, modem->services);
763 while (g_hash_table_iter_next(&iter, &key, &service) == TRUE) {
764 def_context = _ps_service_return_default_context(service, CONTEXT_ROLE_INTERNET);
766 _ps_context_set_alwayson_enable(def_context, TRUE);
768 ims_context = _ps_service_return_default_context(service, CONTEXT_ROLE_IMS);
770 _ps_context_set_alwayson_enable(ims_context, TRUE);
772 __ps_modem_processing_modem_event(modem);
779 gboolean _ps_modem_set_pm_state(ps_modem_t *modem, gint pm_state)
781 g_return_val_if_fail(modem != NULL, FALSE);
783 if (modem->pm_state != pm_state) {
784 modem->pm_state = pm_state;
785 ps_info_ex_modem(modem, "modem(%p) pm_state(%d)", modem, modem->pm_state);
787 if (!modem->services)
790 if (modem->pm_state == 1) {
792 gpointer key, service;
793 ps_context_t *def_context = NULL, *ims_context = NULL;
795 g_hash_table_iter_init(&iter, modem->services);
796 while (g_hash_table_iter_next(&iter, &key, &service) == TRUE) {
797 def_context = _ps_service_return_default_context(service, CONTEXT_ROLE_INTERNET);
798 if (def_context && def_context->timer_src > 0) {
799 ps_info_ex_modem(modem, "reset pdp retry timer (%d)", def_context->timer_src);
800 _ps_service_set_retry_timeout_value(def_context, PDP_RETRY_TIME_OUT_DEFAULT);
801 _ps_service_connection_timer(service, def_context);
804 ims_context = _ps_service_return_default_context(service, CONTEXT_ROLE_IMS);
805 if (ims_context && ims_context->timer_src > 0) {
806 ps_info_ex_modem(modem, "reset pdp retry timer (%d)", ims_context->timer_src);
807 _ps_service_set_retry_timeout_value(ims_context, PDP_RETRY_TIME_OUT_DEFAULT);
808 _ps_service_connection_timer(service, ims_context);
818 gboolean _ps_modem_set_psmode(ps_modem_t *modem, gint value)
820 g_return_val_if_fail(modem != NULL, FALSE);
822 if (modem->ps_mode != value) {
823 modem->ps_mode = value;
824 ps_info_ex_modem(modem, "modem(%p) power saving mode(%d)", modem, modem->ps_mode);
830 gboolean _ps_modem_get_roaming(ps_modem_t *modem)
832 g_return_val_if_fail(modem != NULL, FALSE);
833 return modem->roaming;
836 void _ps_modem_set_roaming(ps_modem_t *modem, gboolean value)
838 g_return_if_fail(modem != NULL);
840 if (modem->roaming != value) {
841 modem->roaming = value;
842 ps_info_ex_modem(modem, "modem(%p) roaming(%d)", modem, modem->roaming);
846 gint _ps_modem_get_roaming_apn_support(ps_modem_t *modem)
848 g_return_val_if_fail(modem != NULL, FALSE);
849 return modem->roaming_apn_support;
852 void _ps_modem_set_roaming_apn_support(ps_modem_t *modem, gboolean value)
854 g_return_if_fail(modem != NULL);
855 if (modem->roaming_apn_support != value) {
856 modem->roaming_apn_support = value;
857 ps_info_ex_modem(modem, "modem(%p) roaming_apn_support(%d)", modem, modem->roaming_apn_support);
861 gint _ps_modem_get_psmode(ps_modem_t *modem)
863 g_return_val_if_fail(modem != NULL, FALSE);
864 return modem->ps_mode;
867 gboolean _ps_modem_get_data_roaming_allowed(ps_modem_t *modem)
869 g_return_val_if_fail(modem != NULL, FALSE);
870 return modem->roaming_allowed;
873 gboolean _ps_modem_get_flght_mode(ps_modem_t *modem)
875 g_return_val_if_fail(modem != NULL, FALSE);
876 return modem->flight_mode;
879 gboolean _ps_modem_get_sim_init(ps_modem_t *modem)
881 g_return_val_if_fail(modem != NULL, FALSE);
882 return modem->sim_init;
885 gboolean _ps_modem_get_power(ps_modem_t *modem)
887 g_return_val_if_fail(modem != NULL, FALSE);
888 return modem->powered;
891 char *_ps_modem_ref_operator(ps_modem_t *modem)
893 g_return_val_if_fail(modem != NULL, FALSE);
894 return modem->operator;
897 ps_subs_type _ps_modem_get_subs_type(ps_modem_t *modem)
899 g_return_val_if_fail(modem != NULL, FALSE);
900 return modem->subs_type;
903 gboolean _ps_modem_get_properties_handler(ps_modem_t *modem, GVariantBuilder *properties)
905 g_return_val_if_fail(modem != NULL, FALSE);
906 g_return_val_if_fail(properties != NULL, FALSE);
908 ps_info_ex_modem(modem, "get modem properties");
910 g_variant_builder_open(properties, G_VARIANT_TYPE("a{ss}"));
911 g_variant_builder_add(properties, "{ss}", "path", modem->path);
914 g_variant_builder_add(properties, "{ss}", "operator", modem->operator);
915 g_variant_builder_add(properties, "{ss}", "powered", BOOL2STRING(modem->powered));
916 g_variant_builder_add(properties, "{ss}", "sim_init", BOOL2STRING(modem->sim_init));
917 g_variant_builder_add(properties, "{ss}", "flight_mode", BOOL2STRING(modem->flight_mode));
918 g_variant_builder_add(properties, "{ss}", "roaming_allowed", BOOL2STRING(modem->roaming_allowed));
919 g_variant_builder_add(properties, "{ss}", "data_allowed", BOOL2STRING(modem->data_allowed));
920 g_variant_builder_close(properties);
925 GVariant *_ps_modem_get_properties(ps_modem_t *modem, GVariantBuilder *properties)
927 g_return_val_if_fail(modem != NULL, FALSE);
928 g_return_val_if_fail(properties != NULL, FALSE);
930 ps_info_ex_modem(modem, "get modem properties");
932 g_variant_builder_init(properties, G_VARIANT_TYPE("a{ss}"));
933 g_variant_builder_add(properties, "{ss}", "path", modem->path);
936 g_variant_builder_add(properties, "{ss}", "operator", modem->operator);
937 g_variant_builder_add(properties, "{ss}", "powered", BOOL2STRING(modem->powered));
938 g_variant_builder_add(properties, "{ss}", "sim_init", BOOL2STRING(modem->sim_init));
939 g_variant_builder_add(properties, "{ss}", "flight_mode", BOOL2STRING(modem->flight_mode));
940 g_variant_builder_add(properties, "{ss}", "roaming_allowed", BOOL2STRING(modem->roaming_allowed));
941 g_variant_builder_add(properties, "{ss}", "data_allowed", BOOL2STRING(modem->data_allowed));
943 return g_variant_builder_end(properties);
946 ps_master_t *_ps_modem_ref_master(ps_modem_t *modem)
948 g_return_val_if_fail(modem != NULL, NULL);
949 return modem->p_master;
952 GHashTable *_ps_modem_ref_services(ps_modem_t *modem)
954 g_return_val_if_fail(modem != NULL, NULL);
955 return modem->services;
958 char *_ps_modem_ref_path(ps_modem_t *modem)
960 g_return_val_if_fail(modem != NULL, NULL);
964 TcorePlugin *_ps_modem_ref_plugin(ps_modem_t *modem)
966 g_return_val_if_fail(modem != NULL, NULL);
970 GDBusConnection *_ps_modem_ref_dbusconn(ps_modem_t *modem)
972 g_return_val_if_fail(modem != NULL, NULL);
976 CoreObject *_ps_modem_ref_co_modem(ps_modem_t *modem)
978 g_return_val_if_fail(modem != NULL, NULL);
979 return modem->co_modem;
982 gchar *_ps_modem_ref_cp_name(ps_modem_t *modem)
984 g_return_val_if_fail(modem != NULL, NULL);
985 return modem->cp_name;
988 GSList *_ps_modem_ref_contexts(ps_modem_t *modem)
990 g_return_val_if_fail(modem != NULL, NULL);
991 return modem->contexts;