X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fhildon2%2Fmodest-msg-view-window.c;h=41c6270d86f9239c49200aab4bbec41ad8c29393;hp=025b68f65e3a685ac0af28282f83d7f0653baabf;hb=be0ca7f2e3995569e4553ab4d979325680e73050;hpb=cc7f0117682ebf3e45c13fa1355eca3251fd3b80 diff --git a/src/hildon2/modest-msg-view-window.c b/src/hildon2/modest-msg-view-window.c index 025b68f..41c6270 100644 --- a/src/hildon2/modest-msg-view-window.c +++ b/src/hildon2/modest-msg-view-window.c @@ -226,6 +226,7 @@ static gboolean _modest_msg_view_window_map_event (GtkWidget *widget, GdkEvent *event, gpointer userdata); + /* list my signals */ enum { MSG_CHANGED_SIGNAL, @@ -725,6 +726,7 @@ select_next_valid_row (GtkTreeModel *model, static void modest_msg_view_window_construct (ModestMsgViewWindow *self, const gchar *modest_account_name, + const gchar *mailbox, const gchar *msg_uid) { GObject *obj = NULL; @@ -808,6 +810,7 @@ modest_msg_view_window_construct (ModestMsgViewWindow *self, obj); 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); @@ -827,6 +830,7 @@ modest_msg_view_window_construct (ModestMsgViewWindow *self, ModestWindow * modest_msg_view_window_new_with_header_model (TnyMsg *msg, const gchar *modest_account_name, + const gchar *mailbox, const gchar *msg_uid, GtkTreeModel *model, GtkTreeRowReference *row_reference) @@ -846,7 +850,7 @@ modest_msg_view_window_new_with_header_model (TnyMsg *msg, 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, msg_uid); + modest_msg_view_window_construct (window, modest_account_name, mailbox, msg_uid); priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (window); @@ -925,6 +929,7 @@ modest_msg_view_window_new_with_header_model (TnyMsg *msg, 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) { @@ -939,7 +944,7 @@ modest_msg_view_window_new_from_header_view (ModestHeaderView *header_view, 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, msg_uid); + modest_msg_view_window_construct (window, modest_account_name, mailbox, msg_uid); priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (window); @@ -1019,6 +1024,7 @@ modest_msg_view_window_new_from_header_view (ModestHeaderView *header_view, ModestWindow * modest_msg_view_window_new_for_search_result (TnyMsg *msg, const gchar *modest_account_name, + const gchar *mailbox, const gchar *msg_uid) { ModestMsgViewWindow *window = NULL; @@ -1028,7 +1034,7 @@ modest_msg_view_window_new_for_search_result (TnyMsg *msg, 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, msg_uid); + modest_msg_view_window_construct (window, modest_account_name, mailbox, msg_uid); priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (window); @@ -1052,8 +1058,9 @@ modest_msg_view_window_new_for_search_result (TnyMsg *msg, ModestWindow * modest_msg_view_window_new_for_attachment (TnyMsg *msg, - const gchar *modest_account_name, - const gchar *msg_uid) + const gchar *modest_account_name, + const gchar *mailbox, + const gchar *msg_uid) { GObject *obj = NULL; ModestMsgViewWindowPrivate *priv; @@ -1064,7 +1071,7 @@ modest_msg_view_window_new_for_attachment (TnyMsg *msg, obj = G_OBJECT (modest_window_mgr_get_msg_view_window (mgr)); priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (obj); modest_msg_view_window_construct (MODEST_MSG_VIEW_WINDOW (obj), - modest_account_name, msg_uid); + modest_account_name, mailbox, msg_uid); tny_msg_view_set_msg (TNY_MSG_VIEW (priv->msg_view), msg); update_window_title (MODEST_MSG_VIEW_WINDOW (obj)); @@ -2197,7 +2204,6 @@ modest_msg_view_window_show_toolbar (ModestWindow *self, { ModestMsgViewWindowPrivate *priv = NULL; ModestWindowPrivate *parent_priv; - GtkWidget *reply_button = NULL, *menu = NULL; parent_priv = MODEST_WINDOW_GET_PRIVATE(self); priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE(self); @@ -2219,13 +2225,6 @@ modest_msg_view_window_show_toolbar (ModestWindow *self, hildon_window_add_toolbar (HILDON_WINDOW (self), GTK_TOOLBAR (parent_priv->toolbar)); - /* Set reply button tap and hold menu */ - reply_button = gtk_ui_manager_get_widget (parent_priv->ui_manager, - "/ToolBar/ToolbarMessageReply"); - menu = gtk_ui_manager_get_widget (parent_priv->ui_manager, - "/ToolbarReplyCSM"); - if (menu && reply_button) - gtk_widget_tap_and_hold_setup (GTK_WIDGET (reply_button), menu, NULL, 0); } if (show_toolbar) { @@ -2434,8 +2433,10 @@ on_decode_to_stream_async_handler (TnyMimePart *mime_part, gchar *filepath = (gchar *) user_data; if (cancelled || err) { - modest_platform_information_banner (NULL, NULL, - _("mail_ib_file_operation_failed")); + if (err) { + modest_platform_information_banner (NULL, NULL, + _KR("cerm_device_memory_full")); + } goto free; } @@ -2487,18 +2488,17 @@ modest_msg_view_window_view_attachment (ModestMsgViewWindow *window, mime_part = (TnyMimePart *) tny_iterator_get_current (iter); g_object_unref (iter); } - g_object_unref (selected_attachments); + if (selected_attachments) + g_object_unref (selected_attachments); if (error) - return; + goto frees; } else { g_object_ref (mime_part); } - if (tny_mime_part_is_purged (mime_part)) { - g_object_unref (mime_part); - return; - } + if (tny_mime_part_is_purged (mime_part)) + goto frees; if (!modest_tny_mime_part_is_msg (mime_part)) { gchar *filepath = NULL; @@ -2551,16 +2551,25 @@ modest_msg_view_window_view_attachment (ModestMsgViewWindow *window, /* 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_for_attachment (TNY_MSG (mime_part), account, attachment_uid); + msg_win = modest_msg_view_window_new_for_attachment (TNY_MSG (mime_part), account, + mailbox, attachment_uid); modest_window_set_zoom (MODEST_WINDOW (msg_win), modest_window_get_zoom (MODEST_WINDOW (window))); - modest_window_mgr_register_window (mgr, msg_win, MODEST_WINDOW (window)); - gtk_widget_show_all (GTK_WIDGET (msg_win)); + 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 (mime_part); + + frees: + if (attachment_uid) + g_free (attachment_uid); + if (mime_part) + g_object_unref (mime_part); } typedef struct @@ -2580,11 +2589,11 @@ 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 +static void save_mime_part_info_free (SaveMimePartInfo *info, gboolean with_struct) { - GList *node; + for (node = info->pairs; node != NULL; node = g_list_next (node)) { SaveMimePartPair *pair = (SaveMimePartPair *) node->data; g_free (pair->filename); @@ -2638,7 +2647,7 @@ save_mime_part_to_file (SaveMimePartInfo *info) g_warning ("modest: could not save attachment %s: %d (%s)\n", pair->filename, error?error->code:-1, error?error->message:"Unknown error"); if ((error->domain == TNY_ERROR_DOMAIN) && - (error->code = TNY_IO_ERROR_WRITE) && + (error->code == TNY_IO_ERROR_WRITE) && (errno == ENOSPC)) { info->result = GNOME_VFS_ERROR_NO_SPACE; } else { @@ -2699,6 +2708,7 @@ save_attachments_response (GtkDialog *dialog, TnyList *mime_parts; gchar *chooser_uri; GList *files_to_save = NULL; + gchar *current_folder; mime_parts = TNY_LIST (user_data); @@ -2706,6 +2716,17 @@ save_attachments_response (GtkDialog *dialog, goto end; chooser_uri = gtk_file_chooser_get_uri (GTK_FILE_CHOOSER (dialog)); + current_folder = gtk_file_chooser_get_current_folder_uri (GTK_FILE_CHOOSER (dialog)); + if (current_folder && current_folder != '\0') { + GError *err = NULL; + modest_conf_set_string (modest_runtime_get_conf (), MODEST_CONF_LATEST_SAVE_ATTACHMENT_PATH, + current_folder,&err); + if (err != NULL) { + g_debug ("Error storing latest used folder: %s", err->message); + g_error_free (err); + } + } + g_free (current_folder); if (!modest_utils_folder_writable (chooser_uri)) { hildon_banner_show_information @@ -2755,11 +2776,12 @@ save_attachments_response (GtkDialog *dialog, } void -modest_msg_view_window_save_attachments (ModestMsgViewWindow *window, TnyList *mime_parts) +modest_msg_view_window_save_attachments (ModestMsgViewWindow *window, + TnyList *mime_parts) { ModestMsgViewWindowPrivate *priv; GtkWidget *save_dialog = NULL; - gchar *folder = NULL; + gchar *conf_folder = NULL; gchar *filename = NULL; gchar *save_multiple_str = NULL; @@ -2770,12 +2792,17 @@ modest_msg_view_window_save_attachments (ModestMsgViewWindow *window, TnyList *m /* In Hildon 2.2 save and delete operate over all the attachments as there's no * selection available */ mime_parts = modest_msg_view_get_attachments (MODEST_MSG_VIEW (priv->msg_view)); - if (!modest_maemo_utils_select_attachments (GTK_WINDOW (window), mime_parts, FALSE)) { + if (mime_parts && !modest_maemo_utils_select_attachments (GTK_WINDOW (window), mime_parts, FALSE)) { g_object_unref (mime_parts); return; } - if (mime_parts == NULL || tny_list_get_length (mime_parts) == 0) + if (mime_parts == NULL || tny_list_get_length (mime_parts) == 0) { + if (mime_parts) { + g_object_unref (mime_parts); + mime_parts = NULL; + } return; + } } else { g_object_ref (mime_parts); } @@ -2807,9 +2834,17 @@ modest_msg_view_window_save_attachments (ModestMsgViewWindow *window, TnyList *m GTK_FILE_CHOOSER_ACTION_SAVE); /* set folder */ - folder = g_build_filename (g_getenv (MYDOCS_ENV), DOCS_FOLDER, NULL); - gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (save_dialog), folder); - g_free (folder); + conf_folder = modest_conf_get_string (modest_runtime_get_conf (), MODEST_CONF_LATEST_SAVE_ATTACHMENT_PATH, NULL); + if (conf_folder && conf_folder[0] != '\0') { + gtk_file_chooser_set_current_folder_uri (GTK_FILE_CHOOSER (save_dialog), conf_folder); + } else { + gchar *docs_folder; + /* Set the default folder to images folder */ + docs_folder = g_build_filename (g_getenv (MYDOCS_ENV), DOCS_FOLDER, NULL); + gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (save_dialog), docs_folder); + g_free (docs_folder); + } + g_free (conf_folder); /* set filename */ if (filename) { @@ -3047,10 +3082,14 @@ on_fetch_image_idle_refresh_view (gpointer userdata) FetchImageData *fidata = (FetchImageData *) userdata; g_message ("REFRESH VIEW"); + + gdk_threads_enter (); if (GTK_WIDGET_DRAWABLE (fidata->msg_view)) { g_message ("QUEUING DRAW"); gtk_widget_queue_draw (fidata->msg_view); } + gdk_threads_leave (); + g_object_unref (fidata->msg_view); g_slice_free (FetchImageData, fidata); return FALSE; @@ -3064,12 +3103,37 @@ on_fetch_image_thread (gpointer userdata) TnyStream *cache_stream; cache = modest_runtime_get_images_cache (); - cache_stream = tny_stream_cache_get_stream (cache, fidata->cache_id, (TnyStreamCacheOpenStreamFetcher) fetch_image_open_stream, (gpointer) fidata->uri); + cache_stream = + tny_stream_cache_get_stream (cache, + fidata->cache_id, + (TnyStreamCacheOpenStreamFetcher) fetch_image_open_stream, + (gpointer) fidata->uri); g_free (fidata->cache_id); g_free (fidata->uri); if (cache_stream != NULL) { - tny_stream_write_to_stream (cache_stream, fidata->output_stream); + char buffer[4096]; + + while (G_LIKELY (!tny_stream_is_eos (cache_stream))) { + gssize nb_read; + + nb_read = tny_stream_read (cache_stream, buffer, sizeof (buffer)); + if (G_UNLIKELY (nb_read < 0)) { + break; + } else if (G_LIKELY (nb_read > 0)) { + gssize nb_written = 0; + + while (G_UNLIKELY (nb_written < nb_read)) { + gssize len; + + len = tny_stream_write (fidata->output_stream, buffer + nb_written, + nb_read - nb_written); + if (G_UNLIKELY (len < 0)) + break; + nb_written += len; + } + } + } tny_stream_close (cache_stream); g_object_unref (cache_stream); } @@ -3077,10 +3141,7 @@ on_fetch_image_thread (gpointer userdata) tny_stream_close (fidata->output_stream); g_object_unref (fidata->output_stream); - - gdk_threads_enter (); g_idle_add (on_fetch_image_idle_refresh_view, fidata); - gdk_threads_leave (); return NULL; }