diff options
author | infirit <[email protected]> | 2014-12-16 13:54:43 +0100 |
---|---|---|
committer | infirit <[email protected]> | 2014-12-16 14:01:20 +0100 |
commit | 08bc0644ebc869ff1db320cc2bdfc4a471a6f9ac (patch) | |
tree | bd4d0789be07a897311be55e1735b8468bbbd5a5 /libcaja-private/caja-dbus-manager.c | |
parent | ff9b49f940395684689a38117082632c3fe5819c (diff) | |
download | caja-08bc0644ebc869ff1db320cc2bdfc4a471a6f9ac.tar.bz2 caja-08bc0644ebc869ff1db320cc2bdfc4a471a6f9ac.tar.xz |
dbus-manager: add a skeleton of NautilusDBusManager
Diffstat (limited to 'libcaja-private/caja-dbus-manager.c')
-rw-r--r-- | libcaja-private/caja-dbus-manager.c | 171 |
1 files changed, 171 insertions, 0 deletions
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); +} |