aboutsummaryrefslogtreecommitdiffstats
path: root/plugins/backup-restore/backup-restore.c
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/backup-restore/backup-restore.c')
-rw-r--r--plugins/backup-restore/backup-restore.c122
1 files changed, 122 insertions, 0 deletions
diff --git a/plugins/backup-restore/backup-restore.c b/plugins/backup-restore/backup-restore.c
new file mode 100644
index 0000000000..7344806e83
--- /dev/null
+++ b/plugins/backup-restore/backup-restore.c
@@ -0,0 +1,122 @@
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <gtk/gtk.h>
+#include <libgnome/gnome-i18n.h>
+#include "shell/es-menu.h"
+
+void org_gnome_backup_restore_backup (EPlugin *ep, ESMenuTargetShell *target);
+void org_gnome_backup_restore_restore (EPlugin *ep, ESMenuTargetShell *target);
+
+static void
+backup (const char *filename, gboolean restart)
+{
+ if (restart)
+ execl (EVOLUTION_TOOLSDIR "/backup", "backup", "--backup", "--restart", filename, NULL);
+ else
+ execl (EVOLUTION_TOOLSDIR "/backup", "backup", "--backup", filename, NULL);
+}
+
+static void
+restore (const char *filename, gboolean restart)
+{
+ if (restart)
+ execl (EVOLUTION_TOOLSDIR "/backup", "backup", "--restore", "--restart", filename, NULL);
+ else
+ execl (EVOLUTION_TOOLSDIR "/backup", "backup", "--restore", filename, NULL);
+}
+
+static gboolean
+sanity_check (const char *filename)
+{
+ char *command;
+ int result;
+
+ command = g_strdup_printf ("%s/backup --check %s", EVOLUTION_TOOLSDIR, filename);
+ result = system (command);
+ g_free (command);
+
+ g_message ("Sanity check result %d:%d", WIFEXITED (result), WEXITSTATUS (result));
+
+ return WIFEXITED (result) && (WEXITSTATUS (result) == 0);
+}
+
+void
+org_gnome_backup_restore_backup (EPlugin *ep, ESMenuTargetShell *target)
+{
+ GtkWidget *dlg;
+ GtkWidget *vbox, *check;
+ 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);
+
+ 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;
+
+ filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dlg));
+
+ backup (filename, gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (check)));
+
+ g_free (filename);
+ }
+
+ gtk_widget_destroy (dlg);
+}
+
+void
+org_gnome_backup_restore_restore (EPlugin *ep, ESMenuTargetShell *target)
+{
+ GtkWidget *dlg;
+ GtkWidget *vbox, *check;
+ 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);
+
+ 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;
+
+ filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dlg));
+
+ if (sanity_check (filename)) {
+ restore (filename, gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (check)));
+ } else {
+ g_message ("Invalid archive");
+ }
+
+ g_free (filename);
+ }
+
+ gtk_widget_destroy (dlg);
+}
+
+