#include <stdlib.h>
#include <stdbool.h>
#include <errno.h>
+#include <glib.h>
+#include <limits.h>
#ifdef TIZEN_FEATURE_TRACKER
#include <tracker.h>
static guint off_lock_timeout;
static guint padding_timeout;
static int prev_count;
+
+static GList *request_id_list;
+
#endif
static struct _lock_timeout {
}
}
+static void notice_lock_expired_done(void *data, GVariant *result, GError *err)
+{
+ int val, ret;
+ GList *l, *l_next;
+ char *id, *elem;
+ size_t len;
+
+ if (!result)
+ return;
+
+ g_variant_get(result, "(si)", &id, &val);
+
+ len = strlen(id) + 1;
+ for (l = request_id_list, l_next = g_list_next(l);
+ l && (elem = l->data) != NULL;
+ l = l_next, l_next = g_list_next(l), elem = NULL) {
+ if (!strncmp(id, elem, len))
+ break;
+ }
+ if (!elem)
+ return;
+
+ request_id_list = g_list_remove(request_id_list, elem);
+ free(elem);
+
+ if (val == 0) { /* Allow to lock cpu */
+ _I("Continue Power Lock");
+ return;
+ } else if (val == 1) { /* Release cpu lock */
+ ret = device_power_release_lock(POWER_LOCK_CPU);
+ if (ret != DEVICE_ERROR_NONE)
+ _E("Failed to release power(CPU) (%d)", ret);
+ }
+}
+
+static char *get_new_request_id(pid_t pid)
+{
+ char id[64];
+ snprintf(id, sizeof(id), "%d_%lu", pid, time(NULL));
+ return strdup(id);
+}
+
+static int notice_power_lock_expired(void)
+{
+ int ret;
+ pid_t pid;
+ char *req_id;
+ char *param[1];
+
+ pid = getpid();
+
+ req_id = get_new_request_id(pid);
+ if (!req_id) {
+ _E("Failed to get request id");
+ return ret;
+ }
+
+ param[0] = req_id;
+ ret = dbus_method_async_with_reply(
+ DEVICED_BUS_NAME,
+ DEVICED_PATH_DISPLAY,
+ DEVICED_INTERFACE_DISPLAY,
+ "LockTimeoutExpired",
+ "s", param,
+ notice_lock_expired_done,
+ -1,
+ NULL);
+ if (ret < 0) {
+ _E("Failed to notice power lock expired (%d)", ret);
+ return ret;
+ }
+
+ request_id_list = g_list_append(request_id_list, req_id);
+ _I("request ID %s is added", req_id);
+
+ return 0;
+}
+
static gboolean padding_timeout_expired(gpointer data)
{
int ret, ref;
}
out:
- remove_off_lock_timeout();
+ ret = notice_power_lock_expired();
+ if (ret < 0) {
+ _E("Failed to launch power lock expired popup (%d)", ret);
+ return G_SOURCE_CONTINUE;
+ }
- ret = device_power_release_lock(POWER_LOCK_CPU);
- if (ret != DEVICE_ERROR_NONE)
- _E("Failed to lock power(CPU) again(%d)", ret);
+ remove_off_lock_timeout();
return G_SOURCE_REMOVE;
}