]> www.fi.muni.cz Git - evince.git/blobdiff - shell/ev-daemon.c
[totem-screensaver] Adapt to GDBus API change
[evince.git] / shell / ev-daemon.c
index 9aed23e1d73788a03311f82f5b2e0674be33711a..b136369dfe8142e07f359d5758097469ba11213a 100644 (file)
@@ -37,6 +37,8 @@
 
 #define DAEMON_TIMEOUT (30) /* seconds */
 
+#define LOG g_printerr
+
 static GList *ev_daemon_docs = NULL;
 static guint kill_timer_id;
 
@@ -88,6 +90,8 @@ ev_daemon_shutdown (gpointer user_data)
 {
         GMainLoop *loop = (GMainLoop *) user_data;
 
+        LOG ("Timeout; exiting daemon.\n");
+
         if (g_main_loop_is_running (loop))
                 g_main_loop_quit (loop);
 
@@ -207,6 +211,7 @@ name_appeared_cb (GDBusConnection *connection,
                   const gchar     *name_owner,
                   gpointer         user_data)
 {
+        LOG ("Watch name'%s' appeared with owner '%s'\n", name, name_owner);
 }
 
 static void
@@ -216,12 +221,16 @@ name_vanished_cb (GDBusConnection *connection,
 {
        GList *l;
 
+        LOG ("Watch name'%s' disappeared\n", name);
+
         for (l = ev_daemon_docs; l != NULL; l = l->next) {
                 EvDoc *doc = (EvDoc *) l->data;
 
                 if (strcmp (doc->dbus_name, name) != 0)
                         continue;
 
+                LOG ("Watch found URI '%s' for name; removing\n", doc->uri);
+
                 ev_daemon_docs = g_list_delete_link (ev_daemon_docs, l);
                 ev_doc_free (doc);
                 
@@ -250,35 +259,41 @@ method_call_cb (GDBusConnection       *connection,
                 g_variant_get (parameters, "(&s)", &uri);
 
                 doc = ev_daemon_find_doc (uri);
-                if (doc == NULL) {
-                        ev_daemon_stop_killtimer ();
-
-                        doc = g_new (EvDoc, 1);
-                        doc->dbus_name = g_strdup (sender);
-                        doc->uri = g_strdup (uri);
+                if (doc != NULL) {
+                        LOG ("RegisterDocument found owner '%s' for URI '%s'\n", doc->dbus_name, uri);
+                        g_dbus_method_invocation_return_value (invocation,
+                                                               g_variant_new ("(s)", doc->dbus_name));
+                        return;
+                }
+        
+                ev_daemon_stop_killtimer ();
 
-                        doc->watch_id = g_bus_watch_name (G_BUS_TYPE_STARTER,
-                                                          sender,
-                                                          G_BUS_NAME_WATCHER_FLAGS_NONE,
-                                                          name_appeared_cb,
-                                                          name_vanished_cb,
-                                                          user_data, NULL);
+                doc = g_new (EvDoc, 1);
+                doc->dbus_name = g_strdup (sender);
+                doc->uri = g_strdup (uri);
 
-                        ev_daemon_docs = g_list_prepend (ev_daemon_docs, doc);
-                }
+                doc->watch_id = g_bus_watch_name_on_connection (connection,
+                                                                sender,
+                                                                G_BUS_NAME_WATCHER_FLAGS_NONE,
+                                                                name_appeared_cb,
+                                                                name_vanished_cb,
+                                                                user_data, NULL);
 
-                g_dbus_method_invocation_return_value (invocation,
-                                                       g_variant_new ("(s)", doc->dbus_name));
-                return;
+                LOG ("RegisterDocument registered owner '%s' for URI '%s'\n", doc->dbus_name, uri);
+                ev_daemon_docs = g_list_prepend (ev_daemon_docs, doc);
 
+                g_dbus_method_invocation_return_value (invocation, g_variant_new ("(s)", ""));
         } else if (g_strcmp0 (method_name, "UnregisterDocument") == 0) {
                 EvDoc *doc;
                 const gchar *uri;
 
                 g_variant_get (parameters, "(&s)", &uri);
 
+                LOG ("UnregisterDocument URI '%s'\n", uri);
+
                 doc = ev_daemon_find_doc (uri);
                 if (doc == NULL) {
+                        LOG ("UnregisterDocument URI was not registered!\n");
                         g_dbus_method_invocation_return_error_literal (invocation,
                                                                        G_DBUS_ERROR,
                                                                        G_DBUS_ERROR_INVALID_ARGS,
@@ -287,6 +302,9 @@ method_call_cb (GDBusConnection       *connection,
                 }
 
                 if (strcmp (doc->dbus_name, sender) != 0) {
+                        LOG ("UnregisterDocument called by non-owner (owner '%s' sender '%s')\n",
+                             doc->dbus_name, sender);
+
                         g_dbus_method_invocation_return_error_literal (invocation,
                                                                        G_DBUS_ERROR,
                                                                        G_DBUS_ERROR_BAD_ADDRESS,
@@ -299,10 +317,58 @@ method_call_cb (GDBusConnection       *connection,
                 ev_daemon_maybe_start_killtimer (user_data);
 
                 g_dbus_method_invocation_return_value (invocation, g_variant_new ("()"));
-                return;
         }
 }
 
+static const char introspection_xml[] =
+  "<node>"
+    "<interface name='org.gnome.evince.Daemon'>"
+      "<method name='RegisterDocument'>"
+        "<arg type='s' name='uri' direction='in'/>"
+        "<arg type='s' name='owner' direction='out'/>"
+      "</method>"
+      "<method name='UnregisterDocument'>"
+        "<arg type='s' name='uri' direction='in'/>"
+      "</method>"
+    "</interface>"
+  "</node>";
+
+static const GDBusInterfaceVTable interface_vtable = {
+  method_call_cb,
+  NULL,
+  NULL
+};
+
+static GDBusNodeInfo *introspection_data;
+
+static void
+bus_acquired_cb (GDBusConnection *connection,
+                const gchar     *name,
+                gpointer         user_data)
+{
+       GMainLoop *loop = (GMainLoop *) user_data;
+       guint      registration_id;
+       GError    *error = NULL;
+
+       if (!introspection_data)
+               introspection_data = g_dbus_node_info_new_for_xml (introspection_xml, NULL);
+
+       registration_id = g_dbus_connection_register_object (connection,
+                                                            EV_DBUS_DAEMON_OBJECT_PATH,
+                                                            introspection_data->interfaces[0],
+                                                            &interface_vtable,
+                                                            g_main_loop_ref (loop),
+                                                            (GDestroyNotify) g_main_loop_unref,
+                                                            &error);
+       if (registration_id == 0) {
+               g_printerr ("Failed to register object: %s\n", error->message);
+               g_error_free (error);
+
+               if (g_main_loop_is_running (loop))
+                       g_main_loop_quit (loop);
+       }
+}
+
 static void
 name_acquired_cb (GDBusConnection *connection,
                   const gchar     *name,
@@ -325,82 +391,36 @@ name_lost_cb (GDBusConnection *connection,
                   g_main_loop_quit (loop);
 }
 
-static const char introspection_xml[] =
-  "<node>"
-    "<interface name='org.gnome.evince.Daemon'>"
-      "<method name='RegisterDocument'>"
-        "<arg type='s' name='uri' direction='in'/>"
-        "<arg type='s' name='owner' direction='out'/>"
-      "</method>"
-      "<method name='UnregisterDocument'>"
-        "<arg type='s' name='uri' direction='in'/>"
-      "</method>"
-    "</interface>"
-  "</node>";
-
-static const GDBusInterfaceVTable interface_vtable = {
-  method_call_cb,
-  NULL,
-  NULL
-};
-
 gint
 main (gint argc, gchar **argv)
 {
-        GDBusConnection *connection;
        GMainLoop *loop;
-        GError *error = NULL;
-        guint registration_id, owner_id;
-        GDBusNodeInfo *introspection_data;
+        guint owner_id;
 
         g_set_prgname ("evince-daemon");
 
        g_type_init ();
 
-        connection = g_bus_get_sync (G_BUS_TYPE_STARTER, NULL, &error);
-        if (connection == NULL) {
-                g_printerr ("Failed to get bus connection: %s\n", error->message);
-                g_error_free (error);
-                return 1;
-        }
-
-        introspection_data = g_dbus_node_info_new_for_xml (introspection_xml, NULL);
-        g_assert (introspection_data != NULL);
-
        loop = g_main_loop_new (NULL, FALSE);
 
-        registration_id = g_dbus_connection_register_object (connection,
-                                                             EV_DBUS_DAEMON_OBJECT_PATH,
-                                                             EV_DBUS_DAEMON_NAME,
-                                                             introspection_data->interfaces[0],
-                                                             &interface_vtable,
-                                                             g_main_loop_ref (loop),
-                                                             (GDestroyNotify) g_main_loop_unref,
-                                                             &error);
-        if (registration_id == 0) {
-                g_printerr ("Failed to register object: %s\n", error->message);
-                g_error_free (error);
-                g_object_unref (connection);
-                return 1;
-        }
-
-        owner_id = g_bus_own_name_on_connection (connection,
-                                                 EV_DBUS_DAEMON_NAME,
-                                                 G_BUS_NAME_OWNER_FLAGS_NONE,
-                                                 name_acquired_cb,
-                                                 name_lost_cb,
-                                                 g_main_loop_ref (loop),
-                                                 (GDestroyNotify) g_main_loop_unref);
+        owner_id = g_bus_own_name (G_BUS_TYPE_SESSION,
+                                  EV_DBUS_DAEMON_NAME,
+                                  G_BUS_NAME_OWNER_FLAGS_NONE,
+                                  bus_acquired_cb,
+                                  name_acquired_cb,
+                                  name_lost_cb,
+                                  g_main_loop_ref (loop),
+                                  (GDestroyNotify) g_main_loop_unref);
 
         g_main_loop_run (loop);
 
         g_bus_unown_name (owner_id);
 
         g_main_loop_unref (loop);
-        g_dbus_node_info_unref (introspection_data);
+       if (introspection_data)
+               g_dbus_node_info_unref (introspection_data);
         g_list_foreach (ev_daemon_docs, (GFunc)ev_doc_free, NULL);
         g_list_free (ev_daemon_docs);
-        g_object_unref (connection);
 
        return 0;
 }