efreet: track efreetd clients
authorSebastian Dransfeld <sd@tango.flipp.net>
Fri, 2 Nov 2012 20:12:41 +0000 (20:12 +0000)
committerSebastian Dransfeld <sd@tango.flipp.net>
Fri, 2 Nov 2012 20:12:41 +0000 (20:12 +0000)
SVN revision: 78874

legacy/efreet/src/bin/efreetd.c
legacy/efreet/src/bin/efreetd.h
legacy/efreet/src/bin/efreetd_dbus.c
legacy/efreet/src/lib/efreet_cache.c

index d36042c..a4ae720 100644 (file)
 
 int efreetd_log_dom = -1;
 
+void
+quit(void)
+{
+   ecore_main_loop_quit();
+}
+
 int
 main(void)
 {
index 67097de..a6931e3 100644 (file)
@@ -29,4 +29,6 @@ extern int efreetd_log_dom;
 #endif
 #define WRN(...) EINA_LOG_DOM_WARN(efreetd_log_dom, __VA_ARGS__)
 
+void quit(void);
+
 #endif
index 92902ab..2c5a80f 100644 (file)
@@ -2,6 +2,7 @@
 # include <config.h>
 #endif
 
+#include <Ecore.h>
 #include <EDBus.h>
 
 #include "efreetd.h"
@@ -21,17 +22,43 @@ enum
 static EDBus_Connection *conn;
 static EDBus_Service_Interface *iface;
 
+static Ecore_Timer *shutdown = NULL;
+static int clients = 0;
+
+static Eina_Bool
+do_shutdown(void *data __UNUSED__)
+{
+   quit();
+   return ECORE_CALLBACK_CANCEL;
+}
+
 static EDBus_Message *
-ping(const EDBus_Service_Interface *ifc __UNUSED__, const EDBus_Message *message)
+do_register(const EDBus_Service_Interface *ifc __UNUSED__, const EDBus_Message *message)
 {
    EDBus_Message *reply;
 
+   clients++;
+   if (shutdown) ecore_timer_del(shutdown);
+   shutdown = NULL;
    reply = edbus_message_method_return_new(message);
    edbus_message_arguments_set(reply, "b", cache_desktop_exists());
    return reply;
 }
 
 static EDBus_Message *
+do_unregister(const EDBus_Service_Interface *ifc __UNUSED__, const EDBus_Message *message __UNUSED__)
+{
+   clients--;
+   if (clients <= 0)
+     {
+        clients = 0;
+        if (shutdown) ecore_timer_del(shutdown);
+        shutdown = ecore_timer_add(10.0, do_shutdown, NULL);
+     }
+   return NULL;
+}
+
+static EDBus_Message *
 add_desktop_dirs(const EDBus_Service_Interface *ifc __UNUSED__, const EDBus_Message *message)
 {
    EDBus_Message_Iter *array = NULL;
@@ -105,10 +132,13 @@ static const EDBus_Signal signals[] = {
 };
 
 static const EDBus_Method methods[] = {
-     /* TODO: Register / Unregister */
        {
-          "Ping", NULL, EDBUS_ARGS({"b", "cache exists"}),
-          ping, 0
+          "Register", NULL, EDBUS_ARGS({"b", "cache exists"}),
+          do_register, 0
+       },
+       {
+          "UnRegister", NULL, NULL,
+          do_unregister, 0
        },
        {
           "AddDesktopDirs", EDBUS_ARGS({"as", "dirs"}), NULL,
@@ -130,7 +160,7 @@ static const EDBus_Method methods[] = {
 };
 
 static const EDBus_Service_Interface_Desc desc = {
-   INTERFACE, methods, signals
+   INTERFACE, methods, signals, NULL, NULL, NULL
 };
 
 static void
index 8c02cff..31eae52 100644 (file)
@@ -93,7 +93,7 @@ static void efreet_cache_icon_theme_free(Efreet_Icon_Theme *theme);
 static Eina_Bool efreet_cache_check(Eet_File **ef, const char *path, int major);
 static void *efreet_cache_close(Eet_File *ef);
 
-static void on_send_ping(void *data, const EDBus_Message *msg, EDBus_Pending *pending);
+static void on_send_register(void *data, const EDBus_Message *msg, EDBus_Pending *pending);
 static void desktop_cache_update(void *context, const EDBus_Message *msg);
 static void icon_cache_update(void *context, const EDBus_Message *msg);
 
@@ -134,7 +134,7 @@ efreet_cache_init(void)
         edbus_proxy_signal_handler_add(proxy, "IconCacheUpdate", icon_cache_update, NULL);
         edbus_proxy_signal_handler_add(proxy, "DesktopCacheUpdate", desktop_cache_update, NULL);
 
-        edbus_proxy_call(proxy, "Ping", on_send_ping, NULL, -1, "");
+        edbus_proxy_call(proxy, "Register", on_send_register, NULL, -1, "");
 
         /*
          * TODO: Needed?
@@ -210,7 +210,11 @@ efreet_cache_shutdown(void)
      * TODO: Needed??
     edbus_name_owner_changed_callback_del(conn, BUS, on_name_owner_changed, conn);
     */
-    if (conn) edbus_connection_unref(conn);
+    if (conn)
+    {
+        edbus_proxy_call(proxy, "UnRegister", NULL, NULL, -1, "");
+        edbus_connection_unref(conn);
+    }
 
     edbus_shutdown();
 }
@@ -1049,7 +1053,7 @@ efreet_cache_util_names(const char *key)
 }
 
 static void
-on_send_ping(void *data __UNUSED__, const EDBus_Message *msg, EDBus_Pending *pending __UNUSED__)
+on_send_register(void *data __UNUSED__, const EDBus_Message *msg, EDBus_Pending *pending __UNUSED__)
 {
     const char *errname, *errmsg;
     Eina_Bool exists;