+ g_free (data);
+}
+
+static void
+on_open_uri_cb (GObject *source_object,
+ GAsyncResult *res,
+ gpointer user_data)
+{
+ GDBusConnection *connection = G_DBUS_CONNECTION (source_object);
+ GVariant *value;
+ GError *error = NULL;
+
+ value = g_dbus_connection_call_finish (connection, res, &error);
+ if (!value) {
+ g_warning ("Failed to OpenURI: %s", error->message);
+ g_error_free (error);
+ }
+ g_variant_unref (value);
+
+ ev_application_shutdown (EV_APP);
+}
+
+static void
+on_register_uri_cb (GObject *source_object,
+ GAsyncResult *res,
+ gpointer user_data)
+{
+ GDBusConnection *connection = G_DBUS_CONNECTION (source_object);
+ EvRegisterDocData *data = (EvRegisterDocData *)user_data;
+ EvApplication *application = EV_APP;
+ GVariant *value;
+ const gchar *owner;
+ GVariantBuilder builder;
+ GError *error = NULL;
+
+ value = g_dbus_connection_call_finish (connection, res, &error);
+ if (!value) {
+ g_warning ("Error registering document: %s\n", error->message);
+ g_error_free (error);
+
+ _ev_application_open_uri_at_dest (application,
+ data->uri,
+ data->screen,
+ data->dest,
+ data->mode,
+ data->search_string,
+ data->timestamp);
+ ev_register_doc_data_free (data);
+
+ return;
+ }
+
+ g_variant_get (value, "(&s)", &owner);
+
+ /* This means that the document wasn't already registered; go
+ * ahead with opening it.
+ */
+ if (owner[0] == '\0') {
+ g_variant_unref (value);
+
+ application->doc_registered = TRUE;
+
+ _ev_application_open_uri_at_dest (application,
+ data->uri,
+ data->screen,
+ data->dest,
+ data->mode,
+ data->search_string,
+ data->timestamp);
+ ev_register_doc_data_free (data);
+
+ return;
+ }
+
+ /* Already registered */
+ g_variant_builder_init (&builder, G_VARIANT_TYPE ("(sa{sv}u)"));
+ g_variant_builder_add (&builder, "s", data->uri);
+
+ g_variant_builder_open (&builder, G_VARIANT_TYPE ("a{sv}"));
+ g_variant_builder_add (&builder, "{sv}",
+ "display",
+ g_variant_new_string (gdk_display_get_name (gdk_screen_get_display (data->screen))));
+ g_variant_builder_add (&builder, "{sv}",
+ "screen",
+ g_variant_new_int32 (gdk_screen_get_number (data->screen)));
+ if (data->dest) {
+ g_variant_builder_add (&builder, "{sv}",
+ "page-label",
+ g_variant_new_string (ev_link_dest_get_page_label (data->dest)));
+ }
+ if (data->search_string) {
+ g_variant_builder_add (&builder, "{sv}",
+ "find-string",
+ g_variant_new_string (data->search_string));
+ }
+ if (data->mode != EV_WINDOW_MODE_NORMAL) {
+ g_variant_builder_add (&builder, "{sv}",
+ "mode",
+ g_variant_new_uint32 (data->mode));
+ }
+ g_variant_builder_close (&builder);
+
+ g_variant_builder_add (&builder, "u", data->timestamp);
+
+ g_dbus_connection_call (connection,
+ owner,
+ APPLICATION_DBUS_OBJECT_PATH,
+ APPLICATION_DBUS_INTERFACE,
+ "OpenURI",
+ g_variant_builder_end (&builder),
+ NULL,
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL,
+ on_open_uri_cb,
+ NULL);
+ g_variant_unref (value);
+ ev_register_doc_data_free (data);
+}
+
+/*
+ * ev_application_register_uri:
+ * @application:
+ * @uri:
+ * @screen:
+ * @dest:
+ * @mode:
+ * @search_string:
+ * @timestamp:
+ *
+ * Registers @uri with evince-daemon.
+ *
+ */
+static void
+ev_application_register_uri (EvApplication *application,
+ const gchar *uri,
+ GdkScreen *screen,
+ EvLinkDest *dest,
+ EvWindowRunMode mode,
+ const gchar *search_string,
+ guint timestamp)
+{
+ EvRegisterDocData *data;
+
+ if (!application->connection)
+ return;
+
+ if (application->doc_registered) {
+ /* Already registered, reload */
+ GList *windows, *l;
+
+ windows = ev_application_get_windows (application);
+ for (l = windows; l != NULL; l = g_list_next (l)) {
+ EvWindow *ev_window = EV_WINDOW (l->data);