From: Jiwoong Im Date: Mon, 14 Nov 2016 10:13:51 +0000 (+0900) Subject: send SYS_EVENT_BOOT_COMPLETED event X-Git-Tag: accepted/tizen/3.0/common/20161125.101803^0 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=89abea5efd475de7364ff06461f21222a5199521;p=platform%2Fcore%2Fappfw%2Fevent-system.git send SYS_EVENT_BOOT_COMPLETED event - Listen system & user finished signal which is sent by systemd and send SYS_EVENT_BOOT_COMPLETED event to system session. Change-Id: I8b6768f4abb4526a81f02ac1950f2fff62265d0d Signed-off-by: Jiwoong Im --- diff --git a/include/eventsystem_daemon.h b/include/eventsystem_daemon.h index 9fa24ce..a5aaa8f 100644 --- a/include/eventsystem_daemon.h +++ b/include/eventsystem_daemon.h @@ -42,9 +42,11 @@ extern "C" { #define ESD_BOOT_COMPLETED "/tmp/esd_ready" -#define LOGIND_INTERFACE "org.freedesktop.login1.Manager" -#define LOGIND_PATH "/org/freedesktop/login1" -#define LOGIND_SIGNAL_USER_NEW "UserNew" +#define SYSTEMD_DBUS_DEST "org.freedesktop.systemd1" +#define SYSTEMD_DBUS_IFACE_MANAGER SYSTEMD_DBUS_DEST ".Manager" +#define SYSTEMD_DBUS_PATH "/org/freedesktop/systemd1" +#define SYSTEMD_DBUS_SIGNAL_STARTUP_FINISHED "StartupFinished" +#define SYSTEMD_DBUS_SIGNAL_USER_STARTUP_FINISHED "UserSessionStartupFinished" int __esd_register_vconf_callbacks(void); diff --git a/src/esd_main.c b/src/esd_main.c index 7c9e270..c7fb780 100644 --- a/src/esd_main.c +++ b/src/esd_main.c @@ -69,8 +69,9 @@ typedef struct __earlier_table_item { bundle *earlier_data; /* event-data from earlier occurrence */ } earlier_item; -static bool g_is_bootcompleted = false; #endif +static bool system_bootcompleted; +static bool user_bootcompleted; static GHashTable *user_last_event_table; /* table of user events for last data */ @@ -884,7 +885,6 @@ static void __esd_earlier_table_print_items(void) static void __esd_earlier_event_handler(char *event_name, bundle *data, void *user_data) { - int handle; earlier_item *item; _D("event_name(%s)", event_name); @@ -895,15 +895,6 @@ static void __esd_earlier_event_handler(char *event_name, bundle *data, void *us bundle_free(item->earlier_data); item->earlier_data = bundle_dup(data); - - if (!g_is_bootcompleted) { - if (strcmp(event_name, SYS_EVENT_BOOT_COMPLETED) == 0) { - handle = creat(ESD_BOOT_COMPLETED, 0640); - if (handle != -1) - close(handle); - g_is_bootcompleted = true; - } - } } } #endif @@ -1044,6 +1035,62 @@ static int __esd_get_user_items(void) return ES_R_OK; } +static int __esd_send_bootcomplete(GDBusConnection *conn, const char *list_name) +{ + GVariant *result; + GError *error = NULL; + GVariantIter *iter; + gchar *str; + GVariant *gv; + bundle *b; + bundle_raw *raw; + int len; + gboolean ret; + + result = g_dbus_connection_call_sync(conn, + "org.freedesktop.DBus", "/org/freedesktop/DBus", "org.freedesktop.DBus", + list_name, NULL, G_VARIANT_TYPE("(as)"), G_DBUS_CALL_FLAGS_NONE, + -1, NULL, &error); + + if (result == NULL) { + _E("get (%s) error(%s)", list_name, error->message); + g_error_free(error); + return ES_R_ERROR; + } + + b = bundle_create(); + bundle_add_str(b, EVT_KEY_BOOT_COMPLETED, + EVT_VAL_BOOT_COMPLETED_TRUE); + + bundle_encode(b, &raw, &len); + + g_variant_get(result, "(as)", &iter); + while (g_variant_iter_loop(iter, "s", &str)) { + if (!strstr((const char *)str, "event.busname")) + continue; + + gv = g_variant_new("(us)", (unsigned int)len, raw); + ret = g_dbus_connection_emit_signal(conn, + str, + SYS_EVENT_OBJ_PATH, + SYS_EVENT_NAME_PREFIX, + EVT_KEY_BOOT_COMPLETED, + gv, + &error); + if (ret == FALSE) { + _E("Unable to emit signal: %s", error->message); + g_error_free(error); + } + } + + g_variant_iter_free(iter); + g_variant_unref(result); + bundle_free_encoded_rawdata(&raw); + bundle_free(b); + + return ES_R_OK; +} + static void __esd_signal_handler(GDBusConnection *connection, const gchar *sender_name, const gchar *object_path, @@ -1052,13 +1099,27 @@ static void __esd_signal_handler(GDBusConnection *connection, GVariant *parameters, gpointer user_data) { - guint uid; - if (g_strcmp0(signal_name, LOGIND_SIGNAL_USER_NEW)) - return; + int handle; - g_variant_get(parameters, "(uo)", &uid, NULL); - _I("New user login(%d)", uid); - __esd_get_user_items(); + if (!g_strcmp0(signal_name, + SYSTEMD_DBUS_SIGNAL_STARTUP_FINISHED)) { + _I("System session finished"); + system_bootcompleted = true; + } else if (!g_strcmp0(signal_name, + SYSTEMD_DBUS_SIGNAL_USER_STARTUP_FINISHED)) { + _I("User session finished"); + __esd_get_user_items(); + user_bootcompleted = true; + } + + if (system_bootcompleted && user_bootcompleted) { + __esd_send_bootcomplete(connection, "ListNames"); + __esd_send_bootcomplete(connection, "ListActivatableNames"); + + handle = creat(ESD_BOOT_COMPLETED, 0640); + if (handle != -1) + close(handle); + } } static GDBusNodeInfo *introspection_data; @@ -1652,7 +1713,8 @@ static void __esd_on_bus_acquired(GDBusConnection *connection, _I("bus acquired(%s)", name); guint reg_id = 0; - guint s_id = 0; + guint boot_id = 0; + guint user_boot_id = 0; GError *error = NULL; reg_id = g_dbus_connection_register_object(connection, @@ -1665,18 +1727,34 @@ static void __esd_on_bus_acquired(GDBusConnection *connection, g_error_free(error); } - s_id = g_dbus_connection_signal_subscribe(connection, + boot_id = g_dbus_connection_signal_subscribe(connection, + NULL, + SYSTEMD_DBUS_IFACE_MANAGER, + SYSTEMD_DBUS_SIGNAL_STARTUP_FINISHED, + SYSTEMD_DBUS_PATH, + NULL, + G_DBUS_SIGNAL_FLAGS_NONE, + __esd_signal_handler, + NULL, + NULL); + + if (boot_id == 0) { + _E("g_dbus_connection_signal_subscribe() is failed."); + g_object_unref(connection); + } + + user_boot_id = g_dbus_connection_signal_subscribe(connection, NULL, - LOGIND_INTERFACE, - LOGIND_SIGNAL_USER_NEW, - LOGIND_PATH, + SYSTEMD_DBUS_IFACE_MANAGER, + SYSTEMD_DBUS_SIGNAL_USER_STARTUP_FINISHED, + SYSTEMD_DBUS_PATH, NULL, G_DBUS_SIGNAL_FLAGS_NONE, __esd_signal_handler, NULL, NULL); - if (s_id == 0) { + if (user_boot_id == 0) { _E("g_dbus_connection_signal_subscribe() is failed."); g_object_unref(connection); }