Now we also show mailboxes window from dbus calls for show account
[modest] / src / hildon2 / modest-address-book.c
index e260d85..b160324 100644 (file)
@@ -62,7 +62,7 @@ static gchar *ui_get_formatted_email_id(gchar * current_given_name,
                                        gchar * current_sur_name, gchar * current_email_id);
 static gchar *run_add_email_addr_to_contact_dlg(const gchar * contact_name, gboolean *canceled);
 static GSList *select_email_addrs_for_contact(GList * email_addr_list);
-static gboolean resolve_address (const gchar *address, GSList **resolved_addresses, gchar **contact_id, gboolean *canceled);
+static gboolean resolve_address (const gchar *address, GSList **resolved_addresses, GSList **contact_id, gboolean *canceled);
 static gchar *unquote_string (const gchar *str);
 
 
@@ -445,10 +445,18 @@ commit_contact(EContact * contact, gboolean is_new)
        if (OSSO_ABOOK_IS_CONTACT (contact)) {
                osso_abook_contact_commit(OSSO_ABOOK_CONTACT(contact), is_new, book, NULL);
        } else {
-               if (is_new)
-                       e_book_add_contact (book, contact, NULL);
-               else
-                       e_book_commit_contact (book, contact, NULL);
+               GError *err = NULL;
+               if (is_new) {
+                       if (!e_book_add_contact (book, contact, &err)) {
+                               g_warning ("Failed to add contact: %s", err->message);
+                               g_error_free (err);
+                       }
+               } else {
+                       if (!e_book_commit_contact (book, contact, &err)) {
+                               g_warning ("Failed to commit contact: %s", err->message);
+                               g_error_free (err);
+                       }
+               }
        }
 #endif /* MODEST_ABOOK_API < 2 */
 }
@@ -591,6 +599,7 @@ run_add_email_addr_to_contact_dlg(const gchar * contact_name,
                                        gchar *message = g_strdup_printf(
                                                _CS("ckdg_ib_illegal_characters_entered"), 
                                                char_in_string);
+                                       g_free (char_in_string);
                                        hildon_banner_show_information (
                                                add_email_addr_to_contact_dlg, NULL, message );
                                        g_free (message);
@@ -689,6 +698,8 @@ add_to_address_book (const gchar* address)
                            err ? err->message : "<unknown>");
                if (err)
                        g_error_free (err);
+               g_free (email);
+               e_book_query_unref (query);
                return FALSE;
        }
        e_book_query_unref (query);
@@ -806,6 +817,14 @@ static void clean_check_names_banner (CheckNamesInfo *info)
        }
 }
 
+void free_resolved_addresses_list (gpointer data,
+                                  gpointer ignored)
+{
+       GSList *list = (GSList *)data;
+       g_slist_foreach (list, (GFunc) g_free, NULL);
+       g_slist_free (list);
+}
+
 gboolean
 modest_address_book_check_names (ModestRecptEditor *recpt_editor, gboolean update_addressbook)
 {
@@ -868,20 +887,21 @@ modest_address_book_check_names (ModestRecptEditor *recpt_editor, gboolean updat
                        } else if (strstr (address, "@") == NULL) {
                                /* here goes searching in addressbook */
                                gboolean canceled;
-                               gchar *contact_id = NULL;
+                               GSList *contact_ids = NULL;
                                GSList *resolved_addresses = NULL;
 
-                               result = resolve_address (address, &resolved_addresses, &contact_id, &canceled);
+                               result = resolve_address (address, &resolved_addresses, &contact_ids, &canceled);
 
                                if (result) {
                                        gint new_length;
-                                       /* replace string */
-                                       modest_recpt_editor_replace_with_resolved_recipient (recpt_editor,
-                                                                                            &start_iter, &end_iter,
-                                                                                            resolved_addresses, 
-                                                                                            contact_id);
-                                       g_free (contact_id);
-                                       g_slist_foreach (resolved_addresses, (GFunc) g_free, NULL);
+
+                                       modest_recpt_editor_replace_with_resolved_recipients (recpt_editor,
+                                                                                             &start_iter, &end_iter,
+                                                                                             resolved_addresses,
+                                                                                             contact_ids);
+                                       g_slist_foreach (contact_ids, (GFunc) g_free, NULL);
+                                       g_slist_foreach (resolved_addresses, free_resolved_addresses_list, NULL);
+                                       g_slist_free (contact_ids);
                                        g_slist_free (resolved_addresses);
 
                                        /* update offset delta */
@@ -1045,6 +1065,9 @@ select_contacts_for_name_dialog (const gchar *name)
                                                                                   _AB("addr_ti_dia_select_contacts"),
                                                                                   OSSO_ABOOK_CAPS_EMAIL,
                                                                                   OSSO_ABOOK_CONTACT_ORDER_NAME);
+               /* Enable multiselection */
+               osso_abook_contact_chooser_set_maximum_selection (OSSO_ABOOK_CONTACT_CHOOSER (contact_dialog),
+                                                                 G_MAXUINT);
                osso_abook_contact_chooser_set_model (OSSO_ABOOK_CONTACT_CHOOSER (contact_dialog),
                                                      contact_model);
 
@@ -1062,7 +1085,7 @@ select_contacts_for_name_dialog (const gchar *name)
 static gboolean
 resolve_address (const gchar *address, 
                 GSList **resolved_addresses, 
-                gchar **contact_id,
+                GSList **contact_ids,
                 gboolean *canceled)
 {
        GList *resolved_contacts;
@@ -1070,6 +1093,8 @@ resolve_address (const gchar *address,
 
        g_return_val_if_fail (canceled, FALSE);
 
+       *resolved_addresses = NULL;
+       *contact_ids = NULL;
        *canceled = FALSE;
        info = g_slice_new0 (CheckNamesInfo);
        show_check_names_banner (info);
@@ -1084,9 +1109,9 @@ resolve_address (const gchar *address,
                clean_check_names_banner (info);
                return FALSE;
        }
-       hide_check_names_banner (info);
 
        resolved_contacts = get_contacts_for_name (address);
+       hide_check_names_banner (info);
 
        if (resolved_contacts == NULL) {
                /* no matching contacts for the search string */
@@ -1104,15 +1129,21 @@ resolve_address (const gchar *address,
 
        /* get the resolved contacts (can be no contact) */
        if (resolved_contacts) {
-               gboolean found;
-               EContact *contact = (EContact *) resolved_contacts->data;
+               GList *node;
+               gboolean found = FALSE;
 
-               *resolved_addresses = get_recipients_for_given_contact (contact, canceled);
-               if (*resolved_addresses) {
-                       *contact_id = g_strdup (e_contact_get_const (contact, E_CONTACT_UID));
-                       found = TRUE;
-               } else {
-                       found = FALSE;
+               for (node = resolved_contacts; node != NULL; node = g_list_next (node)) {
+                       EContact *contact = (EContact *) node->data;
+                       GSList *resolved;
+                       gchar *contact_id;
+
+                       resolved = get_recipients_for_given_contact (contact, canceled);
+                       if (resolved) {
+                               contact_id = g_strdup (e_contact_get_const (contact, E_CONTACT_UID));
+                               *contact_ids = g_slist_append (*contact_ids, contact_id);
+                               found = TRUE;
+                               *resolved_addresses = g_slist_append (*resolved_addresses, resolved);
+                       }
                }
 
                g_list_foreach (resolved_contacts, (GFunc)unref_gobject, NULL);
@@ -1187,6 +1218,8 @@ modest_address_book_has_address (const gchar *address)
                            err ? err->message : "<unknown>");
                if (err)
                        g_error_free (err);
+               g_free (email);
+               e_book_query_unref (query);
                return FALSE;
        }
        e_book_query_unref (query);