Move grab zoom to ModestWindow, as we have to handle it in all the app
[modest] / src / hildon2 / modest-msg-view-window.c
index 025b68f..41c6270 100644 (file)
@@ -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;
 }