diff options
author | Srinivasa Ragavan <sragavan@src.gnome.org> | 2007-04-13 02:15:50 +0800 |
---|---|---|
committer | Srinivasa Ragavan <sragavan@src.gnome.org> | 2007-04-13 02:15:50 +0800 |
commit | 12591b12bf768a2df582b6369e3534ea85a749e6 (patch) | |
tree | 803ce32b469906e056b98c63ca99adad82362593 /plugins/backup-restore/backup-restore.c | |
parent | 4a67e80dce6d56d36b935d3369e01d70fc7bdbf2 (diff) | |
download | gsoc2013-evolution-12591b12bf768a2df582b6369e3534ea85a749e6.tar gsoc2013-evolution-12591b12bf768a2df582b6369e3534ea85a749e6.tar.gz gsoc2013-evolution-12591b12bf768a2df582b6369e3534ea85a749e6.tar.bz2 gsoc2013-evolution-12591b12bf768a2df582b6369e3534ea85a749e6.tar.lz gsoc2013-evolution-12591b12bf768a2df582b6369e3534ea85a749e6.tar.xz gsoc2013-evolution-12591b12bf768a2df582b6369e3534ea85a749e6.tar.zst gsoc2013-evolution-12591b12bf768a2df582b6369e3534ea85a749e6.zip |
Reworked Backup/restore plugin.
svn path=/trunk/; revision=33422
Diffstat (limited to 'plugins/backup-restore/backup-restore.c')
-rw-r--r-- | plugins/backup-restore/backup-restore.c | 231 |
1 files changed, 195 insertions, 36 deletions
diff --git a/plugins/backup-restore/backup-restore.c b/plugins/backup-restore/backup-restore.c index 31b69d9915..7adc48b092 100644 --- a/plugins/backup-restore/backup-restore.c +++ b/plugins/backup-restore/backup-restore.c @@ -3,27 +3,41 @@ #include <sys/wait.h> #include <gtk/gtk.h> #include <glib/gi18n.h> +#include <libgnomeui/libgnomeui.h> #include "shell/es-menu.h" +#include "mail/em-config.h" +#include "mail/em-account-editor.h" +#include "e-util/e-error.h" +#include "e-util/e-util.h" +#include "e-util/e-dialog-utils.h" void org_gnome_backup_restore_backup (EPlugin *ep, ESMenuTargetShell *target); void org_gnome_backup_restore_restore (EPlugin *ep, ESMenuTargetShell *target); +GtkWidget * backup_restore_page (EPlugin *ep, EConfigHookItemFactoryData *hook_data); +void backup_restore_commit (EPlugin *ep, EMConfigTargetAccount *target); +void backup_restore_abort (EPlugin *ep, EMConfigTargetAccount *target); + +typedef enum _br_flags { + BR_OK = 1<<0, + BR_START = 1<<1, +}br_flags; static void backup (const char *filename, gboolean restart) { if (restart) - execl (EVOLUTION_TOOLSDIR "/backup", "backup", "--backup", "--restart", filename, NULL); + execl (EVOLUTION_TOOLSDIR "/evolution-backup", "evolution-backup", "--gui", "--backup", "--restart", filename, NULL); else - execl (EVOLUTION_TOOLSDIR "/backup", "backup", "--backup", filename, NULL); + execl (EVOLUTION_TOOLSDIR "/evolution-backup", "evolution-backup", "--gui", "--backup", filename, NULL); } static void restore (const char *filename, gboolean restart) { if (restart) - execl (EVOLUTION_TOOLSDIR "/backup", "backup", "--restore", "--restart", filename, NULL); + execl (EVOLUTION_TOOLSDIR "/evolution-backup", "evolution-backup", "--gui", "--restore", "--restart", filename, NULL); else - execl (EVOLUTION_TOOLSDIR "/backup", "backup", "--restore", filename, NULL); + execl (EVOLUTION_TOOLSDIR "/evolution-backup", "evolution-backup", "--gui", "--restore", filename, NULL); } static gboolean @@ -32,48 +46,84 @@ sanity_check (const char *filename) char *command; int result; - command = g_strdup_printf ("%s/backup --check %s", EVOLUTION_TOOLSDIR, filename); + command = g_strdup_printf ("%s/evolution-backup --check %s", EVOLUTION_TOOLSDIR, filename); result = system (command); g_free (command); - g_message ("Sanity check result %d:%d", WIFEXITED (result), WEXITSTATUS (result)); + g_message ("Sanity check result %d:%d %d", WIFEXITED (result), WEXITSTATUS (result), result); return WIFEXITED (result) && (WEXITSTATUS (result) == 0); } +static guint32 +dialog_prompt_user(GtkWindow *parent, const char *string, const char *tag, const char *arg0, ...) +{ + GtkWidget *mbox, *check = NULL; + va_list ap; + int button; + guint32 mask = 0; + + va_start(ap, arg0); + mbox = e_error_newv(parent, tag, arg0, ap); + va_end(ap); + + check = gtk_check_button_new_with_mnemonic (string); + /* We should hardcode this to true */ + gtk_toggle_button_set_active ((GtkToggleButton *)check, TRUE); + gtk_container_set_border_width((GtkContainer *)check, 12); + gtk_box_pack_start ((GtkBox *)((GtkDialog *) mbox)->vbox, check, TRUE, TRUE, 0); + gtk_widget_show (check); + + button = gtk_dialog_run ((GtkDialog *) mbox); + + if (button == GTK_RESPONSE_YES) + mask |= BR_OK; + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(check))) + mask |= BR_START; + + gtk_widget_destroy(mbox); + + return mask; +} + void org_gnome_backup_restore_backup (EPlugin *ep, ESMenuTargetShell *target) { GtkWidget *dlg; - GtkWidget *vbox, *check; + GtkWidget *vbox; int response; - - dlg = gtk_file_chooser_dialog_new (_("Select name of Evolution archive"), GTK_WINDOW (target->target.widget), - GTK_FILE_CHOOSER_ACTION_SAVE, - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - GTK_STOCK_SAVE, GTK_RESPONSE_OK, NULL); + + dlg = e_file_get_save_filesel(target->target.widget, _("Select name of the Evolution archive"), NULL, GTK_FILE_CHOOSER_ACTION_SAVE); + +/* dlg = gtk_file_chooser_dialog_new (_("Select name of the Evolution archive"), GTK_WINDOW (target->target.widget), */ +/* GTK_FILE_CHOOSER_ACTION_SAVE, */ +/* GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, */ +/* GTK_STOCK_SAVE, GTK_RESPONSE_OK, NULL); */ gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (dlg), "evolution-backup.tar.gz"); vbox = gtk_vbox_new (FALSE, 6); gtk_widget_show (vbox); - check = gtk_check_button_new_with_mnemonic (_("_Restart Evolution after backup")); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check), TRUE); - gtk_widget_show (check); - - gtk_box_pack_start (GTK_BOX (vbox), check, FALSE, TRUE, 0); - gtk_file_chooser_set_extra_widget (GTK_FILE_CHOOSER (dlg), vbox); - response = gtk_dialog_run (GTK_DIALOG (dlg)); if (response == GTK_RESPONSE_OK) { char *filename; + guint32 mask; + char *uri = NULL; + uri = gtk_file_chooser_get_current_folder_uri(GTK_FILE_CHOOSER (dlg)); + e_file_update_save_path(uri, TRUE); + filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dlg)); - - backup (filename, gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (check))); + gtk_widget_destroy (dlg); + + mask = dialog_prompt_user (GTK_WINDOW (target->target.widget), _("_Restart Evolution after backup"), "org.gnome.backup-restore:backup-confirm", NULL); + if (mask & BR_OK) + backup (filename, (mask & BR_START) ? TRUE: FALSE); g_free (filename); + + return; } gtk_widget_destroy (dlg); @@ -83,40 +133,149 @@ void org_gnome_backup_restore_restore (EPlugin *ep, ESMenuTargetShell *target) { GtkWidget *dlg; - GtkWidget *vbox, *check; + GtkWidget *vbox; int response; - - dlg = gtk_file_chooser_dialog_new (_("Select Evolution archive to restore"), GTK_WINDOW (target->target.widget), - GTK_FILE_CHOOSER_ACTION_OPEN, - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - GTK_STOCK_OPEN, GTK_RESPONSE_OK, NULL); + + dlg = e_file_get_save_filesel(target->target.widget, _("Select name of the Evolution archive to restore"), NULL, GTK_FILE_CHOOSER_ACTION_OPEN); + +/* dlg = gtk_file_chooser_dialog_new (_("Select Evolution archive to restore"), GTK_WINDOW (target->target.widget), */ +/* GTK_FILE_CHOOSER_ACTION_OPEN, */ +/* GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, */ +/* GTK_STOCK_OPEN, GTK_RESPONSE_OK, NULL); */ vbox = gtk_vbox_new (FALSE, 6); gtk_widget_show (vbox); - check = gtk_check_button_new_with_mnemonic (_("_Restart Evolution after restore")); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check), TRUE); - gtk_widget_show (check); - - gtk_box_pack_start (GTK_BOX (vbox), check, FALSE, TRUE, 0); - gtk_file_chooser_set_extra_widget (GTK_FILE_CHOOSER (dlg), vbox); - response = gtk_dialog_run (GTK_DIALOG (dlg)); if (response == GTK_RESPONSE_OK) { char *filename; + char *uri = NULL; + uri = gtk_file_chooser_get_current_folder_uri(GTK_FILE_CHOOSER (dlg)); + e_file_update_save_path(uri, TRUE); + filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dlg)); + gtk_widget_destroy (dlg); if (sanity_check (filename)) { - restore (filename, gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (check))); + guint32 mask; + + mask = dialog_prompt_user (GTK_WINDOW (target->target.widget), _("_Restart Evolution after restore"), "org.gnome.backup-restore:backup-confirm", NULL); + if (mask & BR_OK) + restore (filename, mask & BR_START); } else { - g_message ("Invalid archive"); + e_error_run (GTK_WINDOW (target->target.widget), "org.gnome.backup-restore:invalid-archive", NULL); } g_free (filename); + + return; } gtk_widget_destroy (dlg); } +static void +check_toggled (GtkToggleButton *button, GnomeDruid *druid) +{ + GtkWidget *box = g_object_get_data ((GObject *)button, "box"); + gboolean state = gtk_toggle_button_get_active ((GtkToggleButton *)button); + char *prevfile = g_object_get_data ((GObject *)druid, "restore-file"); + + gtk_widget_set_sensitive (box, state); + gnome_druid_set_show_finish (druid, state); + if (state && !prevfile) + gnome_druid_set_buttons_sensitive (druid, TRUE, FALSE, TRUE, TRUE); + else + gnome_druid_set_buttons_sensitive (druid, TRUE, TRUE, TRUE, TRUE); + + g_object_set_data ((GObject *)druid, "restore", GINT_TO_POINTER (state?1:0)); + +} + +static void +restore_wizard (GnomeDruidPage *druidpage, GnomeDruid *druid, gpointer user_data) +{ + gboolean state = GPOINTER_TO_INT(g_object_get_data((GObject *)druid, "restore")) ? TRUE:FALSE; + char *file = g_object_get_data ((GObject *)druid, "restore-file"); + + if (state) { + if (!file ||!sanity_check (file)) { + e_error_run ((GtkWindow *)druid, "org.gnome.backup-restore:invalid-archive", NULL); + } else + restore (file, TRUE); + + } +} + +static void +file_changed (GtkFileChooser *chooser, GnomeDruid *druid) +{ + char *file = NULL, *prevfile=NULL; + char *uri = NULL; + + uri = gtk_file_chooser_get_current_folder_uri(GTK_FILE_CHOOSER (chooser)); + e_file_update_save_path(uri, TRUE); + + file = gtk_file_chooser_get_filename (chooser); + prevfile = g_object_get_data ((GObject *)druid, "restore-file"); + g_object_set_data ((GObject *)druid, "restore-file", file); + g_free (prevfile); + if (file) { + gnome_druid_set_buttons_sensitive (druid, TRUE, TRUE, TRUE, TRUE); + } else + gnome_druid_set_buttons_sensitive (druid, TRUE, FALSE, TRUE, TRUE); + +} +GtkWidget * +backup_restore_page (EPlugin *ep, EConfigHookItemFactoryData *hook_data) +{ + GtkWidget *page; + GtkWidget *box, *hbox, *label, *cbox, *button; + + page = gnome_druid_page_standard_new_with_vals (_("Restore from backup"), NULL, NULL); + hbox = gtk_hbox_new (FALSE, 6); + label = gtk_label_new (_("You can restore Evolution from your archive. It can restore all the Mails/Calendars/Tasks/Memos/Addressbook. \nIt also restores all your personal settings, mail filters etc.")); + gtk_box_pack_start ((GtkBox *)hbox, label, FALSE, FALSE, 6); + box = gtk_vbox_new (FALSE, 6); + gtk_box_pack_start ((GtkBox *)box, hbox, FALSE, FALSE, 0); + + hbox = gtk_hbox_new (FALSE, 6); + cbox = gtk_check_button_new_with_mnemonic (_("_Restore Evolution from the backup archive")); + g_signal_connect (cbox, "toggled", G_CALLBACK (check_toggled), hook_data->parent); + gtk_box_pack_start ((GtkBox *)hbox, cbox, FALSE, FALSE, 6); + gtk_box_pack_start ((GtkBox *)box, hbox, FALSE, FALSE, 0); + + hbox = gtk_hbox_new (FALSE, 6); + g_object_set_data ((GObject *)cbox, "box", hbox); + label = gtk_label_new (_("Please select an Evolution Archive to restore:")); + gtk_box_pack_start ((GtkBox *)hbox, label, FALSE, FALSE, 12); + + button = gtk_file_chooser_button_new (_("Choose a file to restore"), GTK_FILE_CHOOSER_ACTION_OPEN); + g_signal_connect (button, "selection-changed", G_CALLBACK (file_changed), hook_data->parent); + gtk_file_chooser_button_set_width_chars ((GtkFileChooserButton *)button, 20); + gtk_box_pack_start ((GtkBox *)hbox, button, FALSE, FALSE, 0); + gtk_box_pack_start ((GtkBox *)box, hbox, FALSE, FALSE, 0); + gtk_widget_set_sensitive (hbox, FALSE); + + + gtk_container_add ((GtkContainer *) GNOME_DRUID_PAGE_STANDARD (page)->vbox, box); + gtk_widget_show_all (box); + gnome_druid_append_page (GNOME_DRUID (hook_data->parent), GNOME_DRUID_PAGE (page)); + g_object_set_data ((GObject *)hook_data->parent, "restore", GINT_TO_POINTER (FALSE)); + g_signal_connect (page, "finish", G_CALLBACK (restore_wizard), NULL); + return GTK_WIDGET (page); +} +void +backup_restore_commit (EPlugin *ep, EMConfigTargetAccount *target) +{ + /* Nothing really */ + printf("commit\n"); +} + +void +backup_restore_abort (EPlugin *ep, EMConfigTargetAccount *target) +{ + /* Nothing really */ +} |