diff options
author | Federico Mena Quintero <federico@gnome.org> | 2011-12-13 15:17:14 -0600 |
---|---|---|
committer | Federico Mena Quintero <federico@gnome.org> | 2011-12-13 18:13:25 -0600 |
commit | 3a899726ac482ae90f1b8fb52657ee80fef3a7fe (patch) | |
tree | 36fe73563105cc9dba50ad1c3eb04e08724c7dea /src/nautilus-freedesktop-dbus.c | |
parent | ecf70ad6a66cc1450935e54ebffd95660ebc05a4 (diff) | |
download | nautilus-3a899726ac482ae90f1b8fb52657ee80fef3a7fe.tar.gz |
Turn NautilusFreeDesktopDBus into a GObject internally
This is to match NautilusDBusManager.
Signed-off-by: Federico Mena Quintero <federico@gnome.org>
Diffstat (limited to 'src/nautilus-freedesktop-dbus.c')
-rw-r--r-- | src/nautilus-freedesktop-dbus.c | 222 |
1 files changed, 167 insertions, 55 deletions
diff --git a/src/nautilus-freedesktop-dbus.c b/src/nautilus-freedesktop-dbus.c index 4a099280d..3aa85f0ea 100644 --- a/src/nautilus-freedesktop-dbus.c +++ b/src/nautilus-freedesktop-dbus.c @@ -33,26 +33,50 @@ #include <gio/gio.h> -/* Parent application */ -static NautilusApplication *application; +typedef struct _NautilusFreedesktopDBus NautilusFreedesktopDBus; +typedef struct _NautilusFreedesktopDBusClass NautilusFreedesktopDBusClass; -/* Id from g_dbus_own_name() */ -static guint owner_id; +struct _NautilusFreedesktopDBus { + GObject parent; -/* DBus paraphernalia */ -static GDBusConnection *connection; -static GDBusObjectManagerServer *object_manager; + /* Parent application */ + NautilusApplication *application; -/* Our DBus implementation skeleton */ -static NautilusFreedesktopFileManager1 *skeleton; + /* Id from g_dbus_own_name() */ + guint owner_id; + + /* DBus paraphernalia */ + GDBusConnection *connection; + GDBusObjectManagerServer *object_manager; + + /* Our DBus implementation skeleton */ + NautilusFreedesktopFileManager1 *skeleton; +}; + +struct _NautilusFreedesktopDBusClass { + GObjectClass parent_class; +}; + +enum { + PROP_APPLICATION = 1 +}; + +#define SERVICE_TIMEOUT 5 + +static GType nautilus_freedesktop_dbus_get_type (void) G_GNUC_CONST; +G_DEFINE_TYPE (NautilusFreedesktopDBus, nautilus_freedesktop_dbus, G_TYPE_OBJECT); + +static NautilusFreedesktopDBus *singleton; static gboolean skeleton_handle_show_items_cb (NautilusFreedesktopFileManager1 *object, GDBusMethodInvocation *invocation, const gchar *const *uris, - const gchar *startup_id) + const gchar *startup_id, + gpointer data) { + NautilusFreedesktopDBus *fdb = data; int i; for (i = 0; uris[i] != NULL; i++) { @@ -66,7 +90,7 @@ skeleton_handle_show_items_cb (NautilusFreedesktopFileManager1 *object, * what g_application_open() expects, and neither does * NautilusApplication internally. */ - g_application_open (G_APPLICATION (application), files, 1, ""); + g_application_open (G_APPLICATION (fdb->application), files, 1, ""); g_object_unref (file); } @@ -78,13 +102,14 @@ static gboolean skeleton_handle_show_folders_cb (NautilusFreedesktopFileManager1 *object, GDBusMethodInvocation *invocation, const gchar *const *uris, - const gchar *startup_id) + const gchar *startup_id, + gpointer data) { /* FIXME: NautilusApplication makes no distinction between showing * files vs. folders. For now we will just use the same * implementation. */ - + NautilusFreedesktopDBus *fdb = data; int i; for (i = 0; uris[i] != NULL; i++) { @@ -98,7 +123,7 @@ skeleton_handle_show_folders_cb (NautilusFreedesktopFileManager1 *object, * what g_application_open() expects, and neither does * NautilusApplication internally. */ - g_application_open (G_APPLICATION (application), files, 1, ""); + g_application_open (G_APPLICATION (fdb->application), files, 1, ""); g_object_unref (file); } @@ -110,7 +135,8 @@ static gboolean skeleton_handle_show_item_properties_cb (NautilusFreedesktopFileManager1 *object, GDBusMethodInvocation *invocation, const gchar *const *uris, - const gchar *startup_id) + const gchar *startup_id, + gpointer data) { GList *files; int i; @@ -131,28 +157,47 @@ skeleton_handle_show_item_properties_cb (NautilusFreedesktopFileManager1 *object return TRUE; } +static gboolean +service_timeout_cb (gpointer data) +{ + NautilusFreedesktopDBus *fdb = data; + + DEBUG ("Reached the DBus service timeout"); + + /* just unconditionally release here, as if an operation has been + * called, its progress handler will hold it alive for all the task duration. + */ + g_application_release (G_APPLICATION (fdb->application)); + + return FALSE; +} + static void bus_acquired_cb (GDBusConnection *conn, const gchar *name, gpointer user_data) { + NautilusFreedesktopDBus *fdb = user_data; + DEBUG ("Bus acquired at %s", name); - connection = g_object_ref (conn); - object_manager = g_dbus_object_manager_server_new ("/org/freedesktop/FileManager1"); + fdb->connection = g_object_ref (conn); + fdb->object_manager = g_dbus_object_manager_server_new ("/org/freedesktop/FileManager1"); + + fdb->skeleton = nautilus_freedesktop_file_manager1_skeleton_new (); - skeleton = nautilus_freedesktop_file_manager1_skeleton_new (); + g_signal_connect (fdb->skeleton, "handle-show-items", + G_CALLBACK (skeleton_handle_show_items_cb), fdb); + g_signal_connect (fdb->skeleton, "handle-show-folders", + G_CALLBACK (skeleton_handle_show_folders_cb), fdb); + g_signal_connect (fdb->skeleton, "handle-show-item-properties", + G_CALLBACK (skeleton_handle_show_item_properties_cb), fdb); - g_signal_connect (skeleton, "handle-show-items", - G_CALLBACK (skeleton_handle_show_items_cb), NULL); - g_signal_connect (skeleton, "handle-show-folders", - G_CALLBACK (skeleton_handle_show_folders_cb), NULL); - g_signal_connect (skeleton, "handle-show-item-properties", - G_CALLBACK (skeleton_handle_show_item_properties_cb), NULL); + g_dbus_interface_skeleton_export (G_DBUS_INTERFACE_SKELETON (fdb->skeleton), fdb->connection, "/org/freedesktop/FileManager1", NULL); - g_dbus_interface_skeleton_export (G_DBUS_INTERFACE_SKELETON (skeleton), connection, "/org/freedesktop/FileManager1", NULL); + g_dbus_object_manager_server_set_connection (fdb->object_manager, fdb->connection); - g_dbus_object_manager_server_set_connection (object_manager, connection); + g_timeout_add_seconds (SERVICE_TIMEOUT, service_timeout_cb, fdb); } static void @@ -171,45 +216,112 @@ name_lost_cb (GDBusConnection *connection, DEBUG ("Lost (or failed to acquire) the name %s on the session message bus\n", name); } +static void +nautilus_freedesktop_dbus_dispose (GObject *object) +{ + NautilusFreedesktopDBus *fdb = (NautilusFreedesktopDBus *) object; + + if (fdb->owner_id != 0) { + g_bus_unown_name (fdb->owner_id); + fdb->owner_id = 0; + } + + if (fdb->skeleton != NULL) { + g_dbus_interface_skeleton_unexport (G_DBUS_INTERFACE_SKELETON (fdb->skeleton)); + g_object_unref (fdb->skeleton); + fdb->skeleton = NULL; + } + + if (fdb->object_manager != NULL) { + g_object_unref (fdb->object_manager); + fdb->object_manager = NULL; + } + + g_clear_object (&fdb->connection); + fdb->application = NULL; + + G_OBJECT_CLASS (nautilus_freedesktop_dbus_parent_class)->dispose (object); +} + +static void +nautilus_freedesktop_dbus_constructed (GObject *object) +{ + NautilusFreedesktopDBus *fdb = (NautilusFreedesktopDBus *) object; + + G_OBJECT_CLASS (nautilus_freedesktop_dbus_parent_class)->constructed (object); + + g_application_hold (G_APPLICATION (fdb->application)); + + fdb->owner_id = g_bus_own_name (G_BUS_TYPE_SESSION, + "org.freedesktop.FileManager1", + G_BUS_NAME_OWNER_FLAGS_NONE, + bus_acquired_cb, + name_acquired_cb, + name_lost_cb, + fdb, + NULL); +} + +static void +nautilus_freedesktop_dbus_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + NautilusFreedesktopDBus *fdb = (NautilusFreedesktopDBus *) object; + + switch (property_id) { + case PROP_APPLICATION: + fdb->application = g_value_get_object (value); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + + +static void +nautilus_freedesktop_dbus_class_init (NautilusFreedesktopDBusClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->dispose = nautilus_freedesktop_dbus_dispose; + object_class->constructed = nautilus_freedesktop_dbus_constructed; + object_class->set_property = nautilus_freedesktop_dbus_set_property; + + g_object_class_install_property (object_class, + PROP_APPLICATION, + g_param_spec_object ("application", + "NautilusApplication instance", + "The owning NautilusApplication instance", + NAUTILUS_TYPE_APPLICATION, + G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); + +} + +static void +nautilus_freedesktop_dbus_init (NautilusFreedesktopDBus *fdb) +{ + /* nothing */ +} + /* Tries to own the org.freedesktop.FileManager1 service name */ void nautilus_freedesktop_dbus_start (NautilusApplication *app) { - if (owner_id != 0) + if (singleton) return; - owner_id = g_bus_own_name (G_BUS_TYPE_SESSION, - "org.freedesktop.FileManager1", - G_BUS_NAME_OWNER_FLAGS_NONE, - bus_acquired_cb, - name_acquired_cb, - name_lost_cb, - NULL, - NULL); - - application = app; + singleton = g_object_new (nautilus_freedesktop_dbus_get_type (), + "application", app, + NULL); } /* Releases the org.freedesktop.FileManager1 service name */ void nautilus_freedesktop_dbus_stop (void) { - if (owner_id != 0) { - g_bus_unown_name (owner_id); - owner_id = 0; - } - - if (skeleton != NULL) { - g_dbus_interface_skeleton_unexport (G_DBUS_INTERFACE_SKELETON (skeleton)); - g_object_unref (skeleton); - skeleton = NULL; - } - - if (object_manager != NULL) { - g_object_unref (object_manager); - object_manager = NULL; - } - - g_clear_object (&connection); - application = NULL; + g_clear_object (&singleton); } |