[nautilus] dbus-manager: hold the GApplication for 5 seconds upon startup



commit b76e3c666d1da08cc70bd09a293c2ed319861bcd
Author: Cosimo Cecchi <cosimoc gnome org>
Date:   Tue Feb 22 23:32:20 2011 -0500

    dbus-manager: hold the GApplication for 5 seconds upon startup
    
    This is needed so that nautilus can be started as a DBus service with
    --no-default-window and be able to handle incoming method calls without
    quitting before receiving them.

 libnautilus-private/nautilus-dbus-manager.c |   87 +++++++++++++++++++++++++--
 libnautilus-private/nautilus-dbus-manager.h |    3 +-
 src/nautilus-application.c                  |    2 +-
 3 files changed, 84 insertions(+), 8 deletions(-)
---
diff --git a/libnautilus-private/nautilus-dbus-manager.c b/libnautilus-private/nautilus-dbus-manager.c
index 5410a44..43de3d6 100644
--- a/libnautilus-private/nautilus-dbus-manager.c
+++ b/libnautilus-private/nautilus-dbus-manager.c
@@ -57,6 +57,7 @@ struct _NautilusDBusManager {
   GObject parent;
 
   GDBusConnection *connection;
+  GApplication *application;
 
   guint owner_id;
   guint registration_id;
@@ -66,6 +67,15 @@ struct _NautilusDBusManagerClass {
   GObjectClass parent_class;
 };
 
+enum {
+  PROP_APPLICATION = 1,
+  NUM_PROPERTIES
+};
+
+#define SERVICE_TIMEOUT 5
+
+static GParamSpec *properties[NUM_PROPERTIES] = { NULL, };
+
 static GType nautilus_dbus_manager_get_type (void) G_GNUC_CONST;
 G_DEFINE_TYPE (NautilusDBusManager, nautilus_dbus_manager, G_TYPE_OBJECT);
 
@@ -93,12 +103,19 @@ nautilus_dbus_manager_dispose (GObject *object)
   G_OBJECT_CLASS (nautilus_dbus_manager_parent_class)->dispose (object);
 }
 
-static void
-nautilus_dbus_manager_class_init (NautilusDBusManagerClass *klass)
+static gboolean
+service_timeout_handler (gpointer user_data)
 {
-  GObjectClass *oclass = G_OBJECT_CLASS (klass);
+  NautilusDBusManager *self = user_data;
 
-  oclass->dispose = nautilus_dbus_manager_dispose;
+  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 (self->application);
+
+  return FALSE;
 }
 
 static void
@@ -252,6 +269,8 @@ bus_acquired_handler_cb (GDBusConnection *conn,
       g_bus_unown_name (self->owner_id);
       self->owner_id = 0;
 
+      g_application_release (self->application);
+
       return;
     }
   
@@ -271,13 +290,48 @@ bus_acquired_handler_cb (GDBusConnection *conn,
 
       g_bus_unown_name (self->owner_id);
 
+      g_application_release (self->application);
+
       return;
     }
+
+  g_timeout_add_seconds (SERVICE_TIMEOUT, service_timeout_handler, self);
 }
 
 static void
 nautilus_dbus_manager_init (NautilusDBusManager *self)
 {
+  /* do nothing */
+}
+
+static void
+nautilus_dbus_manager_set_property (GObject *object,
+                                    guint property_id,
+                                    const GValue *value,
+                                    GParamSpec *pspec)
+{
+  NautilusDBusManager *self = (NautilusDBusManager *) (object);
+
+  switch (property_id)
+    {
+    case PROP_APPLICATION:
+      self->application = g_value_get_object (value);
+      break;
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+      break;
+    }
+}
+
+static void
+nautilus_dbus_manager_constructed (GObject *object)
+{
+  NautilusDBusManager *self = (NautilusDBusManager *) (object);
+
+  G_OBJECT_CLASS (nautilus_dbus_manager_parent_class)->constructed (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,
@@ -285,13 +339,34 @@ nautilus_dbus_manager_init (NautilusDBusManager *self)
                                    NULL,
                                    NULL,
                                    self,
-                                   NULL);
+                                   NULL);  
+}
+
+static void
+nautilus_dbus_manager_class_init (NautilusDBusManagerClass *klass)
+{
+  GObjectClass *oclass = G_OBJECT_CLASS (klass);
+
+  oclass->dispose = nautilus_dbus_manager_dispose;
+  oclass->constructed = nautilus_dbus_manager_constructed;
+  oclass->set_property = nautilus_dbus_manager_set_property;
+
+  properties[PROP_APPLICATION] =
+    g_param_spec_object ("application",
+                         "GApplication instance",
+                         "The owning GApplication instance",
+                         G_TYPE_APPLICATION,
+                         G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY |
+                         G_PARAM_STATIC_STRINGS);
+
+  g_object_class_install_properties (oclass, NUM_PROPERTIES, properties);
 }
 
 void
-nautilus_dbus_manager_start (void)
+nautilus_dbus_manager_start (GApplication *application)
 {
   singleton = g_object_new (nautilus_dbus_manager_get_type (),
+                            "application", application,
                             NULL);
 }
 
diff --git a/libnautilus-private/nautilus-dbus-manager.h b/libnautilus-private/nautilus-dbus-manager.h
index 6ad6424..16ea8c4 100644
--- a/libnautilus-private/nautilus-dbus-manager.h
+++ b/libnautilus-private/nautilus-dbus-manager.h
@@ -25,8 +25,9 @@
 #define __NAUTILUS_DBUS_MANAGER_H__
 
 #include <glib-object.h>
+#include <gio/gio.h>
 
-void nautilus_dbus_manager_start (void);
+void nautilus_dbus_manager_start (GApplication *application);
 void nautilus_dbus_manager_stop (void);
 
 #endif /* __NAUTILUS_DBUS_MANAGER_H__ */
diff --git a/src/nautilus-application.c b/src/nautilus-application.c
index e2a57a9..1f7ff0d 100644
--- a/src/nautilus-application.c
+++ b/src/nautilus-application.c
@@ -1154,7 +1154,7 @@ nautilus_application_startup (GApplication *app)
 	gtk_icon_theme_append_search_path (gtk_icon_theme_get_default (),
 					   NAUTILUS_DATADIR G_DIR_SEPARATOR_S "icons");
 
-	nautilus_dbus_manager_start ();
+	nautilus_dbus_manager_start (app);
 }
 
 static void



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]