* fix for NB#63391, where a notes-attachment would be opened in the browser instead
authorDirk-Jan C. Binnema <dirk-jan.binnema@nokia.com>
Sat, 1 Sep 2007 11:43:50 +0000 (11:43 +0000)
committerDirk-Jan C. Binnema <dirk-jan.binnema@nokia.com>
Sat, 1 Sep 2007 11:43:50 +0000 (11:43 +0000)
  - code would make a temp file <random>.ext and ask the mime system to open that,
  however, it only took the *last* extension, so foo.notes.html would become
  <random>.html, and thus opened in browser
  - second, it would open with these funny random chars in the name
  - solution: we now make a temporary-directory (with random name), and save the
  attachment file there with it's real name
  - one issue remaining are attachments without a name.

* make #define hildon_foo --> osso_foo for the functions in modest-platform, so we can
  get rid of the ugly #ifdef blocks.

pmo-trunk-r3179

src/maemo/modest-hildon-includes.h
src/maemo/modest-maemo-utils.c
src/maemo/modest-maemo-utils.h
src/maemo/modest-msg-view-window.c
src/maemo/modest-platform.c
src/modest-init.c

index 5b602e0..7dcf95e 100644 (file)
@@ -90,4 +90,26 @@ k * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 #endif /*__MODEST_HAVE_HILDON1_WIDGETS*/
 #endif /*__MODEST_HAVE_HILDON0_WIDGETS_*/
 
+
+/* backward compatibility... */
+#ifdef MODEST_HAVE_OSSO_MIME
+#define hildon_mime_open_file_with_mime_type osso_mime_open_file_with_mime_type 
+#define hildon_mime_open_file                osso_mime_open_file                
+
+#define HildonURIAction                      OssoURIAction
+#define hildon_uri_get_scheme_from_uri       osso_uri_get_scheme_from_uri
+#define hildon_uri_get_actions               osso_uri_get_actions
+#define hildon_uri_action_get_translation    osso_uri_action_get_translation   
+#define hildon_uri_is_default_action         osso_uri_is_default_action
+#define hildon_uri_free_actions              osso_uri_free_actions
+
+/* service->name */
+#define hildon_uri_action_get_service        osso_uri_action_get_name
+#define hildon_uri_open                      osso_uri_open
+
+#define hildon_mime_get_icon_names           osso_mime_get_icon_names 
+
+#endif /*MODEST_HAVE_OSSO_MIME*/
+
+
 #endif /*__MODEST_HILDON_INCLUDES__*/
index 3f05e5b..0d42cda 100644 (file)
@@ -34,6 +34,8 @@
 #include <dbus/dbus.h>
 #include <dbus/dbus-glib-lowlevel.h>
 #include <glib.h>
+#include <glib/gstdio.h>
+#include <errno.h>
 #include <modest-runtime.h>
 #include <libgnomevfs/gnome-vfs.h>
 #include <tny-fs-stream.h>
@@ -239,27 +241,38 @@ modest_maemo_utils_file_exists (const gchar *filename)
 }
 
 TnyFsStream *
-modest_maemo_utils_create_temp_stream (const gchar *extension, gchar **path)
+modest_maemo_utils_create_temp_stream (const gchar *orig_name, gchar **path)
 {
-       TnyStream *tmp_fs_stream = NULL;
        gint fd;
        gchar *filepath = NULL;
-       gchar *template = NULL;
-
-       if (extension != NULL)
-               template = g_strdup_printf ("XXXXXX.%s", extension);
+       gchar *tmpdir;
+
+       /* make a random subdir under /tmp or /var/tmp */
+       tmpdir = g_strdup_printf ("%s/%d", g_get_tmp_dir (), (guint)random());
+       if (g_mkdir (tmpdir, 0755) == -1) {
+               g_warning ("%s: failed to create dir '%s': %s",
+                          __FUNCTION__, tmpdir, g_strerror(errno));
+               g_free (tmpdir);
+               return NULL;
+       }
 
-       fd = g_file_open_tmp (template, &filepath, NULL);
-       g_free (template);
-       if (path != NULL)
-               *path = filepath;
+       /* try to write the file there */
+       filepath = g_strconcat (tmpdir, "/", orig_name, NULL);
+       fd = g_open (filepath, O_CREAT|O_WRONLY|O_TRUNC, 0644);
        if (fd == -1) {
-               g_message ("TODO BANNER: Error saving stream");
+               g_warning ("%s: failed to create '%s': %s",
+                          __FUNCTION__, filepath, g_strerror(errno));
+               g_free (tmpdir);
+               g_free (filepath);
                return NULL;
        }
-       tmp_fs_stream = tny_fs_stream_new (fd);
-       
-       return TNY_FS_STREAM (tmp_fs_stream);
+
+       g_free (tmpdir);
+
+       if (path)
+               *path = filepath;
+
+       return TNY_FS_STREAM (tny_fs_stream_new (fd));
 }
 
 typedef struct 
index 3bae920..10b02e5 100644 (file)
@@ -87,14 +87,14 @@ gboolean modest_maemo_utils_file_exists (const gchar *filename);
 
 /**
  * modest_maemo_utils_create_temp_stream:
- * @extension: a string with the extension the file should get, or %NULL
+ * @orig_name: a string with the original name of the extension, or %NULL
  * @path: a string with the created file path
  *
- * Creates a temporary fs stream 
+ * Creates a temporary fs stream, in a random subdir of /tmp or /var/tmp.
  *
  * Returns: a #TnyFsStream, or %NULL if operation failed.
  */
-TnyFsStream *modest_maemo_utils_create_temp_stream (const gchar *extension, gchar **path);
+TnyFsStream *modest_maemo_utils_create_temp_stream (const gchar *orig_name, gchar **path);
 
 /**
  * modest_maemo_utils_get_supported_secure_authentication_methods:
index dc67a34..9e580f3 100644 (file)
@@ -2158,17 +2158,10 @@ modest_msg_view_window_view_attachment (ModestMsgViewWindow *window, TnyMimePart
        if (!TNY_IS_MSG (mime_part)) {
                gchar *filepath = NULL;
                const gchar *att_filename = tny_mime_part_get_filename (mime_part);
-               gchar *extension = NULL;
                TnyFsStream *temp_stream = NULL;
 
-               if (att_filename) {
-                       extension = g_strrstr (att_filename, ".");
-                       if (extension != NULL)
-                               extension++;
-               }
-
-               temp_stream = modest_maemo_utils_create_temp_stream (extension, &filepath);
-
+               temp_stream = modest_maemo_utils_create_temp_stream (att_filename, &filepath);
+               
                if (temp_stream) {
                        const gchar *content_type;
                        content_type = tny_mime_part_get_content_type (mime_part);
@@ -2177,7 +2170,8 @@ modest_msg_view_window_view_attachment (ModestMsgViewWindow *window, TnyMimePart
                        modest_platform_activate_file (filepath, content_type);
                        g_object_unref (temp_stream);
                        g_free (filepath);
-                       /* TODO: delete temporary file */
+                       /* NOTE: files in the temporary area will be automatically
+                        * cleaned after some time if they are no longer in use */
                }
        } else {
                /* message attachment */
index ab67a4a..8b7ca49 100644 (file)
@@ -184,14 +184,15 @@ guess_mime_type_from_name (const gchar* name)
        const gchar* ext;
        const static gchar* octet_stream= "application/octet-stream";
        const static gchar* mime_map[][2] = {
-               { "pdf",  "application/pdf"},
-               { "doc",  "application/msword"},
-               { "xls",  "application/excel"},
-               { "png",  "image/png" },
-               { "gif",  "image/gif" },
-               { "jpg",  "image/jpeg"},
-               { "jpeg", "image/jpeg"},
-               { "mp3",  "audio/mp3" }
+               { "note.html", "text/note"}, /* for the osso_notes program */ 
+               { "pdf",       "application/pdf"},
+               { "doc",       "application/msword"},
+               { "xls",       "application/excel"},
+               { "png",       "image/png" },
+               { "gif",       "image/gif" },
+               { "jpg",       "image/jpeg"},
+               { "jpeg",      "image/jpeg"},
+               { "mp3",       "audio/mp3" }
        };
 
        if (!name)
@@ -224,11 +225,7 @@ modest_platform_get_file_icon_name (const gchar* name, const gchar* mime_type,
                g_string_ascii_down (mime_str);
        }
 
-#ifdef MODEST_HAVE_OSSO_MIME
-       icons = osso_mime_get_icon_names (mime_str->str, NULL);
-#else
        icons = hildon_mime_get_icon_names (mime_str->str, NULL);
-#endif /*MODEST_HAVE_OSSO_MIME*/
        for (cursor = icons; cursor; ++cursor) {
                if (!g_ascii_strcasecmp (*cursor, "gnome-mime-message") ||
                    !g_ascii_strcasecmp (*cursor, "gnome-mime-message-rfc822")) {
@@ -250,51 +247,6 @@ modest_platform_get_file_icon_name (const gchar* name, const gchar* mime_type,
 }
 
 
-
-
-#ifdef MODEST_HAVE_OSSO_MIME
-gboolean 
-modest_platform_activate_uri (const gchar *uri)
-{
-       OssoURIAction *action;
-       gboolean result = FALSE;
-       GSList *actions, *iter = NULL;
-       const gchar *scheme;
-       
-       g_return_val_if_fail (uri, FALSE);
-       if (!uri)
-               return FALSE;
-
-       /* the default action should be email */
-       scheme = osso_uri_get_scheme_from_uri (uri, NULL);
-       actions = osso_uri_get_actions (scheme, NULL);
-       
-       for (iter = actions; iter; iter = g_slist_next (iter)) {
-               action = (OssoURIAction*) iter->data;
-               if (action && strcmp (osso_uri_action_get_name (action), "uri_link_compose_email") == 0) {
-                       GError *err = NULL;
-                       result = osso_uri_open (uri, action, &err);
-                       if (!result && err) {
-                               g_printerr ("modest: modest_platform_activate_uri : %s",
-                                           err->message ? err->message : "unknown error");
-                               g_error_free (err);
-                       }
-                       break;
-               }
-       }
-
-       /* if we could open it with email, try something else */
-       if (!result)
-               result = osso_uri_open (uri, NULL, NULL);       
-       
-                       
-       if (!result)
-               hildon_banner_show_information (NULL, NULL, _("mcen_ib_unsupported_link"));
-       return result;
-}
-
-#else /* !MODEST_HAVE_OSSO_MIME*/
-
 gboolean 
 modest_platform_activate_uri (const gchar *uri)
 {
@@ -312,7 +264,8 @@ modest_platform_activate_uri (const gchar *uri)
        
        for (iter = actions; iter; iter = g_slist_next (iter)) {
                action = (HildonURIAction*) iter->data;
-               if (action && strcmp (hildon_uri_action_get_service (action), "com.nokia.modest") == 0) {
+               if (action && strcmp (hildon_uri_action_get_service (action),
+                                     "com.nokia.modest") == 0) {
                        GError *err = NULL;
                        result = hildon_uri_open (uri, action, &err);
                        if (!result && err) {
@@ -334,36 +287,23 @@ modest_platform_activate_uri (const gchar *uri)
        return result;
 }
 
-
-#endif /* MODEST_HAVE_OSSO_MIME*/
-
 gboolean 
 modest_platform_activate_file (const gchar *path, const gchar *mime_type)
 {
-       gint result;
+       gint result = 0;
        DBusConnection *con;
        gchar *uri_path = NULL;
-       GString *mime_str = NULL;
 
-       if (!mime_type || !g_ascii_strcasecmp (mime_type, "application/octet-stream")) 
-               mime_str = g_string_new (guess_mime_type_from_name(path));
-       else {
-               mime_str = g_string_new (mime_type);
-               g_string_ascii_down (mime_str);
-       }
-
-       uri_path = g_strconcat ("file://", path, NULL);
-       
+       uri_path = g_strconcat ("file://", path, NULL); 
        con = osso_get_dbus_connection (osso_context);
-#ifdef MODEST_HAVE_OSSO_MIME
-       result = osso_mime_open_file_with_mime_type (con, uri_path, mime_str->str);
-#else
-       result = hildon_mime_open_file_with_mime_type (con, uri_path, mime_str->str);
-#endif /*MODEST_HAVE_OSSO_MIME*/
-       g_string_free (mime_str, TRUE);
-
+       
+       if (mime_type)
+               result = hildon_mime_open_file_with_mime_type (con, uri_path, mime_type);
+       if (result != 1)
+               result = hildon_mime_open_file (con, uri_path);
        if (result != 1)
                modest_platform_run_information_dialog (NULL, _("mcen_ni_noregistered_viewer"));
+       
        return result != 1;
 }
 
@@ -380,11 +320,8 @@ delete_uri_popup (GtkWidget *menu,
        ModestPlatformPopupInfo *popup_info = (ModestPlatformPopupInfo *) userdata;
 
        g_free (popup_info->uri);
-#ifdef MODEST_HAVE_OSSO_MIME
-       osso_uri_free_actions (popup_info->actions);
-#else
        hildon_uri_free_actions (popup_info->actions);
-#endif /*MODEST_HAVE_OSSO_MIME*/
+
        return FALSE;
 }
 
@@ -417,19 +354,11 @@ activate_uri_popup_item (GtkMenuItem *menu_item,
        
        /* now, the real uri-actions... */
        for (node = popup_info->actions; node != NULL; node = g_slist_next (node)) {
-#ifdef MODEST_HAVE_OSSO_MIME
-               OssoURIAction *action = (OssoURIAction *) node->data;
-               if (strcmp (action_name, osso_uri_action_get_name (action))==0) {
-                       osso_uri_open (popup_info->uri, action, NULL);
-                       break;
-               }
-#else
                HildonURIAction *action = (HildonURIAction *) node->data;
                if (strcmp (action_name, hildon_uri_action_get_name (action))==0) {
                        hildon_uri_open (popup_info->uri, action, NULL);
                        break;
                }
-#endif /*MODEST_HAVE_OSSO_MIME*/
        }
 }
 
@@ -442,13 +371,8 @@ modest_platform_show_uri_popup (const gchar *uri)
        if (uri == NULL)
                return FALSE;
        
-#ifdef MODEST_HAVE_OSSO_MIME
-       scheme = osso_uri_get_scheme_from_uri (uri, NULL);
-       actions_list = osso_uri_get_actions (scheme, NULL);
-#else
        scheme = hildon_uri_get_scheme_from_uri (uri, NULL);
        actions_list = hildon_uri_get_actions (scheme, NULL);
-#endif /* MODEST_HAVE_OSSO_MIME */
        if (actions_list != NULL) {
                GSList *node;
                GtkWidget *menu = gtk_menu_new ();
@@ -461,22 +385,6 @@ modest_platform_show_uri_popup (const gchar *uri)
                        GtkWidget *menu_item;
                        const gchar *action_name;
                        const gchar *translation_domain;
-#ifdef MODEST_HAVE_OSSO_MIME
-                       OssoURIAction *action = (OssoURIAction *) node->data;
-                       action_name = osso_uri_action_get_name (action);
-                       translation_domain = osso_uri_action_get_translation_domain (action);
-                       menu_item = gtk_menu_item_new_with_label (dgettext(translation_domain,action_name));
-                       g_object_set_data (G_OBJECT(menu_item), HILDON_OSSO_URI_ACTION, (gpointer)action_name);
-                       /* hack, we add it as a gobject property*/
-                       g_signal_connect (G_OBJECT (menu_item), "activate", G_CALLBACK (activate_uri_popup_item),
-                                         popup_info);
-                       
-                       if (osso_uri_is_default_action (action, NULL)) {
-                               gtk_menu_shell_prepend (GTK_MENU_SHELL (menu), menu_item);
-                       } else {
-                               gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_item);
-                       }
-#else
                        HildonURIAction *action = (HildonURIAction *) node->data;
                        action_name = hildon_uri_action_get_name (action);
                        translation_domain = hildon_uri_action_get_translation_domain (action);
@@ -490,7 +398,6 @@ modest_platform_show_uri_popup (const gchar *uri)
                        } else {
                                gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_item);
                        }
-#endif /*MODEST_HAVE_OSSO_MIME*/
                        gtk_widget_show (menu_item);
                }
 
@@ -1559,7 +1466,8 @@ modest_platform_check_and_wait_for_account_is_online(TnyAccount *account)
                return TRUE;            
        }
                
-       printf ("DEBUG: %s: tny_account_get_connection_status()==%d\n", __FUNCTION__, tny_account_get_connection_status (account));
+       printf ("DEBUG: %s: tny_account_get_connection_status()==%d\n",
+               __FUNCTION__, tny_account_get_connection_status (account));
        
        /* The POP & IMAP store accounts seem to be TNY_CONNECTION_STATUS_DISCONNECTED, 
         * and that seems to be an OK time to use them. Maybe it's just TNY_CONNECTION_STATUS_INIT that 
index 9f188dc..52c6220 100644 (file)
@@ -190,6 +190,9 @@ modest_init (int argc, char *argv[])
        init_debug_g_type();
        init_debug_logging();
 
+       /* initialize the prng, we need it when creating random files */
+       srandom((int)getpid());
+       
        if (!gnome_vfs_initialized()) {
                if (!gnome_vfs_init ()) {
                        g_printerr ("modest: failed to init gnome-vfs\n");