diff options
Diffstat (limited to 'shell')
-rw-r--r-- | shell/ChangeLog | 10 | ||||
-rw-r--r-- | shell/Evolution-Component.idl | 8 | ||||
-rw-r--r-- | shell/e-shell.c | 75 | ||||
-rw-r--r-- | shell/e-shell.h | 3 | ||||
-rw-r--r-- | shell/main.c | 24 |
5 files changed, 117 insertions, 3 deletions
diff --git a/shell/ChangeLog b/shell/ChangeLog index a7e16e552a..eaa5d2013c 100644 --- a/shell/ChangeLog +++ b/shell/ChangeLog @@ -1,5 +1,15 @@ 2003-11-17 Ettore Perazzoli <ettore@ximian.com> + * main.c (attempt_upgrade): New helper function. + (idle_cb): Call it if we have a local shell. Also, remove unused + variables. + + * e-shell.c (e_shell_attempt_upgrade): New. + + * Evolution-Component.idl (Component.upgradeFromeVersion): New. + +2003-11-17 Ettore Perazzoli <ettore@ximian.com> + * e-shell-window-commands.c (command_open_new_window): New, implement "OpenNewWindow" verb. diff --git a/shell/Evolution-Component.idl b/shell/Evolution-Component.idl index c9c5afaf11..4ccf92431a 100644 --- a/shell/Evolution-Component.idl +++ b/shell/Evolution-Component.idl @@ -29,6 +29,14 @@ module Evolution { exception Failed {}; exception UnknownType {}; + + /*** Upgrade path. ***/ + + boolean upgradeFromVersion (in short major, in short minor, in short revision); + + + /*** Basic functionality. ***/ + /* Create the controls for embedding in the shell. */ void createControls (out Bonobo::Control sidebar_control, out Bonobo::Control view_control) diff --git a/shell/e-shell.c b/shell/e-shell.c index 22cb17e7b4..c6b2f782e3 100644 --- a/shell/e-shell.c +++ b/shell/e-shell.c @@ -1,7 +1,7 @@ /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ /* e-shell.c * - * Copyright (C) 2000, 2001, 2002 Ximian, Inc. + * Copyright (C) 2000, 2001, 2002, 2003 Ximian, Inc. * * This program is free software; you can redistribute it and/or * modify it under the terms of version 2 of the GNU General Public @@ -584,6 +584,79 @@ e_shell_new (EShellStartupLineMode startup_line_mode, /** + * e_shell_attempt_upgrade: + * @shell: + * @from_version: + * + * Upgrade config and components from the specified version name. + * + * Return value: %TRUE If it works, %FALSE if it fails (it should only fail if + * upgrade from @from_version is unsupported). + **/ +gboolean +e_shell_attempt_upgrade (EShell *shell, + const char *from_version) +{ + GSList *component_infos, *p; + int major, minor, revision; + int current_major, current_minor, current_revision; + gboolean success; + + g_return_val_if_fail (E_IS_SHELL (shell), FALSE); + g_return_val_if_fail (from_version != NULL, FALSE); + + sscanf (from_version, "%u.%u.%u", &major, &minor, &revision); + sscanf (VERSION, "%u.%u.%u", ¤t_major, ¤t_minor, ¤t_revision); + + if (! (current_major > major + || (current_major == major && current_minor > minor) + || (current_minor == current_minor && current_revision > current_revision))) { + return TRUE; + } + + success = TRUE; + + component_infos = e_component_registry_peek_list (shell->priv->component_registry); + for (p = component_infos; p != NULL; p = p->next) { + const EComponentInfo *info = p->data; + CORBA_Environment ev; + gboolean component_upgraded; + + CORBA_exception_init (&ev); + + component_upgraded = GNOME_Evolution_Component_upgradeFromVersion (info->iface, major, minor, revision, &ev); + + if (BONOBO_EX (&ev)) { + char *exception_text; + + // Ignore components that do not implement this version, it might just mean that they don't need an + // upgrade path. + if (strcmp (ev._id, ex_CORBA_NO_IMPLEMENT) == 0) { + CORBA_exception_free (&ev); + continue; + } + + exception_text = bonobo_exception_get_text (&ev); + g_warning ("Upgrade of component \"%s\" from version %s failed with exception %s", + info->alias, from_version, exception_text); + g_free (exception_text); + CORBA_exception_free (&ev); + success = FALSE; + } else { + CORBA_exception_free (&ev); + if (! component_upgraded) { + g_warning ("Component \"%s\" could not upgrade configuration from version \"%s\"", + info->alias, from_version); + success = FALSE; + } + } + } + + return success; +} + + +/** * e_shell_create_window: * @shell: The shell for which to create a new window. * @component_id: Id or alias of the component to display in the new window. diff --git a/shell/e-shell.h b/shell/e-shell.h index 712fda8033..499b31728e 100644 --- a/shell/e-shell.h +++ b/shell/e-shell.h @@ -100,6 +100,9 @@ EShellConstructResult e_shell_construct (EShell *shell, EShell *e_shell_new (EShellStartupLineMode startup_line_mode, EShellConstructResult *construct_result_return); +gboolean e_shell_attempt_upgrade (EShell *shell, + const char *from_version); + EShellWindow *e_shell_create_window (EShell *shell, const char *component_id, EShellWindow *template_window); diff --git a/shell/main.c b/shell/main.c index 6285e55560..d89566a6aa 100644 --- a/shell/main.c +++ b/shell/main.c @@ -340,6 +340,25 @@ new_window_created_callback (EShell *shell, #endif /* DEVELOPMENT_WARNING */ +static void +attempt_upgrade (EShell *shell) +{ + GConfClient *gconf_client = gconf_client_get_default (); + char *previous_version = gconf_client_get_string (gconf_client, "/apps/evolution/version", NULL); + + if (previous_version != NULL) { + if (! e_shell_attempt_upgrade (shell, previous_version)) + e_notice (NULL, GTK_MESSAGE_ERROR, + _("Warning: Evolution could not upgrade all your data from version %s.\n" + "The data hasn't been deleted, but it will not be seen by this version of Evolution.\n"), + previous_version); + } + + gconf_client_set_string (gconf_client, "/apps/evolution/version", VERSION, NULL); + g_object_unref (gconf_client); +} + + /* This is for doing stuff that requires the GTK+ loop to be running already. */ static gint @@ -352,8 +371,6 @@ idle_cb (void *data) EShellStartupLineMode startup_line_mode; GSList *p; gboolean have_evolution_uri; - gboolean display_default; - gboolean displayed_any; #ifdef KILL_PROCESS_CMD kill_old_dataserver (); @@ -408,6 +425,9 @@ idle_cb (void *data) } + if (shell != NULL) + attempt_upgrade (shell); + have_evolution_uri = FALSE; if (uri_list == NULL && shell != NULL) |