diff options
Diffstat (limited to 'mail')
-rw-r--r-- | mail/ChangeLog | 19 | ||||
-rw-r--r-- | mail/Makefile.am | 2 | ||||
-rw-r--r-- | mail/em-config.c | 1 | ||||
-rw-r--r-- | mail/em-format-html-display.c | 186 | ||||
-rw-r--r-- | mail/em-format.c | 12 | ||||
-rw-r--r-- | mail/em-menu.c | 1 | ||||
-rw-r--r-- | mail/em-popup.c | 75 | ||||
-rw-r--r-- | mail/em-utils.c | 53 | ||||
-rw-r--r-- | mail/em-vfs-stream.c | 330 | ||||
-rw-r--r-- | mail/em-vfs-stream.h | 60 | ||||
-rw-r--r-- | mail/mail-ops.c | 33 |
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 |