diff options
author | Jari Urpalainen <jari.urpalainen@nokia.com> | 2011-03-08 21:51:24 +0800 |
---|---|---|
committer | Matthew Barnes <mbarnes@redhat.com> | 2011-03-08 21:51:24 +0800 |
commit | a654e38eca0d6cead861e1d78285d3ecfb4925a0 (patch) | |
tree | e04d27f0e86a468e97cb093ff92c3edc04659f52 /addressbook | |
parent | cbcae0eef22d80d564145de68fd55e47d2c35b05 (diff) | |
download | gsoc2013-evolution-a654e38eca0d6cead861e1d78285d3ecfb4925a0.tar gsoc2013-evolution-a654e38eca0d6cead861e1d78285d3ecfb4925a0.tar.gz gsoc2013-evolution-a654e38eca0d6cead861e1d78285d3ecfb4925a0.tar.bz2 gsoc2013-evolution-a654e38eca0d6cead861e1d78285d3ecfb4925a0.tar.lz gsoc2013-evolution-a654e38eca0d6cead861e1d78285d3ecfb4925a0.tar.xz gsoc2013-evolution-a654e38eca0d6cead861e1d78285d3ecfb4925a0.tar.zst gsoc2013-evolution-a654e38eca0d6cead861e1d78285d3ecfb4925a0.zip |
Bug 644194 - EAddressbookModel: Logic error in remove_contact()
Diffstat (limited to 'addressbook')
-rw-r--r-- | addressbook/gui/widgets/e-addressbook-model.c | 33 |
1 files changed, 26 insertions, 7 deletions
diff --git a/addressbook/gui/widgets/e-addressbook-model.c b/addressbook/gui/widgets/e-addressbook-model.c index 785be1c49e..6f679a4233 100644 --- a/addressbook/gui/widgets/e-addressbook-model.c +++ b/addressbook/gui/widgets/e-addressbook-model.c @@ -179,10 +179,20 @@ create_contact (EBookView *book_view, update_folder_bar_message (model); } +static gint +sort_descending (gconstpointer ca, + gconstpointer cb) +{ + gint a = *((gint *) ca); + gint b = *((gint *) cb); + + return (a == b) ? 0 : (a < b) ? 1 : -1; +} + static void remove_contact (EBookView *book_view, - GList *ids, - EAddressbookModel *model) + GList *ids, + EAddressbookModel *model) { /* XXX we should keep a hash around instead of this O(n*m) loop */ GList *iter; @@ -217,6 +227,11 @@ remove_contact (EBookView *book_view, } } + /* Sort the 'indices' array in descending order, since + * g_ptr_array_remove_index() shifts subsequent elements + * down one position to fill the gap. */ + g_array_sort (indices, sort_descending); + for (ii = 0; ii < indices->len; ii++) { gint index; @@ -232,8 +247,8 @@ remove_contact (EBookView *book_view, static void modify_contact (EBookView *book_view, - const GList *contact_list, - EAddressbookModel *model) + const GList *contact_list, + EAddressbookModel *model) { GPtrArray *array; @@ -247,15 +262,19 @@ modify_contact (EBookView *book_view, target_uid = e_contact_get_const (contact, E_CONTACT_UID); for (ii = 0; ii < array->len; ii++) { + EContact *contact; const gchar *uid; - uid = e_contact_get_const ( - array->pdata[ii], E_CONTACT_UID); + contact = array->pdata[ii]; + g_return_if_fail (contact != NULL); + + uid = e_contact_get_const (contact, E_CONTACT_UID); + g_return_if_fail (uid != NULL); if (strcmp (uid, target_uid) != 0) continue; - g_object_unref (array->pdata[ii]); + g_object_unref (contact); contact = e_contact_duplicate (contact); array->pdata[ii] = contact; |