diff options
Diffstat (limited to 'libcaja-private')
-rw-r--r-- | libcaja-private/Makefile.am | 2 | ||||
-rw-r--r-- | libcaja-private/caja-dbus-manager.c | 171 | ||||
-rw-r--r-- | libcaja-private/caja-dbus-manager.h | 10 |
3 files changed, 183 insertions, 0 deletions
diff --git a/libcaja-private/Makefile.am b/libcaja-private/Makefile.am index 4e7b10f9..114c15b2 100644 --- a/libcaja-private/Makefile.am +++ b/libcaja-private/Makefile.am @@ -56,6 +56,8 @@ libcaja_private_la_SOURCES = \ caja-column-chooser.h \ caja-column-utilities.c \ caja-column-utilities.h \ + caja-dbus-manager.c \ + caja-dbus-manager.h \ caja-customization-data.c \ caja-customization-data.h \ caja-debug-log.c \ diff --git a/libcaja-private/caja-dbus-manager.c b/libcaja-private/caja-dbus-manager.c new file mode 100644 index 00000000..1c683dff --- /dev/null +++ b/libcaja-private/caja-dbus-manager.c @@ -0,0 +1,171 @@ +#include <config.h> + +#include "caja-dbus-manager.h" + +#include <gio/gio.h> + +static const gchar introspection_xml[] = + "<node>" + " <interface name='org.mate.caja.FileOperations'>" + " <method name='CopyURIs'>" + " <arg type='as' name='URIList' direction='in'/>" + " <arg type='s' name='Destination' direction='in'/>" + " </method>" + " </interface>" + "</node>"; + +typedef struct _CajaDBusManager CajaDBusManager; +typedef struct _CajaDBusManagerClass CajaDBusManagerClass; + +struct _CajaDBusManager { + GObject parent; + + GDBusConnection *connection; + + guint owner_id; + guint registration_id; +}; + +struct _CajaDBusManagerClass { + GObjectClass parent_class; +}; + +static GType caja_dbus_manager_get_type (void) G_GNUC_CONST; +G_DEFINE_TYPE (CajaDBusManager, caja_dbus_manager, G_TYPE_OBJECT); + +static CajaDBusManager *singleton = NULL; + +static void +caja_dbus_manager_dispose (GObject *object) +{ + CajaDBusManager *self = (CajaDBusManager *) object; + + if (self->registration_id != 0) + { + g_dbus_connection_unregister_object (self->connection, self->registration_id); + self->registration_id = 0; + } + + if (self->owner_id != 0) + { + g_bus_unown_name (self->owner_id); + self->owner_id = 0; + } + + g_clear_object (&self->connection); + + G_OBJECT_CLASS (caja_dbus_manager_parent_class)->dispose (object); +} + +static void +caja_dbus_manager_class_init (CajaDBusManagerClass *klass) +{ + GObjectClass *oclass = G_OBJECT_CLASS (klass); + + oclass->dispose = caja_dbus_manager_dispose; +} + +static void +handle_method_call (GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *method_name, + GVariant *parameters, + GDBusMethodInvocation *invocation, + gpointer user_data) +{ + const gchar **uris = NULL; + const gchar *destination_uri = NULL; + + if (g_strcmp0 (method_name, "CopyURIs") == 0) + { + g_variant_get (parameters, "(^a&s&s)", &uris, &destination_uri); + + g_print ("Called CopyURIs with dest %s and uri %s\n", destination_uri, uris[0]); + } + + g_dbus_method_invocation_return_value (invocation, NULL); +} + +static const GDBusInterfaceVTable interface_vtable = +{ + handle_method_call, + NULL, + NULL, +}; + +static void +name_acquired_cb (GDBusConnection *conn, + const gchar *name, + gpointer user_data) +{ + CajaDBusManager *self = user_data; + GDBusNodeInfo *introspection_data; + GError *error = NULL; + + self->connection = g_object_ref (conn); + introspection_data = g_dbus_node_info_new_for_xml (introspection_xml, &error); + + if (error != NULL) + { + g_warning ("Error parsing the FileOperations XML interface: %s", error->message); + g_error_free (error); + + g_bus_unown_name (self->owner_id); + self->owner_id = 0; + + return; + } + + self->registration_id = g_dbus_connection_register_object (conn, + "/org/mate/caja", + introspection_data->interfaces[0], + &interface_vtable, + self, + NULL, &error); + + if (error != NULL) + { + g_warning ("Error registering the FileOperations proxy on the bus: %s", error->message); + g_error_free (error); + + g_bus_unown_name (self->owner_id); + + return; + } +} + +static void +name_lost_cb (GDBusConnection *conn, + const gchar *name, + gpointer user_data) +{ + +} + +static void +caja_dbus_manager_init (CajaDBusManager *self) +{ + self->owner_id = g_bus_own_name (G_BUS_TYPE_SESSION, + "org.mate.caja", + G_BUS_NAME_OWNER_FLAGS_NONE, + NULL, + name_acquired_cb, + name_lost_cb, + self, + NULL); +} + +void +caja_dbus_manager_start (void) +{ + singleton = g_object_new (caja_dbus_manager_get_type (), + NULL); +} + +void +caja_dbus_manager_stop (void) +{ + g_clear_object (&singleton); +} diff --git a/libcaja-private/caja-dbus-manager.h b/libcaja-private/caja-dbus-manager.h new file mode 100644 index 00000000..0dc79735 --- /dev/null +++ b/libcaja-private/caja-dbus-manager.h @@ -0,0 +1,10 @@ + +#ifndef __CAJA_DBUS_MANAGER_H__ +#define __CAJA_DBUS_MANAGER_H__ + +#include <glib-object.h> + +void caja_dbus_manager_start (void); +void caja_dbus_manager_stop (void); + +#endif /* __CAJA_DBUS_MANAGER_H__ */ |