+ file_name = g_path_get_basename (ev_window->priv->password_uri);
+ ev_window->priv->password_dialog =
+ ev_password_dialog_new (GTK_WIDGET (ev_window), file_name);
+ g_object_add_weak_pointer (G_OBJECT (ev_window->priv->password_dialog),
+ (gpointer *) &(ev_window->priv->password_dialog));
+ g_signal_connect (ev_window->priv->password_dialog,
+ "response",
+ G_CALLBACK (password_dialog_response),
+ ev_window);
+ g_free (file_name);
+ gtk_widget_show (ev_window->priv->password_dialog);
+ } else {
+ ev_password_dialog_set_bad_pass (ev_window->priv->password_dialog);
+ }
+}
+
+/* This wil try to load the document. It might be called multiple times on the
+ * same document by the password dialog.
+ *
+ * Since the flow of the error dialog is very confusing, we assume that both
+ * document and uri will go away after this function is called, and thus we need
+ * to ref/dup them. Additionally, it needs to clear
+ * ev_window->priv->password_{uri,document}, and thus people who call this
+ * function should _not_ necessarily expect those to exist after being
+ * called. */
+static gboolean
+start_loading_document (EvWindow *ev_window,
+ EvDocument *document,
+ const char *uri)
+{
+ gboolean result;
+ GError *error = NULL;
+
+ g_assert (document);
+ g_assert (document != ev_window->priv->document);
+ g_assert (uri);
+ if (ev_window->priv->password_document) {
+ g_object_unref (ev_window->priv->password_document);
+ ev_window->priv->password_document = NULL;
+ }
+ if (ev_window->priv->password_uri) {
+ g_free (ev_window->priv->password_uri);
+ ev_window->priv->password_uri = NULL;
+ }
+
+ result = ev_document_load (document, uri, &error);
+
+ /* Success! */
+ if (result) {
+ if (ev_window->priv->document)
+ g_object_unref (ev_window->priv->document);
+ ev_window->priv->document = g_object_ref (document);
+ ev_window_setup_document (ev_window);
+
+ return TRUE;
+ }
+
+ /* unable to load the document */
+ g_assert (error != NULL);
+
+ if (error->domain == EV_DOCUMENT_ERROR &&
+ error->code == EV_DOCUMENT_ERROR_ENCRYPTED) {
+ char *file_name;
+
+ ev_window->priv->password_document = g_object_ref (document);
+ ev_window->priv->password_uri = g_strdup (uri);
+
+ file_name = g_path_get_basename (uri);
+ ev_password_view_set_file_name (EV_PASSWORD_VIEW (ev_window->priv->password_view),
+ file_name);
+ g_free (file_name);
+ ev_window_set_page_mode (ev_window, PAGE_MODE_PASSWORD);
+
+ ev_window_popup_password_dialog (ev_window);
+ } else {
+ unable_to_load (ev_window, error->message);
+ }
+ g_error_free (error);
+
+ return FALSE;