Fixed NB#128634, cannot open attachments multiple times.
[modest] / src / modest-utils.c
index aac37ef..8507fd5 100644 (file)
@@ -36,6 +36,7 @@
 #include <tny-fs-stream.h>
 #include <tny-camel-account.h>
 #include <tny-status.h>
+#include <tny-camel-send-queue.h>
 #include <tny-camel-transport-account.h>
 #include <tny-camel-imap-store-account.h>
 #include <tny-camel-pop-store-account.h>
@@ -70,7 +71,7 @@ modest_utils_folder_writable (const gchar *filename)
        if (!filename)
                return FALSE;
 
-       if (g_strncasecmp (filename, "obex", 4) != 0) {
+       if (g_ascii_strncasecmp (filename, "obex", 4) != 0) {
                GnomeVFSFileInfo *folder_info = NULL;
                GnomeVFSResult result = GNOME_VFS_OK;
                GnomeVFSURI *uri = NULL;
@@ -105,16 +106,16 @@ modest_utils_folder_writable (const gchar *filename)
 gboolean
 modest_utils_file_exists (const gchar *filename)
 {
-       GnomeVFSURI *uri = NULL;
        gboolean result = FALSE;
+       gchar *escaped;
 
        g_return_val_if_fail (filename, FALSE);
 
-       uri = gnome_vfs_uri_new (filename);
-       if (uri) {
-               result = gnome_vfs_uri_exists (uri);
-               gnome_vfs_uri_unref (uri);
-       }
+       escaped = g_uri_escape_string (filename, NULL, FALSE);
+       if (g_access (escaped, F_OK) == 0)
+               result = TRUE;
+       g_free (escaped);
+
        return result;
 }
 
@@ -123,7 +124,7 @@ modest_utils_create_temp_stream (const gchar *orig_name, const gchar *hash_base,
 {
        gint fd;
        gchar *filepath = NULL;
-       gchar *tmpdir;
+       gchar *tmpdir, *tmp;
        guint hash_number;
 
        /* hmmm... maybe we need a modest_text_utils_validate_file_name? */
@@ -155,15 +156,16 @@ modest_utils_create_temp_stream (const gchar *orig_name, const gchar *hash_base,
                return NULL;
        }
 
-       filepath = g_strconcat (tmpdir, "/", orig_name, NULL);
+       tmp = g_uri_escape_string (orig_name, NULL, FALSE);
+       filepath = g_build_filename (tmpdir, tmp, NULL);
+       g_free (tmp);
 
        /* if file exists, first we try to remove it */
-       if (modest_utils_file_exists (filepath)) {
+       if (g_access (filepath, F_OK) == 0)
                g_unlink (filepath);
-       }
 
        /* don't overwrite if it already exists, even if it is writable */
-       if (modest_utils_file_exists (filepath)) {
+       if (g_access (filepath, F_OK) == 0) {
                if (path!=NULL) {
                        *path = filepath;
                } else {
@@ -1130,6 +1132,8 @@ free_notification_data (gpointer data,
        g_free (notification_data->from);
        g_free (notification_data->subject);
        g_free (notification_data->uri);
+
+       g_slice_free (ModestMsgNotificationData, notification_data);
 }
 
 void
@@ -1140,3 +1144,27 @@ modest_utils_free_notification_list (GList *notification_list)
        g_list_foreach (notification_list, free_notification_data, NULL);
        g_list_free (notification_list);
 }
+
+void
+modest_utils_flush_send_queue (const gchar *account_id)
+{
+       TnyTransportAccount *account;
+
+       /* Get the transport account */
+       account = (TnyTransportAccount *)
+               modest_tny_account_store_get_server_account (modest_runtime_get_account_store (),
+                                                            account_id,
+                                                            TNY_ACCOUNT_TYPE_TRANSPORT);
+       if (account) {
+               ModestMailOperation *wakeup_op;
+               ModestTnySendQueue *send_queue = modest_runtime_get_send_queue (account, TRUE);
+
+               /* Flush it! */
+               wakeup_op = modest_mail_operation_new (NULL);
+               modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
+                                                wakeup_op);
+               modest_mail_operation_queue_wakeup (wakeup_op, send_queue);
+
+               g_object_unref (account);
+       }
+}