]> www.fi.muni.cz Git - evince.git/commitdiff
Do not try to recover invalid or unneeded files
authorCarlos Garcia Campos <carlosgc@gnome.org>
Fri, 25 Sep 2009 09:23:40 +0000 (11:23 +0200)
committerCarlos Garcia Campos <carlosgc@gnome.org>
Fri, 25 Sep 2009 09:23:40 +0000 (11:23 +0200)
Files that no longer exist or that are already in the command line.
Fixes bgo#595887

shell/ev-application.c

index bff03ee1a4807a9ce7283c66ce83717aa675ff23..5c2b370f8e01e54cc7b42eb02caa45eaa2fa6269 100644 (file)
@@ -260,48 +260,11 @@ save_session_crashed_in_idle (EvApplication *application)
 }
 
 static gboolean
-ev_application_run_crash_recovery_dialog (EvApplication *application,
-                                         const gchar  **files)
+ev_application_run_crash_recovery_dialog (EvApplication *application)
 {
        GtkWidget *dialog;
        gint       response;
 
-       /* Do not show the recover dialog if the requested file is the
-        * only one to be recovered
-        */
-       if (files && g_strv_length ((gchar **)files) == 1) {
-               GKeyFile *state_file;
-               gchar   **uri_list;
-
-               state_file = g_key_file_new ();
-               g_key_file_load_from_file (state_file,
-                                          application->crashed_file,
-                                          G_KEY_FILE_NONE,
-                                          NULL);
-               uri_list = g_key_file_get_string_list (state_file,
-                                                      "Evince",
-                                                      "documents",
-                                                      NULL, NULL);
-               if (uri_list && g_strv_length (uri_list) == 1) {
-                       GFile *file;
-                       gchar *uri;
-
-                       file = g_file_new_for_commandline_arg (files[0]);
-                       uri = g_file_get_uri (file);
-                       g_object_unref (file);
-                       if (g_ascii_strcasecmp (uri, uri_list[0]) == 0) {
-                               g_strfreev (uri_list);
-                               g_key_file_free (state_file);
-                               g_free (uri);
-
-                               return FALSE;
-                       }
-                       g_free (uri);
-                       g_strfreev (uri_list);
-               }
-               g_key_file_free (state_file);
-       }
-
        dialog = gtk_message_dialog_new (NULL,
                                         GTK_DIALOG_MODAL,
                                         GTK_MESSAGE_WARNING,
@@ -330,6 +293,84 @@ ev_application_run_crash_recovery_dialog (EvApplication *application,
 
        return response == GTK_RESPONSE_ACCEPT;
 }
+
+static gboolean
+is_in_command_line (GFile         *file,
+                   const gchar  **files)
+{
+       gint i;
+
+       if (!files)
+               return FALSE;
+
+       for (i = 0; files[i]; i++) {
+               GFile *cfile;
+
+               cfile = g_file_new_for_commandline_arg (files[i]);
+               if (g_file_equal (cfile, file)) {
+                       g_object_unref (cfile);
+                       return TRUE;
+               }
+               g_object_unref (cfile);
+       }
+
+       return FALSE;
+}
+
+static GKeyFile *
+ev_application_get_files_to_recover (EvApplication *application,
+                                    const gchar  **files)
+{
+       GKeyFile *state_file;
+       gchar   **uri_list;
+       gchar   **dest_list = NULL;
+       gint      i, j;
+
+       state_file = g_key_file_new ();
+       g_key_file_load_from_file (state_file,
+                                  application->crashed_file,
+                                  G_KEY_FILE_NONE,
+                                  NULL);
+
+       uri_list = g_key_file_get_string_list (state_file,
+                                              "Evince",
+                                              "documents",
+                                              NULL, NULL);
+       if (!uri_list) {
+               g_key_file_free (state_file);
+               return NULL;
+       }
+
+       for (i = 0, j = 0; uri_list[i]; i++) {
+               GFile *file = g_file_new_for_uri (uri_list[i]);
+
+               if (!g_file_query_exists (file, NULL) ||
+                   is_in_command_line (file, files)) {
+                       g_object_unref (file);
+                       continue;
+               }
+
+               if (!dest_list)
+                       dest_list = g_new (gchar *, g_strv_length (uri_list) - i);
+               dest_list[j++] = uri_list[i];
+       }
+
+       if (j > 0) {
+               g_key_file_set_string_list (state_file,
+                                           "Evince",
+                                           "documents",
+                                           (const gchar **)dest_list,
+                                           j);
+       } else {
+               g_key_file_free (state_file);
+               state_file = NULL;
+       }
+
+       g_free (dest_list);
+       g_strfreev (uri_list);
+
+       return state_file;
+}
 #endif /* ENABLE_DBUS */
 
 gboolean
@@ -348,13 +389,12 @@ ev_application_load_session (EvApplication *application,
 #endif /* WITH_SMCLIENT */
 #ifdef ENABLE_DBUS
         if (g_file_test (application->crashed_file, G_FILE_TEST_IS_REGULAR)) {
-               if (ev_application_run_crash_recovery_dialog (application, files)) {
-                       state_file = g_key_file_new ();
-                       g_key_file_load_from_file (state_file,
-                                                  application->crashed_file,
-                                                  G_KEY_FILE_NONE,
-                                                  NULL);
-               } else {
+               state_file = ev_application_get_files_to_recover (application, files);
+               if (!state_file)
+                       return FALSE;
+
+               if (!ev_application_run_crash_recovery_dialog (application)) {
+                       g_key_file_free (state_file);
                        return FALSE;
                }
        } else