summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Larsson <alexl@redhat.com>2011-05-04 16:41:17 +0200
committerAlexander Larsson <alexl@redhat.com>2011-05-04 16:41:17 +0200
commit7c27c4ce158d09be188b529882ecd5c6b0c17db7 (patch)
tree22f2ee8f6e7c0243437a367766092878c213f818
parentfa6e44717818d7f9239558f81b90c32dceddf58a (diff)
downloadnautilus-7c27c4ce158d09be188b529882ecd5c6b0c17db7.tar.gz
Convert the nautilus dbus support to use gdbus-codegen
This required latest glib code to work.
-rw-r--r--data/Makefile.am1
-rw-r--r--data/dbus-interfaces.xml41
-rw-r--r--libnautilus-private/Makefile.am16
-rw-r--r--libnautilus-private/nautilus-dbus-manager.c228
4 files changed, 136 insertions, 150 deletions
diff --git a/data/Makefile.am b/data/Makefile.am
index 6cc3fabee..aa76c1655 100644
--- a/data/Makefile.am
+++ b/data/Makefile.am
@@ -33,6 +33,7 @@ EXTRA_DIST = $(nautilusdata_DATA) \
nautilus.desktop \
nautilus.desktop.in \
nautilus.css \
+ dbus-interfaces.xml \
$(xml_in_files) \
$(desktop_in_files) \
$(service_in_files) \
diff --git a/data/dbus-interfaces.xml b/data/dbus-interfaces.xml
new file mode 100644
index 000000000..85e08c649
--- /dev/null
+++ b/data/dbus-interfaces.xml
@@ -0,0 +1,41 @@
+<!DOCTYPE node PUBLIC
+"-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
+"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
+
+<!--
+ Copyright (C) 2011 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General
+ Public License along with this library; if not, write to the
+ Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ Boston, MA 02111-1307, USA.
+
+ Author: Alexander Larsson <alexl@redhat.com>
+-->
+
+<node name="/" xmlns:doc="http://www.freedesktop.org/dbus/1.0/doc.dtd">
+ <interface name='org.gnome.Nautilus.FileOperations'>
+ <method name='CopyURIs'>
+ <arg type='as' name='SourceFilesURIList' direction='in'/>
+ <arg type='s' name='DestinationDirectoryURI' direction='in'/>
+ </method>
+ <method name='EmptyTrash'>
+ </method>"
+ <method name='CopyFile'>
+ <arg type='s' name='SourceFileURI' direction='in'/>
+ <arg type='s' name='SourceDisplayName' direction='in'/>
+ <arg type='s' name='DestinationDirectoryURI' direction='in'/>
+ <arg type='s' name='DestinationDisplayName' direction='in'/>
+ </method>
+ </interface>
+</node>
diff --git a/libnautilus-private/Makefile.am b/libnautilus-private/Makefile.am
index 9d7d141be..09822a075 100644
--- a/libnautilus-private/Makefile.am
+++ b/libnautilus-private/Makefile.am
@@ -18,14 +18,26 @@ INCLUDES = \
-DNAUTILUS_EXTENSIONDIR=\""$(libdir)/nautilus/extensions-3.0"\" \
$(NULL)
+dbus_built_sources = nautilus-generated.c nautilus-generated.h
+$(dbus_built_sources) : Makefile.am $(top_srcdir)/data/dbus-interfaces.xml
+ gdbus-codegen \
+ --interface-prefix org.gnome.Nautilus. \
+ --c-namespace NautilusDBus \
+ --c-generate-object-manager \
+ --generate-c-code nautilus-generated \
+ --generate-docbook nautilus-generated-doc \
+ $(top_srcdir)/data/dbus-interfaces.xml \
+ $(NULL)
+
BUILT_SOURCES = \
nautilus-marshal.c \
nautilus-marshal.h \
+ $(dbus_built_sources) \
$(NULL)
dependency_static_libs = \
$(top_builddir)/cut-n-paste-code/libegg/libegg.la \
- $(NULL)
+ $(NULL)
libnautilus_private_la_LDFLAGS = \
-no-undefined \
@@ -100,6 +112,8 @@ libnautilus_private_la_SOURCES = \
nautilus-file-utilities.h \
nautilus-file.c \
nautilus-file.h \
+ nautilus-generated.c \
+ nautilus-generated.h \
nautilus-global-preferences.c \
nautilus-global-preferences.h \
nautilus-icon-canvas-item.c \
diff --git a/libnautilus-private/nautilus-dbus-manager.c b/libnautilus-private/nautilus-dbus-manager.c
index 43de3d68f..13fc38c07 100644
--- a/libnautilus-private/nautilus-dbus-manager.c
+++ b/libnautilus-private/nautilus-dbus-manager.c
@@ -24,6 +24,7 @@
#include <config.h>
#include "nautilus-dbus-manager.h"
+#include "nautilus-generated.h"
#include "nautilus-file-operations.h"
@@ -32,24 +33,6 @@
#include <gio/gio.h>
-static const gchar introspection_xml[] =
- "<node>"
- " <interface name='org.gnome.Nautilus.FileOperations'>"
- " <method name='CopyURIs'>"
- " <arg type='as' name='SourceFilesURIList' direction='in'/>"
- " <arg type='s' name='DestinationDirectoryURI' direction='in'/>"
- " </method>"
- " <method name='EmptyTrash'>"
- " </method>"
- " <method name='CopyFile'>"
- " <arg type='s' name='SourceFileURI' direction='in'/>"
- " <arg type='s' name='SourceDisplayName' direction='in'/>"
- " <arg type='s' name='DestinationDirectoryURI' direction='in'/>"
- " <arg type='s' name='DestinationDisplayName' direction='in'/>"
- " </method>"
- " </interface>"
- "</node>";
-
typedef struct _NautilusDBusManager NautilusDBusManager;
typedef struct _NautilusDBusManagerClass NautilusDBusManagerClass;
@@ -59,8 +42,10 @@ struct _NautilusDBusManager {
GDBusConnection *connection;
GApplication *application;
+ GDBusObjectManagerServer *object_manager;
+ NautilusDBusFileOperations *file_operations;
+
guint owner_id;
- guint registration_id;
};
struct _NautilusDBusManagerClass {
@@ -86,18 +71,24 @@ nautilus_dbus_manager_dispose (GObject *object)
{
NautilusDBusManager *self = (NautilusDBusManager *) object;
- if (self->registration_id != 0)
- {
- g_dbus_connection_unregister_object (self->connection, self->registration_id);
- self->registration_id = 0;
- }
-
+ /* Unown before unregistering so we're not registred in a partial state */
if (self->owner_id != 0)
{
g_bus_unown_name (self->owner_id);
self->owner_id = 0;
}
+ if (self->file_operations) {
+ g_dbus_interface_skeleton_unexport (G_DBUS_INTERFACE_SKELETON (self->file_operations));
+ g_object_unref (self->file_operations);
+ self->file_operations = NULL;
+ }
+
+ if (self->object_manager) {
+ g_object_unref (self->object_manager);
+ self->object_manager = NULL;
+ }
+
g_clear_object (&self->connection);
G_OBJECT_CLASS (nautilus_dbus_manager_parent_class)->dispose (object);
@@ -118,22 +109,17 @@ service_timeout_handler (gpointer user_data)
return FALSE;
}
-static void
-trigger_copy_file_operation (const gchar *source_uri,
- const gchar *source_display_name,
- const gchar *dest_dir_uri,
- const gchar *dest_name)
+static gboolean
+handle_copy_file (NautilusDBusFileOperations *object,
+ GDBusMethodInvocation *invocation,
+ const gchar *source_uri,
+ const gchar *source_display_name,
+ const gchar *dest_dir_uri,
+ const gchar *dest_name)
{
GFile *source_file, *target_dir;
const gchar *target_name = NULL, *source_name = NULL;
- if (source_uri == NULL || source_uri[0] == '\0' ||
- dest_dir_uri == NULL || dest_dir_uri[0] == '\0')
- {
- DEBUG ("Called 'CopyFile' with invalid arguments, discarding");
- return;
- }
-
source_file = g_file_new_for_uri (source_uri);
target_dir = g_file_new_for_uri (dest_dir_uri);
@@ -144,26 +130,25 @@ trigger_copy_file_operation (const gchar *source_uri,
source_name = source_display_name;
nautilus_file_operations_copy_file (source_file, target_dir, source_name, target_name,
- NULL, NULL, NULL);
+ NULL, NULL, NULL);
g_object_unref (source_file);
g_object_unref (target_dir);
+
+ nautilus_dbus_file_operations_complete_copy_file (object, invocation);
+ return TRUE; /* invocation was handled */
}
-static void
-trigger_copy_uris_operation (const gchar **sources,
- const gchar *destination)
+static gboolean
+handle_copy_uris (NautilusDBusFileOperations *object,
+ GDBusMethodInvocation *invocation,
+ const gchar **sources,
+ const gchar *destination)
{
GList *source_files = NULL;
GFile *dest_dir;
gint idx;
- if (sources == NULL || sources[0] == NULL || destination == NULL)
- {
- DEBUG ("Called 'CopyURIs' with NULL arguments, discarding");
- return;
- }
-
dest_dir = g_file_new_for_uri (destination);
for (idx = 0; sources[idx] != NULL; idx++)
@@ -176,126 +161,71 @@ trigger_copy_uris_operation (const gchar **sources,
g_list_free_full (source_files, g_object_unref);
g_object_unref (dest_dir);
-}
-static void
-trigger_empty_trash_operation (void)
-{
- nautilus_file_operations_empty_trash (NULL);
+ nautilus_dbus_file_operations_complete_copy_uris (object, invocation);
+ return TRUE; /* invocation was handled */
}
-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)
+static gboolean
+handle_empty_trash (NautilusDBusFileOperations *object,
+ GDBusMethodInvocation *invocation)
{
- DEBUG ("Handle method, sender %s, object_path %s, interface %s, method %s",
- sender, object_path, interface_name, method_name);
-
- if (g_strcmp0 (method_name, "CopyURIs") == 0)
- {
- const gchar **uris = NULL;
- const gchar *destination_uri = NULL;
-
- g_variant_get (parameters, "(^a&s&s)", &uris, &destination_uri);
- trigger_copy_uris_operation (uris, destination_uri);
-
- DEBUG ("Called CopyURIs with dest %s and uri %s\n", destination_uri, uris[0]);
-
- goto out;
- }
-
- if (g_strcmp0 (method_name, "EmptyTrash") == 0)
- {
- trigger_empty_trash_operation ();
-
- DEBUG ("Called EmptyTrash");
-
- goto out;
- }
-
- if (g_strcmp0 (method_name, "CopyFile") == 0)
- {
- const gchar *source_uri;
- const gchar *source_display_name;
- const gchar *destination_dir;
- const gchar *destination_name;
-
- g_variant_get (parameters, "(&s&s&s&s)", &source_uri, &source_display_name,
- &destination_dir, &destination_name);
- trigger_copy_file_operation (source_uri, source_display_name, destination_dir, destination_name);
-
- DEBUG ("Called CopyFile with source %s, dest dir %s and dest name %s", source_uri, destination_dir,
- destination_name);
-
- goto out;
- }
+ nautilus_file_operations_empty_trash (NULL);
- out:
- g_dbus_method_invocation_return_value (invocation, NULL);
+ nautilus_dbus_file_operations_complete_empty_trash (object, invocation);
+ return TRUE; /* invocation was handled */
}
-static const GDBusInterfaceVTable interface_vtable =
-{
- handle_method_call,
- NULL,
- NULL,
-};
-
static void
bus_acquired_handler_cb (GDBusConnection *conn,
const gchar *name,
gpointer user_data)
{
NautilusDBusManager *self = user_data;
- GDBusNodeInfo *introspection_data;
- GError *error = NULL;
DEBUG ("Bus acquired at %s", name);
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;
+ self->object_manager = g_dbus_object_manager_server_new ("/org/gnome/Nautilus");
- g_application_release (self->application);
-
- return;
- }
-
- self->registration_id = g_dbus_connection_register_object (conn,
- "/org/gnome/Nautilus",
- introspection_data->interfaces[0],
- &interface_vtable,
- self,
- NULL, &error);
+ self->file_operations = nautilus_dbus_file_operations_skeleton_new ();
- g_dbus_node_info_unref (introspection_data);
+ g_signal_connect (self->file_operations,
+ "handle-copy-uris",
+ G_CALLBACK (handle_copy_uris),
+ self);
+ g_signal_connect (self->file_operations,
+ "handle-copy-file",
+ G_CALLBACK (handle_copy_file),
+ self);
+ g_signal_connect (self->file_operations,
+ "handle-empty-trash",
+ G_CALLBACK (handle_empty_trash),
+ self);
- if (error != NULL)
- {
- g_warning ("Error registering the FileOperations proxy on the bus: %s", error->message);
- g_error_free (error);
+ g_dbus_interface_skeleton_export (G_DBUS_INTERFACE_SKELETON (self->file_operations), self->connection,
+ "/org/gnome/Nautilus", NULL);
- g_bus_unown_name (self->owner_id);
+ g_dbus_object_manager_server_set_connection (self->object_manager, self->connection);
- g_application_release (self->application);
+ g_timeout_add_seconds (SERVICE_TIMEOUT, service_timeout_handler, self);
+}
- return;
- }
+static void
+on_name_lost (GDBusConnection *connection,
+ const gchar *name,
+ gpointer user_data)
+{
+ DEBUG ("Lost (or failed to acquire) the name %s on the session message bus\n", name);
+}
- g_timeout_add_seconds (SERVICE_TIMEOUT, service_timeout_handler, self);
+static void
+on_name_acquired (GDBusConnection *connection,
+ const gchar *name,
+ gpointer user_data)
+{
+ DEBUG ("Acquired the name %s on the session message bus\n", name);
}
static void
@@ -333,13 +263,13 @@ nautilus_dbus_manager_constructed (GObject *object)
g_application_hold (self->application);
self->owner_id = g_bus_own_name (G_BUS_TYPE_SESSION,
- "org.gnome.Nautilus",
- G_BUS_NAME_OWNER_FLAGS_NONE,
- bus_acquired_handler_cb,
- NULL,
- NULL,
- self,
- NULL);
+ "org.gnome.Nautilus",
+ G_BUS_NAME_OWNER_FLAGS_NONE,
+ bus_acquired_handler_cb,
+ on_name_acquired,
+ on_name_lost,
+ self,
+ NULL);
}
static void