2 #include "e_mod_main.h"
3 #include "e_mod_dbus.h"
5 static const char E_FILEMAN_BUS_NAME[] = "org.enlightenment.FileManager";
6 static const char E_FILEMAN_INTERFACE[] = "org.enlightenment.FileManager";
7 static const char E_FILEMAN_ERROR[] = "org.enlightenment.FileManager.Error";
8 static const char E_FILEMAN_PATH[] = "/org/enlightenment/FileManager";
10 typedef struct _E_Fileman_DBus_Daemon E_Fileman_DBus_Daemon;
11 struct _E_Fileman_DBus_Daemon
13 E_DBus_Connection *conn;
14 E_DBus_Interface *iface;
19 DBusPendingCall *request_name;
24 _e_fileman_dbus_daemon_error(DBusMessage *message,
27 return dbus_message_new_error(message, E_FILEMAN_ERROR, msg);
31 _e_fileman_dbus_daemon_object_init(E_Fileman_DBus_Daemon *d)
35 d->obj = e_dbus_object_add(d->conn, E_FILEMAN_PATH, d);
38 fprintf(stderr, "ERROR: cannot add object to %s\n", E_FILEMAN_PATH);
42 e_dbus_object_interface_attach(d->obj, d->iface);
46 _e_fileman_dbus_daemon_free(E_Fileman_DBus_Daemon *d)
48 if (d->pending.request_name)
49 dbus_pending_call_cancel(d->pending.request_name);
53 e_dbus_object_interface_detach(d->obj, d->iface);
54 e_dbus_object_free(d->obj);
58 e_dbus_interface_unref(d->iface);
61 e_dbus_connection_close(d->conn);
67 _e_fileman_dbus_daemon_open_directory_cb(E_DBus_Object *obj __UNUSED__,
71 const char *directory = NULL, *p;
75 dbus_message_iter_init(message, &itr);
76 dbus_message_iter_get_basic(&itr, &directory);
78 if ((!directory) || (directory[0] == '\0'))
79 return _e_fileman_dbus_daemon_error(message, "no directory provided.");
81 if (strncmp(directory, "file://", sizeof("file://") - 1) == 0)
82 directory += sizeof("file://") - 1;
84 zone = e_util_zone_current_get(e_manager_current_get());
86 return _e_fileman_dbus_daemon_error(message, "could not find a zone.");
88 p = strchr(directory, '/');
91 int len = p - directory + 1;
93 dev = malloc(len + 1);
95 return _e_fileman_dbus_daemon_error
96 (message, "could not allocate memory.");
98 memcpy(dev, directory, len);
101 if ((dev[0] != '/') && (dev[0] != '~'))
102 dev[len - 1] = '\0'; /* remove trailing '/' */
104 directory += p - directory;
108 dev = strdup(directory);
112 e_fwin_new(zone->container, dev, directory);
114 return dbus_message_new_method_return(message);
118 _e_fileman_dbus_daemon_request_name_cb(void *data,
122 E_Fileman_DBus_Daemon *d = data;
126 d->pending.request_name = NULL;
128 if (dbus_error_is_set(err))
130 fprintf(stderr, "ERROR: FILEMAN: RequestName failed: %s\n",
132 dbus_error_free(err);
136 dbus_error_init(&new_err);
137 dbus_message_get_args(msg, &new_err, DBUS_TYPE_UINT32, &ret,
140 if (dbus_error_is_set(&new_err))
143 "ERROR: FILEMAN: could not get arguments of RequestName: %s\n",
145 dbus_error_free(&new_err);
151 case DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER:
152 case DBUS_REQUEST_NAME_REPLY_ALREADY_OWNER:
153 _e_fileman_dbus_daemon_object_init(d);
156 case DBUS_REQUEST_NAME_REPLY_IN_QUEUE:
157 //XXX mark daemon as queued?
160 case DBUS_REQUEST_NAME_REPLY_EXISTS:
166 static E_Fileman_DBus_Daemon *
167 _e_fileman_dbus_daemon_new(void)
169 E_Fileman_DBus_Daemon *d;
171 d = calloc(1, sizeof(*d));
174 perror("ERROR: FILEMAN: cannot allocate fileman dbus daemon memory.");
178 d->conn = e_dbus_bus_get(DBUS_BUS_SESSION);
182 d->iface = e_dbus_interface_new(E_FILEMAN_INTERFACE);
186 d->pending.request_name = e_dbus_request_name
187 (d->conn, E_FILEMAN_BUS_NAME, DBUS_NAME_FLAG_REPLACE_EXISTING,
188 _e_fileman_dbus_daemon_request_name_cb, d);
189 if (!d->pending.request_name)
195 const char *signature;
196 const char *ret_signature;
197 E_DBus_Method_Cb func;
199 {"OpenDirectory", "s", "", _e_fileman_dbus_daemon_open_directory_cb},
203 for (itr = desc; itr->method; itr++)
204 e_dbus_interface_method_add
205 (d->iface, itr->method, itr->signature, itr->ret_signature, itr->func);
210 fprintf(stderr, "ERROR: FILEMAN: failed to create daemon at %p\n", d);
211 _e_fileman_dbus_daemon_free(d);
215 static E_Fileman_DBus_Daemon *_daemon = NULL;
218 e_fileman_dbus_init(void)
224 _daemon = _e_fileman_dbus_daemon_new();
228 e_fileman_dbus_shutdown(void)
233 _e_fileman_dbus_daemon_free(_daemon);