send SYS_EVENT_BOOT_COMPLETED event 09/97509/7 accepted/tizen/3.0/common/20161125.101803 accepted/tizen/3.0/ivi/20161125.081942 accepted/tizen/3.0/mobile/20161125.081646 accepted/tizen/3.0/tv/20161125.081752 accepted/tizen/3.0/wearable/20161125.081902 submit/tizen_3.0/20161124.130849
authorJiwoong Im <jiwoong.im@samsung.com>
Mon, 14 Nov 2016 10:13:51 +0000 (19:13 +0900)
committerJiwoong Im <jiwoong.im@samsung.com>
Thu, 24 Nov 2016 10:52:16 +0000 (19:52 +0900)
- 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 <jiwoong.im@samsung.com>
include/eventsystem_daemon.h
src/esd_main.c

index 9fa24ce..a5aaa8f 100644 (file)
@@ -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);
 
index 7c9e270..c7fb780 100644 (file)
@@ -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);
        }