# include <config.h>
#endif
+#include <Ecore.h>
#include <EDBus.h>
#include "efreetd.h"
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;
};
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,
};
static const EDBus_Service_Interface_Desc desc = {
- INTERFACE, methods, signals
+ INTERFACE, methods, signals, NULL, NULL, NULL
};
static void
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);
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?
* 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();
}
}
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;