aboutsummaryrefslogtreecommitdiffstats
path: root/mail
diff options
context:
space:
mode:
Diffstat (limited to 'mail')
-rw-r--r--mail/ChangeLog19
-rw-r--r--mail/Makefile.am2
-rw-r--r--mail/em-config.c1
-rw-r--r--mail/em-format-html-display.c186
-rw-r--r--mail/em-format.c12
-rw-r--r--mail/em-menu.c1
-rw-r--r--mail/em-popup.c75
-rw-r--r--mail/em-utils.c53
-rw-r--r--mail/em-vfs-stream.c330
-rw-r--r--mail/em-vfs-stream.h60
-rw-r--r--mail/mail-ops.c33
11 files changed, 143 insertions, 629 deletions
diff --git a/mail/ChangeLog b/mail/ChangeLog
index fbddc2eb8e..027e2b1fb8 100644
--- a/mail/ChangeLog
+++ b/mail/ChangeLog
@@ -1,3 +1,22 @@
+2008-04-17 Milan Crha <mcrha@redhat.com>
+
+ ** Part of fix for bug #526739
+
+ * Makefile.am:
+ * em-vfs-stream.h:
+ * em-vfs-stream.c: Removed from project, not used anywhere.
+ * em-menu.c:
+ * em-config.c: Do not include gnome-vfs.
+ * mail-ops.c: (save_messages_exec), (save_part_exec):
+ Changes related to Data Server change of CamelStreamVFS.
+ * em-format.c: (em_format_describe_part):
+ * em-format-html-display.c: (efhd_bonobo_object), (efhd_find_handler),
+ (efhd_use_component), (efhd_bonobo_unknown), (efhd_check_server_prop),
+ (efhd_format_attachment): Drop use of deprecated gnome-vfs functions.
+ * em-utils.c: (em_utils_snoop_type): Use gio to guess the mime_type.
+ * em-popup.c: (emp_apps_open_in), (emp_apps_popup_free),
+ (emp_standard_menu_factory): Use gio to fill popup and launch app.
+
2008-04-16 Shuai Liu <shuai.liu@sun.com>
** Fix for bug #528358
diff --git a/mail/Makefile.am b/mail/Makefile.am
index 3cbd23c825..e286a47908 100644
--- a/mail/Makefile.am
+++ b/mail/Makefile.am
@@ -78,7 +78,6 @@ mailinclude_HEADERS = \
em-stripsig-filter.h \
em-sync-stream.h \
em-utils.h \
- em-vfs-stream.h \
mail-autofilter.h \
mail-component.h \
mail-config.h \
@@ -161,7 +160,6 @@ libevolution_mail_la_SOURCES = \
em-vfolder-editor.h \
em-vfolder-rule.c \
em-vfolder-rule.h \
- em-vfs-stream.c \
mail-autofilter.c \
mail-component-factory.c \
mail-component.c \
diff --git a/mail/em-config.c b/mail/em-config.c
index 80869faa4b..e7fdf6964f 100644
--- a/mail/em-config.c
+++ b/mail/em-config.c
@@ -39,7 +39,6 @@
#include <gtk/gtkimage.h>
#include <libgnome/gnome-url.h>
-#include <libgnomevfs/gnome-vfs-mime.h>
#include "em-config.h"
#include "libedataserver/e-msgport.h"
diff --git a/mail/em-format-html-display.c b/mail/em-format-html-display.c
index 64dbae3377..be0bfa3c87 100644
--- a/mail/em-format-html-display.c
+++ b/mail/em-format-html-display.c
@@ -66,7 +66,6 @@
#include <glade/glade.h>
-#include <libgnomevfs/gnome-vfs-mime-handlers.h>
#include <glib/gi18n.h>
#include <bonobo/bonobo-control-frame.h>
@@ -210,9 +209,6 @@ static void efhd_format_secure(EMFormat *emf, CamelStream *stream, CamelMimePart
static void efhd_complete(EMFormat *);
gboolean efhd_mnemonic_show_bar (GtkWidget *widget, gboolean focus, GtkWidget *efhd);
-static gboolean efhd_bonobo_object(EMFormatHTML *efh, GtkHTMLEmbedded *eb, EMFormatHTMLPObject *pobject);
-static gboolean efhd_use_component(const char *mime_type);
-
static void efhd_builtin_init(EMFormatHTMLDisplayClass *efhc);
enum {
@@ -1326,37 +1322,9 @@ efhd_builtin_init(EMFormatHTMLDisplayClass *efhc)
/* ********************************************************************** */
-static void
-efhd_bonobo_unknown(EMFormat *emf, CamelStream *stream, CamelMimePart *part, const EMFormatHandler *info)
-{
- char *classid;
-
- classid = g_strdup_printf("bonobo-unknown:///em-format-html-display/%s", emf->part_id->str);
- em_format_html_add_pobject((EMFormatHTML *)emf, sizeof(EMFormatHTMLPObject), classid, part, efhd_bonobo_object);
- camel_stream_printf(stream, "<object classid=\"%s\" type=\"%s\"></object><br>\n", classid, info->mime_type);
- g_free(classid);
-}
-
-/* ********************************************************************** */
-
static const EMFormatHandler *efhd_find_handler(EMFormat *emf, const char *mime_type)
{
- const EMFormatHandler *handle;
-
- if ( (handle = ((EMFormatClass *)efhd_parent)->find_handler(emf, mime_type)) == NULL
- && efhd_use_component(mime_type)
- && (handle = g_hash_table_lookup(efhd_bonobo_handlers, mime_type)) == NULL) {
- EMFormatHandler *h = g_malloc0(sizeof(*h));
-
- h->mime_type = g_strdup(mime_type);
- h->handler = efhd_bonobo_unknown;
- h->flags = EM_FORMAT_HANDLER_INLINE_DISPOSITION;
- g_hash_table_insert(efhd_bonobo_handlers, h->mime_type, h);
-
- handle = h;
- }
-
- return handle;
+ return ((EMFormatClass *)efhd_parent)->find_handler(emf, mime_type);
}
static void efhd_format_clone(EMFormat *emf, CamelFolder *folder, const char *uid, CamelMimeMessage *msg, EMFormat *src)
@@ -1980,152 +1948,6 @@ efhd_attachment_frame(EMFormat *emf, CamelStream *stream, EMFormatPURI *puri)
}
}
-static gboolean
-efhd_bonobo_object(EMFormatHTML *efh, GtkHTMLEmbedded *eb, EMFormatHTMLPObject *pobject)
-{
- CamelDataWrapper *wrapper;
- Bonobo_ServerInfo *component;
- GtkWidget *embedded;
- Bonobo_PersistStream persist;
- CORBA_Environment ev;
- CamelStreamMem *cstream;
- BonoboStream *bstream;
- BonoboControlFrame *control_frame;
- Bonobo_PropertyBag prop_bag;
-
- component = gnome_vfs_mime_get_default_component(eb->type);
- if (component == NULL)
- return FALSE;
-
- embedded = bonobo_widget_new_control(component->iid, NULL);
- CORBA_free(component);
- if (embedded == NULL)
- return FALSE;
-
- CORBA_exception_init(&ev);
-
- control_frame = bonobo_widget_get_control_frame((BonoboWidget *)embedded);
- prop_bag = bonobo_control_frame_get_control_property_bag(control_frame, NULL);
- if (prop_bag != CORBA_OBJECT_NIL) {
- /*
- * Now we can take care of business. Currently, the only control
- * that needs something passed to it through a property bag is
- * the iTip control, and it needs only the From email address,
- * but perhaps in the future we can generalize this section of code
- * to pass a bunch of useful things to all embedded controls.
- */
- const CamelInternetAddress *from;
- char *from_address;
-
- from = camel_mime_message_get_from((CamelMimeMessage *)((EMFormat *)efh)->message);
- from_address = camel_address_encode((CamelAddress *)from);
- bonobo_property_bag_client_set_value_string(prop_bag, "from_address", from_address, &ev);
- g_free(from_address);
-
- Bonobo_Unknown_unref(prop_bag, &ev);
- }
-
- persist = (Bonobo_PersistStream)Bonobo_Unknown_queryInterface(bonobo_widget_get_objref((BonoboWidget *)embedded),
- "IDL:Bonobo/PersistStream:1.0", &ev);
- if (persist == CORBA_OBJECT_NIL) {
- g_object_ref_sink(embedded);
- CORBA_exception_free(&ev);
- return FALSE;
- }
-
- /* Write the data to a CamelStreamMem... */
- cstream = (CamelStreamMem *)camel_stream_mem_new();
- wrapper = camel_medium_get_content_object((CamelMedium *)pobject->part);
- if (FALSE && !g_ascii_strncasecmp (eb->type, "text/", 5)) {
- /* do charset conversion, etc */
- d(printf("performing charset conversion for %s component\n", eb->type));
- em_format_format_text((EMFormat *)efh, (CamelStream *)cstream, wrapper);
- } else {
- camel_data_wrapper_decode_to_stream (wrapper, (CamelStream *) cstream);
- }
-
- /* ...convert the CamelStreamMem to a BonoboStreamMem... */
- bstream = bonobo_stream_mem_create((char *)cstream->buffer->data, cstream->buffer->len, TRUE, FALSE);
- camel_object_unref(cstream);
-
- /* ...and hydrate the PersistStream from the BonoboStream. */
- Bonobo_PersistStream_load(persist,
- bonobo_object_corba_objref(BONOBO_OBJECT (bstream)),
- eb->type, &ev);
- bonobo_object_unref(BONOBO_OBJECT (bstream));
- Bonobo_Unknown_unref(persist, &ev);
- CORBA_Object_release(persist, &ev);
-
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_object_ref_sink(embedded);
- CORBA_exception_free(&ev);
- return FALSE;
- }
- CORBA_exception_free(&ev);
-
- gtk_widget_show(embedded);
- gtk_container_add(GTK_CONTAINER (eb), embedded);
-
- return TRUE;
-}
-
-static gboolean
-efhd_check_server_prop(Bonobo_ServerInfo *component, const char *propname, const char *value)
-{
- CORBA_sequence_CORBA_string stringv;
- Bonobo_ActivationProperty *prop;
- int i;
-
- prop = bonobo_server_info_prop_find(component, propname);
- if (!prop || prop->v._d != Bonobo_ACTIVATION_P_STRINGV)
- return FALSE;
-
- stringv = prop->v._u.value_stringv;
- for (i = 0; i < stringv._length; i++) {
- if (!g_ascii_strcasecmp(value, stringv._buffer[i]))
- return TRUE;
- }
-
- return FALSE;
-}
-
-static gboolean
-efhd_use_component(const char *mime_type)
-{
- GList *components, *iter;
- Bonobo_ServerInfo *component = NULL;
-
- /* should this cache it? */
-
- if (g_ascii_strcasecmp(mime_type, "text/x-vcard") != 0
- && g_ascii_strcasecmp(mime_type, "text/calendar") != 0) {
- const char **mime_types;
- int i;
-
- mime_types = mail_config_get_allowable_mime_types();
- for (i = 0; mime_types[i]; i++) {
- if (!g_ascii_strcasecmp(mime_types[i], mime_type))
- goto type_ok;
- }
- return FALSE;
- }
-type_ok:
- components = gnome_vfs_mime_get_all_components (mime_type);
- for (iter = components; iter; iter = iter->next) {
- Bonobo_ServerInfo *comp = iter->data;
-
- comp = iter->data;
- if (efhd_check_server_prop(comp, "repo_ids", "IDL:Bonobo/PersistStream:1.0")
- && efhd_check_server_prop(comp, "bonobo:supported_mime_types", mime_type)) {
- component = comp;
- break;
- }
- }
- gnome_vfs_mime_component_list_free (components);
-
- return component != NULL;
-}
-
static void
attachment_bar_arrow_clicked(GtkWidget *w, EMFormatHTMLDisplay *efhd)
{
@@ -2472,12 +2294,6 @@ efhd_format_attachment(EMFormat *emf, CamelStream *stream, CamelMimePart *part,
if (handle) {
if (info->shown)
handle->handler(emf, stream, part, handle);
- } else if (efhd_use_component(mime_type)) {
- g_free(classid); /* messy */
-
- classid = g_strdup_printf("bonobo-unknown:///em-format-html-display/%s", emf->part_id->str);
- em_format_html_add_pobject((EMFormatHTML *)emf, sizeof(EMFormatHTMLPObject), classid, part, efhd_bonobo_object);
- camel_stream_printf(stream, "<object classid=\"%s\" type=\"%s\"></object><br>>\n", classid, mime_type);
}
g_free(classid);
diff --git a/mail/em-format.c b/mail/em-format.c
index 2bdea062ed..ddf8693790 100644
--- a/mail/em-format.c
+++ b/mail/em-format.c
@@ -28,10 +28,8 @@
#include <stdio.h>
#include <string.h>
-#include <libgnomevfs/gnome-vfs-mime.h>
-#include <libgnomevfs/gnome-vfs-mime-utils.h>
-#include <libgnomevfs/gnome-vfs-mime-handlers.h>
#include <glib/gi18n.h>
+#include <gio/gio.h>
#include <libedataserver/e-msgport.h>
#include <camel/camel-url.h>
@@ -1150,11 +1148,13 @@ em_format_describe_part(CamelMimePart *part, const char *mime_type)
{
GString *stext;
const char *text;
- char *out;
+ char *out, *desc;
stext = g_string_new("");
- text = gnome_vfs_mime_get_description(mime_type);
- g_string_append_printf(stext, _("%s attachment"), text?text:mime_type);
+ /* TODO: mime_type isn't content_type on some systems (Win32), thus this will not work there. */
+ desc = g_content_type_get_description (mime_type);
+ g_string_append_printf (stext, _("%s attachment"), desc ? desc : mime_type);
+ g_free (desc);
if ((text = camel_mime_part_get_filename (part)))
g_string_append_printf(stext, " (%s)", text);
if ((text = camel_mime_part_get_description(part)))
diff --git a/mail/em-menu.c b/mail/em-menu.c
index 69fc7839f8..77a93aba18 100644
--- a/mail/em-menu.c
+++ b/mail/em-menu.c
@@ -39,7 +39,6 @@
#include <gtk/gtkimage.h>
#include <libgnome/gnome-url.h>
-#include <libgnomevfs/gnome-vfs-mime.h>
#include "em-menu.h"
#include "libedataserver/e-msgport.h"
diff --git a/mail/em-popup.c b/mail/em-popup.c
index 0ee4fdae5d..b727bf552f 100644
--- a/mail/em-popup.c
+++ b/mail/em-popup.c
@@ -28,6 +28,9 @@
#include <stdlib.h>
#include <glib.h>
+#include <glib/gi18n.h>
+
+#include <gio/gio.h>
#include <gtk/gtkmenu.h>
#include <gtk/gtkmenuitem.h>
@@ -39,9 +42,6 @@
#include <gtk/gtkimage.h>
#include <libgnome/gnome-url.h>
-#include <libgnomevfs/gnome-vfs-mime.h>
-#include <libgnomevfs/gnome-vfs-utils.h>
-#include <glib/gi18n.h>
#include "em-popup.h"
#include "libedataserver/e-msgport.h"
@@ -644,8 +644,6 @@ static EPopupItem emp_standard_uri_popups[] = {
#define LEN(x) (sizeof(x)/sizeof(x[0]))
-#include <libgnomevfs/gnome-vfs-mime-handlers.h>
-
static void
emp_apps_open_in(EPopup *ep, EPopupItem *item, void *data)
{
@@ -660,18 +658,33 @@ emp_apps_open_in(EPopup *ep, EPopupItem *item, void *data)
path = em_utils_temp_save_part(target->widget, part, TRUE);
if (path) {
- GnomeVFSMimeApplication *app = item->user_data;
- char *uri;
+ GAppInfo *app = item->user_data;
GList *uris = NULL;
+ GError *error = NULL;
- uri = gnome_vfs_get_uri_from_local_path(path);
- uris = g_list_append(uris, uri);
+ if (g_app_info_supports_files (app)) {
+ GFile *file = g_file_new_for_path (path);
- gnome_vfs_mime_application_launch(app, uris);
+ uris = g_list_append (uris, file);
+ g_app_info_launch (app, uris, NULL, &error);
+ g_object_unref (file);
+ } else {
+ char *uri;
- g_free(uri);
- g_list_free(uris);
- g_free(path);
+ uri = e_util_filename_to_uri (path);
+ uris = g_list_append (uris, uri);
+
+ g_app_info_launch_uris (app, uris, NULL, &error);
+ g_free (uri);
+ }
+
+ if (error) {
+ g_warning ("%s", error->message);
+ g_error_free (error);
+ }
+
+ g_list_free (uris);
+ g_free (path);
}
}
@@ -682,6 +695,9 @@ emp_apps_popup_free(EPopup *ep, GSList *free_list, void *data)
GSList *n = free_list->next;
EPopupItem *item = free_list->data;
+ if (item->user_data && item->activate == emp_apps_open_in)
+ g_object_unref (item->user_data);
+
g_free(item->path);
g_free(item->label);
g_free(item);
@@ -790,23 +806,27 @@ emp_standard_menu_factory(EPopup *emp, void *data)
if (mime_type) {
gchar *cp;
- /* GNOME-VFS expects lowercase MIME types. */
+ /* does gvfs expect lowercase MIME types? */
for (cp = mime_type; *cp != '\0'; cp++)
*cp = g_ascii_tolower (*cp);
- apps = gnome_vfs_mime_get_all_applications(mime_type);
+ /* TODO: g_app_info_get_all_for_type expects content_type, not a mime_type, thus it will work fine
+ on Linux/Unix systems, but not on Win32. They will add hopefully some function to convert between
+ these two soon. */
+ apps = g_app_info_get_all_for_type (mime_type);
if (apps == NULL && strcmp(mime_type, "application/octet-stream") == 0) {
- const char *name_type;
-
if (filename) {
- /* GNOME-VFS will misidentify TNEF attachments as MPEG */
+ /* will gvfs misidentify TNEF attachments as MPEG? */
if (!strcmp (filename, "winmail.dat"))
- name_type = "application/vnd.ms-tnef";
- else
- name_type = gnome_vfs_mime_type_from_name(filename);
- if (name_type)
- apps = gnome_vfs_mime_get_all_applications(name_type);
+ apps = g_app_info_get_all_for_type ("application/vnd.ms-tnef");
+ else {
+ char *name_type = e_util_guess_mime_type (filename);
+
+ apps = g_app_info_get_all_for_type (name_type);
+
+ g_free (name_type);
+ }
}
}
@@ -818,16 +838,19 @@ emp_standard_menu_factory(EPopup *emp, void *data)
menus = g_slist_prepend(menus, (void *)&emp_standard_part_apps_bar);
for (l = apps, i = 0; l; l = l->next, i++) {
- GnomeVFSMimeApplication *app = l->data;
+ GAppInfo *app = l->data;
EPopupItem *item;
- if (app->requires_terminal)
+ if (!g_app_info_should_show (app)) {
+ g_object_unref (app);
+ l->data = NULL;
continue;
+ }
item = g_malloc0(sizeof(*item));
item->type = E_POPUP_ITEM;
item->path = g_strdup_printf("99.object.%02d", i);
- item->label = g_strdup_printf(_("Open in %s..."), app->name);
+ item->label = g_strdup_printf(_("Open in %s..."), g_app_info_get_name (app));
item->activate = emp_apps_open_in;
item->user_data = app;
diff --git a/mail/em-utils.c b/mail/em-utils.c
index ee77391e97..53e2fff906 100644
--- a/mail/em-utils.c
+++ b/mail/em-utils.c
@@ -52,11 +52,10 @@
#include <bonobo/bonobo-widget.h>
#include <bonobo/bonobo-event-source.h>
-#include <libgnomevfs/gnome-vfs-mime.h>
-#include <libgnomevfs/gnome-vfs-mime-utils.h>
-#include <libgnomevfs/gnome-vfs-mime-handlers.h>
#include <glib/gi18n.h>
+#include <gio/gio.h>
+
#include "mail-component.h"
#include "mail-mt.h"
#include "mail-ops.h"
@@ -2199,30 +2198,40 @@ em_utils_contact_photo (struct _CamelInternetAddress *cia, gboolean local)
const char *
em_utils_snoop_type(CamelMimePart *part)
{
- const char *filename, *name_type = NULL, *magic_type = NULL;
+ /* cache is here only to be able still return const char * */
+ static GHashTable *types_cache = NULL;
+
+ const char *filename;
+ char *name_type = NULL, *magic_type = NULL, *res, *tmp;
CamelDataWrapper *dw;
filename = camel_mime_part_get_filename (part);
if (filename) {
- /* GNOME-VFS will misidentify TNEF attachments as MPEG */
+ /* will GVFS misidentify TNEF attachments as MPEG? */
if (!strcmp (filename, "winmail.dat"))
return "application/vnd.ms-tnef";
- name_type = gnome_vfs_mime_type_from_name(filename);
+ name_type = e_util_guess_mime_type (filename);
}
dw = camel_medium_get_content_object((CamelMedium *)part);
if (!camel_data_wrapper_is_offline(dw)) {
CamelStreamMem *mem = (CamelStreamMem *)camel_stream_mem_new();
- if (camel_data_wrapper_decode_to_stream(dw, (CamelStream *)mem) > 0)
- magic_type = gnome_vfs_get_mime_type_for_data(mem->buffer->data, mem->buffer->len);
+ if (camel_data_wrapper_decode_to_stream(dw, (CamelStream *)mem) > 0) {
+ char *ct = g_content_type_guess (filename, mem->buffer->data, mem->buffer->len, NULL);
+
+ if (ct)
+ magic_type = g_content_type_get_mime_type (ct);
+
+ g_free (ct);
+ }
camel_object_unref(mem);
}
d(printf("snooped part, magic_type '%s' name_type '%s'\n", magic_type, name_type));
- /* If GNOME-VFS doesn't recognize the data by magic, but it
+ /* If gvfs doesn't recognize the data by magic, but it
* contains English words, it will call it text/plain. If the
* filename-based check came up with something different, use
* that instead and if it returns "application/octet-stream"
@@ -2233,11 +2242,31 @@ em_utils_snoop_type(CamelMimePart *part)
if (name_type
&& (!strcmp(magic_type, "text/plain")
|| !strcmp(magic_type, "application/octet-stream")))
- return name_type;
+ res = name_type;
else
- return magic_type;
+ res = magic_type;
} else
- return name_type;
+ res = name_type;
+
+
+ if (res != name_type)
+ g_free (name_type);
+
+ if (res != magic_type)
+ g_free (magic_type);
+
+ if (!types_cache)
+ types_cache = g_hash_table_new_full (g_str_hash, g_str_equal, (GDestroyNotify) g_free, (GDestroyNotify) NULL);
+
+ tmp = g_hash_table_lookup (types_cache, res);
+ if (tmp) {
+ g_free (res);
+ res = tmp;
+ } else {
+ g_hash_table_insert (types_cache, res, res);
+ }
+
+ return res;
/* We used to load parts to check their type, we dont anymore,
see bug #11778 for some discussion */
diff --git a/mail/em-vfs-stream.c b/mail/em-vfs-stream.c
deleted file mode 100644
index 290ea86a4d..0000000000
--- a/mail/em-vfs-stream.c
+++ /dev/null
@@ -1,330 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
- *
- * Authors: Michael Zucchi <notzed@ximian.com>
- *
- * Copyright 2004 Ximian, Inc. (www.ximian.com)
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- *
- * A GnomeVFS to CamelStream mapper.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <string.h>
-#include <stdio.h>
-#include <errno.h>
-
-#include <libgnomevfs/gnome-vfs.h>
-
-#include "em-vfs-stream.h"
-
-#ifndef EINPROGRESS
-#define EINPROGRESS EAGAIN
-#endif
-#ifndef ELOOP
-#define ELOOP EIO
-#endif
-
-#define LOG_STREAM
-
-#define d(x)
-
-#define EMVS_CLASS(x) ((EMVFSStreamClass *)(((CamelObject *)(x))->klass))
-
-static CamelStreamClass *parent_class = NULL;
-
-static void
-em_vfs_stream_init (CamelObject *object)
-{
- /*EMVFSStream *emvfs = (EMVFSStream *)object;*/
-}
-
-static void
-em_vfs_stream_finalize (CamelObject *object)
-{
- EMVFSStream *emvfs = (EMVFSStream *)object;
-
- if (emvfs->handle)
- gnome_vfs_close(emvfs->handle);
-}
-
-static void
-emvfs_set_errno(GnomeVFSResult res)
-{
- switch(res) {
- case GNOME_VFS_OK:
- g_warning("em-vfs-stream: calling set_errno with no error");
- break;
- case GNOME_VFS_ERROR_NOT_FOUND:
- case GNOME_VFS_ERROR_HOST_NOT_FOUND:
- case GNOME_VFS_ERROR_INVALID_HOST_NAME:
- case GNOME_VFS_ERROR_HOST_HAS_NO_ADDRESS:
- case GNOME_VFS_ERROR_SERVICE_NOT_AVAILABLE:
- errno = ENOENT;
- break;
- case GNOME_VFS_ERROR_GENERIC:
- case GNOME_VFS_ERROR_INTERNAL:
- case GNOME_VFS_ERROR_IO:
- case GNOME_VFS_ERROR_EOF: /* will be caught by read before here anyway */
- case GNOME_VFS_ERROR_SERVICE_OBSOLETE:
- case GNOME_VFS_ERROR_PROTOCOL_ERROR:
- default:
- errno = EIO;
- break;
- case GNOME_VFS_ERROR_BAD_PARAMETERS:
- case GNOME_VFS_ERROR_NOT_SUPPORTED:
- case GNOME_VFS_ERROR_INVALID_URI:
- case GNOME_VFS_ERROR_NOT_OPEN:
- case GNOME_VFS_ERROR_INVALID_OPEN_MODE:
- case GNOME_VFS_ERROR_NOT_SAME_FILE_SYSTEM:
- errno = EINVAL;
- break;
- case GNOME_VFS_ERROR_CORRUPTED_DATA: /* not sure about these */
- case GNOME_VFS_ERROR_WRONG_FORMAT:
- case GNOME_VFS_ERROR_BAD_FILE:
- errno = EBADF;
- break;
- case GNOME_VFS_ERROR_TOO_BIG:
- errno = E2BIG;
- break;
- case GNOME_VFS_ERROR_NO_SPACE:
- errno = ENOSPC;
- break;
- case GNOME_VFS_ERROR_READ_ONLY:
- case GNOME_VFS_ERROR_READ_ONLY_FILE_SYSTEM:
- errno = EROFS;
- break;
- case GNOME_VFS_ERROR_TOO_MANY_OPEN_FILES:
- errno = EMFILE;
- break;
- case GNOME_VFS_ERROR_NOT_A_DIRECTORY:
- errno = ENOTDIR;
- break;
- case GNOME_VFS_ERROR_IN_PROGRESS:
- errno = EINPROGRESS;
- break;
- case GNOME_VFS_ERROR_INTERRUPTED:
- errno = EINTR;
- break;
- case GNOME_VFS_ERROR_FILE_EXISTS:
- errno = EEXIST;
- case GNOME_VFS_ERROR_LOOP:
- errno = ELOOP;
- break;
- case GNOME_VFS_ERROR_ACCESS_DENIED:
- case GNOME_VFS_ERROR_NOT_PERMITTED:
- case GNOME_VFS_ERROR_LOGIN_FAILED:
- errno = EPERM;
- break;
- case GNOME_VFS_ERROR_IS_DIRECTORY:
- case GNOME_VFS_ERROR_DIRECTORY_NOT_EMPTY: /* ?? */
- errno = EISDIR;
- break;
- case GNOME_VFS_ERROR_NO_MEMORY:
- errno = ENOMEM;
- break;
- case GNOME_VFS_ERROR_CANCELLED:
- errno = EINTR;
- break;
- case GNOME_VFS_ERROR_DIRECTORY_BUSY:
- errno = EBUSY;
- break;
- case GNOME_VFS_ERROR_TOO_MANY_LINKS:
- errno = EMLINK;
- break;
- case GNOME_VFS_ERROR_NAME_TOO_LONG:
- errno = ENAMETOOLONG;
- break;
- }
-}
-
-static ssize_t
-emvfs_read(CamelStream *stream, char *buffer, size_t n)
-{
- EMVFSStream *emvfs = EM_VFS_STREAM (stream);
- GnomeVFSFileSize count;
- GnomeVFSResult res;
-
- if (emvfs->handle == NULL) {
- errno = EINVAL;
- return -1;
- }
-
- /* TODO: handle camel cancellation? */
-
- res = gnome_vfs_read(emvfs->handle, buffer, n, &count);
- if (res == GNOME_VFS_OK)
- return (ssize_t)count;
- else if (res == GNOME_VFS_ERROR_EOF) {
- stream->eos = TRUE;
- return 0;
- }
-
- emvfs_set_errno(res);
-
- return -1;
-}
-
-static ssize_t
-emvfs_write(CamelStream *stream, const char *buffer, size_t n)
-{
- EMVFSStream *emvfs = EM_VFS_STREAM (stream);
- GnomeVFSFileSize count;
- GnomeVFSResult res;
-
- if (emvfs->handle == NULL) {
- errno = EINVAL;
- return -1;
- }
-
- res = gnome_vfs_write(emvfs->handle, buffer, n, &count);
- if (res == GNOME_VFS_OK)
- return (ssize_t)count;
-
- emvfs_set_errno(res);
-
- return -1;
-}
-
-static int
-emvfs_close(CamelStream *stream)
-{
- EMVFSStream *emvfs = EM_VFS_STREAM (stream);
- GnomeVFSResult res;
-
- if (emvfs->handle == NULL) {
- errno = EINVAL;
- return -1;
- }
-
- res = gnome_vfs_close(emvfs->handle);
- emvfs->handle = NULL;
- if (res == GNOME_VFS_OK)
- return 0;
-
- emvfs_set_errno(res);
-
- return -1;
-}
-
-static off_t
-emvfs_seek(CamelSeekableStream *stream, off_t offset, CamelStreamSeekPolicy policy)
-{
- EMVFSStream *emvfs = EM_VFS_STREAM (stream);
- GnomeVFSSeekPosition vpolicy;
- GnomeVFSFileSize pos;
- GnomeVFSResult res;
-
- if (emvfs->handle == NULL) {
- errno = EINVAL;
- return -1;
- }
-
- switch (policy) {
- case CAMEL_STREAM_SET:
- default:
- vpolicy = GNOME_VFS_SEEK_START;
- break;
- case CAMEL_STREAM_CUR:
- vpolicy = GNOME_VFS_SEEK_CURRENT;
- break;
- case CAMEL_STREAM_END:
- vpolicy = GNOME_VFS_SEEK_END;
- break;
- }
-
- if ( (res = gnome_vfs_seek(emvfs->handle, vpolicy, offset)) == GNOME_VFS_OK
- && (res = gnome_vfs_tell(emvfs->handle, &pos)) == GNOME_VFS_OK)
- return pos;
-
- emvfs_set_errno(res);
-
- return -1;
-}
-
-static off_t
-emvfs_tell(CamelSeekableStream *stream)
-{
- EMVFSStream *emvfs = EM_VFS_STREAM (stream);
- GnomeVFSFileSize pos;
- GnomeVFSResult res;
-
- if (emvfs->handle == NULL) {
- errno = EINVAL;
- return -1;
- }
-
- if ((res = gnome_vfs_tell(emvfs->handle, &pos)) == GNOME_VFS_OK)
- return pos;
-
- emvfs_set_errno(res);
-
- return -1;
-}
-
-static void
-em_vfs_stream_class_init (EMVFSStreamClass *klass)
-{
- ((CamelStreamClass *)klass)->read = emvfs_read;
- ((CamelStreamClass *)klass)->write = emvfs_write;
- ((CamelStreamClass *)klass)->close = emvfs_close;
-
- ((CamelSeekableStreamClass *)klass)->seek = emvfs_seek;
- ((CamelSeekableStreamClass *)klass)->tell = emvfs_tell;
- /* set_bounds? */
-}
-
-CamelType
-em_vfs_stream_get_type (void)
-{
- static CamelType type = CAMEL_INVALID_TYPE;
-
- if (type == CAMEL_INVALID_TYPE) {
- parent_class = (CamelStreamClass *)camel_seekable_stream_get_type();
- type = camel_type_register ((CamelType)parent_class,
- "EMVFSStream",
- sizeof (EMVFSStream),
- sizeof (EMVFSStreamClass),
- (CamelObjectClassInitFunc) em_vfs_stream_class_init,
- NULL,
- (CamelObjectInitFunc) em_vfs_stream_init,
- (CamelObjectFinalizeFunc) em_vfs_stream_finalize);
- }
-
- return type;
-}
-
-/**
- * emvfs_stream_new:
- * @handle:
- *
- * Create a new camel stream from a GnomeVFS handle. The camel stream
- * will own the handle from now on.
- *
- * Return value: A CamelStream that will talk to @handle. This function cannot fail.
- **/
-EMVFSStream *
-emvfs_stream_new(GnomeVFSHandle *handle)
-{
- EMVFSStream *emvfs;
-
- emvfs = (EMVFSStream *)camel_object_new(em_vfs_stream_get_type());
- emvfs->handle = handle;
-
- return emvfs;
-}
diff --git a/mail/em-vfs-stream.h b/mail/em-vfs-stream.h
deleted file mode 100644
index 2095472fab..0000000000
--- a/mail/em-vfs-stream.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
- *
- * Authors: Michael Zucchi <notzed@ximian.com>
- *
- * Copyright 2004 Ximian, Inc. (www.ximian.com)
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- *
- */
-
-#ifndef EM_VFS_STREAM_H
-#define EM_VFS_STREAM_H
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-#define EM_VFS_STREAM_TYPE (em_vfs_stream_get_type ())
-#define EM_VFS_STREAM(obj) (CAMEL_CHECK_CAST((obj), EM_VFS_STREAM_TYPE, EMVFSStream))
-#define EM_VFS_STREAM_CLASS(k) (CAMEL_CHECK_CLASS_CAST ((k), EM_VFS_STREAM_TYPE, EMVFSStreamClass))
-#define EM_IS_VFS_STREAM(o) (CAMEL_CHECK_TYPE((o), EM_VFS_STREAM_TYPE))
-
-#include <glib.h>
-#include <camel/camel-seekable-stream.h>
-#include <libgnomevfs/gnome-vfs.h>
-
-typedef struct _EMVFSStream EMVFSStream;
-typedef struct _EMVFSStreamClass EMVFSStreamClass;
-
-struct _EMVFSStream {
- CamelSeekableStream parent_stream;
-
- GnomeVFSHandle *handle;
-};
-
-struct _EMVFSStreamClass {
- CamelSeekableStreamClass parent_class;
-};
-
-CamelType em_vfs_stream_get_type (void);
-EMVFSStream *emvfs_stream_new(GnomeVFSHandle *handle);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* EM_VFS_STREAM_H */
diff --git a/mail/mail-ops.c b/mail/mail-ops.c
index d13740570d..77bb37fa62 100644
--- a/mail/mail-ops.c
+++ b/mail/mail-ops.c
@@ -2016,14 +2016,22 @@ save_messages_exec (struct _save_messages_msg *m)
CamelMimeFilterFrom *from_filter;
CamelStream *stream;
int i;
- char *from;
+ char *from, *path;
- stream = camel_stream_vfs_new_with_uri (m->path, O_WRONLY | O_CREAT | O_TRUNC, 0666);
+ if (strstr (m->path, "://"))
+ path = m->path;
+ else
+ path = g_strjoin (NULL, "file://", m->path, NULL);
+
+ stream = camel_stream_vfs_new_with_uri (path, CAMEL_STREAM_VFS_CREATE);
from_filter = camel_mime_filter_from_new();
filtered_stream = camel_stream_filter_new_with_stream(stream);
camel_stream_filter_add(filtered_stream, (CamelMimeFilter *)from_filter);
camel_object_unref(from_filter);
+ if (path != m->path)
+ g_free (path);
+
for (i=0; i<m->uids->len; i++) {
CamelMimeMessage *message;
int pc = ((i+1) * 100) / m->uids->len;
@@ -2122,21 +2130,34 @@ save_part_exec (struct _save_part_msg *m)
{
CamelDataWrapper *content;
CamelStream *stream;
+ char *path;
+
+ if (strstr (m->path, "://"))
+ path = m->path;
+ else
+ path = g_strjoin (NULL, "file://", m->path, NULL);
if(!m->readonly){
- if (!(stream = camel_stream_vfs_new_with_uri (m->path, O_WRONLY | O_CREAT | O_TRUNC, 0644))) {
+ if (!(stream = camel_stream_vfs_new_with_uri (path, CAMEL_STREAM_VFS_CREATE))) {
camel_exception_setv (&m->base.ex, CAMEL_EXCEPTION_SYSTEM,
_("Cannot create output file: %s:\n %s"),
- m->path, g_strerror (errno));
+ path, g_strerror (errno));
+ if (path != m->path)
+ g_free (path);
return;
}
- } else if (!(stream = camel_stream_vfs_new_with_uri (m->path, O_WRONLY | O_CREAT | O_TRUNC, 0444))) {
+ } else if (!(stream = camel_stream_vfs_new_with_uri (path, CAMEL_STREAM_VFS_CREATE))) {
camel_exception_setv (&m->base.ex, CAMEL_EXCEPTION_SYSTEM,
_("Cannot create output file: %s:\n %s"),
- m->path, g_strerror (errno));
+ path, g_strerror (errno));
+ if (path != m->path)
+ g_free (path);
return;
}
+ if (path != m->path)
+ g_free (path);
+
content = camel_medium_get_content_object (CAMEL_MEDIUM (m->part));
if (camel_data_wrapper_decode_to_stream (content, stream) == -1