New helper function. (idle_cb): Call it if we have a local shell. Also,

* 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.

svn path=/trunk/; revision=23403
This commit is contained in:
Ettore Perazzoli
2003-11-17 21:27:21 +00:00
parent 9582e8159c
commit c6b3809b47
5 changed files with 117 additions and 3 deletions

View File

@ -1,3 +1,13 @@
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,

View File

@ -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)

View File

@ -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
@ -583,6 +583,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", &current_major, &current_minor, &current_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.

View File

@ -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);

View File

@ -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)