#include "maemo/modest-hildon-includes.h"
#include "maemo/modest-connection-specific-smtp-window.h"
#endif /* !MODEST_TOOLKIT_GTK */
-#include <modest-utils.h>
+#include <modest-utils.h>
#include "widgets/modest-ui-constants.h"
#include <widgets/modest-main-window.h>
#include <widgets/modest-msg-view-window.h>
#include <tny-msg-view.h>
#include <tny-device.h>
#include <tny-merge-folder.h>
+#include <tny-camel-bs-msg.h>
+#include <tny-camel-bs-mime-part.h>
+#include <gtk/gtk.h>
#include <gtkhtml/gtkhtml.h>
#define MODEST_MOVE_TO_DIALOG_FOLDER_VIEW "move-to-dialog-folder-view"
gchar *mailbox;
GtkWidget *parent_window;
TnyHeader *header;
+ TnyList *parts;
} ReplyForwardHelper;
typedef struct _MoveToHelper {
ModestWindowMgr *mgr = NULL;
#ifdef MODEST_PLATFORM_MAEMO
- modest_osso_save_state();
+ modest_window_mgr_save_state_for_all_windows (modest_runtime_get_window_mgr ());
#endif /* MODEST_PLATFORM_MAEMO */
g_debug ("closing down, clearing %d item(s) from operation queue",
void
modest_ui_actions_add_to_contacts (GtkAction *action, ModestWindow *win)
{
- g_return_if_fail (MODEST_IS_MSG_VIEW_WINDOW (win));
-
- modest_msg_view_window_add_to_contacts (MODEST_MSG_VIEW_WINDOW (win));
+ if (MODEST_IS_MSG_VIEW_WINDOW (win))
+ modest_msg_view_window_add_to_contacts (MODEST_MSG_VIEW_WINDOW (win));
+ else if (MODEST_IS_MSG_EDIT_WINDOW (win))
+ modest_msg_edit_window_add_to_contacts (MODEST_MSG_EDIT_WINDOW (win));
}
void
MODEST_TEXT_UTILS_SIGNATURE_MARKER,
"\n", signature, NULL) : g_strdup(body_str);
} else {
- body = use_signature ? g_strconcat("\n", MODEST_TEXT_UTILS_SIGNATURE_MARKER,
- "\n", signature, NULL) : g_strdup("");
+
+ gchar *gray_color_markup = NULL, *color_begin = NULL, *color_end = NULL;
+ GdkColor color;
+
+ if (win && gtk_style_lookup_color (gtk_widget_get_style ((GtkWidget *) win),
+ "SecondaryTextColor", &color))
+ gray_color_markup = modest_text_utils_get_color_string (&color);
+ if (!gray_color_markup)
+ gray_color_markup = g_strdup ("#babababababa");
+
+ color_begin = g_strdup_printf ("<font color=\"%s\">", gray_color_markup);
+ color_end = "</font>";
+
+ body = use_signature ? g_strconcat("<br/>\n", color_begin,
+ MODEST_TEXT_UTILS_SIGNATURE_MARKER, "<br/>\n",
+ signature, color_end, NULL) : g_strdup("");
+
+ g_free (gray_color_markup);
+ g_free (color_begin);
}
- msg = modest_tny_msg_new (to_str, from_str, cc_str, bcc_str, subject_str, NULL, NULL, body, NULL, NULL, NULL);
+ msg = modest_tny_msg_new_html_plain (to_str, from_str, cc_str, bcc_str, subject_str,
+ NULL, NULL, body, NULL, NULL, NULL, NULL, NULL);
if (!msg) {
g_printerr ("modest: failed to create new msg\n");
goto cleanup;
if (protocol) {
if (tny_account_get_connection_status (account) ==
TNY_CONNECTION_STATUS_CONNECTED) {
- format = modest_protocol_get_translation (protocol,
- MODEST_PROTOCOL_TRANSLATION_MSG_NOT_AVAILABLE,
- subject);
+ if (header) {
+ format = modest_protocol_get_translation (protocol,
+ MODEST_PROTOCOL_TRANSLATION_MSG_NOT_AVAILABLE,
+ subject);
+ } else {
+ format = modest_protocol_get_translation (protocol,
+ MODEST_PROTOCOL_TRANSLATION_MSG_NOT_AVAILABLE_LOST_HEADER);
+ }
} else {
format = g_strdup_printf (_("mail_ib_backend_server_invalid"),
tny_account_get_hostname (account));
g_object_unref (account);
}
- if (!format)
- format = g_strdup (_("emev_ni_ui_imap_message_not_available_in_server"));
+ if (!format) {
+ if (header) {
+ format = g_strdup (_("emev_ni_ui_imap_message_not_available_in_server"));
+ } else {
+ format = g_strdup (_("emev_ni_ui_pop3_msg_recv_error"));
+ }
+ }
msg = g_strdup_printf (format, subject);
modest_platform_run_information_dialog (NULL, msg, FALSE);
create_reply_forward_helper (ReplyForwardAction action,
ModestWindow *win,
guint reply_forward_type,
- TnyHeader *header)
+ TnyHeader *header,
+ TnyList *parts)
{
ReplyForwardHelper *rf_helper = NULL;
const gchar *active_acc = modest_window_get_active_account (win);
g_strdup (active_acc) :
modest_account_mgr_get_default_account (modest_runtime_get_account_mgr());
rf_helper->mailbox = g_strdup (active_mailbox);
+ if (parts)
+ rf_helper->parts = g_object_ref (parts);
+ else
+ rf_helper->parts = NULL;
/* Note that window could be destroyed just AFTER calling
register_window so we must ensure that this pointer does
g_free (helper->mailbox);
if (helper->header)
g_object_unref (helper->header);
+ if (helper->parts)
+ g_object_unref (helper->parts);
if (helper->parent_window)
g_object_weak_unref (G_OBJECT (helper->parent_window),
rf_helper_window_closed, helper);
modest_ui_actions_disk_operations_error_handler,
NULL, NULL);
modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op);
- modest_mail_operation_get_msg (mail_op, rf_helper->header, TRUE, reply_forward_cb, rf_helper);
+ modest_mail_operation_get_msg_and_parts (mail_op, rf_helper->header, rf_helper->parts, TRUE, reply_forward_cb, rf_helper);
/* Frees */
g_object_unref(mail_op);
}
+static gboolean
+all_parts_retrieved (TnyMimePart *part)
+{
+ if (!TNY_IS_CAMEL_BS_MIME_PART (part)) {
+ return TRUE;
+ } else {
+ TnyList *pending_parts;
+ TnyIterator *iterator;
+ gboolean all_retrieved = TRUE;
+
+ pending_parts = TNY_LIST (tny_simple_list_new ());
+ tny_mime_part_get_parts (part, pending_parts);
+ iterator = tny_list_create_iterator (pending_parts);
+ while (all_retrieved && !tny_iterator_is_done (iterator)) {
+ TnyMimePart *child;
+
+ child = TNY_MIME_PART (tny_iterator_get_current (iterator));
+
+ if (tny_camel_bs_mime_part_is_fetched (TNY_CAMEL_BS_MIME_PART (child))) {
+ all_retrieved = all_parts_retrieved (TNY_MIME_PART (child));
+ } else {
+ all_retrieved = FALSE;
+ }
+
+ g_object_unref (child);
+ tny_iterator_next (iterator);
+ }
+ g_object_unref (iterator);
+ g_object_unref (pending_parts);
+ return all_retrieved;
+ }
+}
+
+static void
+forward_pending_parts_helper (TnyMimePart *part, TnyList *list)
+{
+ TnyList *parts;
+ TnyIterator *iterator;
+
+ if (!tny_camel_bs_mime_part_is_fetched (TNY_CAMEL_BS_MIME_PART (part))) {
+ tny_list_append (list, G_OBJECT (part));
+ }
+ parts = TNY_LIST (tny_simple_list_new ());
+ tny_mime_part_get_parts (part, parts);
+ for (iterator = tny_list_create_iterator (parts);
+ !tny_iterator_is_done (iterator);
+ tny_iterator_next (iterator)) {
+ TnyMimePart *child;
+
+ child = TNY_MIME_PART (tny_iterator_get_current (iterator));
+ forward_pending_parts_helper (child, list);
+ g_object_unref (child);
+ }
+ g_object_unref (iterator);
+ g_object_unref (parts);
+}
+
+static TnyList *
+forward_pending_parts (TnyMsg *msg)
+{
+ TnyList *result = TNY_LIST (tny_simple_list_new ());
+ if (TNY_IS_CAMEL_BS_MIME_PART (msg)) {
+ forward_pending_parts_helper (TNY_MIME_PART (msg), result);
+ }
+
+ return result;
+}
+
/*
* Common code for the reply and forward actions
*/
msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW(win));
header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW (win));
- if (msg && header) {
+ if (msg && header && (action != ACTION_FORWARD || all_parts_retrieved (TNY_MIME_PART (msg)))) {
/* Create helper */
rf_helper = create_reply_forward_helper (action, win,
- reply_forward_type, header);
+ reply_forward_type, header, NULL);
reply_forward_cb (NULL, header, FALSE, msg, NULL, rf_helper);
} else {
- g_warning("%s: no message or header found in viewer\n", __FUNCTION__);
+ gboolean do_download = TRUE;
+
+ if (msg && header && action == ACTION_FORWARD) {
+ /* Not all parts retrieved. Then we have to retrieve them all before
+ * creating the forward message */
+ if (!tny_device_is_online (modest_runtime_get_device ())) {
+ gint response;
+
+ /* If ask for user permission to download the messages */
+ response = modest_platform_run_confirmation_dialog (GTK_WINDOW (win),
+ ngettext("mcen_nc_get_msg",
+ "mcen_nc_get_msgs",
+ 1));
+
+ /* End if the user does not want to continue */
+ if (response == GTK_RESPONSE_CANCEL)
+ do_download = FALSE;
+ }
+
+ if (do_download) {
+ TnyList *pending_parts;
+ TnyFolder *folder;
+ TnyAccount *account;
+
+ /* Create helper */
+ pending_parts = forward_pending_parts (msg);
+ rf_helper = create_reply_forward_helper (action, win,
+ reply_forward_type, header, pending_parts);
+ g_object_unref (pending_parts);
+
+ folder = tny_header_get_folder (header);
+ account = tny_folder_get_account (folder);
+ modest_platform_connect_and_perform (GTK_WINDOW (win),
+ TRUE, account,
+ reply_forward_performer,
+ rf_helper);
+ g_object_unref (folder);
+ g_object_unref (account);
+ }
+
+ } else {
+ g_warning("%s: no message or header found in viewer\n", __FUNCTION__);
+ }
}
if (msg)
if (download) {
/* Create helper */
rf_helper = create_reply_forward_helper (action, win,
- reply_forward_type, header);
+ reply_forward_type, header, NULL);
if (uncached_msgs > 0) {
modest_platform_connect_and_perform (GTK_WINDOW (win),
TRUE, account,
header_view = modest_header_window_get_header_view ((ModestHeaderWindow *) source);
#else
if (MODEST_IS_MAIN_WINDOW (source))
- header_view = modest_main_window_get_child_widget ((ModestMainWindow *) source,
- MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW);
+ header_view = MODEST_HEADER_VIEW (modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (source),
+ MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW));
#endif
if (header_view) {
TnyFolder *folder = modest_header_view_get_folder (header_view);
modest_ui_actions_on_send (GtkWidget *widget, ModestMsgEditWindow *edit_window)
{
TnyTransportAccount *transport_account = NULL;
- gboolean had_error = FALSE;
+ gboolean had_error = FALSE, add_to_contacts;
MsgData *data;
ModestAccountMgr *account_mgr;
gchar *account_name;
g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW(edit_window), TRUE);
- if (!modest_msg_edit_window_check_names (edit_window, TRUE))
+ /* Check whether to automatically add new contacts to addressbook or not */
+ add_to_contacts = modest_conf_get_bool (modest_runtime_get_conf (),
+ MODEST_CONF_AUTO_ADD_TO_CONTACTS, NULL);
+ if (!modest_msg_edit_window_check_names (edit_window, add_to_contacts))
return TRUE;
data = modest_msg_edit_window_get_msg_data (edit_window);
if (MODEST_IS_MSG_VIEW_WINDOW (window)) {
async_retrieval = TRUE;
msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (window));
+ async_retrieval = !TNY_IS_CAMEL_BS_MSG (msg);
} else {
async_retrieval = FALSE;
}
removed = modest_account_mgr_remove_account (account_mgr, account_name);
if (removed) {
+#ifdef MODEST_TOOLKIT_HILDON2
+ hildon_gtk_window_take_screenshot (parent_window, FALSE);
+#endif
/* Close all email notifications, we cannot
distinguish if the notification belongs to
this account or not, so for safety reasons