[evolution/account-mgmt: 30/54] Add 'backup-restore' module.



commit b53dc6cbc02fff1510c9ecf47731f5fa15504e4d
Author: Matthew Barnes <mbarnes redhat com>
Date:   Sun Mar 25 18:19:01 2012 -0400

    Add 'backup-restore' module.
    
    Replaces the 'backup-restore' plugin.

 configure.ac                                       |    4 +-
 modules/Makefile.am                                |    1 +
 modules/backup-restore/Makefile.am                 |   84 ++++
 .../backup-restore/e-mail-config-restore-page.c    |  382 ++++++++++++++++++
 .../backup-restore/e-mail-config-restore-page.h    |   81 ++++
 .../e-mail-config-restore-ready-page.c             |   80 ++++
 .../e-mail-config-restore-ready-page.h             |   76 ++++
 .../backup-restore/evolution-backup-restore.c      |  419 ++++++++++----------
 .../backup-restore/evolution-backup-tool.c         |   17 +-
 .../org-gnome-backup-restore.error.xml             |    4 +-
 plugins/backup-restore/Makefile.am                 |   66 ---
 .../org-gnome-backup-restore.eplug.xml             |   32 --
 12 files changed, 929 insertions(+), 317 deletions(-)
---
diff --git a/configure.ac b/configure.ac
index 2d72512..5d1b988 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1289,7 +1289,7 @@ plugins_base_always="calendar-file calendar-http itip-formatter default-source a
 plugins_base="$plugins_base_always"
 dist_plugins_base="$plugins_base_always calendar-weather"
 
-plugins_standard_always="bbdb save-calendar mail-to-task mailing-list-actions prefer-plain mail-notification attachment-reminder backup-restore email-custom-header face templates vcard-inline dbx-import"
+plugins_standard_always="bbdb save-calendar mail-to-task mailing-list-actions prefer-plain mail-notification attachment-reminder email-custom-header face templates vcard-inline dbx-import"
 
 plugins_standard="$plugins_standard_always"
 dist_plugins_standard="$plugins_standard audio-inline image-inline pst-import"
@@ -1618,6 +1618,7 @@ modules/addressbook/Makefile
 modules/bogofilter/Makefile
 modules/calendar/Makefile
 modules/mail/Makefile
+modules/backup-restore/Makefile
 modules/composer-autosave/Makefile
 modules/mailto-handler/Makefile
 modules/mdn/Makefile
@@ -1634,7 +1635,6 @@ plugins/Makefile
 plugins/addressbook-file/Makefile
 plugins/attachment-reminder/Makefile
 plugins/audio-inline/Makefile
-plugins/backup-restore/Makefile
 plugins/bbdb/Makefile
 plugins/caldav/Makefile
 plugins/calendar-file/Makefile
diff --git a/modules/Makefile.am b/modules/Makefile.am
index ce6c0aa..e52034b 100644
--- a/modules/Makefile.am
+++ b/modules/Makefile.am
@@ -15,6 +15,7 @@ SUBDIRS = \
 	bogofilter \
 	calendar \
 	mail \
+	backup-restore \
 	composer-autosave \
 	mailto-handler \
 	mdn \
diff --git a/modules/backup-restore/Makefile.am b/modules/backup-restore/Makefile.am
new file mode 100644
index 0000000..2a4d84f
--- /dev/null
+++ b/modules/backup-restore/Makefile.am
@@ -0,0 +1,84 @@
+NULL =
+
+module_LTLIBRARIES = libevolution-module-backup-restore.la
+
+libevolution_module_backup_restore_la_CPPFLAGS =		\
+	$(AM_CPPFLAGS)						\
+	-I$(top_srcdir)						\
+	-I$(top_srcdir)/widgets					\
+	-DG_LOG_DOMAIN=\"evolution-backup-restore\"		\
+	-DEVOLUTION_LOCALEDIR=\""$(localedir)"\"		\
+	-DEVOLUTION_TOOLSDIR=\""$(privlibexecdir)"\"		\
+	-DPREFIX=\""$(prefix)"\"				\
+	-DSYSCONFDIR=\""$(sysconfdir)"\"			\
+	-DDATADIR=\""$(datadir)"\"				\
+	-DLIBDIR=\""$(libdir)"\"				\
+	$(EVOLUTION_DATA_SERVER_CFLAGS)				\
+	$(GNOME_PLATFORM_CFLAGS)				\
+	$(GTKHTML_CFLAGS)					\
+	$(NULL)
+
+libevolution_module_backup_restore_la_SOURCES =			\
+	evolution-backup-restore.c				\
+	e-mail-config-restore-page.c				\
+	e-mail-config-restore-page.h				\
+	e-mail-config-restore-ready-page.c			\
+	e-mail-config-restore-ready-page.h			\
+	$(NULL)
+
+libevolution_module_backup_restore_la_LIBADD =			\
+	$(top_builddir)/e-util/libeutil.la			\
+	$(top_builddir)/shell/libeshell.la			\
+	$(top_builddir)/mail/libevolution-mail.la		\
+	$(top_builddir)/widgets/misc/libemiscwidgets.la		\
+	$(top_builddir)/libemail-engine/libemail-engine.la	\
+	$(top_builddir)/libevolution-utils/libevolution-utils.la \
+	$(EVOLUTION_DATA_SERVER_LIBS)				\
+	$(GNOME_PLATFORM_LIBS)					\
+	$(GTKHTML_LIBS)						\
+	$(NULL)
+
+libevolution_module_backup_restore_la_LDFLAGS =			\
+	-module -avoid-version $(NO_UNDEFINED)
+
+privlibexec_PROGRAMS = evolution-backup
+
+evolution_backup_CPPFLAGS =					\
+	$(AM_CPPFLAGS)						\
+	-I$(top_srcdir)						\
+	-I$(top_srcdir)/widgets					\
+	-DEVOLUTION_LOCALEDIR=\""$(localedir)"\"		\
+	-DEVOLUTION_TOOLSDIR=\""$(privlibexecdir)"\"		\
+	-DPREFIX=\""$(prefix)"\"				\
+	-DSYSCONFDIR=\""$(sysconfdir)"\"			\
+	-DDATADIR=\""$(datadir)"\"				\
+	-DLIBDIR=\""$(libdir)"\"				\
+	$(EVOLUTION_DATA_SERVER_CFLAGS)				\
+	$(GNOME_PLATFORM_CFLAGS)				\
+	$(NULL)
+
+evolution_backup_SOURCES =					\
+	evolution-backup-tool.c					\
+	$(NULL)
+
+evolution_backup_LDADD =					\
+	$(top_builddir)/e-util/libeutil.la			\
+	$(EVOLUTION_DATA_SERVER_LIBS)				\
+	$(GNOME_PLATFORM_LIBS)					\
+	$(NULL)
+
+if OS_WIN32
+evolution_backup_LDFLAGS = -mwindows
+endif
+
+error_DATA = org-gnome-backup-restore.error
+errordir = $(privdatadir)/errors
+ EVO_PLUGIN_RULE@
+
+BUILT_SOURCES = $(error_DATA)
+
+EXTRA_DIST =							\
+	org-gnome-backup-restore.error.xml			\
+	$(NULL)
+
+-include $(top_srcdir)/git.mk
diff --git a/modules/backup-restore/e-mail-config-restore-page.c b/modules/backup-restore/e-mail-config-restore-page.c
new file mode 100644
index 0000000..fa1a6fd
--- /dev/null
+++ b/modules/backup-restore/e-mail-config-restore-page.c
@@ -0,0 +1,382 @@
+/*
+ * e-mail-config-restore-page.c
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) version 3.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with the program; if not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+#include "e-mail-config-restore-page.h"
+
+#include <config.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/types.h>
+#ifdef HAVE_SYS_WAIT_H
+#  include <sys/wait.h>
+#endif
+#include <glib/gi18n-lib.h>
+
+#include <libevolution-utils/e-alert-sink.h>
+#include <libevolution-utils/e-alert-dialog.h>
+#include <misc/e-alert-bar.h>
+
+#define E_MAIL_CONFIG_RESTORE_PAGE_GET_PRIVATE(obj) \
+	(G_TYPE_INSTANCE_GET_PRIVATE \
+	((obj), E_TYPE_MAIL_CONFIG_RESTORE_PAGE, EMailConfigRestorePagePrivate))
+
+struct _EMailConfigRestorePagePrivate {
+	GtkWidget *toggle_button;  /* not referenced */
+	GtkWidget *file_chooser;   /* not referenced */
+	GtkWidget *alert_bar;      /* not referenced */
+	gchar *filename;
+};
+
+enum {
+	PROP_0,
+	PROP_FILENAME
+};
+
+/* Forward Declarations */
+static void	e_mail_config_restore_page_alert_sink_init
+					(EAlertSinkInterface *interface);
+static void	e_mail_config_restore_page_interface_init
+					(EMailConfigPageInterface *interface);
+
+G_DEFINE_DYNAMIC_TYPE_EXTENDED (
+	EMailConfigRestorePage,
+	e_mail_config_restore_page,
+	GTK_TYPE_BOX,
+	0,
+	G_IMPLEMENT_INTERFACE_DYNAMIC (
+		E_TYPE_ALERT_SINK,
+		e_mail_config_restore_page_alert_sink_init)
+	G_IMPLEMENT_INTERFACE_DYNAMIC (
+		E_TYPE_MAIL_CONFIG_PAGE,
+		e_mail_config_restore_page_interface_init))
+
+static void
+mail_config_restore_page_update_filename (EMailConfigRestorePage *page)
+{
+	GtkToggleButton *toggle_button;
+	GtkFileChooser *file_chooser;
+	gchar *filename = NULL;
+
+	file_chooser = GTK_FILE_CHOOSER (page->priv->file_chooser);
+	toggle_button = GTK_TOGGLE_BUTTON (page->priv->toggle_button);
+
+	e_alert_bar_clear (E_ALERT_BAR (page->priv->alert_bar));
+
+	if (gtk_toggle_button_get_active (toggle_button))
+		filename = gtk_file_chooser_get_filename (file_chooser);
+
+	if (!evolution_backup_restore_validate_backup_file (filename)) {
+		if (filename != NULL) {
+			e_alert_submit (
+				E_ALERT_SINK (page),
+				"org.gnome.backup-restore:invalid-backup",
+				NULL);
+			g_free (filename);
+			filename = NULL;
+		}
+	}
+
+	g_free (page->priv->filename);
+	page->priv->filename = filename;
+
+	g_object_notify (G_OBJECT (page), "filename");
+
+	e_mail_config_page_changed (E_MAIL_CONFIG_PAGE (page));
+}
+
+static void
+mail_config_restore_page_toggled_cb (GtkToggleButton *toggle_button,
+                                     EMailConfigRestorePage *page)
+{
+	mail_config_restore_page_update_filename (page);
+}
+
+static void
+mail_config_restore_page_file_set_cb (GtkFileChooser *file_chooser,
+                                      EMailConfigRestorePage *page)
+{
+	mail_config_restore_page_update_filename (page);
+}
+
+static void
+mail_config_restore_page_get_property (GObject *object,
+                                       guint property_id,
+                                       GValue *value,
+                                       GParamSpec *pspec)
+{
+	switch (property_id) {
+		case PROP_FILENAME:
+			g_value_set_string (
+				value,
+				e_mail_config_restore_page_get_filename (
+				E_MAIL_CONFIG_RESTORE_PAGE (object)));
+			return;
+	}
+
+	G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+}
+
+static void
+mail_config_restore_page_finalize (GObject *object)
+{
+	EMailConfigRestorePagePrivate *priv;
+
+	priv = E_MAIL_CONFIG_RESTORE_PAGE_GET_PRIVATE (object);
+
+	g_free (priv->filename);
+
+	/* Chain up to parent's finalize() method. */
+	G_OBJECT_CLASS (e_mail_config_restore_page_parent_class)->
+		finalize (object);
+}
+
+static void
+mail_config_restore_page_constructed (GObject *object)
+{
+	EMailConfigRestorePage *page;
+	GtkWidget *widget;
+	GtkWidget *container;
+	const gchar *text;
+
+	page = E_MAIL_CONFIG_RESTORE_PAGE (object);
+
+	/* Chain up to parent's constructed() method. */
+	G_OBJECT_CLASS (e_mail_config_restore_page_parent_class)->
+		constructed (object);
+
+	gtk_orientable_set_orientation (
+		GTK_ORIENTABLE (page), GTK_ORIENTATION_VERTICAL);
+
+	gtk_box_set_spacing (GTK_BOX (page), 24);
+
+	text = _("You can restore Evolution from a backup file.\n\n"
+		 "This will restore all your personal data, settings "
+		 "mail filters, etc.");
+	widget = gtk_label_new (text);
+	gtk_label_set_line_wrap (GTK_LABEL (widget), TRUE);
+	gtk_misc_set_alignment (GTK_MISC (widget), 0.0, 0.5);
+	gtk_box_pack_start (GTK_BOX (page), widget, FALSE, FALSE, 0);
+	gtk_widget_show (widget);
+
+	widget = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
+	gtk_box_pack_start (GTK_BOX (page), widget, FALSE, FALSE, 0);
+	gtk_widget_show (widget);
+
+	container = widget;
+
+	text = _("_Restore from a backup file:");
+	widget = gtk_check_button_new_with_mnemonic (text);
+	gtk_box_pack_start (GTK_BOX (container), widget, FALSE, FALSE, 0);
+	page->priv->toggle_button = widget;  /* not referenced */
+	gtk_widget_show (widget);
+
+	g_signal_connect (
+		widget, "toggled",
+		G_CALLBACK (mail_config_restore_page_toggled_cb), page);
+
+	widget = gtk_file_chooser_button_new (
+		_("Choose a backup file to restore"),
+		GTK_FILE_CHOOSER_ACTION_OPEN);
+	gtk_file_chooser_set_local_only (GTK_FILE_CHOOSER (widget), TRUE);
+	gtk_box_pack_start (GTK_BOX (container), widget, TRUE, TRUE, 0);
+	page->priv->file_chooser = widget;  /* not referenced */
+	gtk_widget_show (widget);
+
+	g_signal_connect (
+		widget, "file-set",
+		G_CALLBACK (mail_config_restore_page_file_set_cb), page);
+
+	widget = gtk_frame_new (NULL);
+	gtk_frame_set_shadow_type (GTK_FRAME (widget), GTK_SHADOW_IN);
+	gtk_box_pack_start (GTK_BOX (page), widget, FALSE, FALSE, 0);
+	/* Visibility is bound to the EActivityBar. */
+
+	container = widget;
+
+	widget = e_alert_bar_new ();
+	gtk_container_add (GTK_CONTAINER (container), widget);
+	page->priv->alert_bar = widget;  /* not referenced */
+	/* EActivityBar controls its own visibility. */
+
+	g_object_bind_property (
+		widget, "visible",
+		container, "visible",
+		G_BINDING_SYNC_CREATE);
+
+	g_object_bind_property (
+		page->priv->toggle_button, "active",
+		page->priv->file_chooser, "sensitive",
+		G_BINDING_SYNC_CREATE);
+}
+
+static void
+mail_config_restore_page_submit_alert (EAlertSink *alert_sink,
+                                       EAlert *alert)
+{
+	EMailConfigRestorePagePrivate *priv;
+	EAlertBar *alert_bar;
+	GtkWidget *dialog;
+	gpointer parent;
+
+	priv = E_MAIL_CONFIG_RESTORE_PAGE_GET_PRIVATE (alert_sink);
+
+	parent = gtk_widget_get_toplevel (GTK_WIDGET (alert_sink));
+	parent = gtk_widget_is_toplevel (parent) ? parent : NULL;
+
+	switch (e_alert_get_message_type (alert)) {
+		case GTK_MESSAGE_INFO:
+		case GTK_MESSAGE_WARNING:
+		case GTK_MESSAGE_ERROR:
+			alert_bar = E_ALERT_BAR (priv->alert_bar);
+			e_alert_bar_add_alert (alert_bar, alert);
+			break;
+
+		default:
+			dialog = e_alert_dialog_new (parent, alert);
+			gtk_dialog_run (GTK_DIALOG (dialog));
+			gtk_widget_destroy (dialog);
+			break;
+	}
+}
+
+static gboolean
+mail_config_restore_page_check_complete (EMailConfigPage *page)
+{
+	EMailConfigRestorePagePrivate *priv;
+	GtkToggleButton *toggle_button;
+	gboolean complete;
+
+	priv = E_MAIL_CONFIG_RESTORE_PAGE_GET_PRIVATE (page);
+
+	toggle_button = GTK_TOGGLE_BUTTON (priv->toggle_button);
+
+	complete =
+		!gtk_toggle_button_get_active (toggle_button) ||
+		(priv->filename != NULL && *priv->filename != '\0');
+
+	return complete;
+}
+
+static void
+e_mail_config_restore_page_class_init (EMailConfigRestorePageClass *class)
+{
+	GObjectClass *object_class;
+
+	g_type_class_add_private (
+		class, sizeof (EMailConfigRestorePagePrivate));
+
+	object_class = G_OBJECT_CLASS (class);
+	object_class->get_property = mail_config_restore_page_get_property;
+	object_class->finalize = mail_config_restore_page_finalize;
+	object_class->constructed = mail_config_restore_page_constructed;
+
+	g_object_class_install_property (
+		object_class,
+		PROP_FILENAME,
+		g_param_spec_string (
+			"filename",
+			"Filename",
+			"Selected filename to restore from",
+			NULL,
+			G_PARAM_READABLE));
+}
+
+static void
+e_mail_config_restore_page_class_finalize (EMailConfigRestorePageClass *class)
+{
+}
+
+static void
+e_mail_config_restore_page_alert_sink_init (EAlertSinkInterface *interface)
+{
+	interface->submit_alert = mail_config_restore_page_submit_alert;
+}
+
+static void
+e_mail_config_restore_page_interface_init (EMailConfigPageInterface *interface)
+{
+	interface->title = _("Restore from Backup");
+	interface->sort_order = E_MAIL_CONFIG_RESTORE_PAGE_SORT_ORDER;
+	interface->check_complete = mail_config_restore_page_check_complete;
+}
+
+static void
+e_mail_config_restore_page_init (EMailConfigRestorePage *page)
+{
+	page->priv = E_MAIL_CONFIG_RESTORE_PAGE_GET_PRIVATE (page);
+}
+
+void
+e_mail_config_restore_page_type_register (GTypeModule *type_module)
+{
+	/* XXX G_DEFINE_DYNAMIC_TYPE declares a static type registration
+	 *     function, so we have to wrap it with a public function in
+	 *     order to register types from a separate compilation unit. */
+	e_mail_config_restore_page_register_type (type_module);
+}
+
+EMailConfigPage *
+e_mail_config_restore_page_new (void)
+{
+	return g_object_new (E_TYPE_MAIL_CONFIG_RESTORE_PAGE, NULL);
+}
+
+const gchar *
+e_mail_config_restore_page_get_filename (EMailConfigRestorePage *page)
+{
+	g_return_val_if_fail (E_IS_MAIL_CONFIG_RESTORE_PAGE (page), NULL);
+
+	return page->priv->filename;
+}
+
+gboolean
+evolution_backup_restore_validate_backup_file (const gchar *filename)
+{
+	gchar *command;
+	gint result;
+	gchar *quotedfname;
+	gchar *toolfname;
+	const gchar *basedir;
+
+	if (filename == NULL || *filename == '\0')
+		return FALSE;
+
+	/* FIXME We should be using g_spawn_command_line_sync() here. */
+
+	basedir = EVOLUTION_TOOLSDIR;
+	quotedfname = g_shell_quote (filename);
+	toolfname = g_build_filename (basedir, "evolution-backup", NULL);
+
+	command =  g_strdup_printf("%s --check %s", toolfname, quotedfname);
+	result = system (command);
+
+	g_free (command);
+	g_free (quotedfname);
+	g_free (toolfname);
+
+#ifdef HAVE_SYS_WAIT_H
+	g_message (
+		"Sanity check result %d:%d %d",
+		WIFEXITED (result), WEXITSTATUS (result), result);
+
+	return WIFEXITED (result) && (WEXITSTATUS (result) == 0);
+#else
+	return (result == 0);
+#endif
+}
+
diff --git a/modules/backup-restore/e-mail-config-restore-page.h b/modules/backup-restore/e-mail-config-restore-page.h
new file mode 100644
index 0000000..c6d4221
--- /dev/null
+++ b/modules/backup-restore/e-mail-config-restore-page.h
@@ -0,0 +1,81 @@
+/*
+ * e-mail-config-restore-page.h
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) version 3.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with the program; if not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+#ifndef E_MAIL_CONFIG_RESTORE_PAGE_H
+#define E_MAIL_CONFIG_RESTORE_PAGE_H
+
+#include <gtk/gtk.h>
+
+#include <mail/e-mail-config-page.h>
+#include <mail/e-mail-config-welcome-page.h>
+
+/* Standard GObject macros */
+#define E_TYPE_MAIL_CONFIG_RESTORE_PAGE \
+	(e_mail_config_restore_page_get_type ())
+#define E_MAIL_CONFIG_RESTORE_PAGE(obj) \
+	(G_TYPE_CHECK_INSTANCE_CAST \
+	((obj), E_TYPE_MAIL_CONFIG_RESTORE_PAGE, EMailConfigRestorePage))
+#define E_MAIL_CONFIG_RESTORE_PAGE_CLASS(cls) \
+	(G_TYPE_CHECK_CLASS_CAST \
+	((cls), E_TYPE_MAIL_CONFIG_RESTORE_PAGE, EMailConfigRestorePageClass))
+#define E_IS_MAIL_CONFIG_RESTORE_PAGE(obj) \
+	(G_TYPE_CHECK_INSTANCE_TYPE \
+	((obj), E_TYPE_MAIL_CONFIG_RESTORE_PAGE))
+#define E_IS_MAIL_CONFIG_RESTORE_PAGE_CLASS(cls) \
+	(G_TYPE_CHECK_CLASS_TYPE \
+	((cls), E_TYPE_MAIL_CONFIG_RESTORE_PAGE))
+#define E_MAIL_CONFIG_RESTORE_PAGE_GET_CLASS(obj) \
+	(G_TYPE_INSTANCE_GET_CLASS \
+	((obj), E_TYPE_MAIL_CONFIG_RESTORE_PAGE, EMailConfigRestorePageClass))
+
+#define E_MAIL_CONFIG_RESTORE_PAGE_SORT_ORDER \
+	(E_MAIL_CONFIG_WELCOME_PAGE_SORT_ORDER + 10)
+
+G_BEGIN_DECLS
+
+typedef struct _EMailConfigRestorePage EMailConfigRestorePage;
+typedef struct _EMailConfigRestorePageClass EMailConfigRestorePageClass;
+typedef struct _EMailConfigRestorePagePrivate EMailConfigRestorePagePrivate;
+
+struct _EMailConfigRestorePage {
+	GtkBox parent;
+	EMailConfigRestorePagePrivate *priv;
+};
+
+struct _EMailConfigRestorePageClass {
+	GtkBoxClass parent_class;
+};
+
+GType		e_mail_config_restore_page_get_type
+						(void) G_GNUC_CONST;
+void		e_mail_config_restore_page_type_register
+						(GTypeModule *type_module);
+EMailConfigPage *
+		e_mail_config_restore_page_new	(void);
+const gchar *	e_mail_config_restore_page_get_filename
+						(EMailConfigRestorePage *page);
+
+/* This is a stand-alone function to validate the given backup file.
+ * It resides in this file because EMailConfigRestorePage uses it. */
+gboolean	evolution_backup_restore_validate_backup_file
+						(const gchar *filename);
+
+G_END_DECLS
+
+#endif /* E_MAIL_CONFIG_RESTORE_PAGE_H */
+
diff --git a/modules/backup-restore/e-mail-config-restore-ready-page.c b/modules/backup-restore/e-mail-config-restore-ready-page.c
new file mode 100644
index 0000000..2827e67
--- /dev/null
+++ b/modules/backup-restore/e-mail-config-restore-ready-page.c
@@ -0,0 +1,80 @@
+/*
+ * e-mail-config-restore-ready-page.c
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) version 3.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with the program; if not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+/* NOTE: This page is never actually shown to the user.  It works as a
+ *       placeholder, visible only when the user chooses a backup file
+ *       to restore.  As soon as we arrive on this page we execl() the
+ *       "evolution-backup" tool, and the startup wizard disappears. */
+
+#include "e-mail-config-restore-ready-page.h"
+
+#include <config.h>
+#include <glib/gi18n-lib.h>
+
+/* Forward Declarations */
+static void	e_mail_config_restore_ready_page_interface_init
+					(EMailConfigPageInterface *interface);
+
+G_DEFINE_DYNAMIC_TYPE_EXTENDED (
+	EMailConfigRestoreReadyPage,
+	e_mail_config_restore_ready_page,
+	GTK_TYPE_BOX,
+	0,
+	G_IMPLEMENT_INTERFACE_DYNAMIC (
+		E_TYPE_MAIL_CONFIG_PAGE,
+		e_mail_config_restore_ready_page_interface_init))
+
+static void
+e_mail_config_restore_ready_page_class_init (EMailConfigRestoreReadyPageClass *class)
+{
+}
+
+static void
+e_mail_config_restore_ready_page_class_finalize (EMailConfigRestoreReadyPageClass *class)
+{
+}
+
+static void
+e_mail_config_restore_ready_page_interface_init (EMailConfigPageInterface *interface)
+{
+	/* Keep the title identical to EMailConfigRestorePage
+	 * so it's only shown once in the assistant sidebar. */
+	interface->title = _("Restore from Backup");
+	interface->sort_order = E_MAIL_CONFIG_RESTORE_READY_PAGE_SORT_ORDER;
+}
+
+static void
+e_mail_config_restore_ready_page_init (EMailConfigRestoreReadyPage *page)
+{
+}
+
+void
+e_mail_config_restore_ready_page_type_register (GTypeModule *type_module)
+{
+	/* XXX G_DEFINE_DYNAMIC_TYPE declares a static type registration
+	 *     function, so we have to wrap it with a public function in
+	 *     order to register types from a separate compilation unit. */
+	e_mail_config_restore_ready_page_register_type (type_module);
+}
+
+EMailConfigPage *
+e_mail_config_restore_ready_page_new (void)
+{
+	return g_object_new (E_TYPE_MAIL_CONFIG_RESTORE_READY_PAGE, NULL);
+}
+
diff --git a/modules/backup-restore/e-mail-config-restore-ready-page.h b/modules/backup-restore/e-mail-config-restore-ready-page.h
new file mode 100644
index 0000000..fb196db
--- /dev/null
+++ b/modules/backup-restore/e-mail-config-restore-ready-page.h
@@ -0,0 +1,76 @@
+/*
+ * e-mail-config-restore-ready-page.h
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) version 3.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with the program; if not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+#ifndef E_MAIL_CONFIG_RESTORE_READY_PAGE_H
+#define E_MAIL_CONFIG_RESTORE_READY_PAGE_H
+
+#include <gtk/gtk.h>
+
+#include <mail/e-mail-config-page.h>
+
+#include "e-mail-config-restore-page.h"
+
+/* Standard GObject macros */
+#define E_TYPE_MAIL_CONFIG_RESTORE_READY_PAGE \
+	(e_mail_config_restore_ready_page_get_type ())
+#define E_MAIL_CONFIG_RESTORE_READY_PAGE(obj) \
+	(G_TYPE_CHECK_INSTANCE_CAST \
+	((obj), E_TYPE_MAIL_CONFIG_RESTORE_READY_PAGE, EMailConfigRestoreReadyPage))
+#define E_MAIL_CONFIG_RESTORE_READY_PAGE_CLASS(cls) \
+	(G_TYPE_CHECK_CLASS_CAST \
+	((cls), E_TYPE_MAIL_CONFIG_RESTORE_READY_PAGE, EMailConfigRestoreReadyPageClass))
+#define E_IS_MAIL_CONFIG_RESTORE_READY_PAGE(obj) \
+	(G_TYPE_CHECK_INSTANCE_TYPE \
+	((obj), E_TYPE_MAIL_CONFIG_RESTORE_READY_PAGE))
+#define E_IS_MAIL_CONFIG_RESTORE_READY_PAGE_CLASS(cls) \
+	(G_TYPE_CHECK_CLASS_TYPE \
+	((cls), E_TYPE_MAIL_CONFIG_RESTORE_READY_PAGE))
+#define E_MAIL_CONFIG_RESTORE_READY_PAGE_GET_CLASS(obj) \
+	(G_TYPE_INSTANCE_GET_CLASS \
+	((obj), E_TYPE_MAIL_CONFIG_RESTORE_READY_PAGE, EMailConfigRestoreReadyPageClass))
+
+#define E_MAIL_CONFIG_RESTORE_READY_PAGE_SORT_ORDER \
+	(E_MAIL_CONFIG_RESTORE_PAGE_SORT_ORDER + 1)
+
+G_BEGIN_DECLS
+
+typedef struct _EMailConfigRestoreReadyPage EMailConfigRestoreReadyPage;
+typedef struct _EMailConfigRestoreReadyPageClass EMailConfigRestoreReadyPageClass;
+typedef struct _EMailConfigRestoreReadyPagePrivate EMailConfigRestoreReadyPagePrivate;
+
+struct _EMailConfigRestoreReadyPage {
+	GtkBox parent;
+	EMailConfigRestoreReadyPagePrivate *priv;
+};
+
+struct _EMailConfigRestoreReadyPageClass {
+	GtkBoxClass parent_class;
+};
+
+GType		e_mail_config_restore_ready_page_get_type
+						(void) G_GNUC_CONST;
+void		e_mail_config_restore_ready_page_type_register
+						(GTypeModule *type_module);
+EMailConfigPage *
+		e_mail_config_restore_ready_page_new
+						(void);
+
+G_END_DECLS
+
+#endif /* E_MAIL_CONFIG_RESTORE_READY_PAGE_H */
+
diff --git a/plugins/backup-restore/backup-restore.c b/modules/backup-restore/evolution-backup-restore.c
similarity index 51%
rename from plugins/backup-restore/backup-restore.c
rename to modules/backup-restore/evolution-backup-restore.c
index e821113..75a070a 100644
--- a/plugins/backup-restore/backup-restore.c
+++ b/modules/backup-restore/evolution-backup-restore.c
@@ -1,4 +1,5 @@
 /*
+ * evolution-backup-restore.c
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -13,31 +14,31 @@
  * You should have received a copy of the GNU Lesser General Public
  * License along with the program; if not, see <http://www.gnu.org/licenses/>
  *
- *
- * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
- *
  */
 
-#ifdef HAVE_CONFIG_H
 #include <config.h>
-#endif
-
 #include <unistd.h>
 #include <sys/types.h>
 #ifdef HAVE_SYS_WAIT_H
 #  include <sys/wait.h>
 #endif
 #include <stdlib.h>
+
 #include <gtk/gtk.h>
 #include <glib/gi18n.h>
 #include <glib/gstdio.h>
-#include "mail/em-config.h"
-#include "mail/em-account-editor.h"
-#include "libevolution-utils/e-alert-dialog.h"
-#include "e-util/e-util.h"
-#include "e-util/e-dialog-utils.h"
-#include "shell/e-shell-utils.h"
-#include "shell/e-shell-window.h"
+
+#include <libebackend/e-extension.h>
+
+#include <mail/e-mail-config-assistant.h>
+#include <libevolution-utils/e-alert-dialog.h>
+#include <e-util/e-util.h>
+#include <e-util/e-dialog-utils.h>
+#include <shell/e-shell-utils.h>
+#include <shell/e-shell-window.h>
+
+#include "e-mail-config-restore-page.h"
+#include "e-mail-config-restore-ready-page.h"
 
 #ifdef G_OS_WIN32
 #ifdef localtime_r
@@ -49,28 +50,46 @@
 	(result), localtime (timep), sizeof (*(result))) : 0)
 #endif
 
-gboolean	e_plugin_ui_init	(GtkUIManager *ui_manager,
-					 EShellWindow *shell_window);
-GtkWidget *	backup_restore_page	(EPlugin *ep,
-					 EConfigHookItemFactoryData *hook_data);
-void		backup_restore_commit	(EPlugin *ep,
-					 EMConfigTargetSettings *target);
-void		backup_restore_abort	(EPlugin *ep,
-					 EMConfigTargetSettings *target);
-
-typedef enum _br_flags {
-	BR_OK = 1 << 0,
+typedef EExtension EvolutionBackupRestoreAssistant;
+typedef EExtensionClass EvolutionBackupRestoreAssistantClass;
+
+typedef EExtension EvolutionBackupRestoreMenuItems;
+typedef EExtensionClass EvolutionBackupRestoreMenuItemsClass;
+
+/* Module Entry Points */
+void e_module_load (GTypeModule *type_module);
+void e_module_unload (GTypeModule *type_module);
+
+/* Forward Declarations */
+GType evolution_backup_restore_assistant_get_type (void);
+GType evolution_backup_restore_menu_items_get_type (void);
+
+static const gchar *ui =
+"<ui>"
+"  <menubar name='main-menu'>"
+"    <menu action='file-menu'>"
+"      <placeholder name='file-actions'>"
+"        <menuitem action='settings-backup'/>"
+"        <menuitem action='settings-restore'/>"
+"      </placeholder>"
+"    </menu>"
+"  </menubar>"
+"</ui>";
+
+G_DEFINE_DYNAMIC_TYPE (
+	EvolutionBackupRestoreAssistant,
+	evolution_backup_restore_assistant,
+	E_TYPE_EXTENSION)
+
+G_DEFINE_DYNAMIC_TYPE (
+	EvolutionBackupRestoreMenuItems,
+	evolution_backup_restore_menu_items,
+	E_TYPE_EXTENSION)
+
+enum {
+	BR_OK    = 1 << 0,
 	BR_START = 1 << 1
-}br_flags;
-
-gint e_plugin_lib_enable (EPlugin *ep, gint enable);
-
-gint
-e_plugin_lib_enable (EPlugin *ep,
-                     gint enable)
-{
-	return 0;
-}
+};
 
 static void
 backup (const gchar *filename,
@@ -118,33 +137,6 @@ restore (const gchar *filename,
 			NULL);
 }
 
-static gboolean
-sanity_check (const gchar *filename)
-{
-	gchar *command;
-	gint result;
-	gchar *quotedfname, *toolfname;
-
-	quotedfname = g_shell_quote (filename);
-	toolfname = g_build_filename (EVOLUTION_TOOLSDIR, "evolution-backup", NULL);
-
-	command =  g_strdup_printf("%s --check %s", toolfname, quotedfname);
-	result = system (command);
-	g_free (command);
-	g_free (quotedfname);
-	g_free (toolfname);
-
-#ifdef HAVE_SYS_WAIT_H
-	g_message (
-		"Sanity check result %d:%d %d",
-		WIFEXITED (result), WEXITSTATUS (result), result);
-
-	return WIFEXITED (result) && (WEXITSTATUS (result) == 0);
-#else
-	return result;
-#endif
-}
-
 static guint32
 dialog_prompt_user (GtkWindow *parent,
                     const gchar *string,
@@ -290,7 +282,7 @@ action_settings_restore_cb (GtkAction *action,
 
 	path = g_file_get_path (file);
 
-	if (sanity_check (path)) {
+	if (evolution_backup_restore_validate_backup_file (path)) {
 		guint32 mask;
 
 		mask = dialog_prompt_user (
@@ -309,183 +301,143 @@ action_settings_restore_cb (GtkAction *action,
 	g_free (path);
 }
 
-static void
-check_toggled (GtkToggleButton *button,
-               GObject *assistant)
-{
-	EConfig *config;
-	GtkWidget *box;
-	gboolean active;
+static GtkActionEntry entries[] = {
 
-	active = gtk_toggle_button_get_active (button);
-	box = g_object_get_data (G_OBJECT (button), "box");
-	gtk_widget_set_sensitive (box, active);
+	{ "settings-backup",
+	  NULL,
+	  N_("_Back up Evolution Data..."),
+	  NULL,
+	  N_("Back up Evolution data and settings to an archive file"),
+	  G_CALLBACK (action_settings_backup_cb) },
 
-	g_object_set_data (
-		assistant, "restore",
-		GINT_TO_POINTER (active ? 1 : 0));
+	{ "settings-restore",
+	  NULL,
+	  N_("R_estore Evolution Data..."),
+	  NULL,
+	  N_("Restore Evolution data and settings from an archive file"),
+	  G_CALLBACK (action_settings_restore_cb) }
+};
+
+static gboolean
+evolution_backup_restore_filename_to_visible (GBinding *binding,
+                                              const GValue *source_value,
+                                              GValue *target_value,
+                                              gpointer unused)
+{
+	const gchar *filename;
+	gboolean visible;
 
-	config = g_object_get_data (assistant, "restore-config");
+	filename = g_value_get_string (source_value);
+	visible = (filename != NULL && *filename != '\0');
+	g_value_set_boolean (target_value, visible);
 
-	e_config_target_changed (
-		config, E_CONFIG_TARGET_CHANGED_STATE);
+	return TRUE;
 }
 
 static void
-file_changed (GtkFileChooser *chooser,
-              GObject *assistant)
+evolution_backup_restore_prepare_cb (GtkAssistant *assistant,
+                                     GtkWidget *page,
+                                     EMailConfigRestorePage *restore_page)
 {
-	EConfig *config;
-	gchar *file = NULL, *prevfile = NULL;
+	const gchar *filename;
 
-	file = gtk_file_chooser_get_filename (chooser);
-	prevfile = g_object_get_data (assistant, "restore-file");
-	g_object_set_data (assistant, "restore-file", file);
-	g_free (prevfile);
+	/* If we've landed on the EMailConfigRestoreReadyPage, that
+	 * means the user has chosen a valid backup file to restore
+	 * so start the "evolution-backup" tool immediately. */
 
-	config = g_object_get_data (assistant, "restore-config");
+	filename = e_mail_config_restore_page_get_filename (restore_page);
 
-	e_config_target_changed (
-		config, E_CONFIG_TARGET_CHANGED_STATE);
+	if (E_IS_MAIL_CONFIG_RESTORE_READY_PAGE (page))
+		restore (filename, TRUE);
 }
 
-static gboolean
-backup_restore_check (EConfig *ec,
-                      const gchar *pageid,
-                      gpointer data)
+static void
+evolution_backup_restore_assistant_constructed (GObject *object)
 {
-	GObject *assistant = data;
-	gboolean do_restore;
-	gchar *file;
-
-	g_return_val_if_fail (data != NULL, FALSE);
-	g_return_val_if_fail (GTK_IS_ASSISTANT (data), FALSE);
+	EExtension *extension;
+	EExtensible *extensible;
+	EMailConfigAssistant *assistant;
+	const gchar *type_name;
+
+	extension = E_EXTENSION (object);
+	extensible = e_extension_get_extensible (extension);
+
+	/* Chain up to parent's constructed() method. */
+	G_OBJECT_CLASS (evolution_backup_restore_assistant_parent_class)->
+		constructed (object);
+
+	assistant = E_MAIL_CONFIG_ASSISTANT (extensible);
+
+	/* XXX We only want to add the EMailConfigRestorePage to an
+	 *     EStartupAssistant instance, not a normal EMailConfigAssistant.
+	 *     But EStartupAssistant is defined in the "startup-wizard" module
+	 *     and we can't access its GType without knowing its type name, so
+	 *     just hard-code the type name. */
+	type_name = G_OBJECT_TYPE_NAME (assistant);
+	if (g_strcmp0 (type_name, "EStartupAssistant") == 0) {
+		EMailConfigPage *restore_page;
+		EMailConfigPage *ready_page;
+
+		restore_page = e_mail_config_restore_page_new ();
+		e_mail_config_assistant_add_page (assistant, restore_page);
+
+		ready_page = e_mail_config_restore_ready_page_new ();
+		e_mail_config_assistant_add_page (assistant, ready_page);
+
+		g_object_bind_property_full (
+			restore_page, "filename",
+			ready_page, "visible",
+			G_BINDING_SYNC_CREATE,
+			evolution_backup_restore_filename_to_visible,
+			NULL,
+			NULL, (GDestroyNotify) NULL);
+
+		g_signal_connect (
+			assistant, "prepare",
+			G_CALLBACK (evolution_backup_restore_prepare_cb),
+			restore_page);
+	}
+}
 
-	do_restore = (g_object_get_data (assistant, "restore") != NULL);
-	file = g_object_get_data (assistant, "restore-file");
+static void
+evolution_backup_restore_assistant_class_init (EExtensionClass *class)
+{
+	GObjectClass *object_class;
 
-	e_config_set_page_is_finish (
-		ec, "0.startup_page.10.backup_restore", do_restore);
+	object_class = G_OBJECT_CLASS (class);
+	object_class->constructed = evolution_backup_restore_assistant_constructed;
 
-	return !do_restore || file;
+	class->extensible_type = E_TYPE_MAIL_CONFIG_ASSISTANT;
 }
 
-GtkWidget *
-backup_restore_page (EPlugin *ep,
-                     EConfigHookItemFactoryData *hook_data)
+static void
+evolution_backup_restore_assistant_class_finalize (EExtensionClass *class)
 {
-	GtkWidget *page, *hbox, *label, *cbox, *button;
-	GObject *assistant = G_OBJECT (hook_data->parent);
-
-	page = gtk_vbox_new (FALSE, 6);
-	gtk_container_set_border_width (GTK_CONTAINER (page), 12);
-
-	hbox = gtk_hbox_new (FALSE, 6);
-	label = gtk_label_new (
-		_("You can restore Evolution from your backup. It can restore "
-		  "all the Mails, Calendars, Tasks, Memos, Contacts. It also "
-		  "restores all your personal settings, mail filters etc."));
-	gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
-	gtk_label_set_single_line_mode (GTK_LABEL (label), FALSE);
-	gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 6);
-	gtk_box_pack_start (GTK_BOX (page), hbox, FALSE, FALSE, 0);
-
-	hbox = gtk_hbox_new (FALSE, 6);
-	cbox = gtk_check_button_new_with_mnemonic (
-		_("_Restore Evolution from the backup file"));
-	g_signal_connect (
-		cbox, "toggled",
-		G_CALLBACK (check_toggled), assistant);
-	gtk_box_pack_start (GTK_BOX (hbox), cbox, FALSE, FALSE, 6);
-	gtk_box_pack_start (GTK_BOX (page), 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 (GTK_BOX (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), assistant);
-	gtk_file_chooser_button_set_width_chars (
-		GTK_FILE_CHOOSER_BUTTON (button), 20);
-	gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
-	gtk_box_pack_start (GTK_BOX (page), hbox, FALSE, FALSE, 0);
-	gtk_widget_set_sensitive (hbox, FALSE);
-
-	gtk_assistant_append_page (GTK_ASSISTANT (assistant), page);
-	gtk_assistant_set_page_title (
-		GTK_ASSISTANT (assistant),
-		page, _("Restore from backup"));
-	gtk_widget_show_all (page);
-
-	g_object_set_data (assistant, "restore", GINT_TO_POINTER (FALSE));
-	g_object_set_data (assistant, "restore-config", hook_data->config);
-
-	e_config_add_page_check (
-		hook_data->config,
-		"0.startup_page.10.backup_restore",
-		backup_restore_check, assistant);
-
-	return GTK_WIDGET (page);
 }
 
-void
-backup_restore_commit (EPlugin *ep,
-                       EMConfigTargetSettings *target)
+static void
+evolution_backup_restore_assistant_init (EExtension *extension)
 {
-	GObject *assistant;
-	gchar *file;
-
-	assistant = G_OBJECT (target->target.config->widget);
-	file = g_object_get_data (assistant, "restore-file");
-
-	if (g_object_get_data (assistant, "restore") != NULL) {
-		if (file == NULL || !sanity_check (file)) {
-			e_alert_run_dialog_for_args (
-				GTK_WINDOW (assistant),
-				"org.gnome.backup-restore:invalid-backup",
-				NULL);
-		} else {
-			restore (file, TRUE);
-		}
-	}
 }
 
-void
-backup_restore_abort (EPlugin *ep,
-                      EMConfigTargetSettings *target)
+static void
+evolution_backup_restore_menu_items_constructed (GObject *object)
 {
-	/* Nothing really */
-}
+	EExtension *extension;
+	EExtensible *extensible;
+	EShellWindow *shell_window;
+	GtkActionGroup *action_group;
+	GtkUIManager *ui_manager;
+	GError *error = NULL;
 
-static GtkActionEntry entries[] = {
+	extension = E_EXTENSION (object);
+	extensible = e_extension_get_extensible (extension);
 
-	{ "settings-backup",
-	  NULL,
-	  N_("_Back up Evolution Data..."),
-	  NULL,
-	  N_("Back up Evolution data and settings to an archive file"),
-	  G_CALLBACK (action_settings_backup_cb) },
-
-	{ "settings-restore",
-	  NULL,
-	  N_("R_estore Evolution Data..."),
-	  NULL,
-	  N_("Restore Evolution data and settings from an archive file"),
-	  G_CALLBACK (action_settings_restore_cb) }
-};
-
-gboolean
-e_plugin_ui_init (GtkUIManager *ui_manager,
-                  EShellWindow *shell_window)
-{
-	GtkActionGroup *action_group;
+	/* Chain up to parent's constructed() method. */
+	G_OBJECT_CLASS (evolution_backup_restore_menu_items_parent_class)->
+		constructed (object);
 
+	shell_window = E_SHELL_WINDOW (extensible);
 	action_group = e_shell_window_get_action_group (shell_window, "shell");
 
 	/* Add actions to the "shell" action group. */
@@ -493,5 +445,50 @@ e_plugin_ui_init (GtkUIManager *ui_manager,
 		action_group, entries,
 		G_N_ELEMENTS (entries), shell_window);
 
-	return TRUE;
+	/* Because we are loading from a hard-coded string, there is
+	 * no chance of I/O errors.  Failure here implies a malformed
+	 * UI definition.  Full stop. */
+	ui_manager = e_shell_window_get_ui_manager (shell_window);
+	gtk_ui_manager_add_ui_from_string (ui_manager, ui, -1, &error);
+	if (error != NULL)
+		g_error ("%s", error->message);
+}
+
+static void
+evolution_backup_restore_menu_items_class_init (EExtensionClass *class)
+{
+	GObjectClass *object_class;
+	EExtensionClass *extension_class;
+
+	object_class = G_OBJECT_CLASS (class);
+	object_class->constructed = evolution_backup_restore_menu_items_constructed;
+
+	extension_class = E_EXTENSION_CLASS (class);
+	extension_class->extensible_type = E_TYPE_SHELL_WINDOW;
+}
+
+static void
+evolution_backup_restore_menu_items_class_finalize (EExtensionClass *class)
+{
 }
+
+static void
+evolution_backup_restore_menu_items_init (EExtension *extension)
+{
+}
+
+G_MODULE_EXPORT void
+e_module_load (GTypeModule *type_module)
+{
+	evolution_backup_restore_assistant_register_type (type_module);
+	evolution_backup_restore_menu_items_register_type (type_module);
+
+	e_mail_config_restore_page_type_register (type_module);
+	e_mail_config_restore_ready_page_type_register (type_module);
+}
+
+G_MODULE_EXPORT void
+e_module_unload (GTypeModule *type_module)
+{
+}
+
diff --git a/plugins/backup-restore/backup.c b/modules/backup-restore/evolution-backup-tool.c
similarity index 97%
rename from plugins/backup-restore/backup.c
rename to modules/backup-restore/evolution-backup-tool.c
index bfbdf85..38a477e 100644
--- a/plugins/backup-restore/backup.c
+++ b/modules/backup-restore/evolution-backup-tool.c
@@ -1,4 +1,5 @@
 /*
+ * evolution-backup-tool.c
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -13,9 +14,6 @@
  * You should have received a copy of the GNU Lesser General Public
  * License along with the program; if not, see <http://www.gnu.org/licenses/>
  *
- *
- * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
- *
  */
 
 #ifdef HAVE_CONFIG_H
@@ -560,7 +558,18 @@ restore (const gchar *filename,
 	if (g_cancellable_is_cancelled (cancellable))
 		return;
 
-	txt = _("Ensuring local sources");
+	txt = _("Reloading registry service");
+
+	/* This runs migration routines on the newly-restored data.
+	 *
+	 * XXX Hard-coding the whole command like this is not ideal
+	 *     because the "SourcesX" interface name will occasionally
+	 *     change and I guarantee we'll forget to update this. */
+	run_cmd (
+		"gdbus call --session "
+		"--dest org.gnome.evolution.dataserver.Sources0 "
+		"--object-path /org/gnome/evolution/dataserver/SourceManager "
+		"--method org.gnome.evolution.dataserver.SourceManager.Reload");
 
 end:
 	if (restart_arg) {
diff --git a/plugins/backup-restore/org-gnome-backup-restore.error.xml b/modules/backup-restore/org-gnome-backup-restore.error.xml
similarity index 92%
rename from plugins/backup-restore/org-gnome-backup-restore.error.xml
rename to modules/backup-restore/org-gnome-backup-restore.error.xml
index 10a9966..b38a134 100644
--- a/plugins/backup-restore/org-gnome-backup-restore.error.xml
+++ b/modules/backup-restore/org-gnome-backup-restore.error.xml
@@ -18,7 +18,7 @@
     <button _label="Close and Restore Evolution" response="GTK_RESPONSE_YES"/>
   </error>  
    <error id="insufficient-permissions" type="error">
-   	<_primary>Insufficient Permissions</_primary>
-	<_secondary>The selected folder is not writable.</_secondary>
+        <_primary>Insufficient Permissions</_primary>
+        <_secondary>The selected folder is not writable.</_secondary>
    </error>
 </error-list>



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]