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.
25 #include "ps_common.h"
26 #include "generated-code.h"
32 #include <user_request.h>
33 #include <co_context.h>
35 #define PS_MASTER_PATH "/"
36 #define PROP_DEFAULT FALSE
37 #define PROP_DEFAULT_STR NULL
39 /* [Wearable][sap-stack] SAPInterface.h */
40 #define SAP_CONN_TYPE_ALL 0x00
41 #define SAP_CONN_TYPE_BT 0x01
42 #define SAP_CONN_TYPE_MOBILE 0x10 /* scs */
44 static void __ps_master_emit_modem_added_signal(ps_master_t *master, gpointer modem);
45 /*static void __ps_master_emit_modem_removed_signal(ps_master_t *master, gpointer modem);*/
46 static void _ps_master_setup_interface(PacketServiceMaster *master, ps_master_t *master_data);
48 static void __ps_master_register_key_callback(gpointer master, enum tcore_storage_key key);
49 static void __ps_master_storage_key_callback(enum tcore_storage_key key, void *value, void *user_data);
51 static void __ps_master_handle_ups_mode(gpointer object, gchar *request)
53 ps_modem_t *modem = object;
54 GSList *contexts = NULL;
60 dbg("send dbus %s requeset", request);
61 contexts = modem->contexts;
62 if (contexts == NULL) {
67 for (index = 0; index < g_slist_length(contexts); index++) {
69 gpointer value = g_slist_nth_data(contexts, index);
70 ps_context_t *pscontext = (ps_context_t *)value;
71 int role = tcore_context_get_role(pscontext->co_context);
73 s_path = _ps_context_ref_path(value);
74 dbg("value(%p), path(%s)", value, s_path);
76 if (role == CONTEXT_ROLE_INTERNET && pscontext->is_default) {
77 if (!g_strcmp0(request, "IfaceDown"))
78 _ps_context_handle_ifacedown(value);
79 else if (!g_strcmp0(request, "IfaceUp"))
80 _ps_context_handle_ifaceup(value);
81 } else if (role == CONTEXT_ROLE_UNKNOWN || role == CONTEXT_ROLE_USER_DEFINED) {
82 warn("Not supported profile type: %d", role);
85 if (CONTEXT_STATE_ACTIVATED != tcore_context_get_state(pscontext->co_context))
88 if (!g_strcmp0(request, "InterfaceDown")) {
89 warn("disconnect context request.");
90 _ps_service_deactivate_context(pscontext->p_service, pscontext);
97 void __remove_master(gpointer data, gpointer user_data)
99 ps_master_t *master = data;
106 /*Need to remove the compelete hash table*/
107 g_hash_table_remove_all(master->modems);
109 /*Need to UNexport and Unref the master Object */
110 g_dbus_interface_skeleton_unexport(G_DBUS_INTERFACE_SKELETON(master->if_obj));
112 g_object_unref(master->if_obj);
114 /*Need to free the memory allocated for the members of the master*/
115 g_free(master->path);
122 static void __ps_master_emit_modem_added_signal(ps_master_t *master, gpointer modem)
125 GVariantBuilder properties;
127 dbg("get modem properties");
129 gv = _ps_modem_get_properties(modem, &properties);
130 packet_service_master_emit_modem_added(master->if_obj, gv);
136 static void __ps_master_emit_modem_removed_signal(ps_master_t *master, gpointer modem)
138 g_signal_emit(master, signals[SIG_MASTER_MODEM_REMOVED], 0, _ps_modem_ref_path(modem));
139 dbg("master (%p) emit the modem(%p) removed signal", master, modem);
143 static void __ps_master_register_key_callback(gpointer object, enum tcore_storage_key key)
145 ps_master_t *master = (ps_master_t *) object;
146 Server *s = tcore_plugin_ref_server(master->plg);
147 static Storage *strg;
149 strg = tcore_server_find_storage(s, "vconf");
150 tcore_storage_set_key_callback(strg, key, __ps_master_storage_key_callback, object);
155 static void __ps_master_storage_key_callback(enum tcore_storage_key key, void *value, void *user_data)
157 GVariant *tmp = NULL;
159 gpointer h_key, h_value;
160 gboolean type_check = FALSE;
161 ps_master_t *master = (ps_master_t *)user_data;
163 dbg("storage key(%d) callback", key);
164 g_return_if_fail(master != NULL);
166 tmp = (GVariant *)value;
168 err("value is null");
174 case KEY_DATA_ROAMING_SETTING:
175 case KEY_NETWORK_RESTRICT_MODE:
176 type_check = g_variant_is_of_type(tmp, G_VARIANT_TYPE_BOOLEAN);
178 err("wrong variant data type");
179 g_variant_unref(tmp);
184 case KEY_POWER_SAVING_MODE:
186 #ifdef POWER_SAVING_FEATURE_WEARABLE
187 case KEY_WECONN_ALL_CONNECTED:
189 type_check = g_variant_is_of_type(tmp, G_VARIANT_TYPE_INT32);
191 dbg("wrong variant data type");
192 g_variant_unref(tmp);
198 warn("unknown key (0x%x)", key);
202 g_hash_table_iter_init(&iter, master->modems);
203 while (g_hash_table_iter_next(&iter, &h_key, &h_value) == TRUE) {
204 if (key == KEY_3G_ENABLE) {
205 gboolean data_allowed = g_variant_get_boolean(tmp);
206 msg("[PSINFO] data_allowed [%d] changed", data_allowed);
207 #if defined(TIZEN_PS_FORCE_ATTACH_DETACH)
208 if (_ps_master_get_storage_value_int(master, KEY_WECONN_ALL_CONNECTED) > 0) {
210 int sap_conn_type = SAP_CONN_TYPE_ALL;
211 sap_conn_type = _ps_master_get_storage_value_int(master, KEY_SAP_CONNECTION_TYPE);
212 if (sap_conn_type == SAP_CONN_TYPE_BT) {
213 dbg("[Companion mode] ignore data_allowed.");
219 _ps_modem_set_data_allowed(h_value, data_allowed);
220 } else if (key == KEY_DATA_ROAMING_SETTING) {
221 gboolean roaming_allowed = g_variant_get_boolean(tmp);
222 msg("[PSINFO] roaming_allowed [%d] changed.", roaming_allowed);
223 _ps_modem_set_data_roaming_allowed(h_value, roaming_allowed);
224 } else if (key == KEY_POWER_SAVING_MODE) {
225 gint ps_mode = g_variant_get_int32(tmp);
226 #ifdef POWER_SAVING_FEATURE_WEARABLE
227 gboolean f_mode = _ps_modem_get_flght_mode(h_value);
228 gboolean f_mode_ups = _ps_modem_get_flght_mode_ups(h_value);
229 struct treq_modem_set_flightmode data = {0};
230 dbg("f_mode: %d, f_mode_ups: %d", f_mode, f_mode_ups);
232 if (ps_mode == POWER_SAVING_MODE_NORMAL) {
233 if (f_mode_ups != f_mode) {
234 dbg("set flight mode off");
235 data.enable = f_mode_ups;
237 } else if (ps_mode == POWER_SAVING_MODE_WEARABLE) {
239 dbg("set flight mode on");
240 /* save flight mode state when UPS off. */
241 _ps_modem_set_flght_mode_ups(h_value, _ps_modem_get_flght_mode(h_value));
245 err("Not supported");
248 _ps_modem_send_filght_mode_request(h_value, &data);
250 if (ps_mode == POWER_SAVING_MODE_NORMAL && ps_mode != _ps_modem_get_psmode(h_value))
251 warn("[PSINFO] UPS mode change: On -> Off ");
253 _ps_modem_set_psmode(h_value, ps_mode);
254 } else if (key == KEY_PM_STATE) {
255 gint pm_state = g_variant_get_int32(tmp);
256 gint ps_mode = _ps_modem_get_psmode(h_value);
257 dbg("current power saving mode: %d, pm_state: %d", ps_mode, pm_state);
258 if (ps_mode & POWER_SAVING_MODE_FMM) {
259 warn("UPS by FMM: Do not change data network state.");
262 if (pm_state == 3) {/* LCD Off */
263 if (ps_mode > POWER_SAVING_MODE_NORMAL && ps_mode < POWER_SAVING_MODE_WEARABLE) {
264 msg("[PSINFO] LCD OFF. Start Deactivate with power saving [%d]", ps_mode);
265 /* send dbus request pdp context deactivation. */
266 __ps_master_handle_ups_mode(h_value, "IfaceDown");
268 } else { /* LCD On or dimming */
269 if (ps_mode > POWER_SAVING_MODE_NORMAL && ps_mode < POWER_SAVING_MODE_WEARABLE) {
270 msg("[PSINFO] pm_state(%d) changed. Start activate with power saving [%d]", pm_state, ps_mode);
271 /* send dbus request pdp context activation. */
272 __ps_master_handle_ups_mode(h_value, "IfaceUp");
275 } else if (key == KEY_NETWORK_RESTRICT_MODE) {
276 gboolean b_network_restrict = g_variant_get_boolean(tmp);
277 if (b_network_restrict) {
278 msg("[PSINFO] network restricted mode on");
279 _ps_modem_set_data_allowed(h_value, FALSE);
281 gboolean key_3g_enable = FALSE;
282 msg("[PSINFO] network restricted mode off");
283 key_3g_enable = _ps_master_get_storage_value_bool(master, KEY_3G_ENABLE);
284 _ps_modem_set_data_allowed(h_value, key_3g_enable);
286 #ifdef STORAGE_KEY_WECONN_ALL_CONNECTED
287 } else if (key == KEY_WECONN_ALL_CONNECTED) {
288 int b_wms_connected = g_variant_get_int32(tmp);
289 if (b_wms_connected) {
290 int sap_conn_type = SAP_CONN_TYPE_ALL;
291 sap_conn_type = _ps_master_get_storage_value_int(master, KEY_SAP_CONNECTION_TYPE);
292 if (sap_conn_type == SAP_CONN_TYPE_BT) {
293 msg("[PSINFO][Wearable] Companinon mode. set data allowed FALSE");
294 _ps_modem_set_data_allowed(h_value, FALSE);
297 gboolean key_3g_enable = FALSE;
298 key_3g_enable = _ps_master_get_storage_value_bool(master, KEY_3G_ENABLE);
299 msg("[PSINFO][Wearable] Standalone mode. set data allowed (%d)", key_3g_enable);
300 _ps_modem_set_data_allowed(h_value, key_3g_enable);
309 gpointer _ps_master_create_master(GDBusConnection *conn, TcorePlugin *p)
311 PacketServiceMaster *master = NULL;
312 ps_master_t *new_master = NULL;
313 GError *error = NULL;
315 dbg("master object create");
316 g_return_val_if_fail(conn != NULL, NULL);
318 /*creating the master object for the interface com.tcore.ps.master*/
319 master = packet_service_master_skeleton_new();
320 g_return_val_if_fail(master != NULL, NULL);
323 /*Initializing the master list for internal referencing*/
324 new_master = g_try_malloc0(sizeof(ps_master_t));
325 if (NULL == new_master) {
326 err("Unable to allocate memory for master");
330 new_master->conn = conn;
331 new_master->path = g_strdup(PS_MASTER_PATH);
333 new_master->if_obj = master;
334 new_master->modems = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, __remove_modem_handler);
336 /*Setting Up the call backs for the interface*/
337 _ps_master_setup_interface(master, new_master);
339 /*exporting the interface object to the path mention for master*/
340 g_dbus_interface_skeleton_export(G_DBUS_INTERFACE_SKELETON(master),
345 g_assert_no_error(error);
347 /*Registering the key callbacks for values in storage settings */
348 __ps_master_register_key_callback(new_master, KEY_3G_ENABLE);
349 __ps_master_register_key_callback(new_master, KEY_DATA_ROAMING_SETTING);
350 #if defined(TIZEN_UPS_ENABLED)
351 __ps_master_register_key_callback(new_master, KEY_POWER_SAVING_MODE);
352 __ps_master_register_key_callback(new_master, KEY_PM_STATE);
354 /* __ps_master_register_key_callback(new_master, KEY_PM_STATE); */
355 #if defined(TIZEN_PS_FORCE_ATTACH_DETACH)
356 __ps_master_register_key_callback(new_master, KEY_WECONN_ALL_CONNECTED);
359 /*Alarm manager init*/
360 dbg("init alarm manager.");
361 if (alarmmgr_init("packetservice") != ALARMMGR_RESULT_SUCCESS) {
362 err("Failed to init alarm manager");
365 /*Adding Hook for modem addition laters*/
366 tcore_server_add_notification_hook(tcore_plugin_ref_server(p),
367 TNOTI_SERVER_ADDED_MODEM_PLUGIN, __on_hook_modem_added, new_master);
369 /*Adding Hook for modem removal laters*/
370 tcore_server_add_notification_hook(tcore_plugin_ref_server(p),
371 TNOTI_SERVER_REMOVED_MODEM_PLUGIN, __on_hook_modem_removed, new_master);
373 dbg("Successfully created the master");
377 err("Unable to create master");
378 g_object_unref(master);
382 gboolean _ps_master_create_modems(gpointer object, TcorePlugin *modem_plg)
385 gpointer modem = NULL, tmp = NULL;
386 ps_master_t *master = NULL;
387 CoreObject *co_modem = NULL;
388 gchar *modem_name = NULL;
389 gchar *cp_name = NULL;
391 dbg("create modem objects");
392 g_return_val_if_fail(object != NULL, FALSE);
394 master = (ps_master_t *)object;
396 cp_name = (gchar *)tcore_server_get_cp_name_by_plugin(modem_plg);
397 modem_name = g_strdup_printf("/%s", cp_name);
398 tmp = g_hash_table_lookup(master->modems, modem_name);
400 dbg("modem (%p) already existed", tmp);
405 co_modem = tcore_plugin_ref_core_object(modem_plg, CORE_OBJECT_TYPE_MODEM);
407 modem = _ps_modem_create_modem(master->conn, master->plg,
408 master, modem_name, co_modem, cp_name);
410 dbg("fail to create modem");
415 g_hash_table_insert(master->modems, g_strdup(modem_name), modem);
416 dbg("modem (%p) created at path %s", modem , modem_name);
418 __ps_master_emit_modem_added_signal(master, modem);
423 /*Need to walk through all modem if any present before packet service intialization*/
425 TcorePlugin *p = NULL;
426 GSList *plist_head = NULL;
427 GSList *plist = NULL;
428 GSList *modemlist_head = NULL;
429 GSList *modemlist = NULL;
431 s = tcore_plugin_ref_server(master->plg);
432 plist_head = tcore_server_get_modem_plugin_list(s);
435 dbg("Modem plugin is not present");
443 modemlist_head = tcore_plugin_get_core_objects_bytype(p, CORE_OBJECT_TYPE_MODEM);
444 if (!modemlist_head) {
445 dbg("Found no modem core-objects");
449 modemlist = modemlist_head;
451 co_modem = modemlist->data;
452 cp_name = (gchar *)tcore_server_get_cp_name_by_plugin(tcore_object_ref_plugin(co_modem));
453 modem_name = g_strdup_printf("/%s", cp_name);
454 tmp = g_hash_table_lookup(master->modems, modem_name);
456 dbg("modem (%p) already existed", tmp);
457 modemlist = modemlist->next;
462 modem = _ps_modem_create_modem(master->conn, master->plg, master, modem_name, co_modem, cp_name);
464 dbg("Fail to create modem ");
465 modemlist = modemlist->next;
470 g_hash_table_insert(master->modems, g_strdup(modem_name), modem);
471 dbg("modem (%p) created at path %s", modem , modem_name);
473 __ps_master_emit_modem_added_signal(master, modem);
476 modemlist = modemlist->next;
478 g_slist_free(modemlist_head);
482 g_slist_free(plist_head);
487 gboolean _ps_master_destroy_modem(gpointer object, TcorePlugin *plugin)
489 ps_master_t *master = NULL;
494 dbg("destroy modem object");
496 master = (ps_master_t *)object;
498 modem_name = g_strdup_printf("/%s",
499 tcore_server_get_cp_name_by_plugin(plugin));
501 modem = g_hash_table_lookup(master->modems, modem_name);
503 dbg("modem '%s' doesn't exists", modem_name);
509 dbg("Destroying modem object for '%s' modem[%p]", modem_name, modem);
510 _ps_modem_destroy_modem(master->conn, modem);
512 if (g_hash_table_remove(master->modems, modem_name) == TRUE)
513 dbg("Removed modem '%s'", modem_name);
520 gboolean _ps_master_get_storage_value_bool(gpointer object, enum tcore_storage_key key)
523 Storage *strg = NULL;
524 ps_master_t *master = object;
526 g_return_val_if_fail(master != NULL, FALSE);
527 s = tcore_plugin_ref_server(master->plg);
528 strg = tcore_server_find_storage(s, "vconf");
530 return tcore_storage_get_bool(strg, key);;
533 gint _ps_master_get_storage_value_int(gpointer object, enum tcore_storage_key key)
536 Storage *strg = NULL;
537 ps_master_t *master = object;
539 g_return_val_if_fail(master != NULL, FALSE);
540 s = tcore_plugin_ref_server(master->plg);
541 strg = tcore_server_find_storage(s, "vconf");
543 return tcore_storage_get_int(strg, key);;
546 gboolean _ps_master_set_storage_value_bool(gpointer object, enum tcore_storage_key key, gboolean value)
549 Storage *strg = NULL;
550 ps_master_t *master = object;
552 g_return_val_if_fail(master != NULL, FALSE);
553 s = tcore_plugin_ref_server(master->plg);
554 strg = tcore_server_find_storage(s, "vconf");
556 return tcore_storage_set_bool(strg, key, value);
559 gboolean _ps_master_set_storage_value_int(gpointer object, enum tcore_storage_key key, gint value)
562 Storage *strg = NULL;
563 ps_master_t *master = object;
565 g_return_val_if_fail(master != NULL, FALSE);
566 s = tcore_plugin_ref_server(master->plg);
567 strg = tcore_server_find_storage(s, "vconf");
569 return tcore_storage_set_int(strg, key, value);
572 static gboolean on_master_get_modems(PacketServiceMaster *obj_master,
573 GDBusMethodInvocation *invocation,
576 GVariantBuilder b_modem;
581 ps_master_t *master = user_data;
582 TcorePlugin *p = (master) ? master->plg : NULL;
583 PsPrivInfo *priv_info = tcore_plugin_ref_user_data(p);
584 cynara *p_cynara = (priv_info) ? priv_info->p_cynara : NULL;
586 if (!ps_util_check_access_control(p_cynara, invocation, AC_PS_PUBLIC, "r"))
591 if (master->modems == NULL) {
592 err("No modem Present");
593 FAIL_RESPONSE(invocation, PS_ERR_INTERNAL);
597 g_variant_builder_init(&b_modem, G_VARIANT_TYPE("a{sa{ss}}"));
599 g_hash_table_iter_init(&iter, master->modems);
600 while (g_hash_table_iter_next(&iter, &key, &value) == TRUE) {
603 path = _ps_modem_ref_path(value);
604 dbg("modem path [%s]", path);
606 g_variant_builder_open(&b_modem, G_VARIANT_TYPE("{sa{ss}}"));
607 g_variant_builder_add(&b_modem, "s", g_strdup(path));
608 if (FALSE == _ps_modem_get_properties_handler(value, &b_modem)) {
609 err("Unable to get the modem properties");
610 g_variant_builder_close(&b_modem);
611 FAIL_RESPONSE(invocation, PS_ERR_INTERNAL);
614 g_variant_builder_close(&b_modem);
616 modems = g_variant_builder_end(&b_modem);
618 packet_service_master_complete_get_modems(obj_master, invocation, modems);
622 static void _ps_master_setup_interface(PacketServiceMaster *master, ps_master_t *master_data)
626 g_signal_connect(master,
628 G_CALLBACK(on_master_get_modems),