From 9349ecf81c58237e1d8744e5d2d62901949a0569 Mon Sep 17 00:00:00 2001 From: Rodrigo Moya Date: Thu, 21 Oct 2004 01:17:24 +0000 Subject: new plugin for saving a calendar to disk. 2004-10-21 Rodrigo Moya * save-calendar.c: new plugin for saving a calendar to disk. svn path=/trunk/; revision=27661 --- plugins/save-calendar/ChangeLog | 3 + plugins/save-calendar/Makefile.am | 11 ++ .../save-calendar/org-gnome-save-calendar.eplug.in | 14 +++ plugins/save-calendar/save-calendar.c | 126 +++++++++++++++++++++ 4 files changed, 154 insertions(+) create mode 100644 plugins/save-calendar/ChangeLog create mode 100644 plugins/save-calendar/Makefile.am create mode 100644 plugins/save-calendar/org-gnome-save-calendar.eplug.in create mode 100644 plugins/save-calendar/save-calendar.c (limited to 'plugins') diff --git a/plugins/save-calendar/ChangeLog b/plugins/save-calendar/ChangeLog new file mode 100644 index 0000000000..a98c1f8365 --- /dev/null +++ b/plugins/save-calendar/ChangeLog @@ -0,0 +1,3 @@ +2004-10-21 Rodrigo Moya + + * save-calendar.c: new plugin for saving a calendar to disk. \ No newline at end of file diff --git a/plugins/save-calendar/Makefile.am b/plugins/save-calendar/Makefile.am new file mode 100644 index 0000000000..ed29da9d18 --- /dev/null +++ b/plugins/save-calendar/Makefile.am @@ -0,0 +1,11 @@ +INCLUDES = \ + -I$(top_srcdir) \ + $(EVOLUTION_CALENDAR_CFLAGS) + +@EVO_PLUGIN_RULE@ + +plugin_DATA = org-gnome-save-calendar.eplug +plugin_LTLIBRARIES = liborg-gnome-save-calendar.la + +liborg_gnome_save_calendar_la_SOURCES = save-calendar.c +liborg_gnome_save_calendar_la_LDFLAGS = -module -avoid-version diff --git a/plugins/save-calendar/org-gnome-save-calendar.eplug.in b/plugins/save-calendar/org-gnome-save-calendar.eplug.in new file mode 100644 index 0000000000..4fd8816bf4 --- /dev/null +++ b/plugins/save-calendar/org-gnome-save-calendar.eplug.in @@ -0,0 +1,14 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/plugins/save-calendar/save-calendar.c b/plugins/save-calendar/save-calendar.c new file mode 100644 index 0000000000..4ecb5df968 --- /dev/null +++ b/plugins/save-calendar/save-calendar.c @@ -0,0 +1,126 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * + * Authors: Rodrigo Moya + * + * Copyright 2004 Novell, Inc. (www.novell.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., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * + */ + +/* This is prototype code only, this may, or may not, use undocumented + * unstable or private internal function calls. */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#ifdef USE_GTKFILECHOOSER +# include +# include +#else +# include +#endif +#include +#include +#include +#include +#include + +void org_gnome_save_calendar (EPlugin *ep, ECalPopupTargetSource *target); +void org_gnome_save_tasks (EPlugin *ep, ECalPopupTargetSource *target); + +static void +do_save_calendar (EPlugin *ep, ECalPopupTargetSource *target, ECalSourceType type) +{ + ESource *primary_source; + char *dest_uri; + ECal *source_client, *dest_client; + GtkWidget *dialog; + + primary_source = e_source_selector_peek_primary_selection (target->selector); + + /* ask the user for destination file */ +#ifdef USE_GTKFILECHOOSER + dialog = gtk_file_chooser_dialog_new (_("Select destination file"), + NULL, + GTK_FILE_CHOOSER_ACTION_SAVE, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + GTK_STOCK_SAVE, GTK_RESPONSE_OK, + NULL); + gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK); +#else + dialog = gtk_file_selection_new (_("Select destination file")); +#endif + + if (gtk_dialog_run (GTK_DIALOG (dialog)) != GTK_RESPONSE_OK) { + gtk_widget_destroy (dialog); + return; + } + +#ifdef USE_GTKFILECHOOSER + dest_uri = gtk_file_chooser_get_uri (GTK_FILE_CHOOSER (dialog)); +#else + dest_uri = g_strdup (gtk_file_selection_get_filename (GTK_FILE_SELECTION (filesel))); +#endif + gtk_widget_destroy (dialog); + if (!dest_uri) + return; + + /* open source client */ + source_client = e_cal_new (primary_source, type); + if (!e_cal_open (source_client, TRUE, NULL)) { + g_object_unref (source_client); + g_free (dest_uri); + return; + } + + /* open destination client */ + dest_client = e_cal_new_from_uri (dest_uri, type); + if (e_cal_open (dest_client, FALSE, NULL)) { + GList *objects; + + if (e_cal_get_object_list (source_client, "#t", &objects, NULL)) { + while (objects != NULL) { + icalcomponent *icalcomp = objects->data; + + /* FIXME: deal with additions/modifications */ + e_cal_create_object (dest_client, icalcomp, NULL, NULL); + + /* remove item from the list */ + objects = g_list_remove (objects, icalcomp); + icalcomponent_free (icalcomp); + } + } + } + + /* terminate */ + g_object_unref (source_client); + g_object_unref (dest_client); + g_free (dest_uri); +} + +void +org_gnome_save_calendar (EPlugin *ep, ECalPopupTargetSource *target) +{ + do_save_calendar (ep, target, E_CAL_SOURCE_TYPE_EVENT); +} + +void +org_gnome_save_tasks (EPlugin *ep, ECalPopupTargetSource *target) +{ + do_save_calendar (ep, target, E_CAL_SOURCE_TYPE_TODO); +} -- cgit v1.2.3