From 6e85b4bfcc42ad8d9d1bc3882a743e1f101df59e Mon Sep 17 00:00:00 2001 From: Sebastian Dransfeld Date: Fri, 2 Nov 2012 20:12:41 +0000 Subject: [PATCH] efreet: track efreetd clients SVN revision: 78874 --- legacy/efreet/src/bin/efreetd.c | 6 +++++ legacy/efreet/src/bin/efreetd.h | 2 ++ legacy/efreet/src/bin/efreetd_dbus.c | 40 ++++++++++++++++++++++++---- legacy/efreet/src/lib/efreet_cache.c | 12 ++++++--- 4 files changed, 51 insertions(+), 9 deletions(-) diff --git a/legacy/efreet/src/bin/efreetd.c b/legacy/efreet/src/bin/efreetd.c index d36042ce16..a4ae720a4e 100644 --- a/legacy/efreet/src/bin/efreetd.c +++ b/legacy/efreet/src/bin/efreetd.c @@ -11,6 +11,12 @@ int efreetd_log_dom = -1; +void +quit(void) +{ + ecore_main_loop_quit(); +} + int main(void) { diff --git a/legacy/efreet/src/bin/efreetd.h b/legacy/efreet/src/bin/efreetd.h index 67097de4a5..a6931e3282 100644 --- a/legacy/efreet/src/bin/efreetd.h +++ b/legacy/efreet/src/bin/efreetd.h @@ -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 diff --git a/legacy/efreet/src/bin/efreetd_dbus.c b/legacy/efreet/src/bin/efreetd_dbus.c index 92902ab7f2..2c5a80fdff 100644 --- a/legacy/efreet/src/bin/efreetd_dbus.c +++ b/legacy/efreet/src/bin/efreetd_dbus.c @@ -2,6 +2,7 @@ # include #endif +#include #include #include "efreetd.h" @@ -21,16 +22,42 @@ 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) { @@ -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 diff --git a/legacy/efreet/src/lib/efreet_cache.c b/legacy/efreet/src/lib/efreet_cache.c index 8c02cff2d3..31eae52392 100644 --- a/legacy/efreet/src/lib/efreet_cache.c +++ b/legacy/efreet/src/lib/efreet_cache.c @@ -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;