aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--calendar/ChangeLog5
-rw-r--r--calendar/importers/.cvsignore6
-rw-r--r--calendar/importers/GNOME_Evolution_Calendar_Importer.oaf.in27
-rw-r--r--calendar/importers/Makefile.am37
-rw-r--r--calendar/importers/evolution-calendar-importer.h34
-rw-r--r--calendar/importers/icalendar-importer.c238
-rw-r--r--calendar/importers/main.c83
7 files changed, 430 insertions, 0 deletions
diff --git a/calendar/ChangeLog b/calendar/ChangeLog
index 5a41faecb9..b881d16f24 100644
--- a/calendar/ChangeLog
+++ b/calendar/ChangeLog
@@ -1,3 +1,8 @@
+2001-10-29 Rodrigo Moya <rodrigo@ximian.com>
+
+ * importers/: added evolution-calendar-importer binary, starting
+ with an iCalendar file importer
+
2001-10-29 JP Rosevear <jpr@ximian.com>
* conduits/todo/todo-conduit-config.h
diff --git a/calendar/importers/.cvsignore b/calendar/importers/.cvsignore
new file mode 100644
index 0000000000..dfa0930c53
--- /dev/null
+++ b/calendar/importers/.cvsignore
@@ -0,0 +1,6 @@
+.deps
+.libs
+Makefile
+Makefile.in
+evolution-calendar-importer
+GNOME_Evolution_Calendar_Importer.oaf
diff --git a/calendar/importers/GNOME_Evolution_Calendar_Importer.oaf.in b/calendar/importers/GNOME_Evolution_Calendar_Importer.oaf.in
new file mode 100644
index 0000000000..35ccf84a66
--- /dev/null
+++ b/calendar/importers/GNOME_Evolution_Calendar_Importer.oaf.in
@@ -0,0 +1,27 @@
+<oaf_info>
+
+<oaf_server iid="OAFIID:GNOME_Evolution_Calendar_ImporterFactory"
+ type="exe"
+ location="evolution-evolution-importer">
+
+ <oaf_attribute name="repo_ids" type="stringv">
+ <item value="IDL:GNOME/ObjectFactory:1.0"/>
+ </oaf_attribute>
+ <oaf_attribute name="description" type="string"
+ _value="Factory to import iCalendar files into Evolution"/>
+</oaf_server>
+
+<oaf_server iid="OAFIID:GNOME_Evolution_Calendar_iCalendar_Importer"
+ type="factory"
+ location="OAFIID:GNOME_Evolution_Calendar_ImporterFactory">
+
+ <oaf_attribute name="repo_ids" type="stringv">
+ <item value="IDL:GNOME/Evolution/Importer:1.0"/>
+ </oaf_attribute>
+ <oaf_attribute name="evolution:menu-name" type="string"
+ value="iCalendar files (.ics)"/>
+ <oaf_attribute name="description" type="string"
+ _value="Imports iCalendar files into Evolution"/>
+
+</oaf_server>
+</oaf_info>
diff --git a/calendar/importers/Makefile.am b/calendar/importers/Makefile.am
new file mode 100644
index 0000000000..b000e2da2c
--- /dev/null
+++ b/calendar/importers/Makefile.am
@@ -0,0 +1,37 @@
+bin_PROGRAMS = evolution-calendar-importer
+
+INCLUDES = \
+ -DEVOLUTION_LOCALEDIR=\""$(localedir)"\" \
+ -DG_LOG_DOMAIN=\"Evolution-Importer\" \
+ -I$(top_srcdir) \
+ -I$(top_builddir)/shell \
+ -I$(top_srcdir)/shell \
+ -I$(top_srcdir)/calendar/cal-client \
+ -I$(top_builddir)/calendar/cal-client \
+ -I$(top_srcdir)/calendar \
+ -I$(top_builddir)/calendar \
+ -I$(top_srcdir)/libical/src/libical \
+ -I$(top_builddir)/libical/src/libical \
+ $(BONOBO_CFLAGS) \
+ $(GNOME_INCLUDEDIR)
+
+evolution_calendar_importer_SOURCES = \
+ icalendar-importer.c \
+ main.c
+
+evolution_calendar_importer_LDADD = \
+ $(top_builddir)/shell/importer/libevolution-importer.la \
+ $(top_builddir)/calendar/cal-util/libcal-util.la \
+ $(top_builddir)/calendar/cal-client/libcal-client.la \
+ $(top_builddir)/libwombat/libwombat.la \
+ $(top_builddir)/libical/src/libical/libical.la \
+ $(EXTRA_GNOME_LIBS)
+
+oafdir = $(datadir)/oaf
+oaf_in_files = GNOME_Evolution_Calendar_Importer.oaf.in
+
+oaf_DATA = $(oaf_in_files:.oaf.in=.oaf)
+
+EXTRA_DIST = $(oaf_in_files) $(oaf_DATA)
+
+@XML_I18N_MERGE_OAF_RULE@
diff --git a/calendar/importers/evolution-calendar-importer.h b/calendar/importers/evolution-calendar-importer.h
new file mode 100644
index 0000000000..ac4d15dd8d
--- /dev/null
+++ b/calendar/importers/evolution-calendar-importer.h
@@ -0,0 +1,34 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/* Evolution calendar importer component
+ *
+ * Authors: Rodrigo Moya <rodrigo@ximian.com>
+ *
+ * Copyright (C) 2001 Ximian, Inc.
+ *
+ * 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 Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef EVOLUTION_CALENDAR_IMPORTER_H
+#define EVOLUTION_CALENDAR_IMPORTER_H
+
+#include <bonobo/bonobo-object.h>
+
+BEGIN_GNOME_DECLS
+
+BonoboObject *ical_importer_new (void);
+
+END_GNOME_DECLS
+
+#endif
diff --git a/calendar/importers/icalendar-importer.c b/calendar/importers/icalendar-importer.c
new file mode 100644
index 0000000000..ab3cffcfa2
--- /dev/null
+++ b/calendar/importers/icalendar-importer.c
@@ -0,0 +1,238 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/* Evolution calendar importer component
+ *
+ * Authors: Rodrigo Moya <rodrigo@ximian.com>
+ *
+ * Copyright (C) 2001 Ximian, Inc.
+ *
+ * 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 Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include <sys/types.h>
+#include <fcntl.h>
+#include <gtk/gtksignal.h>
+#include <cal-client.h>
+#include <importer/evolution-importer.h>
+#include <importer/GNOME_Evolution_Importer.h>
+#include "evolution-calendar-importer.h"
+
+typedef struct {
+ CalClient *client;
+ EvolutionImporter *importer;
+ icalcomponent *icalcomp;
+} ICalImporter;
+
+static void
+importer_destroy_cb (GtkObject *object, gpointer user_data)
+{
+ ICalImporter *ici = (ICalImporter *) user_data;
+
+ g_return_if_fail (ici != NULL);
+
+ gtk_object_unref (GTK_OBJECT (ici->client));
+ if (ici->icalcomp != NULL)
+ icalcomponent_free (ici->icalcomp);
+ g_free (ici);
+}
+
+static gboolean
+support_format_fn (EvolutionImporter *importer,
+ const char *filename,
+ void *closure)
+{
+ int fd;
+ GString *str;
+ icalcomponent *icalcomp;
+ int n;
+ char buffer[2049];
+ gboolean ret = TRUE;
+
+ /* read file contents */
+ fd = open (filename, O_RDONLY);
+ if (fd == -1)
+ return FALSE;
+
+ str = g_string_new ("");
+ while (1) {
+ memset (buffer, 0, sizeof(buffer));
+ n = read (fd, buffer, sizeof (buffer) - 1);
+ if (n > 0) {
+ str = g_string_append (str, buffer);
+ }
+ else if (n == 0)
+ break;
+ else {
+ ret = FALSE;
+ break;
+ }
+ }
+
+ close (fd);
+
+ /* parse the file */
+ if (ret) {
+ icalcomp = icalparser_parse_string (str->str);
+ if (icalcomp)
+ icalcomponent_free (icalcomp);
+ else
+ ret = FALSE;
+ }
+
+ g_string_free (str, TRUE);
+
+ return ret;
+}
+
+static gboolean
+load_file_fn (EvolutionImporter *importer,
+ const char *filename,
+ const char *folderpath,
+ void *closure)
+{
+ int fd;
+ GString *str;
+ icalcomponent *icalcomp;
+ int n;
+ char buffer[2049];
+ char *uri_str;
+ gboolean ret = TRUE;
+ ICalImporter *ici = (ICalImporter *) closure;
+
+ g_return_val_if_fail (ici != NULL, FALSE);
+
+ if (folderpath == NULL || *folderpath == '\0')
+ uri_str = g_strdup_printf ("%s/evolution/local/Calendar/calendar.ics",
+ g_get_home_dir ());
+ else {
+ char *name;
+ char *parent;
+
+ name = strrchr (folderpath, '/');
+ if (!name) {
+ parent = g_strdup ("evolution/local/");
+ name = folderpath;
+ }
+ else {
+ name += 1;
+ parent = g_strdup ("evolution/local/Calendar/subfolders/");
+ }
+ uri_str = g_strdup_printf ("%s/%s%s/calendar.ics", g_get_home_dir (),
+ parent, name);
+ }
+
+ /* read file contents */
+ fd = open (filename, O_RDONLY);
+ if (fd == -1)
+ return FALSE;
+
+ str = g_string_new ("");
+ while (1) {
+ memset (buffer, 0, sizeof(buffer));
+ n = read (fd, buffer, sizeof (buffer) - 1);
+ if (n > 0) {
+ str = g_string_append (str, buffer);
+ }
+ else if (n == 0)
+ break;
+ else {
+ ret = FALSE;
+ break;
+ }
+ }
+
+ close (fd);
+
+ /* parse the file */
+ if (ret) {
+ icalcomp = icalparser_parse_string (str->str);
+ if (icalcomp) {
+ if (!cal_client_open_calendar (ici->client, uri_str, TRUE))
+ ret = FALSE;
+ else
+ ici->icalcomp = icalcomp;
+ }
+ else
+ ret = FALSE;
+ }
+
+ g_string_free (str, TRUE);
+ g_free (uri_str);
+
+ return ret;
+}
+
+static void
+process_item_fn (EvolutionImporter *importer,
+ CORBA_Object listener,
+ void *closure,
+ CORBA_Environment *ev)
+{
+ CalClientLoadState state;
+ ICalImporter *ici = (ICalImporter *) closure;
+
+ g_return_if_fail (ici != NULL);
+ g_return_if_fail (IS_CAL_CLIENT (ici->client));
+ g_return_if_fail (ici->icalcomp != NULL);
+
+ state = cal_client_get_load_state (ici->client);
+ if (state == CAL_CLIENT_LOAD_LOADING) {
+ GNOME_Evolution_ImporterListener_notifyResult (
+ listener,
+ GNOME_Evolution_ImporterListener_NOT_READY,
+ TRUE, ev);
+ return;
+ }
+ else if (state != CAL_CLIENT_LOAD_LOADED) {
+ GNOME_Evolution_ImporterListener_notifyResult (
+ listener,
+ GNOME_Evolution_ImporterListener_UNSUPPORTED_OPERATION,
+ FALSE, ev);
+ return;
+ }
+
+ /* import objects into the given client */
+ if (!cal_client_update_objects (ici->client, ici->icalcomp)) {
+ g_warning ("Could not update objects");
+ GNOME_Evolution_ImporterListener_notifyResult (
+ listener,
+ GNOME_Evolution_ImporterListener_BAD_DATA,
+ FALSE, ev);
+ }
+ else {
+ GNOME_Evolution_ImporterListener_notifyResult (
+ listener,
+ GNOME_Evolution_ImporterListener_OK,
+ FALSE, ev);
+ }
+}
+
+BonoboObject *
+ical_importer_new (void)
+{
+ ICalImporter *ici;
+
+ ici = g_new0 (ICalImporter, 1);
+ ici->client = cal_client_new ();
+ ici->icalcomp = NULL;
+ ici->importer = evolution_importer_new (support_format_fn,
+ load_file_fn,
+ process_item_fn,
+ NULL,
+ ici);
+ gtk_signal_connect (GTK_OBJECT (ici->importer), "destroy",
+ GTK_SIGNAL_FUNC (importer_destroy_cb), ici);
+
+ return BONOBO_OBJECT (ici->importer);
+}
diff --git a/calendar/importers/main.c b/calendar/importers/main.c
new file mode 100644
index 0000000000..aaf4ced23a
--- /dev/null
+++ b/calendar/importers/main.c
@@ -0,0 +1,83 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/* Evolution calendar importer component
+ *
+ * Authors: Rodrigo Moya <rodrigo@ximian.com>
+ *
+ * Copyright (C) 2001 Ximian, Inc.
+ *
+ * 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 Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include <bonobo/bonobo-generic-factory.h>
+#include "evolution-calendar-importer.h"
+
+#define IMPORTER_FACTORY_ID "OAFIID:GNOME_Evolution_Calendar_ImporterFactory"
+#define ICALENDAR_IMPORTER_ID "OAFIID:GNOME_Evolution_Calendar_iCalendar_Importer"
+
+static BonoboObject *
+importer_factory_fn (BonoboGenericFactory *factory, const char *id, void *closure)
+{
+ BonoboObject *object = NULL;
+
+ g_return_val_if_fail (id != NULL, NULL);
+
+ if (!strcmp (id, ICALENDAR_IMPORTER_ID))
+ object = ical_importer_new ();
+ else
+ g_warning ("Component not supporte by this factory");
+
+ return object;
+}
+
+static void
+init_importer (void)
+{
+ BonoboGenericFactory *factory;
+
+ factory = bonobo_generic_factory_new_multi (IMPORTER_FACTORY_ID,
+ importer_factory_fn, NULL);
+ if (factory == NULL) {
+ g_error ("Unable to create factory");
+ exit (0);
+ }
+
+ bonobo_running_context_auto_exit_unref (BONOBO_OBJECT (factory));
+}
+
+int
+main (int argc, char *argv[])
+{
+ CORBA_ORB orb;
+
+ bindtextdomain(PACKAGE, EVOLUTION_LOCALEDIR);
+ textdomain(PACKAGE);
+
+ gnome_init_with_popt_table ("evolution-calendar-importer",
+ VERSION, argc, argv, oaf_popt_options, 0,
+ NULL);
+ orb = oaf_init (argc, argv);
+ if (bonobo_init (orb, CORBA_OBJECT_NIL, CORBA_OBJECT_NIL) == FALSE) {
+ g_error ("Could not initialize Bonobo.");
+ exit (0);
+ }
+
+ init_importer ();
+ bonobo_main ();
+
+ return 0;
+}