aboutsummaryrefslogtreecommitdiffstats
path: root/plugins/ipod-sync/ipod-sync.c
diff options
context:
space:
mode:
authorSrinivasa Ragavan <sragavan@novell.com>2005-10-18 17:25:51 +0800
committerSrinivasa Ragavan <sragavan@src.gnome.org>2005-10-18 17:25:51 +0800
commitecc167430b4a2fd2f9418ef753da62a9f1aab891 (patch)
tree4c1ae48a666d6fb290ae7da39f89a0a6e06e3018 /plugins/ipod-sync/ipod-sync.c
parent82af9cb973cc15c93afb2f0dfd2598de009a158b (diff)
downloadgsoc2013-evolution-ecc167430b4a2fd2f9418ef753da62a9f1aab891.tar
gsoc2013-evolution-ecc167430b4a2fd2f9418ef753da62a9f1aab891.tar.gz
gsoc2013-evolution-ecc167430b4a2fd2f9418ef753da62a9f1aab891.tar.bz2
gsoc2013-evolution-ecc167430b4a2fd2f9418ef753da62a9f1aab891.tar.lz
gsoc2013-evolution-ecc167430b4a2fd2f9418ef753da62a9f1aab891.tar.xz
gsoc2013-evolution-ecc167430b4a2fd2f9418ef753da62a9f1aab891.tar.zst
gsoc2013-evolution-ecc167430b4a2fd2f9418ef753da62a9f1aab891.zip
Added iPod sync e-plugin to experimental plugins. Added plugins/ipod-sync
2005-10-18 Srinivasa Ragavan <sragavan@novell.com> * configure.in: Added iPod sync e-plugin to experimental plugins. Added plugins/ipod-sync svn path=/trunk/; revision=30523
Diffstat (limited to 'plugins/ipod-sync/ipod-sync.c')
-rw-r--r--plugins/ipod-sync/ipod-sync.c186
1 files changed, 186 insertions, 0 deletions
diff --git a/plugins/ipod-sync/ipod-sync.c b/plugins/ipod-sync/ipod-sync.c
new file mode 100644
index 0000000000..cdf801765b
--- /dev/null
+++ b/plugins/ipod-sync/ipod-sync.c
@@ -0,0 +1,186 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
+ *
+ * Authors: Srinivasa Ragavan <sragavan@novell.com>
+ *
+ * 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 written from the save-calendar plugin and James Bowes evo-iPod
+ * sync code.
+ *
+ * This provides eplugin support to sync calendar/task/addressbook with iPod
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <glib.h>
+#include <glib/gi18n.h>
+
+#include <libebook/e-book.h>
+#include <libebook/e-contact.h>
+
+#include <libedataserver/e-source.h>
+#include <libedataserverui/e-source-selector.h>
+#include <libecal/e-cal.h>
+#include <calendar/gui/e-cal-popup.h>
+#include <addressbook/gui/widgets/eab-popup.h>
+#include <libgnomevfs/gnome-vfs.h>
+#include <string.h>
+
+#include "format-handler.h"
+#include "evolution-ipod-sync.h"
+
+void org_gnome_sync_calendar (EPlugin *ep, ECalPopupTargetSource *target);
+void org_gnome_sync_tasks (EPlugin *ep, ECalPopupTargetSource *target);
+void org_gnome_sync_addressbook (EPlugin *ep, EABPopupTargetSource *target);
+
+
+static void
+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, message);
+ gtk_dialog_run (GTK_DIALOG (dialog));
+ gtk_widget_destroy (dialog);
+}
+
+static void
+destination_save_addressbook (EPlugin *ep, EABPopupTargetSource *target)
+{
+ EBook *book;
+ EBookQuery *query;
+ GList *contacts, *tmp;
+ ESource *primary_source;
+ gchar *uri;
+ char *dest_uri = NULL;
+ GnomeVFSResult result;
+ GnomeVFSHandle *handle;
+ char *mount = ipod_get_mount();
+
+ /* use g_file api here to build path*/
+ dest_uri = g_strdup_printf("%s/%s/%s", mount, "Contacts", "evolution.vcf");
+ g_free (mount);
+
+ primary_source = e_source_selector_peek_primary_selection (target->selector);
+ uri = e_source_get_uri (primary_source);
+
+ book = e_book_new_from_uri (uri, NULL);
+
+ if (!book
+ || !e_book_open (book, TRUE, NULL)) {
+ g_warning ("Couldn't load addressbook %s", uri);
+ return;
+ }
+
+ /* Let us export some meaning full contacts */
+ query = e_book_query_any_field_contains ("");
+ e_book_get_contacts (book, query, &contacts, NULL);
+ e_book_query_unref (query);
+
+ 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));
+ }
+ }
+
+ if (result == GNOME_VFS_OK) {
+ GnomeVFSFileSize bytes_written;
+
+ for (tmp = contacts; tmp; tmp=tmp->next) {
+ EContact *contact = tmp->data;
+ gchar *temp = e_vcard_to_string (E_VCARD (contact), EVC_FORMAT_VCARD_30);
+ gchar *vcard;
+
+ vcard = g_strconcat(temp, "\r\n", NULL);
+ if ((result = gnome_vfs_write (handle, (gconstpointer) vcard, strlen (vcard), &bytes_written))
+ != GNOME_VFS_OK) {
+ display_error_message (gtk_widget_get_toplevel (GTK_WIDGET (target->selector)),
+ gnome_vfs_result_to_string (result));
+ }
+
+ g_object_unref (contact);
+ g_free (temp);
+ g_free (vcard);
+ }
+ }
+
+ sync();
+
+ if (contacts != NULL)
+ g_list_free (contacts);
+
+ gnome_vfs_close (handle);
+ g_object_unref (book);
+ g_free (dest_uri);
+ g_free (uri);
+}
+
+static void
+destination_save_cal (EPlugin *ep, ECalPopupTargetSource *target, ECalSourceType type)
+{
+ FormatHandler *handler = NULL;
+ char *mount = ipod_get_mount();
+ char *dest_uri = NULL;
+
+ /* The available formathandlers */
+ handler= ical_format_handler_new ();
+
+ dest_uri = g_strdup_printf("%s/%s/%s", mount, "Calendars", (type==E_CAL_SOURCE_TYPE_EVENT)? "evolution-calendar.ics":"evolution-todo.ics");
+
+ handler->save (handler, ep, target, type, dest_uri);
+
+ sync();
+
+ g_free (dest_uri);
+ g_free (mount);
+ g_free (handler);
+}
+
+void
+org_gnome_sync_calendar (EPlugin *ep, ECalPopupTargetSource *target)
+{
+ if (!ipod_check_status(FALSE))
+ return;
+
+ destination_save_cal (ep, target, E_CAL_SOURCE_TYPE_EVENT);
+}
+
+void
+org_gnome_sync_tasks (EPlugin *ep, ECalPopupTargetSource *target)
+{
+ if (!ipod_check_status(FALSE))
+ return;
+
+ destination_save_cal (ep, target, E_CAL_SOURCE_TYPE_TODO);
+}
+
+
+void
+org_gnome_sync_addressbook (EPlugin *ep, EABPopupTargetSource *target)
+{
+ if (!ipod_check_status(FALSE))
+ return;
+
+ destination_save_addressbook (ep, target);
+}