#include "power-internal.h"
#include "common.h"
-#define SLEEP_DBUS_SIGNAME "sleep"
-#define WAKEUP_DBUS_SIGNAME "wakeup"
+#define CHANGE_STATE_DBUS_SIGNAME "ChangeState"
#define DBUS_METHOD_SYNC_CALL_TIMEOUT_MS 10000 /* 10 second */
+#define EVENT_TYPE_SLEEP 0
+#define EVENT_TYPE_WAKEUP 1
+
struct userdata {
void *data;
sleep_callback callback;
};
-static int sleep_signal_subscribe_id = -1;
-static int wakeup_signal_subscribe_id = -1;
+static int change_state_signal_id = -1;
static void signal_unsubscribed_callback(void *data)
{
free(ud);
}
-static void handle_sleep_signal(GDBusConnection *connection, GVariant *parameters, void *user_data)
+static void signal_callback(GDBusConnection *connection,
+ const gchar *sender_name,
+ const gchar *object_path,
+ const gchar *interface_name,
+ const gchar *signal_name,
+ GVariant *parameters,
+ gpointer user_data)
{
- struct userdata *ud = (struct userdata *) user_data;
- guint64 sig_time_ms;
- guint64 sleep_id;
+ struct device_event_info info;
+ struct userdata *ud;
+ guint64 event_id;
int retval;
+ ud = (struct userdata *) user_data;
+
if (!ud || !ud->callback)
return;
- g_variant_get(parameters, "(tt)", &sig_time_ms, &sleep_id);
+ g_variant_get(parameters, "(iti)", &info.event, &event_id, &info.reason);
- retval = ud->callback(sig_time_ms, DEVICE_SIG_SLEEP_SHORTKEY, ud->data);
- if (retval == DEVICE_SLEEP_READY) {
+ retval = ud->callback(&info, ud->data);
+ if (info.event == EVENT_TYPE_SLEEP && retval == DEVICE_SLEEP_READY) {
g_dbus_connection_call_sync(connection,
DEVICED_BUS_NAME,
DEVICED_PATH_POWER,
DEVICED_INTERFACE_POWER,
"ConfirmSleepWait",
- g_variant_new("(i)", sleep_id),
+ g_variant_new("(i)", event_id),
NULL,
G_DBUS_CALL_FLAGS_NONE,
DBUS_METHOD_SYNC_CALL_TIMEOUT_MS,
}
}
-static void handle_wakeup_signal(GVariant *parameters, void *user_data)
-{
- struct userdata *ud = (struct userdata *) user_data;
- guint64 sig_time_ms;
- enum device_siginfo siginfo;
-
- if (!ud || !ud->callback)
- return;
-
- g_variant_get(parameters, "(tt)", &sig_time_ms, &siginfo);
- ud->callback(sig_time_ms, siginfo, ud->data);
-}
-
-static void signal_callback(GDBusConnection *connection,
- const gchar *sender_name,
- const gchar *object_path,
- const gchar *interface_name,
- const gchar *signal_name,
- GVariant *parameters,
- gpointer user_data)
-{
-
- if (!strncmp(signal_name, SLEEP_DBUS_SIGNAME, sizeof(SLEEP_DBUS_SIGNAME)))
- handle_sleep_signal(connection, parameters, user_data);
- else if (!strncmp(signal_name, WAKEUP_DBUS_SIGNAME, sizeof(WAKEUP_DBUS_SIGNAME)))
- handle_wakeup_signal(parameters, user_data);
-}
-
int device_power_add_sleep_callback(sleep_callback cb, void *data)
{
GDBusConnection *connection;
GError *err = NULL;
struct userdata *ud;
- if (sleep_signal_subscribe_id != -1)
+ if (change_state_signal_id != -1)
return DEVICE_ERROR_ALREADY_IN_PROGRESS;
connection = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &err);
return DEVICE_ERROR_OPERATION_FAILED;
}
- ud = malloc(sizeof(struct userdata));
- if (!ud) {
- _E("Failed to alloc user data");
- return DEVICE_ERROR_OPERATION_FAILED;
- }
-
retval = g_dbus_connection_call_sync(connection,
DEVICED_BUS_NAME,
DEVICED_PATH_POWER,
return DEVICE_ERROR_OPERATION_FAILED;
}
+ ud = malloc(sizeof(struct userdata));
+ if (!ud) {
+ _E("Failed to alloc user data");
+ return DEVICE_ERROR_OPERATION_FAILED;
+ }
+
ud->data = data;
ud->callback = cb;
- sleep_signal_subscribe_id = g_dbus_connection_signal_subscribe(connection,
+ change_state_signal_id = g_dbus_connection_signal_subscribe(connection,
DEVICED_BUS_NAME,
DEVICED_INTERFACE_POWER,
- SLEEP_DBUS_SIGNAME,
+ CHANGE_STATE_DBUS_SIGNAME,
DEVICED_PATH_POWER,
NULL,
G_DBUS_SIGNAL_FLAGS_NONE,
ud,
signal_unsubscribed_callback);
- wakeup_signal_subscribe_id = g_dbus_connection_signal_subscribe(connection,
- DEVICED_BUS_NAME,
- DEVICED_INTERFACE_POWER,
- WAKEUP_DBUS_SIGNAME,
- DEVICED_PATH_POWER,
- NULL,
- G_DBUS_SIGNAL_FLAGS_NONE,
- signal_callback,
- ud,
- NULL);
-
return DEVICE_ERROR_NONE;
}
GError *err = NULL;
GDBusConnection *connection;
- if (sleep_signal_subscribe_id == -1)
+ if (change_state_signal_id == -1)
return;
connection = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &err);
return;
}
- g_dbus_connection_signal_unsubscribe(connection, sleep_signal_subscribe_id);
- sleep_signal_subscribe_id = -1;
- g_dbus_connection_signal_unsubscribe(connection, wakeup_signal_subscribe_id);
- wakeup_signal_subscribe_id = -1;
+ g_dbus_connection_signal_unsubscribe(connection, change_state_signal_id);
+ change_state_signal_id = -1;
g_dbus_connection_call_sync(connection,
DEVICED_BUS_NAME,