diff options
-rw-r--r-- | plugins/save-calendar/ChangeLog | 8 | ||||
-rw-r--r-- | plugins/save-calendar/ical-format.c | 68 | ||||
-rw-r--r-- | plugins/save-calendar/save-calendar.c | 1 |
3 files changed, 50 insertions, 27 deletions
diff --git a/plugins/save-calendar/ChangeLog b/plugins/save-calendar/ChangeLog index acfee8b0ca..899809540e 100644 --- a/plugins/save-calendar/ChangeLog +++ b/plugins/save-calendar/ChangeLog @@ -1,3 +1,11 @@ +2005-02-21 Rodrigo Moya <rodrigo@novell.com> + + Fixes #71527 + + * ical-format.c (display_error_message): changed to get a simple + string instead of a GError. + (do_save_calendar_ical): use GNOME-VFS for saving the file. + 2005-01-05 JP Rosevear <jpr@novell.com> * save-calendar.c (ask_destination_and_save): fix build for non diff --git a/plugins/save-calendar/ical-format.c b/plugins/save-calendar/ical-format.c index 680885161c..b6fe797f1d 100644 --- a/plugins/save-calendar/ical-format.c +++ b/plugins/save-calendar/ical-format.c @@ -31,12 +31,14 @@ #else # include <gtk/gtkfilesel.h> #endif +#include <libgnomevfs/gnome-vfs-ops.h> #include <gtk/gtkmessagedialog.h> #include <gtk/gtkstock.h> #include <gtk/gtk.h> #include <libedataserver/e-source.h> #include <libedataserverui/e-source-selector.h> #include <libecal/e-cal.h> +#include <libecal/e-cal-util.h> #include <calendar/gui/e-cal-popup.h> #include <libgnomevfs/gnome-vfs.h> #include <string.h> @@ -44,12 +46,11 @@ #include "format-handler.h" static void -display_error_message (GtkWidget *parent, GError *error) +display_error_message (GtkWidget *parent, const char *message) { GtkWidget *dialog; - dialog = gtk_message_dialog_new (GTK_WINDOW (parent), 0, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, - error->message); + dialog = gtk_message_dialog_new (GTK_WINDOW (parent), 0, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, message); gtk_dialog_run (GTK_DIALOG (dialog)); gtk_widget_destroy (dialog); } @@ -58,8 +59,10 @@ static void do_save_calendar_ical (FormatHandler *handler, EPlugin *ep, ECalPopupTargetSource *target, ECalSourceType type, char *dest_uri) { ESource *primary_source; - ECal *source_client, *dest_client; + ECal *source_client; GError *error = NULL; + GList *objects; + icalcomponent *top_level = NULL; primary_source = e_source_selector_peek_primary_selection (target->selector); @@ -69,47 +72,60 @@ do_save_calendar_ical (FormatHandler *handler, EPlugin *ep, ECalPopupTargetSourc /* open source client */ source_client = e_cal_new (primary_source, type); if (!e_cal_open (source_client, TRUE, &error)) { - display_error_message (gtk_widget_get_toplevel (GTK_WIDGET (target->selector)), error); + display_error_message (gtk_widget_get_toplevel (GTK_WIDGET (target->selector)), error->message); g_object_unref (source_client); g_error_free (error); return; } - /* open destination client */ - error = NULL; - dest_client = e_cal_new_from_uri (dest_uri, type); - if (e_cal_open (dest_client, FALSE, &error)) { - GList *objects; + /* create destination file */ + top_level = e_cal_util_new_top_level (); - if (e_cal_get_object_list (source_client, "#t", &objects, NULL)) { - while (objects != NULL) { - icalcomponent *icalcomp = objects->data; + error = NULL; + if (e_cal_get_object_list (source_client, "#t", &objects, &error)) { + GnomeVFSResult result; + GnomeVFSHandle *handle; - /* FIXME: deal with additions/modifications */ + while (objects != NULL) { + icalcomponent *icalcomp = objects->data; + + icalcomponent_add_component (top_level, icalcomp); - /* FIXME: This stores a directory with one file in it, the user expects only a file */ + /* remove item from the list */ + objects = g_list_remove (objects, icalcomp); + } - /* FIXME: It would be nice if this ical-handler would use gnome-vfs rather than e_cal_* */ + /* save the file */ + result = gnome_vfs_open (&handle, dest_uri, GNOME_VFS_OPEN_WRITE); + if (result != GNOME_VFS_OK) { + if ((result = gnome_vfs_create (&handle, dest_uri, GNOME_VFS_OPEN_WRITE, + TRUE, GNOME_VFS_PERM_USER_ALL)) != GNOME_VFS_OK) { + display_error_message (gtk_widget_get_toplevel (GTK_WIDGET (target->selector)), + gnome_vfs_result_to_string (result)); + } + } - error = NULL; - if (!e_cal_create_object (dest_client, icalcomp, NULL, &error)) { - display_error_message (gtk_widget_get_toplevel (GTK_WIDGET (target->selector)), error); - g_error_free (error); - } + if (result == GNOME_VFS_OK) { + char *ical_str; + GnomeVFSFileSize bytes_written; - /* remove item from the list */ - objects = g_list_remove (objects, icalcomp); - icalcomponent_free (icalcomp); + ical_str = icalcomponent_as_ical_string (top_level); + if ((result = gnome_vfs_write (handle, (gconstpointer) ical_str, strlen (ical_str), &bytes_written)) + != GNOME_VFS_OK) { + display_error_message (gtk_widget_get_toplevel (GTK_WIDGET (target->selector)), + gnome_vfs_result_to_string (result)); } + + gnome_vfs_close (handle); } } else { - display_error_message (gtk_widget_get_toplevel (GTK_WIDGET (target->selector)), error); + display_error_message (gtk_widget_get_toplevel (GTK_WIDGET (target->selector)), error->message); g_error_free (error); } /* terminate */ g_object_unref (source_client); - g_object_unref (dest_client); + icalcomponent_free (top_level); } FormatHandler *ical_format_handler_new (void) diff --git a/plugins/save-calendar/save-calendar.c b/plugins/save-calendar/save-calendar.c index 48a0614704..b2b6d88b4c 100644 --- a/plugins/save-calendar/save-calendar.c +++ b/plugins/save-calendar/save-calendar.c @@ -128,7 +128,6 @@ ask_destination_and_save (EPlugin *ep, ECalPopupTargetSource *target, ECalSource format_handlers = g_list_append (format_handlers, rdf_format_handler_new ()); - /* The Type GtkComboBox */ gtk_box_pack_start (GTK_BOX (extra_widget), GTK_WIDGET (combo), TRUE, TRUE, 0); |