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 {
#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;
}
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;
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);
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;
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));
}
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);
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));
}
}
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);
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);
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);
}
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
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);
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;
}
/* 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);
}
#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;
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);
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));
+}