* Replaced tny_folder_get_msg by its async version
authorSergio Villar Senin <svillar@igalia.com>
Mon, 11 Dec 2006 17:53:42 +0000 (17:53 +0000)
committerSergio Villar Senin <svillar@igalia.com>
Mon, 11 Dec 2006 17:53:42 +0000 (17:53 +0000)
* Replaced tny_folder_refresh by its async version
* Replaced tny_folder_store_get_folders by its async version

pmo-trunk-r542

src/gtk/modest-main-window.c
src/maemo/modest-main-window.c
src/modest-formatter.c
src/modest-mail-operation.c
src/modest-text-utils.c
src/widgets/modest-header-view.c

index 88654b4..2613689 100644 (file)
@@ -53,6 +53,7 @@ static void modest_main_window_finalize      (GObject *obj);
 
 static void restore_sizes (ModestMainWindow *self);
 static void save_sizes (ModestMainWindow *self);
+static void get_msg_cb (TnyFolder *folder, TnyMsg *msg, GError **err, gpointer user_data);
 
 /* list my signals */
 enum {
@@ -83,6 +84,15 @@ struct _ModestMainWindowPrivate {
 #define MODEST_MAIN_WINDOW_GET_PRIVATE(o)      (G_TYPE_INSTANCE_GET_PRIVATE((o), \
                                                 MODEST_TYPE_MAIN_WINDOW, \
                                                 ModestMainWindowPrivate))
+
+typedef struct _GetMsgAsyncHelper {
+       ModestMainWindowPrivate *main_window_private;
+       guint action;
+       ModestMailOperationReplyType reply_type;
+       ModestMailOperationForwardType forward_type;
+       gchar *from;
+} GetMsgAsyncHelper;
+
 /* globals */
 static GtkWindowClass *parent_class = NULL;
 
@@ -218,9 +228,61 @@ on_menu_new_message (ModestMainWindow *self, guint action, GtkWidget *widget)
 }
 
 static void
-on_menu_reply_forward (ModestMainWindow *self, guint action, GtkWidget *widget)
+get_msg_cb (TnyFolder *folder, TnyMsg *msg, GError **err, gpointer user_data)
 {
        GtkWidget *msg_win;
+       TnyHeader *new_header;
+       TnyMsg *new_msg;
+       ModestMainWindowPrivate *priv;
+       ModestEditType edit_type = -2;
+       GetMsgAsyncHelper *helper;
+
+       helper = (GetMsgAsyncHelper *) (user_data);
+       priv  = helper->main_window_private;
+
+       /* FIXME: select proper action */
+       new_msg = NULL;
+       switch (helper->action) {
+       case 1:
+               new_msg = 
+                       modest_mail_operation_create_reply_mail (msg, helper->from, helper->reply_type,
+                                                                MODEST_MAIL_OPERATION_REPLY_MODE_SENDER);
+               edit_type = MODEST_EDIT_TYPE_REPLY;
+               break;
+       case 2:
+               new_msg = 
+                       modest_mail_operation_create_reply_mail (msg, helper->from, helper->reply_type,
+                                                                MODEST_MAIL_OPERATION_REPLY_MODE_ALL);
+               edit_type = MODEST_EDIT_TYPE_REPLY;
+               break;
+       case 3:
+               new_msg = 
+                       modest_mail_operation_create_forward_mail (msg, helper->from, helper->forward_type);
+               edit_type = MODEST_EDIT_TYPE_FORWARD;
+               break;
+       default:
+               g_warning ("unexpected action type: %d", helper->action);
+       }
+       
+       if (new_msg) {
+               /* Set from */
+               new_header = tny_msg_get_header (new_msg);
+               tny_header_set_from (new_header, helper->from);
+               
+               /* Show edit window */
+               msg_win = modest_edit_msg_window_new (priv->widget_factory,
+                                                     edit_type,
+                                                     new_msg);
+               gtk_widget_show (msg_win);
+               
+               /* Clean and go on */
+               g_object_unref (new_msg);
+       }
+}
+
+static void
+on_menu_reply_forward (ModestMainWindow *self, guint action, GtkWidget *widget)
+{
        ModestMainWindowPrivate *priv;
        ModestHeaderView *header_view;
        TnyList *header_list;
@@ -230,6 +292,7 @@ on_menu_reply_forward (ModestMainWindow *self, guint action, GtkWidget *widget)
        ModestMailOperationForwardType forward_type;
        ModestConf *conf;
        GError *error;
+       GetMsgAsyncHelper *helper;
 
        priv  = MODEST_MAIN_WINDOW_GET_PRIVATE(self);
        conf = modest_tny_platform_factory_get_modest_conf_instance (priv->factory);
@@ -264,10 +327,8 @@ on_menu_reply_forward (ModestMainWindow *self, guint action, GtkWidget *widget)
        g_free (forward_key);
        
        if (header_list) {
-               TnyHeader *header, *new_header;
+               TnyHeader *header;
                TnyFolder *folder;
-               TnyMsg    *msg, *new_msg = NULL;
-               ModestEditType edit_type = -2;
                gchar *from, *email_key;
                const gchar *account_name;
 
@@ -286,47 +347,20 @@ on_menu_reply_forward (ModestMainWindow *self, guint action, GtkWidget *widget)
                folder = tny_header_get_folder (header);
 
                do {
+                       /* Since it's not an object, we need to create
+                          it each time due to it's not a GObject and
+                          we can not do a g_object_ref. No need to
+                          free it, tinymail will do it for us. */
+                       helper = g_slice_new0 (GetMsgAsyncHelper);
+                       helper->main_window_private = priv;
+                       helper->reply_type = reply_type;
+                       helper->forward_type = forward_type;
+                       helper->action = action;
+                       helper->from = from;
+
                        /* Get msg from header */
                        header = TNY_HEADER (tny_iterator_get_current (iter));
-                       msg = tny_folder_get_msg (folder, header, NULL); /* FIXME */
-
-                       /* FIXME: select proper action */
-                       switch (action) {
-                       case 1:
-                               new_msg = 
-                                       modest_mail_operation_create_reply_mail (msg, from, reply_type,
-                                                                                MODEST_MAIL_OPERATION_REPLY_MODE_SENDER);
-                               edit_type = MODEST_EDIT_TYPE_REPLY;
-                               break;
-                       case 2:
-                               new_msg = 
-                                       modest_mail_operation_create_reply_mail (msg, from, reply_type,
-                                                                                MODEST_MAIL_OPERATION_REPLY_MODE_ALL);
-                               edit_type = MODEST_EDIT_TYPE_REPLY;
-                               break;
-                       case 3:
-                               new_msg = 
-                                       modest_mail_operation_create_forward_mail (msg, from, forward_type);
-                               edit_type = MODEST_EDIT_TYPE_FORWARD;
-                               break;
-                       default:
-                               g_warning ("unexpected action type: %d", action);
-                       }
-
-                       if (new_msg) {
-                               /* Set from */
-                               new_header = tny_msg_get_header (new_msg);
-                               tny_header_set_from (new_header, from);
-                               
-                               /* Show edit window */
-                               msg_win = modest_edit_msg_window_new (priv->widget_factory,
-                                                                     edit_type,
-                                                                     new_msg);
-                               gtk_widget_show (msg_win);
-                               
-                               /* Clean and go on */
-                               g_object_unref (new_msg);
-                       }
+                       tny_folder_get_msg_async (folder, header, get_msg_cb, helper);
                        tny_iterator_next (iter);
 
                } while (!tny_iterator_is_done (iter));
index 8658f96..3d79f49 100644 (file)
@@ -221,19 +221,71 @@ on_menu_new_message (ModestMainWindow *self, guint action, GtkWidget *widget)
 }
 
 static void
-on_menu_reply_forward (ModestMainWindow *self, guint action, GtkWidget *widget)
+get_msg_cb (TnyFolder *folder, TnyMsg *msg, GError **err, gpointer user_data)
 {
        GtkWidget *msg_win;
+       TnyHeader *new_header;
+       TnyMsg *new_msg;
+       ModestMainWindowPrivate *priv;
+       ModestEditType edit_type = -2;
+       GetMsgAsyncHelper *helper;
+
+       helper = (GetMsgAsyncHelper *) (user_data);
+       priv  = helper->main_window_private;
+
+       /* FIXME: select proper action */
+       new_msg = NULL;
+       switch (helper->action) {
+       case 1:
+               new_msg = 
+                       modest_mail_operation_create_reply_mail (msg, helper->from, helper->reply_type,
+                                                                MODEST_MAIL_OPERATION_REPLY_MODE_SENDER);
+               edit_type = MODEST_EDIT_TYPE_REPLY;
+               break;
+       case 2:
+               new_msg = 
+                       modest_mail_operation_create_reply_mail (msg, helper->from, helper->reply_type,
+                                                                MODEST_MAIL_OPERATION_REPLY_MODE_ALL);
+               edit_type = MODEST_EDIT_TYPE_REPLY;
+               break;
+       case 3:
+               new_msg = 
+                       modest_mail_operation_create_forward_mail (msg, helper->from, helper->forward_type);
+               edit_type = MODEST_EDIT_TYPE_FORWARD;
+               break;
+       default:
+               g_warning ("unexpected action type: %d", helper->action);
+       }
+       
+       if (new_msg) {
+               /* Set from */
+               new_header = tny_msg_get_header (new_msg);
+               tny_header_set_from (new_header, helper->from);
+               
+               /* Show edit window */
+               msg_win = modest_edit_msg_window_new (priv->widget_factory,
+                                                     edit_type,
+                                                     new_msg);
+               gtk_widget_show (msg_win);
+               
+               /* Clean and go on */
+               g_object_unref (new_msg);
+       }
+}
+
+static void
+on_menu_reply_forward (ModestMainWindow *self, guint action, GtkWidget *widget)
+{
        ModestMainWindowPrivate *priv;
        ModestHeaderView *header_view;
        TnyList *header_list;
        TnyIterator *iter;
-       const gchar *from;
        gchar *reply_key, *forward_key;
        ModestMailOperationReplyType reply_type;
        ModestMailOperationForwardType forward_type;
        ModestConf *conf;
        GError *error;
+       GetMsgAsyncHelper *helper;
 
        priv  = MODEST_MAIN_WINDOW_GET_PRIVATE(self);
        conf = modest_tny_platform_factory_get_modest_conf_instance (priv->factory);
@@ -245,77 +297,71 @@ on_menu_reply_forward (ModestMainWindow *self, guint action, GtkWidget *widget)
        error = NULL;
        reply_key = g_strdup_printf ("%s/%s", MODEST_CONF_NAMESPACE, MODEST_CONF_REPLY_TYPE);
        reply_type = modest_conf_get_int (conf, reply_key, &error);
-       if (error) {
+       if (error || reply_type == 0) {
                g_warning ("key %s not defined", reply_key);
                reply_type = MODEST_MAIL_OPERATION_REPLY_TYPE_CITE;
-               g_error_free (error);
-               error = NULL;
+               if (error) {
+                       g_error_free (error);
+                       error = NULL;
+               }
        }
        g_free (reply_key);
        
        forward_key = g_strdup_printf ("%s/%s", MODEST_CONF_NAMESPACE, MODEST_CONF_FORWARD_TYPE);
-       forward_type = modest_conf_get_int (conf, forward_key, NULL);
-       if (error) {
+       forward_type = modest_conf_get_int (conf, forward_key, &error);
+       if (error || forward_type == 0) {
                g_warning ("key %s not defined", forward_key);
-               reply_type = MODEST_MAIL_OPERATION_FORWARD_TYPE_INLINE;
-               g_error_free (error);
+               forward_type = MODEST_MAIL_OPERATION_FORWARD_TYPE_INLINE;
+               if (error) {
+                       g_error_free (error);
+                       error = NULL;
+               }
        }
        g_free (forward_key);
        
        if (header_list) {
+               TnyHeader *header;
+               TnyFolder *folder;
+               gchar *from, *email_key;
+               const gchar *account_name;
+
+               /* We assume that we can only select messages of the
+                  same folder and that we reply all of them from the
+                  same account. In fact the interface currently only
+                  allows single selection */
+               account_name = modest_folder_view_get_selected_account (priv->folder_view);
+               email_key = g_strdup_printf ("%s/%s/%s", MODEST_ACCOUNT_NAMESPACE, 
+                                            account_name, MODEST_ACCOUNT_EMAIL);
+               from = modest_conf_get_string (conf, email_key, NULL);
+               g_free (email_key);
+
                iter = tny_list_create_iterator (header_list);
+               header = TNY_HEADER (tny_iterator_get_current (iter));
+               folder = tny_header_get_folder (header);
+
                do {
-                       TnyHeader *header, *new_header;
-                       TnyFolder *folder;
-                       TnyMsg    *msg, *new_msg;
-                       ModestEditType edit_type;
+                       /* Since it's not an object, we need to create
+                          it each time due to it's not a GObject and
+                          we can not do a g_object_ref. No need to
+                          free it, tinymail will do it for us. */
+                       helper = g_slice_new0 (GetMsgAsyncHelper);
+                       helper->main_window_private = priv;
+                       helper->reply_type = reply_type;
+                       helper->forward_type = forward_type;
+                       helper->action = action;
+                       helper->from = from;
 
                        /* Get msg from header */
                        header = TNY_HEADER (tny_iterator_get_current (iter));
-                       folder = tny_header_get_folder (header);
-                       msg = tny_folder_get_msg (folder, header, NULL); /* FIXME */
-
-                       from = modest_folder_view_get_selected_account (priv->folder_view);
-
-                       /* FIXME: select proper action */
-                       switch (action) {
-                       case 1:
-                               new_msg = 
-                                       modest_mail_operation_create_reply_mail (msg, from, reply_type,
-                                                                                MODEST_MAIL_OPERATION_REPLY_MODE_SENDER);
-                               edit_type = MODEST_EDIT_TYPE_REPLY;
-                               break;
-                       case 2:
-                               new_msg = 
-                                       modest_mail_operation_create_reply_mail (msg, from, reply_type,
-                                                                                MODEST_MAIL_OPERATION_REPLY_MODE_ALL);
-                               edit_type = MODEST_EDIT_TYPE_REPLY;
-                               break;
-                       case 3:
-                               new_msg = 
-                                       modest_mail_operation_create_forward_mail (msg, from, forward_type);
-                               edit_type = MODEST_EDIT_TYPE_FORWARD;
-                               break;
-                       default:
-                               g_warning ("unexpected action type: %d", action);
-                       }
-
-                       /* Set from */
-                       new_header = tny_msg_get_header (new_msg);
-                       tny_header_set_from (new_header, 
-                                            modest_folder_view_get_selected_account (priv->folder_view));
-
-                       /* Show edit window */
-                       msg_win = modest_edit_msg_window_new (priv->widget_factory,
-                                                             edit_type,
-                                                             new_msg);
-                       gtk_widget_show (msg_win);
-
-                       /* Clean and go on */
-                       g_object_unref (new_msg);
+                       tny_folder_get_msg_async (folder, header, get_msg_cb, helper);
                        tny_iterator_next (iter);
 
                } while (!tny_iterator_is_done (iter));
+
+               /* Clean */
+               g_free (from);
+               g_object_unref (G_OBJECT (iter));
+               g_object_unref (G_OBJECT (folder));
        }
 }
 
index 81af6dc..aa82ddf 100644 (file)
@@ -87,7 +87,8 @@ extract_text (ModestFormatter *self, TnyMimePart *body)
        if (strcmp (tny_mime_part_get_content_type (body), priv->content_type)) {
                if (!strcmp (priv->content_type, "text/html"))
                        converted_text = modest_text_utils_convert_to_html  (text);
-/*             else */
+               else
+                       converted_text = g_strdup (text);
 /*                     converted_text = modest_text_utils_convert_to_plain (text); */
 
                g_free (text);
index 72acc99..d655730 100644 (file)
@@ -65,18 +65,23 @@ enum _ModestMailOperationErrorCode {
        MODEST_MAIL_OPERATION_NUM_ERROR_CODES
 };
 
-static void       set_error          (ModestMailOperation *mail_operation, 
+static void     set_error            (ModestMailOperation *mail_operation, 
                                      ModestMailOperationErrorCode error_code,
                                      const gchar *fmt, ...);
-static void       status_update_cb   (TnyFolder *folder, 
+static void     status_update_cb     (TnyFolder *folder, 
                                      const gchar *what, 
                                      gint status, 
+                                     gint oftotal,
                                      gpointer user_data);
-static void       folder_refresh_cb  (TnyFolder *folder, 
+static void     folder_refresh_cb    (TnyFolder *folder, 
                                      gboolean canceled,
                                      GError **err,
                                      gpointer user_data);
-static void       add_attachments    (TnyMsg *msg, 
+static void     update_folders_cb    (TnyFolderStore *self, 
+                                     TnyList *list, 
+                                     GError **err, 
+                                     gpointer user_data);
+static void     add_attachments      (TnyMsg *msg, 
                                      GList *attachments_list);
 
 
@@ -441,10 +446,13 @@ modest_mail_operation_create_reply_mail (TnyMsg *msg,
                if (cc)  g_string_append_printf (tmp, ",%s",cc);
                if (bcc) g_string_append_printf (tmp, ",%s",bcc);
 
-               /* Remove my own address from the cc list */
+
+               /* Remove my own address from the cc list. TODO:
+                  remove also the To: of the new message, needed due
+                  to the new reply_to feature */
                new_cc = (gchar *) 
                        modest_text_utils_remove_address ((const gchar *) tmp->str, 
-                                                         (const gchar *) from);
+                                                         from);
                /* FIXME: remove also the mails from the new To: */
                tny_header_set_cc (new_header, new_cc);
 
@@ -462,9 +470,9 @@ modest_mail_operation_create_reply_mail (TnyMsg *msg,
 }
 
 static void
-status_update_cb (TnyFolder *folder, const gchar *what, gint status, gpointer user_data) 
+status_update_cb (TnyFolder *folder, const gchar *what, gint status, gint oftotal, gpointer user_data) 
 {
-       g_print ("%s status: %d\n", what, status);
+       g_print ("%s status: %d, of total %d\n", what, status, oftotal);
 }
 
 static void
@@ -506,35 +514,24 @@ folder_refresh_cb (TnyFolder *folder, gboolean canceled, GError **err, gpointer
        g_signal_emit (G_OBJECT (mail_op), signals[PROGRESS_CHANGED_SIGNAL], 0, NULL);
 }
 
-gboolean
-modest_mail_operation_update_account (ModestMailOperation *mail_op,
-                                     TnyStoreAccount *store_account)
+
+static void
+update_folders_cb (TnyFolderStore *self, TnyList *list, GError **err, gpointer user_data)
 {
+       ModestMailOperation *mail_op;
        ModestMailOperationPrivate *priv;
        TnyList *folders;
        TnyIterator *ifolders;
        TnyFolder *cur_folder;
-       TnyFolderStoreQuery *query;
 
-       g_return_if_fail (MODEST_IS_MAIL_OPERATION (mail_op));
-       g_return_if_fail (TNY_IS_STORE_ACCOUNT(store_account));
-
-       priv = MODEST_MAIL_OPERATION_GET_PRIVATE(mail_op);
+       mail_op = MODEST_MAIL_OPERATION (user_data);
+       priv    = MODEST_MAIL_OPERATION_GET_PRIVATE (mail_op);
 
-       /* Get subscribed folders */
-       folders = TNY_LIST (tny_simple_list_new ());
-       query = tny_folder_store_query_new ();
-       tny_folder_store_query_add_item (query, NULL, TNY_FOLDER_STORE_QUERY_OPTION_SUBSCRIBED);
-       tny_folder_store_get_folders (TNY_FOLDER_STORE (store_account),
-                                     folders, query, NULL); /* FIXME */
-       g_object_unref (query);
-       
-       ifolders = tny_list_create_iterator (folders);
-       priv->total = tny_list_get_length (folders);
+       ifolders = tny_list_create_iterator (list);
+       priv->total = tny_list_get_length (list);
        priv->done = 0;
        priv->status = MODEST_MAIL_OPERATION_STATUS_IN_PROGRESS;
 
-       gint i =0;
        /* Async refresh folders. Reference the mail_op because
           tinymail destroys the user_data */   
        for (tny_iterator_first (ifolders); 
@@ -542,11 +539,35 @@ modest_mail_operation_update_account (ModestMailOperation *mail_op,
             tny_iterator_next (ifolders)) {
                
                cur_folder = TNY_FOLDER (tny_iterator_get_current (ifolders));
-               tny_folder_refresh_async (cur_folder, folder_refresh_cb,
+               tny_folder_refresh_async (cur_folder, 
+                                         folder_refresh_cb,
                                          status_update_cb, g_object_ref (mail_op));
        }
        
-       g_object_unref (ifolders);
+       g_object_unref (G_OBJECT (ifolders));
+       g_object_unref (G_OBJECT (list));
+}
+
+gboolean
+modest_mail_operation_update_account (ModestMailOperation *mail_op,
+                                     TnyStoreAccount *store_account)
+{
+       ModestMailOperationPrivate *priv;
+       TnyList *folders;
+       TnyFolderStoreQuery *query;
+
+       g_return_if_fail (MODEST_IS_MAIL_OPERATION (mail_op));
+       g_return_if_fail (TNY_IS_STORE_ACCOUNT(store_account));
+
+       priv = MODEST_MAIL_OPERATION_GET_PRIVATE(mail_op);
+
+       /* Get subscribed folders & refresh them */
+       folders = TNY_LIST (tny_simple_list_new ());
+       query = tny_folder_store_query_new ();
+       tny_folder_store_query_add_item (query, NULL, TNY_FOLDER_STORE_QUERY_OPTION_SUBSCRIBED);
+       tny_folder_store_get_folders_async (TNY_FOLDER_STORE (store_account),
+                                           folders, update_folders_cb, query, mail_op);
+       g_object_unref (query);
 
        return TRUE;
 }
index 130bc8f..4262066 100644 (file)
@@ -235,9 +235,9 @@ modest_text_utils_remove_address (const gchar *address_list, const gchar *addres
                /* Add to list if not found */
                if (!strstr ((const char *) token, (const char *) address)) {
                        if (filtered_emails->len == 0)
-                               g_string_append_printf (filtered_emails, "%s", token);
+                               g_string_append_printf (filtered_emails, "%s", g_strstrip (token));
                        else
-                               g_string_append_printf (filtered_emails, ",%s", token);
+                               g_string_append_printf (filtered_emails, ",%s", g_strstrip (token));
                }
                token = strtok_r (NULL, ",", &ptr);
        }
index 09f78c4..016ad53 100644 (file)
@@ -66,6 +66,12 @@ struct _ModestHeaderViewPrivate {
 #define MODEST_HEADER_VIEW_GET_PRIVATE(o)      (G_TYPE_INSTANCE_GET_PRIVATE((o), \
                                                MODEST_TYPE_HEADER_VIEW, \
                                                 ModestHeaderViewPrivate))
+
+typedef struct _GetMsgAsyncHelper {
+       ModestHeaderView *view;
+       TnyHeader *header;
+} GetMsgAsyncHelper;
+
 /* globals */
 static GObjectClass *parent_class = NULL;
 
@@ -881,20 +887,38 @@ modest_header_view_set_folder (ModestHeaderView *self, TnyFolder *folder)
        return TRUE;
 }
 
+static void
+get_msg_cb (TnyFolder *folder, TnyMsg *msg, GError **err, gpointer user_data)
+{
+       GetMsgAsyncHelper *helper;
+       TnyHeaderFlags header_flags;
 
+       helper = (GetMsgAsyncHelper *) user_data;
 
+       if (!msg) {
+               g_signal_emit (G_OBJECT(helper->view), signals[ITEM_NOT_FOUND_SIGNAL], 0,
+                              MODEST_ITEM_TYPE_MESSAGE);
+               return;
+       }
+                                       
+       g_signal_emit (G_OBJECT(helper->view), signals[MESSAGE_SELECTED_SIGNAL], 0,
+                      msg);
+       
+       /* mark message as seen; _set_flags crashes, bug in tinymail? */
+       header_flags = tny_header_get_flags (helper->header);
+       tny_header_set_flags (helper->header, header_flags | TNY_HEADER_FLAG_SEEN);
+}
 
 static void
 on_selection_changed (GtkTreeSelection *sel, gpointer user_data)
 {
-       GtkTreeModel            *model;
-       TnyHeader       *header;
-       TnyHeaderFlags header_flags;
-       GtkTreeIter             iter;
-       ModestHeaderView        *self;
+       GtkTreeModel *model;
+       TnyHeader *header;
+       GtkTreeIter iter;
+       ModestHeaderView *self;
        ModestHeaderViewPrivate *priv;
-       const TnyMsg *msg = NULL;
-       const TnyFolder *folder;
+       TnyFolder *folder;
+       GetMsgAsyncHelper *helper;
        
        g_return_if_fail (sel);
        g_return_if_fail (user_data);
@@ -920,22 +944,16 @@ on_selection_changed (GtkTreeSelection *sel, gpointer user_data)
                               MODEST_ITEM_TYPE_FOLDER);
                return;
        }
-       
-       msg = tny_folder_get_msg (TNY_FOLDER(folder),
-                                 header, NULL); /* FIXME */
-       if (!msg) {
-               g_signal_emit (G_OBJECT(self), signals[ITEM_NOT_FOUND_SIGNAL], 0,
-                              MODEST_ITEM_TYPE_MESSAGE);
-               return;
-       }
-                                       
-       g_signal_emit (G_OBJECT(self), signals[MESSAGE_SELECTED_SIGNAL], 0,
-                      msg);
-       
-       /* mark message as seen; _set_flags crashes, bug in tinymail? */
-       header_flags = tny_header_get_flags (TNY_HEADER(header));
-       tny_header_set_flags (header, header_flags | TNY_HEADER_FLAG_SEEN);
+
+       helper = g_slice_new0 (GetMsgAsyncHelper);
+       helper->view = self;
+       helper->header = header;
+
+       /* Get message asynchronously. The callback will issue a
+          signal if the message was retrieved correctly and then will
+          set the header flags as read. Tinymail will free the helper */       
+       tny_folder_get_msg_async (TNY_FOLDER(folder), header, get_msg_cb, helper);
 
        /* Free */
-/*     g_free (folder); */
-}      
+       g_object_unref (G_OBJECT (folder));
+}