#include <string.h>
#include <glib.h>
+#include <stdlib.h>
#include <tcore.h>
#include <server.h>
#include <manager.h>
#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)
co_call = co_call_other;
plugin_subs = plugin_subs_other;
}
- } else{
+ } else {
priv_data->is_end_all_initiated = FALSE;
}
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");
}
return TCORE_MANAGER_RETURN_CONTINUE;
-
}
+
enum tcore_manager_return manager_modem_process_request(Server *server,
UserRequest *ur)
{
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");
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)) {
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)
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,
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: {
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");
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;
set_nw_dds_ds_on_boot(manager);
#endif
}
- break;
+ break;
default:
break;