Fix device API handling poweroff
[platform/core/telephony/tel-plugin-manager.git] / src / manager_modem.c
index 9c42cfe..97f8b44 100644 (file)
@@ -20,6 +20,7 @@
 
 #include <string.h>
 #include <glib.h>
+#include <stdlib.h>
 #include <tcore.h>
 #include <server.h>
 #include <manager.h>
@@ -39,6 +40,8 @@
 #include "tfeature.h"
 
 #include <vconf.h>
+#include <system_info.h>
+#include <device/power-internal.h>
 
 /*
  * Timeout of 1 second for normal cases, we may have to consider 4 sec for Verizon.
 #define MANAGER_DEFAULT_TIMEOUT        (5 * 1000)
 #define MANAGER_RETRY_TIMEOUT  (1 * 1000)
 
-
-/*
- * Dbus interface info for power off wait timer handling
- */
-#define DEVICED_BUS_NAME                                       "org.tizen.system.deviced"
-#define DEVICED_OBJECT_PATH                                    "/Org/Tizen/System/DeviceD"
-#define DEVICED_INTERFACE_NAME              DEVICED_BUS_NAME
-
-#define DEVICED_PATH_REBOOT                                    DEVICED_OBJECT_PATH"/Reboot"
-#define DEVICED_PATH_POWEROFF                          DEVICED_OBJECT_PATH"/PowerOff"
-
-#define DEVICED_INTERFACE_REBOOT                       DEVICED_INTERFACE_NAME".reboot"
-#define DEVICED_INTERFACE_POWEROFF                     DEVICED_INTERFACE_NAME".PowerOff"
-
-#define DBUS_METHOD_ADD_POWEROFF_WAIT          "AddPoweroffWait"
-#define DBUS_METHOD_REMOVE_POWEROFF_WAIT       "RemovePoweroffWait"
-#define DBUS_SIGNAL_POWEROFF_STATE                     "ChangeState"
-
-static void __manager_modem_add_poweroff_wait(ModemPrivateInfo *modem_info);
-
 static enum tcore_hook_return on_noti_hook_manager_call_status_idle(Server *server,
                                                                       CoreObject *source, enum tcore_notification_command command,
                                                                       unsigned int data_len, void *data, void *user_data)
@@ -130,7 +113,7 @@ static enum tcore_manager_return __handle_flight_mode_end(Server *server, UserRe
                        co_call = co_call_other;
                        plugin_subs = plugin_subs_other;
                }
-       } else{
+       } else {
                priv_data->is_end_all_initiated = FALSE;
        }
 
@@ -146,7 +129,7 @@ static enum tcore_manager_return __handle_flight_mode_end(Server *server, UserRe
                tcore_user_request_set_command(new_ur, TREQ_CALL_END);
                tcore_user_request_set_data(new_ur, sizeof(struct treq_call_end), &req);
                if (TCORE_RETURN_SUCCESS != tcore_server_dispatch_request(server, new_ur)) {
-                       err("END_ALL request failed!!r");
+                       err("END_ALL request failed!!");
                        tcore_user_request_free(new_ur);
                } else {
                        info("queueing flight mode request");
@@ -156,8 +139,8 @@ static enum tcore_manager_return __handle_flight_mode_end(Server *server, UserRe
        }
 
        return TCORE_MANAGER_RETURN_CONTINUE;
-
 }
+
 enum tcore_manager_return manager_modem_process_request(Server *server,
                                                        UserRequest *ur)
 {
@@ -262,12 +245,9 @@ static void __request_modem_poweroff(TcorePlugin *modem_plugin)
        dbg("done");
 }
 
-static void __manager_modem_poweroff_signal_handler(GDBusConnection *connection,
-                                                            const gchar *sender_name, const gchar *object_path,
-                                                            const gchar *interface_name, const gchar *signal_name,
-                                                            GVariant *parameters, gpointer user_data)
+static void manager_modem_poweroff_handler(device_power_state_e prev_state, device_power_state_e next_state,
+                                                            uint64_t wait_callback_id, device_power_transition_reason_e reason, void *user_data)
 {
-
        ModemPrivateInfo *modem_info = user_data;
        TcorePlugin *modem_plugin = NULL;
        dbg("enter");
@@ -275,123 +255,20 @@ static void __manager_modem_poweroff_signal_handler(GDBusConnection *connection,
        if (G_UNLIKELY(!modem_info))
                return;
 
-       if (g_strcmp0(signal_name, DBUS_SIGNAL_POWEROFF_STATE) == 0) {
-               modem_plugin = tcore_object_ref_plugin(modem_info->co_modem);
-               dbg("poweroff state changed is happened");
-               __request_modem_poweroff(modem_plugin);
-       }
-       dbg("done");
-
-}
-
-static void __manager_modem_poweroff_subscribe_signal(ModemPrivateInfo *modem_info)
-{
-       dbg("enter");
-
-       if (G_UNLIKELY(!modem_info)) {
-               err("Invalid data");
-               return;
-       }
-
-       if (!modem_info->sys_power.conn) {
-               GError *error = NULL;
-
-               modem_info->sys_power.conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
-               if (modem_info->sys_power.conn == NULL) {
-                       err("GDBusconnection is NULL: [%s]", error->message);
-                       g_error_free(error);
-                       return;
-               }
-               modem_info->sys_power.set_poweroff_wait = FALSE;
-       }
-
-       if (!modem_info->sys_power.ca) {
-               modem_info->sys_power.ca = g_cancellable_new();
-       }
-
-       if (modem_info->sys_power.subs_id_power_off) {
-               dbg("g_dbus_connection_signal_subscribe() for poweroff_state has been already done.");
-               return;
-       }
-
-       modem_info->sys_power.subs_id_power_off = g_dbus_connection_signal_subscribe(modem_info->sys_power.conn,
-                                                                                       NULL,
-                                                                                       DEVICED_INTERFACE_POWEROFF,
-                                                                                       DBUS_SIGNAL_POWEROFF_STATE,
-                                                                                       DEVICED_PATH_POWEROFF, NULL, G_DBUS_SIGNAL_FLAGS_NONE,
-                                                                                       __manager_modem_poweroff_signal_handler, modem_info, NULL);
-
-
-       if (modem_info->sys_power.subs_id_power_off == 0) {
-               err("g_dbus_connection_signal_subscribe() is failed.");
-               g_object_unref(modem_info->sys_power.conn);
-       }
-
-       dbg("done");
-
-}
-
-static void __manager_modem_poweroff_unsubscribe_signal(ModemPrivateInfo *modem_info)
-{
-       dbg("enter");
-
-       if (G_UNLIKELY(!modem_info)) {
-               err("Invalid data");
-               return;
-       }
-
-       if (modem_info->sys_power.subs_id_power_off > 0) {
-               g_dbus_connection_signal_unsubscribe(modem_info->sys_power.conn, modem_info->sys_power.subs_id_power_off);
-               modem_info->sys_power.subs_id_power_off = 0;
-       }
-
-       if (modem_info->sys_power.ca) {
-               g_cancellable_cancel(modem_info->sys_power.ca);
-               g_object_unref(modem_info->sys_power.ca);
-       }
-
-       if (modem_info->sys_power.conn) {
-               g_object_unref(modem_info->sys_power.conn);
-               modem_info->sys_power.conn = NULL;
-       }
+       modem_info->poweroff_id = wait_callback_id;
 
-       modem_info->sys_power.set_poweroff_wait = FALSE;
+       modem_plugin = tcore_object_ref_plugin(modem_info->co_modem);
+       dbg("poweroff state changed is happened");
+       __request_modem_poweroff(modem_plugin);
 
        dbg("done");
-
 }
 
-static void __manager_modem_add_poweroff_wait_cb(GObject *source_object, GAsyncResult *res, gpointer user_data)
+static void mamager_modem_register_poweroff_handler(ModemPrivateInfo *modem_info)
 {
-       GError *error = NULL;
-       GDBusConnection *conn = NULL;
-       int result = -1;
-       GVariant *dbus_result = NULL;
-       ModemPrivateInfo *modem_info = user_data;
-
-       dbg("enter");
-
-       conn = G_DBUS_CONNECTION(source_object);
-       dbus_result = g_dbus_connection_call_finish(conn, res, &error);
-       if (error) {
-               err("Failed: %s", error->message);
-               g_error_free(error);
-       } else {
-               dbg("PoweroffWait Added Successufully");
-               modem_info->sys_power.set_poweroff_wait = TRUE;
-       }
+       int ret;
+       char *profile = NULL;
 
-       if (dbus_result) {
-               g_variant_get(dbus_result, "(i)", &result);
-               g_variant_unref(dbus_result);
-       }
-
-       dbg("result : %d", result);
-}
-
-
-static void __manager_modem_add_poweroff_wait(ModemPrivateInfo *modem_info)
-{
        dbg("enter");
 
        if (G_UNLIKELY(!modem_info)) {
@@ -399,71 +276,27 @@ static void __manager_modem_add_poweroff_wait(ModemPrivateInfo *modem_info)
                return;
        }
 
-       if (modem_info->sys_power.set_poweroff_wait == TRUE) {
+       /*      Poweroff signal support should be executed only mobile and wearable profile.
+               In case of TV or IoT profile etc... (dongle modem support case),
+               dongle modem can be power off with udev_remove event.  */
+       ret = system_info_get_platform_string("tizen.org/feature/profile", &profile);
+       if (ret != SYSTEM_INFO_ERROR_NONE) {
+               err("system_info_get_platform_string() failed!!! (%d,%s)", ret, get_error_message(ret));
                return;
        }
 
-       if (modem_info->sys_power.conn) {
-               g_dbus_connection_call(modem_info->sys_power.conn, DEVICED_BUS_NAME,
-                                       DEVICED_PATH_REBOOT, DEVICED_INTERFACE_REBOOT, DBUS_METHOD_ADD_POWEROFF_WAIT,
-                                       NULL, NULL, G_DBUS_CALL_FLAGS_NONE,
-                                       MANAGER_DEFAULT_TIMEOUT, modem_info->sys_power.ca,
-                                       __manager_modem_add_poweroff_wait_cb, modem_info);
-       }
-
-       dbg("done");
-
-       return;
-}
-
-static void __manager_modem_remove_poweroff_wait_cb(GObject *source_object, GAsyncResult *res, gpointer user_data)
-{
-       GError *error = NULL;
-       GDBusConnection *conn = NULL;
-       int result = -1;
-       GVariant *dbus_result = NULL;
-       ModemPrivateInfo *modem_info = user_data;
-
-       dbg("enter");
-
-       conn = G_DBUS_CONNECTION(source_object);
-       dbus_result = g_dbus_connection_call_finish(conn, res, &error);
-       if (error) {
-               err("Failed: %s", error->message);
-               g_error_free(error);
-       } else {
-               dbg("PoweroffWait Removed Successufully");
-               modem_info->sys_power.set_poweroff_wait = FALSE;
-       }
-
-       if (dbus_result) {
-               g_variant_get(dbus_result, "(i)", &result);
-               g_variant_unref(dbus_result);
-       }
-
-       dbg("result : %d", result);
-}
-
-static void __manager_modem_remove_poweroff_wait(ModemPrivateInfo *modem_info)
-{
-       dbg("enter");
-
-       if (G_UNLIKELY(!modem_info)) {
-               err("Invalid data");
+       dbg("profile: %s", profile);
+       if (g_strcmp0(profile, "mobile") && g_strcmp0(profile, "wearable")) {
+               dbg("No need to subscribe poweroff signal handling to deviced");
+               free(profile);
                return;
        }
+       if (profile)
+               free(profile);
 
-       if (modem_info->sys_power.conn) {
-               g_dbus_connection_call(modem_info->sys_power.conn, DEVICED_BUS_NAME,
-                                       DEVICED_PATH_REBOOT, DEVICED_INTERFACE_REBOOT, DBUS_METHOD_REMOVE_POWEROFF_WAIT,
-                                       NULL, NULL, G_DBUS_CALL_FLAGS_NONE,
-                                       MANAGER_DEFAULT_TIMEOUT, modem_info->sys_power.ca,
-                                       __manager_modem_remove_poweroff_wait_cb, NULL);
-
-               modem_info->sys_power.set_poweroff_wait = FALSE;
-       }
+       device_power_add_state_wait_callback(DEVICE_POWER_STATE_POWEROFF | DEVICE_POWER_STATE_REBOOT, manager_modem_poweroff_handler, modem_info);
 
-       return;
+       dbg("done");
 }
 
 gboolean manager_modem_initialize_private_info(ModemBoard *mb)
@@ -482,36 +315,37 @@ gboolean manager_modem_initialize_private_info(ModemBoard *mb)
        mb->modem_info->co_modem = tcore_plugin_ref_core_object(mb->modem_plugin, CORE_OBJECT_TYPE_MODEM);
        mb->modem_info->modem_status = MODEM_STATE_UNKNOWN;
 
+       /* For executing CP detach process when Device Power off */
+       /* It should be subscribed power off waiting timer to deviced */
+       /* Poweroff timer should be added only one time, in case of modem index (0) */
        if (mb->index == MANAGER_MODEM_BOARD_INDEX_0) {
-               dbg("__manager_power_subscribe_signal() for modem index (%d)", mb->index);
-               __manager_modem_poweroff_subscribe_signal(mb->modem_info);
+               dbg("manager_modem_register_poweroff_handler() for modem index (%d)", mb->index);
+               mamager_modem_register_poweroff_handler(mb->modem_info);
        }
 
        dbg("Initialized modem private info");
        return TRUE;
 }
 
-gboolean manager_modem_clear_private_info(ModemBoard *mb)
+void manager_modem_clear_private_info(ModemBoard *mb)
 {
 
        dbg("enter");
 
        if (G_UNLIKELY(!mb || !mb->modem_info)) {
                err("Invalid data");
-               return FALSE;
+               return;
        }
 
        if (mb->index == MANAGER_MODEM_BOARD_INDEX_0) {
-               dbg("__manager_power_unsubscribe_signal() for modem index (%d)", mb->index);
-               __manager_modem_poweroff_unsubscribe_signal(mb->modem_info);
+               dbg("device_power_remove_state_wait_callback() for modem index (%d)", mb->index);
+               device_power_remove_state_wait_callback(DEVICE_POWER_STATE_POWEROFF | DEVICE_POWER_STATE_REBOOT);
        }
 
        g_free(mb->modem_info);
        mb->modem_info = NULL;
 
        dbg("done");
-
-       return TRUE;
 }
 
 enum tcore_manager_return manager_modem_process_notification(Manager *manager,
@@ -534,11 +368,15 @@ enum tcore_manager_return manager_modem_process_notification(Manager *manager,
                const struct tnoti_modem_power *modem_power = data;
 
                switch (modem_power->state) {
-               case MODEM_STATE_ERROR:
+               case MODEM_STATE_ERROR: {
                        dbg("Modem RESET happened");
+
                        manager_network_process_modem_error(source);
                        manager_call_process_modem_error(source);
+                       manager_sim_process_modem_error(source);
+
                        priv_data->fm_processing_state = MANAGER_FLIGHT_PROCESSING_NONE;
+               }
                        break;
 
                case MODEM_STATE_ONLINE: {
@@ -547,18 +385,8 @@ enum tcore_manager_return manager_modem_process_notification(Manager *manager,
                        manager_util_write_to_proc_file(msg, strlen(msg));
                        g_free(msg);
 
-                       /* For executing CP detach process when Device Power off */
-                       /* It should be subscribed power off waiting timer to deviced */
-                       /* Poweroff timer should be added only one time, in case of modem index (0) */
-                       if (mb->index == MANAGER_MODEM_BOARD_INDEX_0) {
-                               dbg("Should add poweroff timer in case of modem index(0)");
-                               if (!mb->modem_info->sys_power.set_poweroff_wait) {
-                                       //__manager_power_subscribe_signal(mb->modem_info);
-                                       __manager_modem_add_poweroff_wait(mb->modem_info);
-                               }
-                       }
                }
-               break;
+                       break;
 
                case MODEM_STATE_OFFLINE: {
                        dbg("MODEM_STATE has been changed to OFFLINE");
@@ -569,12 +397,13 @@ enum tcore_manager_return manager_modem_process_notification(Manager *manager,
                        if (mb->index == MANAGER_MODEM_BOARD_INDEX_0) {
                                dbg("Should removed poweroff timer in case of modem index (0)");
 
-                               if (mb->modem_info->sys_power.set_poweroff_wait == TRUE) {
-                                       __manager_modem_remove_poweroff_wait(mb->modem_info);
+                               if (mb->modem_info->poweroff_id > 0) {
+                                       device_power_confirm_wait_callback(mb->modem_info->poweroff_id);
+                                       mb->modem_info->poweroff_id = 0;
                                }
                        }
                }
-               break;
+                       break;
 
                default:
                        break;
@@ -584,7 +413,7 @@ enum tcore_manager_return manager_modem_process_notification(Manager *manager,
                set_nw_dds_ds_on_boot(manager);
 #endif
        }
-       break;
+               break;
 
        default:
                break;