diff options
-rw-r--r-- | calendar/ChangeLog | 14 | ||||
-rw-r--r-- | calendar/gui/migration.c | 274 |
2 files changed, 179 insertions, 109 deletions
diff --git a/calendar/ChangeLog b/calendar/ChangeLog index f6ffd47d36..0cb2b1fa11 100644 --- a/calendar/ChangeLog +++ b/calendar/ChangeLog @@ -1,3 +1,17 @@ +2004-01-29 JP Rosevear <jpr@ximian.com> + + * gui/migration.c (migrate_ical_folder_to_source): migrate to a + specific source + (migrate_ical_folder): create a new source based on the new source + name/uid + (create_calendar_contact_source): use the #define for the base uri + (create_calendar_sources): try and find the right sources if they + already exist + (create_task_sources): ditto + (migrate_calendars): make sure the personal source is the system + source + (migrate_tasks): ditto + 2004-01-29 Rodrigo Moya <rodrigo@ximian.com> * gui/calendar-view.c (calendar_view_get_type_code): added support for diff --git a/calendar/gui/migration.c b/calendar/gui/migration.c index fdc73eca7f..face2434e1 100644 --- a/calendar/gui/migration.c +++ b/calendar/gui/migration.c @@ -288,11 +288,10 @@ migrate_ical (ECal *old_ecal, ECal *new_ecal) } static gboolean -migrate_ical_folder (char *old_path, ESourceGroup *dest_group, char *source_name, ECalSourceType type) +migrate_ical_folder_to_source (char *old_path, ESource *new_source, ECalSourceType type) { ECal *old_ecal = NULL, *new_ecal = NULL; ESource *old_source; - ESource *new_source; ESourceGroup *group; char *old_uri = g_strdup_printf ("file://%s", old_path); GError *error = NULL; @@ -300,14 +299,9 @@ migrate_ical_folder (char *old_path, ESourceGroup *dest_group, char *source_name group = e_source_group_new ("", old_uri); old_source = e_source_new ("", ""); - e_source_set_group (old_source, group); - g_object_unref (group); + e_source_group_add_source (group, old_source, -1); - new_source = e_source_new (source_name, source_name); - e_source_set_relative_uri (new_source, e_source_peek_uid (new_source)); - e_source_group_add_source (dest_group, new_source, -1); - - dialog_set_folder_name (source_name); + dialog_set_folder_name (e_source_peek_name (new_source)); old_ecal = e_cal_new (old_source, type); if (!e_cal_open (old_ecal, TRUE, &error)) { @@ -325,9 +319,10 @@ migrate_ical_folder (char *old_path, ESourceGroup *dest_group, char *source_name retval = migrate_ical (old_ecal, new_ecal); - finish: +finish: g_clear_error (&error); g_object_unref (old_ecal); + g_object_unref (group); if (new_ecal) g_object_unref (new_ecal); g_free (old_uri); @@ -335,6 +330,28 @@ migrate_ical_folder (char *old_path, ESourceGroup *dest_group, char *source_name return retval; } +static gboolean +migrate_ical_folder (char *old_path, ESourceGroup *dest_group, char *source_name, ECalSourceType type) +{ + ESource *new_source; + gboolean retval; + + new_source = e_source_new (source_name, source_name); + e_source_set_relative_uri (new_source, e_source_peek_uid (new_source)); + e_source_group_add_source (dest_group, new_source, -1); + + retval = migrate_ical_folder_to_source (old_path, new_source, type); + + g_object_unref (new_source); + + return retval; +} + + +#define WEBCAL_BASE_URI "webcal://" +#define CONTACT_BASE_URI "contact://" +#define PERSONAL_RELATIVE_URI "system" + static ESourceGroup * create_calendar_contact_source (ESourceList *source_list) { @@ -342,7 +359,7 @@ create_calendar_contact_source (ESourceList *source_list) ESource *source; /* Create the contacts group */ - group = e_source_group_new (_("Contacts"), "contacts://"); + group = e_source_group_new (_("Contacts"), CONTACT_BASE_URI); e_source_group_set_readonly (group, TRUE); e_source_list_add_group (source_list, group, -1); @@ -353,131 +370,163 @@ create_calendar_contact_source (ESourceList *source_list) return group; } -static gboolean +static void create_calendar_sources (CalendarComponent *component, ESourceList *source_list, ESourceGroup **on_this_computer, + ESource **personal_source, ESourceGroup **on_the_web, ESourceGroup **contacts) { GSList *groups; + ESourceGroup *group; + ESource *source = NULL; + char *base_uri, *base_uri_proto; + + base_uri = g_build_filename (calendar_component_peek_base_directory (component), + "/calendar/local/", + NULL); + + base_uri_proto = g_strconcat ("file://", base_uri, NULL); groups = e_source_list_peek_groups (source_list); if (groups) { /* groups are already there, we need to search for things... */ - g_warning ("can't migrate when existing groups are present"); - return FALSE; - } else { - ESourceGroup *group; - ESource *source; - char *base_uri, *base_uri_proto, *new_dir; + GSList *g; - /* Create the local source group */ - base_uri = g_build_filename (calendar_component_peek_base_directory (component), - "/calendar/local/OnThisComputer/", - NULL); + for (g = groups; g; g = g->next) { - base_uri_proto = g_strconcat ("file://", base_uri, NULL); + group = E_SOURCE_GROUP (g->data); + if (!*on_this_computer && !strcmp (base_uri_proto, e_source_group_peek_base_uri (group))) + *on_this_computer = g_object_ref (group); + else if (!*on_the_web && !strcmp (WEBCAL_BASE_URI, e_source_group_peek_base_uri (group))) + *on_the_web = g_object_ref (group); + else if (!*contacts && !strcmp (CONTACT_BASE_URI, e_source_group_peek_base_uri (group))) + *contacts = g_object_ref (group); + } + } + + if (*on_this_computer) { + /* make sure "Personal" shows up as a source under + this group */ + GSList *sources = e_source_group_peek_sources (*on_this_computer); + GSList *s; + for (s = sources; s; s = s->next) { + ESource *source = E_SOURCE (s->data); + if (!strcmp (PERSONAL_RELATIVE_URI, e_source_peek_relative_uri (source))) { + *personal_source = g_object_ref (source); + break; + } + } + } else { + /* create the local source group */ group = e_source_group_new (_("On This Computer"), base_uri_proto); e_source_list_add_group (source_list, group, -1); - if (on_this_computer) - *on_this_computer = group; - else - g_object_unref (group); - - g_free (base_uri_proto); - - /* Create default calendar */ - new_dir = g_build_filename (base_uri, "Personal/", NULL); - if (!e_mkdir_hier (new_dir, 0700)) { - source = e_source_new (_("Personal"), "Personal"); - e_source_set_relative_uri (source, e_source_peek_uid (source)); - e_source_group_add_source (group, source, -1); - g_object_unref (source); - } - g_free (new_dir); + *on_this_computer = group; + } + + if (!source) { + /* Create the default Person addressbook */ + source = e_source_new (_("Personal"), PERSONAL_RELATIVE_URI); + e_source_group_add_source (*on_this_computer, source, -1); - g_free (base_uri); + *personal_source = source; + } - /* Create the web group */ - group = e_source_group_new (_("On The Web"), "webcal://"); + if (!*on_the_web) { + /* Create the Webcal source group */ + group = e_source_group_new (_("On The Web"), WEBCAL_BASE_URI); e_source_list_add_group (source_list, group, -1); - if (on_the_web) - *on_the_web = group; - else - g_object_unref (group); - - /* Create the contact group */ - group = create_calendar_contact_source (source_list); - if (contacts) - *contacts = group; - else - g_object_unref (group); + *on_the_web = group; } - return TRUE; + if (!*contacts) { + group = create_calendar_contact_source (source_list); + + *contacts = group; + } + + g_free (base_uri_proto); + g_free (base_uri); } -static gboolean +static void create_task_sources (TasksComponent *component, - ESourceList *source_list, - ESourceGroup **on_this_computer) + ESourceList *source_list, + ESourceGroup **on_this_computer, + ESource **personal_source) { GSList *groups; + ESourceGroup *group; + ESource *source = NULL; + char *base_uri, *base_uri_proto; + + base_uri = g_build_filename (tasks_component_peek_base_directory (component), + "/tasks/local/", + NULL); + + base_uri_proto = g_strconcat ("file://", base_uri, NULL); groups = e_source_list_peek_groups (source_list); if (groups) { /* groups are already there, we need to search for things... */ - g_warning ("can't migrate when existing groups are present"); - return FALSE; - } else { - ESourceGroup *group; - ESource *source; - char *base_uri, *base_uri_proto, *new_dir; + GSList *g; - /* create the local source group */ - base_uri = g_build_filename (tasks_component_peek_base_directory (component), - "/tasks/local/OnThisComputer/", - NULL); + for (g = groups; g; g = g->next) { - base_uri_proto = g_strconcat ("file://", base_uri, NULL); + group = E_SOURCE_GROUP (g->data); + if (!*on_this_computer && !strcmp (base_uri_proto, e_source_group_peek_base_uri (group))) + *on_this_computer = g_object_ref (group); + } + } + + if (*on_this_computer) { + /* make sure "Personal" shows up as a source under + this group */ + GSList *sources = e_source_group_peek_sources (*on_this_computer); + GSList *s; + for (s = sources; s; s = s->next) { + ESource *source = E_SOURCE (s->data); + if (!strcmp (PERSONAL_RELATIVE_URI, e_source_peek_relative_uri (source))) { + *personal_source = g_object_ref (source); + break; + } + } + } else { + /* create the local source group */ group = e_source_group_new (_("On This Computer"), base_uri_proto); e_source_list_add_group (source_list, group, -1); - if (on_this_computer) - *on_this_computer = group; - else - g_object_unref (group); - - g_free (base_uri_proto); - - /* Create default task list */ - new_dir = g_build_filename (base_uri, "Personal/", NULL); - if (!e_mkdir_hier (new_dir, 0700)) { - source = e_source_new (_("Personal"), "Personal"); - e_source_set_relative_uri (source, e_source_peek_uid (source)); - e_source_group_add_source (group, source, -1); - g_object_unref (source); - } - g_free (new_dir); + *on_this_computer = group; + } - g_free (base_uri); + if (!source) { + /* Create the default Person addressbook */ + source = e_source_new (_("Personal"), PERSONAL_RELATIVE_URI); + e_source_group_add_source (*on_this_computer, source, -1); + + *personal_source = source; } - return TRUE; + g_free (base_uri_proto); + g_free (base_uri); } gboolean migrate_calendars (CalendarComponent *component, int major, int minor, int revision) { + ESourceGroup *on_this_computer = NULL, *on_the_web = NULL, *contacts = NULL; + ESource *personal_source = NULL; gboolean retval = TRUE; - if (major == 0 && minor == 0 && revision == 0) - return create_calendar_sources (component, calendar_component_peek_source_list (component), NULL, NULL, NULL); + /* we call this unconditionally now - create_groups either + creates the groups/sources or it finds the necessary + groups/sources. */ + create_calendar_sources (component, calendar_component_peek_source_list (component), &on_this_computer, &personal_source, &on_the_web, &contacts); if (major == 1) { xmlDocPtr config_doc = NULL; @@ -509,27 +558,26 @@ migrate_calendars (CalendarComponent *component, int major, int minor, int revis } if (minor <= 4) { - ESourceGroup *on_this_computer; GSList *migration_dirs, *l; char *path, *local_cal_folder; setup_progress_dialog (FALSE); - if (!create_calendar_sources (component, calendar_component_peek_source_list (component), &on_this_computer, NULL, NULL)) - return FALSE; - path = g_build_filename (g_get_home_dir (), "evolution", "local", NULL); migration_dirs = e_folder_map_local_folders (path, "calendar"); local_cal_folder = g_build_filename (path, "Calendar", NULL); g_free (path); + if (personal_source) + migrate_ical_folder_to_source (local_cal_folder, personal_source, E_CAL_SOURCE_TYPE_EVENT); + for (l = migration_dirs; l; l = l->next) { char *source_name; - if (!strcmp (l->data, local_cal_folder)) - source_name = g_strdup (_("Personal")); - else - source_name = get_source_name (on_this_computer, (char*)l->data); + if (personal_source && !strcmp ((char*)l->data, local_cal_folder)) + continue; + + source_name = get_source_name (on_this_computer, (char*)l->data); if (!migrate_ical_folder (l->data, on_this_computer, source_name, E_CAL_SOURCE_TYPE_EVENT)) retval = FALSE; @@ -561,11 +609,15 @@ migrate_calendars (CalendarComponent *component, int major, int minor, int revis gboolean migrate_tasks (TasksComponent *component, int major, int minor, int revision) { + ESourceGroup *on_this_computer = NULL; + ESource *personal_source = NULL; gboolean retval = TRUE; - if (major == 0 && minor == 0 && revision == 0) - return create_task_sources (component, tasks_component_peek_source_list (component), NULL); - + /* we call this unconditionally now - create_groups either + creates the groups/sources or it finds the necessary + groups/sources. */ + create_task_sources (component, tasks_component_peek_source_list (component), &on_this_computer, &personal_source); + if (major == 1) { xmlDocPtr config_doc = NULL; char *conf_file; @@ -596,27 +648,26 @@ migrate_tasks (TasksComponent *component, int major, int minor, int revision) } if (minor <= 4) { - ESourceGroup *on_this_computer; GSList *migration_dirs, *l; char *path, *local_task_folder; setup_progress_dialog (TRUE); - if (!create_task_sources (component, tasks_component_peek_source_list (component), &on_this_computer)) - return FALSE; - path = g_build_filename (g_get_home_dir (), "evolution", "local", NULL); migration_dirs = e_folder_map_local_folders (path, "tasks"); local_task_folder = g_build_filename (path, "Tasks", NULL); - g_free (path); - + g_free (path); + + if (personal_source) + migrate_ical_folder_to_source (local_task_folder, personal_source, E_CAL_SOURCE_TYPE_TODO); + for (l = migration_dirs; l; l = l->next) { char *source_name; - if (!strcmp (l->data, local_task_folder)) - source_name = g_strdup (_("Personal")); - else - source_name = get_source_name (on_this_computer, (char*)l->data); + if (personal_source && !strcmp ((char*)l->data, local_task_folder)) + continue; + + source_name = get_source_name (on_this_computer, (char*)l->data); if (!migrate_ical_folder (l->data, on_this_computer, source_name, E_CAL_SOURCE_TYPE_TODO)) retval = FALSE; @@ -631,6 +682,11 @@ migrate_tasks (TasksComponent *component, int major, int minor, int revision) dialog_close (); } } + + if (on_this_computer) + g_object_unref (on_this_computer); + if (personal_source) + g_object_unref (personal_source); return retval; } |