#include <glib/gstdio.h>
#include <modest-debug.h>
#include <modest-header-window.h>
+#include <modest-account-protocol.h>
#define MYDOCS_ENV "MYDOCSDIR"
#define DOCS_FOLDER ".documents"
GtkWidget *prev_toolitem;
GtkWidget *next_toolitem;
gboolean progress_hint;
+ gint fetching_images;
/* Optimized view enabled */
gboolean optimized_view;
GtkWidget *remove_attachment_banner;
gchar *msg_uid;
+ TnyMimePart *other_body;
GSList *sighandlers;
};
static gboolean message_reader (ModestMsgViewWindow *window,
ModestMsgViewWindowPrivate *priv,
TnyHeader *header,
+ const gchar *msg_uid,
+ TnyFolder *folder,
GtkTreeRowReference *row_reference);
static void setup_menu (ModestMsgViewWindow *self);
static gboolean _modest_msg_view_window_map_event (GtkWidget *widget,
GdkEvent *event,
gpointer userdata);
+static void update_branding (ModestMsgViewWindow *self);
/* list my signals */
};
static const GtkToggleActionEntry msg_view_toggle_action_entries [] = {
- { "FindInMessage", MODEST_TOOLBAR_ICON_FIND, N_("qgn_toolb_gene_find"), NULL, NULL, G_CALLBACK (modest_msg_view_window_toggle_find_toolbar), FALSE },
+ { "FindInMessage", MODEST_TOOLBAR_ICON_FIND, N_("qgn_toolb_gene_find"), "<CTRL>F", NULL, G_CALLBACK (modest_msg_view_window_toggle_find_toolbar), FALSE },
};
-
#define MODEST_MSG_VIEW_WINDOW_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \
MODEST_TYPE_MSG_VIEW_WINDOW, \
ModestMsgViewWindowPrivate))
priv->row_inserted_handler = 0;
priv->rows_reordered_handler = 0;
priv->progress_hint = FALSE;
+ priv->fetching_images = 0;
priv->optimized_view = FALSE;
priv->purge_timeout = 0;
priv->remove_attachment_banner = NULL;
priv->msg_uid = NULL;
+ priv->other_body = NULL;
priv->sighandlers = NULL;
return FALSE;
}
+static void
+update_progress_hint (ModestMsgViewWindow *self)
+{
+ ModestMsgViewWindowPrivate *priv;
+ priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE(self);
+
+ if (GTK_WIDGET_VISIBLE (self)) {
+ hildon_gtk_window_set_progress_indicator (GTK_WINDOW (self),
+ (priv->progress_hint || (priv->fetching_images > 0))?1:0);
+ }
+}
+
static void
set_progress_hint (ModestMsgViewWindow *self,
gboolean enabled)
/* Sets current progress hint */
priv->progress_hint = enabled;
- if (GTK_WIDGET_VISIBLE (self)) {
- hildon_gtk_window_set_progress_indicator (GTK_WINDOW (self), enabled?1:0);
- }
+ update_progress_hint (self);
}
priv->msg_view = GTK_WIDGET (tny_platform_factory_new_msg_view (modest_tny_platform_factory_get_instance ()));
modest_msg_view_set_shadow_type (MODEST_MSG_VIEW (priv->msg_view), GTK_SHADOW_NONE);
main_vbox = gtk_vbox_new (FALSE, 6);
-#ifdef MODEST_TOOLKIT_HILDON2
priv->main_scroll = hildon_pannable_area_new ();
gtk_container_add (GTK_CONTAINER (priv->main_scroll), priv->msg_view);
-#else
-#ifdef MODEST_USE_MOZEMBED
- priv->main_scroll = priv->msg_view;
- gtk_widget_set_size_request (priv->msg_view, -1, 1600);
-#else
- priv->main_scroll = gtk_scrolled_window_new (NULL, NULL);
- gtk_container_add (GTK_CONTAINER (priv->main_scroll), priv->msg_view);
-#endif
- gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (priv->main_scroll), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
- gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (priv->main_scroll), GTK_SHADOW_NONE);
- modest_maemo_set_thumbable_scrollbar (GTK_SCROLLED_WINDOW(priv->main_scroll), TRUE);
-
-#endif
gtk_box_pack_start (GTK_BOX(main_vbox), priv->main_scroll, TRUE, TRUE, 0);
gtk_container_add (GTK_CONTAINER(obj), main_vbox);
- priv->find_toolbar = hildon_find_toolbar_new (NULL);
- hildon_window_add_toolbar (HILDON_WINDOW (obj), GTK_TOOLBAR (priv->find_toolbar));
- gtk_widget_set_no_show_all (priv->find_toolbar, TRUE);
-
/* NULL-ize fields if the window is destroyed */
g_signal_connect (priv->msg_view, "destroy", G_CALLBACK (gtk_widget_destroyed), &(priv->msg_view));
call this function before */
modest_msg_view_window_disconnect_signals (MODEST_WINDOW (obj));
+ if (priv->other_body != NULL) {
+ g_object_unref (priv->other_body);
+ priv->other_body = NULL;
+ }
+
if (priv->header_model != NULL) {
g_object_unref (priv->header_model);
priv->header_model = NULL;
modest_window_set_active_account (MODEST_WINDOW(obj), modest_account_name);
modest_window_set_active_mailbox (MODEST_WINDOW(obj), mailbox);
- g_signal_connect (G_OBJECT (priv->find_toolbar), "close", G_CALLBACK (modest_msg_view_window_find_toolbar_close), obj);
- g_signal_connect (G_OBJECT (priv->find_toolbar), "search", G_CALLBACK (modest_msg_view_window_find_toolbar_search), obj);
- priv->last_search = NULL;
-
+ /* First add out toolbar ... */
modest_msg_view_window_show_toolbar (MODEST_WINDOW (obj), TRUE);
+ /* ... and later the find toolbar. This way find toolbar will
+ be shown over the other */
+ priv->find_toolbar = hildon_find_toolbar_new (NULL);
+ hildon_window_add_toolbar (HILDON_WINDOW (obj), GTK_TOOLBAR (priv->find_toolbar));
+ gtk_widget_set_no_show_all (priv->find_toolbar, TRUE);
+ g_signal_connect (G_OBJECT (priv->find_toolbar), "close",
+ G_CALLBACK (modest_msg_view_window_find_toolbar_close), obj);
+ g_signal_connect (G_OBJECT (priv->find_toolbar), "search",
+ G_CALLBACK (modest_msg_view_window_find_toolbar_search), obj);
+ priv->last_search = NULL;
+
/* Init the clipboard actions dim status */
modest_msg_view_grab_focus(MODEST_MSG_VIEW (priv->msg_view));
ModestMsgViewWindowPrivate *priv = NULL;
TnyFolder *header_folder = NULL;
ModestHeaderView *header_view = NULL;
- ModestWindow *main_window = NULL;
ModestWindowMgr *mgr = NULL;
MODEST_DEBUG_BLOCK (
priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (window);
- /* Remember the message list's TreeModel so we can detect changes
+ /* Remember the message list's TreeModel so we can detect changes
* and change the list selection when necessary: */
-
- main_window = modest_window_mgr_get_main_window(mgr, FALSE); /* don't create */
- if (main_window) {
- header_view = MODEST_HEADER_VIEW(modest_main_window_get_child_widget(
- MODEST_MAIN_WINDOW(main_window),
- MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW));
- }
-
- if (header_view != NULL){
- header_folder = modest_header_view_get_folder(header_view);
- /* This could happen if the header folder was
- unseleted before opening this msg window (for
- example if the user selects an account in the
- folder view of the main window */
- if (header_folder) {
- priv->is_outbox = (modest_tny_folder_guess_folder_type (header_folder) == TNY_FOLDER_TYPE_OUTBOX);
- priv->header_folder_id = tny_folder_get_id(header_folder);
- g_assert(priv->header_folder_id != NULL);
- g_object_unref(header_folder);
- }
+ header_folder = modest_header_view_get_folder (header_view);
+ if (header_folder) {
+ priv->is_outbox = (modest_tny_folder_guess_folder_type (header_folder) ==
+ TNY_FOLDER_TYPE_OUTBOX);
+ priv->header_folder_id = tny_folder_get_id (header_folder);
+ g_object_unref(header_folder);
}
/* Setup row references and connect signals */
tny_msg_view_set_msg (TNY_MSG_VIEW (priv->msg_view), msg);
update_window_title (MODEST_MSG_VIEW_WINDOW (window));
+ update_branding (MODEST_MSG_VIEW_WINDOW (window));
/* gtk_widget_show_all (GTK_WIDGET (window)); */
modest_msg_view_window_update_priority (window);
}
ModestWindow *
-modest_msg_view_window_new_from_header_view (ModestHeaderView *header_view,
- const gchar *modest_account_name,
+modest_msg_view_window_new_from_uid (const gchar *modest_account_name,
+ const gchar *mailbox,
+ const gchar *msg_uid)
+{
+ ModestMsgViewWindow *window = NULL;
+ ModestMsgViewWindowPrivate *priv = NULL;
+ ModestWindowMgr *mgr = NULL;
+ gboolean is_merge;
+ TnyAccount *account = NULL;
+
+ mgr = modest_runtime_get_window_mgr ();
+ window = MODEST_MSG_VIEW_WINDOW (modest_window_mgr_get_msg_view_window (mgr));
+ g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (window), NULL);
+
+ modest_msg_view_window_construct (window, modest_account_name, mailbox, msg_uid);
+
+ priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (window);
+
+
+
+ is_merge = g_str_has_prefix (msg_uid, "merge:");
+
+ /* Get the account */
+ if (!is_merge)
+ account = tny_account_store_find_account (TNY_ACCOUNT_STORE (modest_runtime_get_account_store ()),
+ msg_uid);
+
+
+ if (is_merge || account) {
+ TnyFolder *folder = NULL;
+
+ /* Try to get the message, if it's already downloaded
+ we don't need to connect */
+ if (account) {
+ folder = modest_tny_folder_store_find_folder_from_uri (TNY_FOLDER_STORE (account), msg_uid);
+ } else {
+ ModestTnyAccountStore *account_store;
+ ModestTnyLocalFoldersAccount *local_folders_account;
+
+ account_store = modest_runtime_get_account_store ();
+ local_folders_account = MODEST_TNY_LOCAL_FOLDERS_ACCOUNT (
+ modest_tny_account_store_get_local_folders_account (account_store));
+ folder = modest_tny_local_folders_account_get_merged_outbox (local_folders_account);
+ g_object_unref (local_folders_account);
+ }
+ if (folder) {
+ TnyDevice *device;
+ gboolean device_online;
+
+ device = modest_runtime_get_device();
+ device_online = tny_device_is_online (device);
+ if (device_online) {
+ message_reader (window, priv, NULL, msg_uid, folder, NULL);
+ } else {
+ TnyMsg *msg = tny_folder_find_msg (folder, msg_uid, NULL);
+ if (msg) {
+ tny_msg_view_set_msg (TNY_MSG_VIEW (priv->msg_view), msg);
+ update_window_title (MODEST_MSG_VIEW_WINDOW (window));
+ update_branding (MODEST_MSG_VIEW_WINDOW (window));
+ g_object_unref (msg);
+ } else {
+ message_reader (window, priv, NULL, msg_uid, folder, NULL);
+ }
+ }
+ g_object_unref (folder);
+ }
+
+ }
+
+ /* Check dimming rules */
+ modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (window));
+ modest_ui_actions_check_menu_dimming_rules (MODEST_WINDOW (window));
+ modest_window_check_dimming_rules_group (MODEST_WINDOW (window), MODEST_DIMMING_RULES_CLIPBOARD);
+
+ return MODEST_WINDOW(window);
+}
+
+ModestWindow *
+modest_msg_view_window_new_from_header_view (ModestHeaderView *header_view,
+ const gchar *modest_account_name,
const gchar *mailbox,
- const gchar *msg_uid,
- GtkTreeRowReference *row_reference)
+ const gchar *msg_uid,
+ GtkTreeRowReference *row_reference)
{
ModestMsgViewWindow *window = NULL;
ModestMsgViewWindowPrivate *priv = NULL;
example if the user selects an account in the
folder view of the main window */
if (header_folder) {
- priv->is_outbox = (modest_tny_folder_guess_folder_type (header_folder) == TNY_FOLDER_TYPE_OUTBOX);
+ priv->is_outbox = (modest_tny_folder_guess_folder_type (header_folder) ==
+ TNY_FOLDER_TYPE_OUTBOX);
priv->header_folder_id = tny_folder_get_id(header_folder);
- g_assert(priv->header_folder_id != NULL);
g_object_unref(header_folder);
}
}
if (header_view != NULL){
modest_header_view_add_observer(header_view,
- MODEST_HEADER_VIEW_OBSERVER(window));
+ MODEST_HEADER_VIEW_OBSERVER(window));
}
tny_msg_view_set_msg (TNY_MSG_VIEW (priv->msg_view), NULL);
+ update_branding (MODEST_MSG_VIEW_WINDOW (window));
path = gtk_tree_row_reference_get_path (row_reference);
if (gtk_tree_model_get_iter (priv->header_model, &iter, path)) {
gtk_tree_model_get (priv->header_model, &iter,
TNY_GTK_HEADER_LIST_MODEL_INSTANCE_COLUMN,
&header, -1);
- message_reader (window, priv, header, row_reference);
+ message_reader (window, priv, header, NULL, NULL, row_reference);
+ g_object_unref (header);
}
gtk_tree_path_free (path);
}
ModestWindow *
-modest_msg_view_window_new_for_search_result (TnyMsg *msg,
+modest_msg_view_window_new_for_search_result (TnyMsg *msg,
const gchar *modest_account_name,
const gchar *mailbox,
const gchar *msg_uid)
priv->is_search_result = TRUE;
tny_msg_view_set_msg (TNY_MSG_VIEW (priv->msg_view), msg);
+ update_branding (MODEST_MSG_VIEW_WINDOW (window));
update_window_title (window);
/* gtk_widget_show_all (GTK_WIDGET (window));*/
return MODEST_WINDOW(window);
}
+gboolean
+modest_msg_view_window_is_other_body (ModestMsgViewWindow *self)
+{
+ ModestMsgViewWindowPrivate *priv = NULL;
+
+ g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (self), FALSE);
+ priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (self);
+
+ return (priv->other_body != NULL);
+}
+
ModestWindow *
-modest_msg_view_window_new_for_attachment (TnyMsg *msg,
- const gchar *modest_account_name,
- const gchar *mailbox,
- const gchar *msg_uid)
+modest_msg_view_window_new_with_other_body (TnyMsg *msg,
+ TnyMimePart *other_body,
+ const gchar *modest_account_name,
+ const gchar *mailbox,
+ const gchar *msg_uid)
{
GObject *obj = NULL;
ModestMsgViewWindowPrivate *priv;
modest_msg_view_window_construct (MODEST_MSG_VIEW_WINDOW (obj),
modest_account_name, mailbox, msg_uid);
- tny_msg_view_set_msg (TNY_MSG_VIEW (priv->msg_view), msg);
+ if (other_body) {
+ priv->other_body = g_object_ref (other_body);
+ modest_msg_view_set_msg_with_other_body (MODEST_MSG_VIEW (priv->msg_view), msg, other_body);
+ } else {
+ tny_msg_view_set_msg (TNY_MSG_VIEW (priv->msg_view), msg);
+ }
update_window_title (MODEST_MSG_VIEW_WINDOW (obj));
+ update_branding (MODEST_MSG_VIEW_WINDOW (obj));
/* gtk_widget_show_all (GTK_WIDGET (obj)); */
return MODEST_WINDOW(obj);
}
+ModestWindow *
+modest_msg_view_window_new_for_attachment (TnyMsg *msg,
+ const gchar *modest_account_name,
+ const gchar *mailbox,
+ const gchar *msg_uid)
+{
+ return modest_msg_view_window_new_with_other_body (msg, NULL, modest_account_name, mailbox, msg_uid);
+}
+
static void
modest_msg_view_window_on_row_changed (GtkTreeModel *header_model,
GtkTreePath *arg1,
/* Setup row_reference for the actual msg. */
priv->row_reference = gtk_tree_row_reference_new (priv->header_model, tree_path);
if (priv->row_reference == NULL) {
- g_warning("No reference for msg header item.");
+ g_warning("%s: No reference for msg header item.", __FUNCTION__);
return;
}
typedef struct {
TnyHeader *header;
+ gchar *msg_uid;
+ TnyFolder *folder;
GtkTreeRowReference *row_reference;
} MsgReaderInfo;
}
/* Register the header - it'll be unregistered in the callback */
- modest_window_mgr_register_header (modest_runtime_get_window_mgr (), info->header, NULL);
+ if (info->header)
+ modest_window_mgr_register_header (modest_runtime_get_window_mgr (), info->header, NULL);
/* New mail operation */
mail_op = modest_mail_operation_new_with_error_handling (G_OBJECT(parent_window),
NULL, NULL);
modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op);
- modest_mail_operation_get_msg (mail_op, info->header, TRUE, view_msg_cb, info->row_reference);
+ if (info->header)
+ modest_mail_operation_get_msg (mail_op, info->header, TRUE, view_msg_cb, info->row_reference);
+ else
+ modest_mail_operation_find_msg (mail_op, info->folder, info->msg_uid, TRUE, view_msg_cb, NULL);
g_object_unref (mail_op);
/* Update dimming rules */
frees:
/* Frees. The row_reference will be freed by the view_msg_cb callback */
- g_object_unref (info->header);
+ g_free (info->msg_uid);
+ if (info->folder)
+ g_object_unref (info->folder);
+ if (info->header)
+ g_object_unref (info->header);
g_slice_free (MsgReaderInfo, info);
}
message_reader (ModestMsgViewWindow *window,
ModestMsgViewWindowPrivate *priv,
TnyHeader *header,
+ const gchar *msg_uid,
+ TnyFolder *folder,
GtkTreeRowReference *row_reference)
{
ModestWindowMgr *mgr;
TnyAccount *account;
- TnyFolder *folder;
MsgReaderInfo *info;
- g_return_val_if_fail (row_reference != NULL, FALSE);
+ /* We set the header from model while we're loading */
+ tny_header_view_set_header (TNY_HEADER_VIEW (priv->msg_view), header);
+ gtk_window_set_title (GTK_WINDOW (window), _CS("ckdg_pb_updating"));
+
+ if (folder)
+ g_object_ref (folder);
mgr = modest_runtime_get_window_mgr ();
/* Msg download completed */
- if (!(tny_header_get_flags (header) & TNY_HEADER_FLAG_CACHED)) {
-
- /* We set the header from model while we're loading */
- tny_header_view_set_header (TNY_HEADER_VIEW (priv->msg_view), header);
- gtk_window_set_title (GTK_WINDOW (window), _CS("ckdg_pb_updating"));
+ if (!header || !(tny_header_get_flags (header) & TNY_HEADER_FLAG_CACHED)) {
/* Ask the user if he wants to download the message if
we're not online */
return FALSE;
}
- folder = tny_header_get_folder (header);
+ if (header) {
+ folder = tny_header_get_folder (header);
+ }
info = g_slice_new (MsgReaderInfo);
- info->header = g_object_ref (header);
- info->row_reference = gtk_tree_row_reference_copy (row_reference);
+ info->msg_uid = g_strdup (msg_uid);
+ if (header)
+ info->header = g_object_ref (header);
+ else
+ info->header = NULL;
+ if (folder)
+ info->folder = g_object_ref (folder);
+ else
+ info->folder = NULL;
+ if (row_reference) {
+ info->row_reference = gtk_tree_row_reference_copy (row_reference);
+ } else {
+ info->row_reference = NULL;
+ }
/* Offer the connection dialog if necessary */
modest_platform_connect_if_remote_and_perform ((GtkWindow *) window,
return TRUE;
}
}
-
- folder = tny_header_get_folder (header);
+
+ if (header) {
+ folder = tny_header_get_folder (header);
+ }
account = tny_folder_get_account (folder);
info = g_slice_new (MsgReaderInfo);
- info->header = g_object_ref (header);
- info->row_reference = gtk_tree_row_reference_copy (row_reference);
-
+ info->msg_uid = g_strdup (msg_uid);
+ if (folder)
+ info->folder = g_object_ref (folder);
+ else
+ info->folder = NULL;
+ if (header)
+ info->header = g_object_ref (header);
+ else
+ info->header = NULL;
+ if (row_reference)
+ info->row_reference = gtk_tree_row_reference_copy (row_reference);
+ else
+ info->row_reference = NULL;
+
message_reader_performer (FALSE, NULL, (GtkWindow *) window, account, info);
g_object_unref (account);
g_object_unref (folder);
&header, -1);
/* Read the message & show it */
- if (!message_reader (window, priv, header, row_reference)) {
+ if (!message_reader (window, priv, header, NULL, NULL, row_reference)) {
retval = FALSE;
}
gtk_tree_row_reference_free (row_reference);
GtkTreeRowReference *row_reference;
row_reference = gtk_tree_row_reference_new (priv->header_model, path);
/* Read the message & show it */
- retval = message_reader (window, priv, header, row_reference);
+ retval = message_reader (window, priv, header, NULL, NULL, row_reference);
gtk_tree_row_reference_free (row_reference);
} else {
finished = FALSE;
row_reference = (GtkTreeRowReference *) user_data;
if (canceled) {
- gtk_tree_row_reference_free (row_reference);
+ if (row_reference)
+ gtk_tree_row_reference_free (row_reference);
self = (ModestMsgViewWindow *) modest_mail_operation_get_source (mail_op);
if (self) {
/* Restore window title */
/* If there was any error */
if (!modest_ui_actions_msg_retrieval_check (mail_op, header, msg)) {
- gtk_tree_row_reference_free (row_reference);
+ if (row_reference)
+ gtk_tree_row_reference_free (row_reference);
self = (ModestMsgViewWindow *) modest_mail_operation_get_source (mail_op);
if (self) {
/* Restore window title */
tny_msg_view_set_msg (TNY_MSG_VIEW (priv->msg_view), msg);
modest_msg_view_window_update_priority (self);
update_window_title (MODEST_MSG_VIEW_WINDOW (self));
+ update_branding (MODEST_MSG_VIEW_WINDOW (self));
modest_msg_view_grab_focus (MODEST_MSG_VIEW (priv->msg_view));
}
/* Frees */
g_object_unref (self);
- gtk_tree_row_reference_free (row_reference);
+ if (row_reference)
+ gtk_tree_row_reference_free (row_reference);
}
TnyFolderType
return selected_attachments;
}
+typedef struct {
+ ModestMsgViewWindow *self;
+ gchar *file_path;
+} DecodeAsyncHelper;
+
static void
on_decode_to_stream_async_handler (TnyMimePart *mime_part,
gboolean cancelled,
GError *err,
gpointer user_data)
{
- gchar *filepath = (gchar *) user_data;
+ DecodeAsyncHelper *helper = (DecodeAsyncHelper *) user_data;
+
+ /* It could happen that the window was closed */
+ if (GTK_WIDGET_VISIBLE (helper->self))
+ set_progress_hint (helper->self, FALSE);
if (cancelled || err) {
if (err) {
}
/* make the file read-only */
- g_chmod(filepath, 0444);
+ g_chmod(helper->file_path, 0444);
/* Activate the file */
- modest_platform_activate_file (filepath, tny_mime_part_get_content_type (mime_part));
+ modest_platform_activate_file (helper->file_path, tny_mime_part_get_content_type (mime_part));
free:
/* Frees */
- g_free (filepath);
+ g_object_unref (helper->self);
+ g_free (helper->file_path);
+ g_slice_free (DecodeAsyncHelper, helper);
}
void
attachments = modest_msg_view_get_attachments (MODEST_MSG_VIEW (priv->msg_view));
attachment_index = modest_list_index (attachments, (GObject *) mime_part);
g_object_unref (attachments);
-
+
if (msg_uid && attachment_index >= 0) {
attachment_uid = g_strdup_printf ("%s/%d", msg_uid, attachment_index);
}
if (tny_mime_part_is_purged (mime_part))
goto frees;
- if (!modest_tny_mime_part_is_msg (mime_part)) {
+ if (!modest_tny_mime_part_is_msg (mime_part) && tny_mime_part_get_filename (mime_part)) {
gchar *filepath = NULL;
const gchar *att_filename = tny_mime_part_get_filename (mime_part);
gboolean show_error_banner = FALSE;
&filepath);
if (temp_stream != NULL) {
- tny_mime_part_decode_to_stream_async (mime_part, TNY_STREAM (temp_stream),
- on_decode_to_stream_async_handler,
+ DecodeAsyncHelper *helper;
+
+ /* Activate progress hint */
+ set_progress_hint (window, TRUE);
+
+ helper = g_slice_new0 (DecodeAsyncHelper);
+ helper->self = g_object_ref (window);
+ helper->file_path = g_strdup (filepath);
+
+ tny_mime_part_decode_to_stream_async (mime_part, TNY_STREAM (temp_stream),
+ on_decode_to_stream_async_handler,
NULL,
- g_strdup (filepath));
+ helper);
g_object_unref (temp_stream);
/* NOTE: files in the temporary area will be automatically
* cleaned after some time if they are no longer in use */
g_free (filepath);
if (show_error_banner)
modest_platform_information_banner (NULL, NULL, _("mail_ib_file_operation_failed"));
+ } else if (!modest_tny_mime_part_is_msg (mime_part)) {
+ ModestWindowMgr *mgr;
+ ModestWindow *msg_win = NULL;
+ TnyMsg *current_msg;
+ gboolean found;
+ TnyHeader *header;
+
+ current_msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (window));
+ mgr = modest_runtime_get_window_mgr ();
+ header = tny_msg_get_header (TNY_MSG (current_msg));
+ found = modest_window_mgr_find_registered_message_uid (mgr,
+ attachment_uid,
+ &msg_win);
+
+ if (found) {
+ g_debug ("window for this body is already being created");
+ } else {
+
+ /* it's not found, so create a new window for it */
+ modest_window_mgr_register_header (mgr, header, attachment_uid); /* register the uid before building the window */
+ gchar *account = g_strdup (modest_window_get_active_account (MODEST_WINDOW (window)));
+ const gchar *mailbox = modest_window_get_active_mailbox (MODEST_WINDOW (window));
+ if (!account)
+ account = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr ());
+
+ msg_win = modest_msg_view_window_new_with_other_body (TNY_MSG (current_msg), TNY_MIME_PART (mime_part),
+ account, mailbox, attachment_uid);
+
+ modest_window_set_zoom (MODEST_WINDOW (msg_win),
+ modest_window_get_zoom (MODEST_WINDOW (window)));
+ if (modest_window_mgr_register_window (mgr, msg_win, MODEST_WINDOW (window)))
+ gtk_widget_show_all (GTK_WIDGET (msg_win));
+ else
+ gtk_widget_destroy (GTK_WIDGET (msg_win));
+ }
+ g_object_unref (current_msg);
} else {
/* message attachment */
TnyHeader *header = NULL;
if (found) {
/* if it's found, but there is no msg_win, it's probably in the process of being created;
* thus, we don't do anything */
- g_warning ("window for is already being created");
+ g_debug ("window for is already being created");
} else {
/* it's not found, so create a new window for it */
modest_window_mgr_register_header (mgr, header, attachment_uid); /* register the uid before building the window */
static void save_mime_part_info_free (SaveMimePartInfo *info, gboolean with_struct);
static gboolean idle_save_mime_part_show_result (SaveMimePartInfo *info);
static gpointer save_mime_part_to_file (SaveMimePartInfo *info);
-static void save_mime_parts_to_file_with_checks (SaveMimePartInfo *info);
+static void save_mime_parts_to_file_with_checks (GtkWindow *parent, SaveMimePartInfo *info);
static void
save_mime_part_info_free (SaveMimePartInfo *info, gboolean with_struct)
static gboolean
idle_save_mime_part_show_result (SaveMimePartInfo *info)
{
- if (info->pairs != NULL) {
- save_mime_part_to_file (info);
- } else {
- /* This is a GDK lock because we are an idle callback and
- * hildon_banner_show_information is or does Gtk+ code */
+ /* This is a GDK lock because we are an idle callback and
+ * hildon_banner_show_information is or does Gtk+ code */
- gdk_threads_enter (); /* CHECKED */
- save_mime_part_info_free (info, TRUE);
- if (info->result == GNOME_VFS_OK) {
- hildon_banner_show_information (NULL, NULL, _CS("sfil_ib_saved"));
- } else if (info->result == GNOME_VFS_ERROR_NO_SPACE) {
- gchar *msg = g_strdup_printf (_KR("cerm_device_memory_full"), "");
- modest_platform_information_banner (NULL, NULL, msg);
- g_free (msg);
- } else {
- hildon_banner_show_information (NULL, NULL, _("mail_ib_file_operation_failed"));
- }
- gdk_threads_leave (); /* CHECKED */
+ gdk_threads_enter (); /* CHECKED */
+ if (info->result == GNOME_VFS_OK) {
+ hildon_banner_show_information (NULL, NULL, _CS("sfil_ib_saved"));
+ } else if (info->result == GNOME_VFS_ERROR_NO_SPACE) {
+ gchar *msg = g_strdup_printf (_KR("cerm_device_memory_full"), "");
+ modest_platform_information_banner (NULL, NULL, msg);
+ g_free (msg);
+ } else {
+ hildon_banner_show_information (NULL, NULL, _("mail_ib_file_operation_failed"));
}
+ save_mime_part_info_free (info, FALSE);
+ gdk_threads_leave (); /* CHECKED */
return FALSE;
}
}
}
g_object_unref (G_OBJECT (stream));
- g_object_unref (pair->part);
- g_slice_free (SaveMimePartPair, pair);
- info->pairs = g_list_delete_link (info->pairs, info->pairs);
} else {
- g_warning ("modest: could not create save attachment %s: %s\n", pair->filename, gnome_vfs_result_to_string (info->result));
- save_mime_part_info_free (info, FALSE);
+ g_warning ("Could not create save attachment %s: %s\n",
+ pair->filename, gnome_vfs_result_to_string (info->result));
+ }
+
+ /* Go on saving remaining files */
+ info->pairs = g_list_remove_link (info->pairs, info->pairs);
+ if (info->pairs != NULL) {
+ save_mime_part_to_file (info);
+ } else {
+ g_idle_add ((GSourceFunc) idle_save_mime_part_show_result, info);
}
- g_idle_add ((GSourceFunc) idle_save_mime_part_show_result, info);
return NULL;
}
static void
-save_mime_parts_to_file_with_checks (SaveMimePartInfo *info)
+save_mime_parts_to_file_with_checks (GtkWindow *parent,
+ SaveMimePartInfo *info)
{
gboolean is_ok = TRUE;
gint replaced_files = 0;
const GList *files = info->pairs;
- const GList *iter;
+ const GList *iter, *to_replace = NULL;
for (iter = files; (iter != NULL) && (replaced_files < 2); iter = g_list_next(iter)) {
SaveMimePartPair *pair = iter->data;
if (modest_utils_file_exists (pair->filename)) {
replaced_files++;
+ if (replaced_files == 1)
+ to_replace = iter;
}
}
if (replaced_files) {
- GtkWidget *confirm_overwrite_dialog;
- const gchar *message = (replaced_files == 1) ?
- _FM("docm_nc_replace_file") : _FM("docm_nc_replace_multiple");
- confirm_overwrite_dialog = hildon_note_new_confirmation (NULL, message);
- if (gtk_dialog_run (GTK_DIALOG (confirm_overwrite_dialog)) != GTK_RESPONSE_OK) {
- is_ok = FALSE;
+ gint response;
+
+ if (replaced_files == 1) {
+ SaveMimePartPair *pair = to_replace->data;
+ const gchar *basename = strrchr (pair->filename, G_DIR_SEPARATOR) + 1;
+ gchar *escaped_basename, *message;
+
+ escaped_basename = g_uri_unescape_string (basename, NULL);
+ message = g_strdup_printf ("%s\n%s",
+ _FM("docm_nc_replace_file"),
+ (escaped_basename) ? escaped_basename : "");
+ response = modest_platform_run_confirmation_dialog (parent, message);
+ g_free (message);
+ g_free (escaped_basename);
+ } else {
+ response = modest_platform_run_confirmation_dialog (parent,
+ _FM("docm_nc_replace_multiple"));
}
- gtk_widget_destroy (confirm_overwrite_dialog);
+ if (response != GTK_RESPONSE_OK)
+ is_ok = FALSE;
}
if (!is_ok) {
SaveMimePartInfo *info = g_slice_new0 (SaveMimePartInfo);
info->pairs = files_to_save;
info->result = TRUE;
- save_mime_parts_to_file_with_checks (info);
+ save_mime_parts_to_file_with_checks ((GtkWindow *) dialog, info);
}
end:
filename = g_strdup (tny_mime_part_get_filename (mime_part));
} else {
/* TODO: show any error? */
- g_warning ("Tried to save a non-file attachment");
+ g_warning ("%s: Tried to save a non-file attachment", __FUNCTION__);
g_object_unref (mime_parts);
return;
}
g_object_unref (mime_part);
} else {
- save_multiple_str = g_strdup_printf (_FM("sfil_va_number_of_objects_attachments"),
- tny_list_get_length (mime_parts));
+ gint num = tny_list_get_length (mime_parts);
+ save_multiple_str = g_strdup_printf (dngettext("hildon-fm",
+ "sfil_va_number_of_objects_attachment",
+ "sfil_va_number_of_objects_attachments",
+ num), num);
}
save_dialog = hildon_file_chooser_dialog_new (GTK_WINDOW (window),
modest_msg_view_window_remove_attachments (ModestMsgViewWindow *window, gboolean get_all)
{
ModestMsgViewWindowPrivate *priv;
- TnyList *mime_parts = NULL;
+ TnyList *mime_parts = NULL, *tmp;
gchar *confirmation_message;
gint response;
gint n_attachments;
* because we don't have selection
*/
mime_parts = modest_msg_view_get_attachments (MODEST_MSG_VIEW (priv->msg_view));
-
- /* Remove already purged messages from mime parts list */
- iter = tny_list_create_iterator (mime_parts);
+
+ /* Remove already purged messages from mime parts list. We use
+ a copy of the list to remove items in the original one */
+ tmp = tny_list_copy (mime_parts);
+ iter = tny_list_create_iterator (tmp);
while (!tny_iterator_is_done (iter)) {
TnyMimePart *part = TNY_MIME_PART (tny_iterator_get_current (iter));
- tny_iterator_next (iter);
- if (tny_mime_part_is_purged (part)) {
+ if (tny_mime_part_is_purged (part))
tny_list_remove (mime_parts, (GObject *) part);
- }
+
g_object_unref (part);
+ tny_iterator_next (iter);
}
+ g_object_unref (tmp);
g_object_unref (iter);
if (!modest_maemo_utils_select_attachments (GTK_WINDOW (window), mime_parts, TRUE) ||
}
priv->purge_timeout = g_timeout_add (2000, show_remove_attachment_information, window);
-
+
iter = tny_list_create_iterator (mime_parts);
while (!tny_iterator_is_done (iter)) {
TnyMimePart *part;
tny_msg_rewrite_cache (msg);
tny_msg_view_set_msg (TNY_MSG_VIEW (priv->msg_view), msg);
g_object_unref (msg);
+ update_branding (MODEST_MSG_VIEW_WINDOW (window));
g_object_unref (mime_parts);
g_object_unref (priv->remove_attachment_banner);
priv->remove_attachment_banner = NULL;
}
-
-
}
msg = tny_msg_view_get_msg (TNY_MSG_VIEW (priv->msg_view));
- if (msg != NULL) {
+ if (priv->other_body) {
+ gchar *description;
+
+ description = modest_tny_mime_part_get_header_value (priv->other_body, "Content-Description");
+ if (description) {
+ g_strstrip (description);
+ subject = description;
+ }
+ } else if (msg != NULL) {
header = tny_msg_get_header (msg);
subject = tny_header_dup_subject (header);
g_object_unref (header);
gchar *cache_id;
TnyStream *output_stream;
GtkWidget *msg_view;
+ GtkWidget *window;
} FetchImageData;
gboolean
{
FetchImageData *fidata = (FetchImageData *) userdata;
- g_message ("REFRESH VIEW");
gdk_threads_enter ();
if (GTK_WIDGET_DRAWABLE (fidata->msg_view)) {
- g_message ("QUEUING DRAW");
+ ModestMsgViewWindowPrivate *priv;
+
+ priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (fidata->window);
+ priv->fetching_images--;
gtk_widget_queue_draw (fidata->msg_view);
+ update_progress_hint (MODEST_MSG_VIEW_WINDOW (fidata->window));
}
gdk_threads_leave ();
g_object_unref (fidata->msg_view);
+ g_object_unref (fidata->window);
g_slice_free (FetchImageData, fidata);
return FALSE;
}
fidata = g_slice_new0 (FetchImageData);
fidata->msg_view = g_object_ref (msgview);
+ fidata->window = g_object_ref (window);
fidata->uri = g_strdup (uri);
fidata->cache_id = modest_images_cache_get_id (current_account, uri);
fidata->output_stream = g_object_ref (stream);
+ priv->fetching_images++;
if (g_thread_create (on_fetch_image_thread, fidata, FALSE, NULL) == NULL) {
g_object_unref (fidata->output_stream);
g_free (fidata->cache_id);
g_object_unref (fidata->msg_view);
g_slice_free (FetchImageData, fidata);
tny_stream_close (stream);
+ priv->fetching_images--;
+ update_progress_hint (window);
return FALSE;
}
+ update_progress_hint (window);
return TRUE;
}
modest_hildon2_window_add_to_menu (MODEST_HILDON2_WINDOW (self), _("mcen_me_viewer_addtocontacts"), NULL,
APP_MENU_CALLBACK (modest_ui_actions_add_to_contacts),
MODEST_DIMMING_CALLBACK (modest_ui_dimming_rules_on_add_to_contacts));
+
+ modest_hildon2_window_add_to_menu (MODEST_HILDON2_WINDOW (self), _("mail_bd_external_images"), NULL,
+ APP_MENU_CALLBACK (modest_ui_actions_on_fetch_images),
+ MODEST_DIMMING_CALLBACK (modest_ui_dimming_rules_on_fetch_images));
+ modest_hildon2_window_add_to_menu (MODEST_HILDON2_WINDOW (self), _("mcen_ti_message_properties"), NULL,
+ APP_MENU_CALLBACK (modest_ui_actions_on_details),
+ MODEST_DIMMING_CALLBACK (modest_ui_dimming_rules_on_details));
}
void
gpointer userdata)
{
ModestMsgViewWindow *self = (ModestMsgViewWindow *) userdata;
- ModestMsgViewWindowPrivate *priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (self);
- if (priv->progress_hint) {
- hildon_gtk_window_set_progress_indicator (GTK_WINDOW (self), TRUE);
- }
+ update_progress_hint (self);
return FALSE;
}
+
+void
+modest_msg_view_window_fetch_images (ModestMsgViewWindow *self)
+{
+ ModestMsgViewWindowPrivate *priv;
+ priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (self);
+
+ modest_msg_view_request_fetch_images (MODEST_MSG_VIEW (priv->msg_view));
+}
+
+gboolean
+modest_msg_view_window_has_blocked_external_images (ModestMsgViewWindow *self)
+{
+ ModestMsgViewWindowPrivate *priv;
+ priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (self);
+
+ g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (self), FALSE);
+
+ return modest_msg_view_has_blocked_external_images (MODEST_MSG_VIEW (priv->msg_view));
+}
+
+void
+modest_msg_view_window_reload (ModestMsgViewWindow *self)
+{
+ ModestMsgViewWindowPrivate *priv;
+ TnyHeader *header;
+
+ g_return_if_fail (MODEST_IS_MSG_VIEW_WINDOW (self));
+
+ priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (self);
+ header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW (self));
+
+ if (!message_reader (self, priv, header, NULL, NULL, priv->row_reference)) {
+ g_warning ("Shouldn't happen, trying to reload a message failed");
+ }
+
+ g_object_unref (header);
+}
+
+static void
+update_branding (ModestMsgViewWindow *self)
+{
+ const gchar *account;
+ const gchar *mailbox;
+ ModestAccountMgr *mgr;
+ ModestProtocol *protocol = NULL;
+ gchar *service_name = NULL;
+ const GdkPixbuf *service_icon = NULL;
+ ModestMsgViewWindowPrivate *priv;
+
+ priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (self);
+
+ account = modest_window_get_active_account (MODEST_WINDOW (self));
+ mailbox = modest_window_get_active_mailbox (MODEST_WINDOW (self));
+
+ mgr = modest_runtime_get_account_mgr ();
+
+ if (modest_account_mgr_account_is_multimailbox (mgr, account, &protocol)) {
+ if (MODEST_IS_ACCOUNT_PROTOCOL (protocol)) {
+ service_name = modest_account_protocol_get_service_name (MODEST_ACCOUNT_PROTOCOL (protocol),
+ account, mailbox);
+ service_icon = modest_account_protocol_get_service_icon (MODEST_ACCOUNT_PROTOCOL (protocol),
+ account, mailbox, MODEST_ICON_SIZE_SMALL);
+ }
+ }
+
+ modest_msg_view_set_branding (MODEST_MSG_VIEW (priv->msg_view), service_name, service_icon);
+ g_free (service_name);
+}