diff options
author | Hans Petter Jansson <hpj@ximian.com> | 2004-04-22 10:21:42 +0800 |
---|---|---|
committer | Hans Petter <hansp@src.gnome.org> | 2004-04-22 10:21:42 +0800 |
commit | 141f7667dfa4b1543b3f1b0db606bb8302ff1833 (patch) | |
tree | fb14dac071f764a2a57b037bf2352c5169e25f97 /addressbook/gui | |
parent | 4bedac7abd6c6a4911ea8f89584ed7374c4c73be (diff) | |
download | gsoc2013-evolution-141f7667dfa4b1543b3f1b0db606bb8302ff1833.tar.gz gsoc2013-evolution-141f7667dfa4b1543b3f1b0db606bb8302ff1833.tar.zst gsoc2013-evolution-141f7667dfa4b1543b3f1b0db606bb8302ff1833.zip |
Implement. (extract_email): Preserve offscreen addresses. (extract_phone):
2004-04-21 Hans Petter Jansson <hpj@ximian.com>
* gui/contact-editor/e-contact-editor.c (free_attr_list): Implement.
(extract_email): Preserve offscreen addresses.
(extract_phone): Preserve offscreen phone numbers.
(extract_im): Preserve offscreen IM accounts.
svn path=/trunk/; revision=25571
Diffstat (limited to 'addressbook/gui')
-rw-r--r-- | addressbook/gui/contact-editor/e-contact-editor.c | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/addressbook/gui/contact-editor/e-contact-editor.c b/addressbook/gui/contact-editor/e-contact-editor.c index 912720dc6b..0ce3f02d9d 100644 --- a/addressbook/gui/contact-editor/e-contact-editor.c +++ b/addressbook/gui/contact-editor/e-contact-editor.c @@ -524,6 +524,19 @@ alloc_ui_slot (EContactEditor *editor, const gchar *widget_base, gint preferred_ } static void +free_attr_list (GList *attr_list) +{ + GList *l; + + for (l = attr_list; l; l = g_list_next (l)) { + EVCardAttribute *attr = l->data; + e_vcard_attribute_free (attr); + } + + g_list_free (attr_list); +} + +static void fill_in_email (EContactEditor *editor) { GList *email_attr_list; @@ -561,6 +574,8 @@ static void extract_email (EContactEditor *editor) { GList *attr_list = NULL; + GList *old_attr_list; + GList *l, *l_next; gint i; for (i = 1; i <= EMAIL_SLOTS; i++) { @@ -587,7 +602,22 @@ extract_email (EContactEditor *editor) g_free (address); } + /* Splice in the old attributes, minus the EMAIL_SLOTS first */ + + old_attr_list = e_contact_get_attributes (editor->contact, E_CONTACT_EMAIL); + for (l = old_attr_list, i = 1; l && i <= EMAIL_SLOTS; l = l_next, i++) { + l_next = g_list_next (l); + + e_vcard_attribute_free (l->data); + g_list_delete_link (l, l); + } + + old_attr_list = l; + attr_list = g_list_concat (attr_list, old_attr_list); + e_contact_set_attributes (editor->contact, E_CONTACT_EMAIL, attr_list); + + free_attr_list (attr_list); } /* EContact can get attributes by field ID only, and there is none for TEL, so we need this */ @@ -706,6 +736,8 @@ static void extract_phone (EContactEditor *editor) { GList *attr_list = NULL; + GList *old_attr_list; + GList *l, *l_next; gint i; for (i = 1; i <= PHONE_SLOTS; i++) { @@ -743,7 +775,22 @@ extract_phone (EContactEditor *editor) g_free (phone); } + /* Splice in the old attributes, minus the PHONE_SLOTS first */ + + old_attr_list = get_attributes_named (E_VCARD (editor->contact), "TEL"); + for (l = old_attr_list, i = 1; l && i <= PHONE_SLOTS; l = l_next, i++) { + l_next = g_list_next (l); + + e_vcard_attribute_free (l->data); + g_list_delete_link (l, l); + } + + old_attr_list = l; + attr_list = g_list_concat (attr_list, old_attr_list); + set_attributes_named (E_VCARD (editor->contact), "TEL", attr_list); + + free_attr_list (attr_list); } static void @@ -952,6 +999,7 @@ static void extract_im (EContactEditor *editor) { GList **service_attr_list; + gint remaining_slots = IM_SLOTS; gint i; service_attr_list = g_new0 (GList *, G_N_ELEMENTS (im_service)); @@ -982,8 +1030,31 @@ extract_im (EContactEditor *editor) } for (i = 0; i < G_N_ELEMENTS (im_service); i++) { + GList *old_service_attr_list; + gint filled_in_slots; + GList *l, *l_next; + gint j; + + /* Splice in the old attributes, minus the filled_in_slots first */ + + old_service_attr_list = e_contact_get_attributes (editor->contact, im_service [i].field); + filled_in_slots = MIN (remaining_slots, g_list_length (old_service_attr_list)); + remaining_slots -= filled_in_slots; + + for (l = old_service_attr_list, j = 0; l && j < filled_in_slots; l = l_next, j++) { + l_next = g_list_next (l); + + e_vcard_attribute_free (l->data); + g_list_delete_link (l, l); + } + + old_service_attr_list = l; + service_attr_list [i] = g_list_concat (service_attr_list [i], old_service_attr_list); + e_contact_set_attributes (editor->contact, im_service [i].field, service_attr_list [i]); + + free_attr_list (service_attr_list [i]); } g_free (service_attr_list); |