4 #include <libsyscommon/libgdbus.h>
6 #include "power-internal.h"
9 #define SLEEP_DBUS_SIGNAME "sleep"
10 #define WAKEUP_DBUS_SIGNAME "wakeup"
11 #define DBUS_METHOD_SYNC_CALL_TIMEOUT_MS 10000 /* 10 second */
15 sleep_callback callback;
18 static int sleep_signal_subscribe_id = -1;
19 static int wakeup_signal_subscribe_id = -1;
21 static void signal_unsubscribed_callback(void *data)
23 struct userdata *ud = (struct userdata *) data;
28 static void handle_sleep_signal(GDBusConnection *connection, GVariant *parameters, void *user_data)
30 struct userdata *ud = (struct userdata *) user_data;
35 if (!ud || !ud->callback)
38 g_variant_get(parameters, "(tt)", &sig_time_ms, &sleep_id);
40 retval = ud->callback(sig_time_ms, DEVICE_SIG_SLEEP_SHORTKEY, ud->data);
41 if (retval == DEVICE_SLEEP_READY) {
42 g_dbus_connection_call_sync(connection,
45 DEVICED_INTERFACE_POWER,
47 g_variant_new("(i)", sleep_id),
49 G_DBUS_CALL_FLAGS_NONE,
50 DBUS_METHOD_SYNC_CALL_TIMEOUT_MS,
56 static void handle_wakeup_signal(GVariant *parameters, void *user_data)
58 struct userdata *ud = (struct userdata *) user_data;
60 enum device_siginfo siginfo;
62 if (!ud || !ud->callback)
65 g_variant_get(parameters, "(tt)", &sig_time_ms, &siginfo);
66 ud->callback(sig_time_ms, siginfo, ud->data);
69 static void signal_callback(GDBusConnection *connection,
70 const gchar *sender_name,
71 const gchar *object_path,
72 const gchar *interface_name,
73 const gchar *signal_name,
78 if (!strncmp(signal_name, SLEEP_DBUS_SIGNAME, sizeof(SLEEP_DBUS_SIGNAME)))
79 handle_sleep_signal(connection, parameters, user_data);
80 else if (!strncmp(signal_name, WAKEUP_DBUS_SIGNAME, sizeof(WAKEUP_DBUS_SIGNAME)))
81 handle_wakeup_signal(parameters, user_data);
84 int device_power_add_sleep_callback(sleep_callback cb, void *data)
86 GDBusConnection *connection;
91 if (sleep_signal_subscribe_id != -1)
92 return DEVICE_ERROR_ALREADY_IN_PROGRESS;
94 connection = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &err);
96 _E("Failed to get dbus connection, %s", err->message);
98 return DEVICE_ERROR_OPERATION_FAILED;
101 ud = malloc(sizeof(struct userdata));
103 _E("Failed to alloc user data");
104 return DEVICE_ERROR_OPERATION_FAILED;
107 retval = g_dbus_connection_call_sync(connection,
110 DEVICED_INTERFACE_POWER,
114 G_DBUS_CALL_FLAGS_NONE,
115 DBUS_METHOD_SYNC_CALL_TIMEOUT_MS,
118 if (!retval || err) {
119 _E("Failed to request AddSleepWait, %s", err->message);
121 return DEVICE_ERROR_OPERATION_FAILED;
127 sleep_signal_subscribe_id = g_dbus_connection_signal_subscribe(connection,
129 DEVICED_INTERFACE_POWER,
133 G_DBUS_SIGNAL_FLAGS_NONE,
136 signal_unsubscribed_callback);
138 wakeup_signal_subscribe_id = g_dbus_connection_signal_subscribe(connection,
140 DEVICED_INTERFACE_POWER,
144 G_DBUS_SIGNAL_FLAGS_NONE,
149 return DEVICE_ERROR_NONE;
152 void device_power_remove_sleep_callback(void)
155 GDBusConnection *connection;
157 if (sleep_signal_subscribe_id == -1)
160 connection = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &err);
162 _E("Failed to get dbus connection, %s", err->message);
167 g_dbus_connection_signal_unsubscribe(connection, sleep_signal_subscribe_id);
168 sleep_signal_subscribe_id = -1;
169 g_dbus_connection_signal_unsubscribe(connection, wakeup_signal_subscribe_id);
170 wakeup_signal_subscribe_id = -1;
172 g_dbus_connection_call_sync(connection,
175 DEVICED_INTERFACE_POWER,
179 G_DBUS_CALL_FLAGS_NONE,
180 DBUS_METHOD_SYNC_CALL_TIMEOUT_MS,