+ /* Asynchronously commit contacts */
+ if (to_commit_contacts)
+ e_book_async_commit_contacts (book, to_commit_contacts, NULL, NULL);
+
+ /* Free lists */
+ g_list_free (to_add_contacts);
+ g_list_free (to_commit_contacts);
+
+ frees:
+ if (addresses) {
+ g_slist_foreach (addresses, (GFunc) g_free, NULL);
+ g_slist_free (addresses);
+ }
+ if (contacts)
+ g_list_free (contacts);
+}
+
+
+static void
+add_to_address_book (GSList *addresses)
+{
+ EBookQuery **queries, *composite_query;
+ gint num_add, i;
+
+ g_return_if_fail (addresses);
+
+ if (!book)
+ if (!open_addressbook ())
+ g_return_if_reached ();
+
+ /* Create the list of queries */
+ num_add = g_slist_length (addresses);
+ queries = g_malloc0 (sizeof (EBookQuery *) * num_add);
+ for (i = 0; i < num_add; i++) {
+ gchar *email;
+
+ email = modest_text_utils_get_email_address (g_slist_nth_data (addresses, i));
+ queries[i] = e_book_query_field_test (E_CONTACT_EMAIL, E_BOOK_QUERY_IS, email);
+ g_free (email);
+ }
+
+ /* Create the query */
+ composite_query = e_book_query_or (num_add, queries, TRUE);
+
+ /* Asynchronously retrieve contacts */
+ e_book_async_get_contacts (book, composite_query, async_get_contacts_cb, addresses);
+
+ /* Frees. This will unref the subqueries as well */
+ e_book_query_unref (composite_query);