diff options
author | Chris Toshok <toshok@ximian.com> | 2004-04-22 04:46:09 +0800 |
---|---|---|
committer | Chris Toshok <toshok@src.gnome.org> | 2004-04-22 04:46:09 +0800 |
commit | 4cb6f19cf30847b9059a13980a15e56a3ffe6d0e (patch) | |
tree | 788ff64cfe28dd099406e8c916b7ca39a9ca9c72 /addressbook | |
parent | fa40c443641bc748bbf8edc4d9f9c5208095dc1c (diff) | |
download | gsoc2013-evolution-4cb6f19cf30847b9059a13980a15e56a3ffe6d0e.tar.gz gsoc2013-evolution-4cb6f19cf30847b9059a13980a15e56a3ffe6d0e.tar.zst gsoc2013-evolution-4cb6f19cf30847b9059a13980a15e56a3ffe6d0e.zip |
store off the label as well as the folder name label, so we can reuse the
2004-04-21 Chris Toshok <toshok@ximian.com>
* gui/component/addressbook-migrate.c (setup_progress_dialog):
store off the label as well as the folder name label, so we can
reuse the dialog and update the label. Also, no longer take the
string to display here.
(dialog_set_label): new function.
(migrate_contact_lists_for_local_folders): call
dialog_set_folder_name here so we can see the folder being
migrated.
(migrate_company_phone_for_local_folders): new function for
updating the way we store company phone numbers.
(addressbook_migrate): split out the logic for setting up/tearing
down the dialog from the individual migration points so we can
reuse the same dialog and not have get destroyed/recreated for
each stage. Also add a new migration point ( <= 1.5.8) for
migrating the company phone numbers.
svn path=/trunk/; revision=25567
Diffstat (limited to 'addressbook')
-rw-r--r-- | addressbook/ChangeLog | 18 | ||||
-rw-r--r-- | addressbook/gui/component/addressbook-migrate.c | 209 |
2 files changed, 195 insertions, 32 deletions
diff --git a/addressbook/ChangeLog b/addressbook/ChangeLog index 3acec61928..bbf9309b03 100644 --- a/addressbook/ChangeLog +++ b/addressbook/ChangeLog @@ -1,3 +1,21 @@ +2004-04-21 Chris Toshok <toshok@ximian.com> + + * gui/component/addressbook-migrate.c (setup_progress_dialog): + store off the label as well as the folder name label, so we can + reuse the dialog and update the label. Also, no longer take the + string to display here. + (dialog_set_label): new function. + (migrate_contact_lists_for_local_folders): call + dialog_set_folder_name here so we can see the folder being + migrated. + (migrate_company_phone_for_local_folders): new function for + updating the way we store company phone numbers. + (addressbook_migrate): split out the logic for setting up/tearing + down the dialog from the individual migration points so we can + reuse the same dialog and not have get destroyed/recreated for + each stage. Also add a new migration point ( <= 1.5.8) for + migrating the company phone numbers. + 2004-04-21 Sivaiah Nallagatla <snallagatla@novell.com> * gui/component/addressbook.c (remove_parameters_from_uri) : added diff --git a/addressbook/gui/component/addressbook-migrate.c b/addressbook/gui/component/addressbook-migrate.c index 79f54bb66d..53b3c55e66 100644 --- a/addressbook/gui/component/addressbook-migrate.c +++ b/addressbook/gui/component/addressbook-migrate.c @@ -34,6 +34,8 @@ #include <gtk/gtkprogressbar.h> #include <e-util/e-folder-map.h> +/*#define SLOW_MIGRATION*/ + typedef struct { /* this hash table maps old folder uris to new uids. It's build in migrate_contact_folder and it's used in @@ -45,14 +47,15 @@ typedef struct { AddressbookComponent *component; GtkWidget *window; - GtkLabel *label; - GtkProgressBar *progress; + GtkWidget *label; + GtkWidget *folder_label; + GtkWidget *progress; } MigrationContext; static void -setup_progress_dialog (MigrationContext *context, const char *str) +setup_progress_dialog (MigrationContext *context) { - GtkWidget *vbox, *hbox, *w; + GtkWidget *vbox, *hbox; context->window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_title (GTK_WINDOW (context->window), _("Migrating...")); @@ -63,25 +66,24 @@ setup_progress_dialog (MigrationContext *context, const char *str) gtk_widget_show (vbox); gtk_container_add (GTK_CONTAINER (context->window), vbox); - w = gtk_label_new (str); - gtk_label_set_line_wrap (GTK_LABEL (w), TRUE); - gtk_widget_show (w); - gtk_box_pack_start_defaults (GTK_BOX (vbox), w); + context->label = gtk_label_new (""); + gtk_label_set_line_wrap (GTK_LABEL (context->label), TRUE); + gtk_widget_show (context->label); + gtk_box_pack_start_defaults (GTK_BOX (vbox), context->label); hbox = gtk_hbox_new (FALSE, 6); gtk_widget_show (hbox); gtk_box_pack_start_defaults (GTK_BOX (vbox), hbox); - context->label = GTK_LABEL (gtk_label_new ("")); - gtk_widget_show (GTK_WIDGET (context->label)); - gtk_box_pack_start_defaults (GTK_BOX (hbox), GTK_WIDGET (context->label)); + context->folder_label = gtk_label_new (""); + gtk_widget_show (context->folder_label); + gtk_box_pack_start_defaults (GTK_BOX (hbox), context->folder_label); - context->progress = GTK_PROGRESS_BAR (gtk_progress_bar_new ()); - gtk_widget_show (GTK_WIDGET (context->progress)); - gtk_box_pack_start_defaults (GTK_BOX (hbox), GTK_WIDGET (context->progress)); + context->progress = gtk_progress_bar_new (); + gtk_widget_show (context->progress); + gtk_box_pack_start_defaults (GTK_BOX (hbox), context->progress); gtk_widget_show (context->window); - } static void @@ -91,18 +93,35 @@ dialog_close (MigrationContext *context) } static void +dialog_set_label (MigrationContext *context, const char *str) +{ + gtk_label_set_text (GTK_LABEL (context->label), str); + + while (gtk_events_pending ()) + gtk_main_iteration (); + +#ifdef SLOW_MIGRATION + sleep (1); +#endif +} + +static void dialog_set_folder_name (MigrationContext *context, const char *folder_name) { char *text; text = g_strdup_printf (_("Migrating `%s':"), folder_name); - gtk_label_set_text (context->label, text); + gtk_label_set_text (GTK_LABEL (context->folder_label), text); g_free (text); - gtk_progress_bar_set_fraction (context->progress, 0.0); + gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (context->progress), 0.0); while (gtk_events_pending ()) gtk_main_iteration (); + +#ifdef SLOW_MIGRATION + sleep (1); +#endif } static void @@ -112,11 +131,15 @@ dialog_set_progress (MigrationContext *context, double percent) snprintf (text, sizeof (text), "%d%%", (int) (percent * 100.0f)); - gtk_progress_bar_set_fraction (context->progress, percent); - gtk_progress_bar_set_text (context->progress, text); + gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (context->progress), percent); + gtk_progress_bar_set_text (GTK_PROGRESS_BAR (context->progress), text); while (gtk_events_pending ()) gtk_main_iteration (); + +#ifdef SLOW_MIGRATION + sleep (1); +#endif } static gboolean @@ -747,6 +770,8 @@ migrate_contact_lists_for_local_folders (MigrationContext *context, ESourceGroup GList *l, *contacts; int num_contacts, num_converted; + dialog_set_folder_name (context, e_source_peek_name (source)); + book = e_book_new (); if (!e_book_load_source (book, source, TRUE, NULL)) { char *uri = e_source_get_uri (source); @@ -791,7 +816,108 @@ migrate_contact_lists_for_local_folders (MigrationContext *context, ESourceGroup if (!e_book_commit_contact (book, contact, &e)) - g_warning ("contact add failed: `%s'", e->message); + g_warning ("contact commit failed: `%s'", e->message); + } + + num_converted ++; + + dialog_set_progress (context, (double)num_converted / num_contacts); + } + + g_list_foreach (contacts, (GFunc)g_object_unref, NULL); + g_list_free (contacts); + + g_object_unref (book); + } +} + +static void +migrate_company_phone_for_local_folders (MigrationContext *context, ESourceGroup *on_this_computer) +{ + GSList *sources, *s; + + sources = e_source_group_peek_sources (on_this_computer); + for (s = sources; s; s = s->next) { + ESource *source = s->data; + EBook *book; + EBookQuery *query; + GList *l, *contacts; + int num_contacts, num_converted; + + dialog_set_folder_name (context, e_source_peek_name (source)); + + book = e_book_new (); + if (!e_book_load_source (book, source, TRUE, NULL)) { + char *uri = e_source_get_uri (source); + g_warning ("failed to migrate company phone numbers for source %s", uri); + g_free (uri); + continue; + } + + query = e_book_query_any_field_contains (""); + + e_book_get_contacts (book, query, &contacts, NULL); + + num_converted = 0; + num_contacts = g_list_length (contacts); + for (l = contacts; l; l = l->next) { + EContact *contact = l->data; + GError *e = NULL; + GList *attrs, *attr; + gboolean converted = FALSE; + int num_work_voice = 0; + + attrs = e_vcard_get_attributes (E_VCARD (contact)); + for (attr = attrs; attr;) { + EVCardAttribute *a = attr->data; + GList *next_attr = attr->next; + + if (!strcmp ("TEL", e_vcard_attribute_get_name (a))) { + GList *params, *param; + gboolean found_voice = FALSE; + gboolean found_work = FALSE; + + params = e_vcard_attribute_get_params (a); + for (param = params; param; param = param->next) { + EVCardAttributeParam *p = param->data; + if (!strcmp (EVC_TYPE, e_vcard_attribute_param_get_name (p))) { + GList *v = e_vcard_attribute_param_get_values (p); + if (v && v->data) { + if (!strcmp ("VOICE", v->data)) + found_voice = TRUE; + else if (!strcmp ("WORK", v->data)) + found_work = TRUE; + } + } + + if (found_work && found_voice) + num_work_voice++; + + if (num_work_voice == 3) { + GList *v = e_vcard_attribute_get_values (a); + + if (v && v->data) + e_contact_set (contact, E_CONTACT_PHONE_COMPANY, v->data); + + e_vcard_remove_attribute (E_VCARD (contact), a); + + converted = TRUE; + break; + } + } + } + + attr = next_attr; + + if (converted) + break; + } + + if (converted) { + if (!e_book_commit_contact (book, + contact, + &e)) + g_warning ("contact commit failed: `%s'", e->message); } num_converted ++; @@ -840,6 +966,7 @@ addressbook_migrate (AddressbookComponent *component, int major, int minor, int ESourceGroup *on_ldap_servers; ESource *personal_source; MigrationContext *context = migration_context_new (component); + gboolean need_dialog = FALSE; printf ("addressbook_migrate (%d.%d.%d)\n", major, minor, revision); @@ -848,14 +975,24 @@ addressbook_migrate (AddressbookComponent *component, int major, int minor, int groups/sources. */ create_groups (context, &on_this_computer, &on_ldap_servers, &personal_source); + /* figure out if we need the dialog displayed */ + if (major == 1 + /* we only need the most recent upgrade point here. + further decomposition will happen below. */ + && (minor < 5 || (minor == 5 && revision <= 8))) + need_dialog = TRUE; + + if (need_dialog) + setup_progress_dialog (context); + if (major == 1) { if (minor < 5 || (minor == 5 && revision <= 2)) { /* initialize our dialog */ - setup_progress_dialog (context, - _("The location and hierarchy of the Evolution contact " - "folders has changed since Evolution 1.x.\n\nPlease be " - "patient while Evolution migrates your folders...")); + dialog_set_label (context, + _("The location and hierarchy of the Evolution contact " + "folders has changed since Evolution 1.x.\n\nPlease be " + "patient while Evolution migrates your folders...")); if (on_this_computer) migrate_local_folders (context, on_this_computer, personal_source); @@ -863,22 +1000,30 @@ addressbook_migrate (AddressbookComponent *component, int major, int minor, int migrate_ldap_servers (context, on_ldap_servers); migrate_completion_folders (context); - - dialog_close (context); } - if (minor <= 5 || (minor == 5 && revision <= 7)) { - setup_progress_dialog (context, - _("The format of mailing list contacts has changed.\n\n" - "Please be patient while Evolution migrates your " - "folders...")); + if (minor < 5 || (minor == 5 && revision <= 7)) { + dialog_set_label (context, + _("The format of mailing list contacts has changed.\n\n" + "Please be patient while Evolution migrates your " + "folders...")); migrate_contact_lists_for_local_folders (context, on_this_computer); + } - dialog_close (context); + if (minor < 5 || (minor == 5 && revision <= 8)) { + dialog_set_label (context, + _("The way evolutions stores some phone numbers has changed.\n\n" + "Please be patient while Evolution migrates your " + "folders...")); + + migrate_company_phone_for_local_folders (context, on_this_computer); } } + if (need_dialog) + dialog_close (context); + if (on_this_computer) g_object_unref (on_this_computer); if (on_ldap_servers) |