From 2db054edd13e807c85a614262f9647d69cc7f65d726e65f2e4815a5696cc591b Mon Sep 17 00:00:00 2001 From: OBS User autobuild Date: Fri, 27 Aug 2010 19:59:53 +0000 Subject: [PATCH] Accepting request 46443 from GNOME:Factory checked in (request 46443) OBS-URL: https://build.opensuse.org/request/show/46443 OBS-URL: https://build.opensuse.org/package/show/GNOME:Factory/evolution?expand=0&rev=91 --- evolution-2.31.6.tar.bz2 | 3 + evolution-2.31.90.tar.bz2 | 3 - evolution-no-dbus-glib.patch | 42 ++ evolution.changes | 47 -- evolution.spec | 23 +- sharepoint-account-setup.patch | 514 ++++++++++++++++++ sp-meetingworkspace-ui.patch | 945 +++++++++++++++++++++++++++++++++ sp-process-meetings.diff | 440 +++++++++++++++ sp-tasks-setup.diff | 236 ++++++++ 9 files changed, 2201 insertions(+), 52 deletions(-) create mode 100644 evolution-2.31.6.tar.bz2 delete mode 100644 evolution-2.31.90.tar.bz2 create mode 100644 evolution-no-dbus-glib.patch create mode 100644 sharepoint-account-setup.patch create mode 100644 sp-meetingworkspace-ui.patch create mode 100644 sp-process-meetings.diff create mode 100644 sp-tasks-setup.diff diff --git a/evolution-2.31.6.tar.bz2 b/evolution-2.31.6.tar.bz2 new file mode 100644 index 0000000..21901ed --- /dev/null +++ b/evolution-2.31.6.tar.bz2 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a4c36b0773d810cf234ba466904da180af4ea35f270a87d0f7091d938f141d0b +size 31567308 diff --git a/evolution-2.31.90.tar.bz2 b/evolution-2.31.90.tar.bz2 deleted file mode 100644 index 52aa35e..0000000 --- a/evolution-2.31.90.tar.bz2 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a3a667c80cb616552cf67b32e81b5cbe4435a8e3d6de6ca07ae4f41370b6bc58 -size 31784062 diff --git a/evolution-no-dbus-glib.patch b/evolution-no-dbus-glib.patch new file mode 100644 index 0000000..922d835 --- /dev/null +++ b/evolution-no-dbus-glib.patch @@ -0,0 +1,42 @@ +commit 5c49c70d5568a9a68daa5facaa531ab317d1f005 +Author: Fridrich Štrba +Date: Thu Aug 5 01:01:19 2010 +0200 + + We are not using dbus-glib anymore, don't call dbus_g_thread_init + +diff --git a/calendar/gui/alarm-notify/notify-main.c b/calendar/gui/alarm-notify/notify-main.c +index 2696119..799229a 100644 +--- a/calendar/gui/alarm-notify/notify-main.c ++++ b/calendar/gui/alarm-notify/notify-main.c +@@ -57,7 +57,6 @@ main (gint argc, gchar **argv) + textdomain (GETTEXT_PACKAGE); + + g_thread_init (NULL); +- dbus_g_thread_init (); + + #ifdef G_OS_WIN32 + path = g_build_path (";", _e_get_bindir (), g_getenv ("PATH"), NULL); +diff --git a/capplet/anjal-settings-main.c b/capplet/anjal-settings-main.c +index e789f91..ec1019d 100644 +--- a/capplet/anjal-settings-main.c ++++ b/capplet/anjal-settings-main.c +@@ -225,7 +225,6 @@ main (gint argc, gchar *argv[]) + + if (!g_thread_get_initialized ()) + g_thread_init (NULL); +- dbus_g_thread_init (); + + client = gconf_client_get_default(); + +diff --git a/shell/main.c b/shell/main.c +index a525262..82d6e6a 100644 +--- a/shell/main.c ++++ b/shell/main.c +@@ -492,7 +492,6 @@ main (gint argc, gchar **argv) + g_type_init (); + if (!g_thread_get_initialized ()) + g_thread_init (NULL); +- dbus_g_thread_init (); + + #ifdef G_OS_WIN32 + path = g_build_path (";", _e_get_bindir (), g_getenv ("PATH"), NULL); diff --git a/evolution.changes b/evolution.changes index e437f21..d7eac94 100644 --- a/evolution.changes +++ b/evolution.changes @@ -1,50 +1,3 @@ -------------------------------------------------------------------- -Tue Aug 17 10:58:11 CEST 2010 - dimstar@opensuse.org - -- Update to version 2.31.90: - + ESelectionModel, ECanvas, EMsgComposer, EMfolderTreeModel, - EMFormat cleanups. - + Pass an EShell to EMsgComposer instances. - + Pause timline instead of stop. It hides the search animation - texture. - + Add keybindings to tab. - + Remove select-on-focus hack, and replace with new skip-a-parent - chaining hack - + Ensure widgets are registered, without relying on config dialog - setup at startup. - + build: Add libemformat to LDADD for evolution-settings - + Add Histogram of mail trend in clutter tab and enable DnD of - tabs - + Change em_format_redraw() to em_format_queue_redraw(). - + Defer the load / creation of configuration UI with changes to - e_preferences_window to take factory callbacks and store a - reference to the shell. - + Execute calendar search post startup, not - + Make the intention of /tmp more explicit, and rescue people who - happen to have evolution .po files in /tmp from a sad fate - + bgo#624896: Missing icons in table properties - + bgo#605737: Appointment reminder shows icons on buttons - + bgo#624913: Disallow drag-and-drop within the same attachment - bar - + bgo#323142: Signature missing when handling mailto: URI with - body part - + bgo#626724: Folder tree mistakes "mark as unread" as new mail - + bgo#271691: Add a way to view all attachments inline - + bgo#626453: Show attachments inline when printing - + bgo#626090: Only set -fno-strict-aliasing for GCC - + bgo#626059: Welcome messages has incorrect links - + bgo#625847: make signatures work again. -- Drop evolution-no-dbus-glib.patch: fixed upstream. - -------------------------------------------------------------------- -Thu Aug 12 21:23:59 UTC 2010 - dimstar@opensuse.org - -- Finally drop unmaintained sharepoint patches (came from SLE) - + sharepoint-account-setup.patch - + sp-meetingworkspace-ui.patch - + sp-process-meetings.diff - + sp-tasks-setup.diff - ------------------------------------------------------------------- Fri Aug 6 02:11:42 CEST 2010 - vuntz@opensuse.org diff --git a/evolution.spec b/evolution.spec index 066c8ca..947c8b1 100644 --- a/evolution.spec +++ b/evolution.spec @@ -1,5 +1,5 @@ # -# spec file for package evolution (Version 2.31.90) +# spec file for package evolution (Version 2.31.6) # # Copyright (c) 2010 SUSE LINUX Products GmbH, Nuernberg, Germany. # @@ -57,11 +57,13 @@ License: LGPLv2.0 ; LGPLv3 Group: Productivity/Networking/Email/Clients # This should be updated upon major version changes; it should match BASE_VERSION as defined in configure.in. %define evolution_base_version 2.32 -Version: 2.31.90 +Version: 2.31.6 Release: 1 # FIXME: check with upstream/meego if we want to enable clutter for express mode Summary: The Integrated GNOME Mail, Calendar, and Address Book Suite Source0: ftp://ftp.gnome.org/pub/gnome/sources/evolution/2.25/%{name}-%{version}.tar.bz2 +# PATCH-FIX-UPSTREAM evolution-no-dbus-glib.patch vuntz@opensuse.org -- Taken from upstream, there's no use of dbus-glib anymore, so no need to call init functions +Patch0: evolution-no-dbus-glib.patch # PATCH-NEEDS-REBASE calendar-sendbutton.patch -- It also needs a proper description and a bug number Patch7: calendar-sendbutton.patch # PATCH-FIX-OPENSUSE evolution-custom-openldap-includes.patch maw@novell.com -- look for ldap includes in %{_libdir}/evoldap/include @@ -70,16 +72,24 @@ Patch15: evolution-custom-openldap-includes.patch Patch18: bnc-435668-hide-accept.patch # PATCH-FIX-UPSTREAM bnc-435722-book-uri-long.patch bnc#435722 abharath@suse.de -- Book URI: Spills Into Second Column. Patch19: bnc-435722-book-uri-long.patch +# NEEDS-REBASE sharepoint-account-setup.patch pchenthill@suse.de -- This patch allows you to connect to sharepoint servers (WAS: PATCH-FIX-UPSTREAM) +Patch23: sharepoint-account-setup.patch # PATCH-FIX-OPENSUSE bnc-433448-backup-restore-fails.patch bnc433448 abharath@suse.de -- Not required upstream. Patch25: bnc-433448-backup-restore-fails.patch # PATCH-FIX-UPSTREAM bnc-210959-evo-accept-ics.patch bnc210959 pchenthill@novell.com -- Patch yet to be pushed upstream. Patch35: bnc-210959-evo-accept-ics.patch +# PATCH-NEEDS-REBASE sp-tasks-setup.diff pchenthill@suse.de -- Patch needs to be upstreamed. (WAS: PATCH-FIX-UPSTREAM) +Patch36: sp-tasks-setup.diff +# PATCH-NEEDS-REBASE sp-meetingworkspace-ui.patch pchenthill@suse.de -- Patch needs to be upstreamed. (WAS: PATCH-FIX-UPSTREAM) +Patch41: sp-meetingworkspace-ui.patch # PATCH-NEEDS-REBASE bnc-449888-handle-no-workspace.patch bnc449888 pchenthill@suse.de -- Patch needs to be upstreamed. (WAS: PATCH-FIX-UPSTREAM) Patch42: bnc-449888-handle-no-workspace.patch # PATCH-NEEDS-REBASE bnc-440634-forwarded-hide-accept-decline.patch bnc440634 abharath@suse.de -- Make GW understand folders better. (WAS: PATCH-FIX-SLED) Patch53: bnc-440634-forwarded-hide-accept-decline.patch # PATCH-NEEDS-REBASE bnc-445996-address-conflict.patch bnc445996 shashish@suse.de -- Needs to be moved out of glade files. (was PATCH-FIX-SLED) Patch54: bnc-445996-address-conflict.patch +# PATCH-NEEDS-REBASE: sp-process-meetings.diff pchenthill@suse.de -- Fix for bug 449899 (bnc) (WAS: PATCH-FIX-SLED) +Patch101: sp-process-meetings.diff Url: http://gnome.org/projects/evolution/ BuildRoot: %{_tmppath}/%{name}-%{version}-build Recommends: bogofilter @@ -143,6 +153,7 @@ Evolution or embed the existing ones in other applications. %prep %setup -q translation-update-upstream +%patch0 -p1 # %patch7 %if %USE_EVOLDAP %patch15 -p1 @@ -150,13 +161,21 @@ translation-update-upstream # NEEDS REBASE #%patch18 %patch19 +# NEEDS-REBASE +#%patch23 -p1 %patch25 %patch35 # NEEDS-REBASE +#%patch36 -p1 +# NEEDS-REBASE +#%patch41 -p1 +# NEEDS-REBASE #%patch42 -p1 # NEEDS REBASE #%patch53 #%patch54 +# NEEDS-REBASE +#%patch101 -p1 %build autoreconf -f -i diff --git a/sharepoint-account-setup.patch b/sharepoint-account-setup.patch new file mode 100644 index 0000000..1b850b5 --- /dev/null +++ b/sharepoint-account-setup.patch @@ -0,0 +1,514 @@ +diff -ruN evolution-2.27.4.1/configure.ac evolution-2.27.4.1.patched//configure.ac +--- evolution-2.27.4.1/configure.ac 2009-07-15 11:25:24.000000000 +0200 ++++ evolution-2.27.4.1.patched//configure.ac 2009-07-22 13:21:18.000000000 +0200 +@@ -903,6 +903,24 @@ + PKG_CHECK_MODULES([MONO], ["mono"]) + AC_DEFINE(ENABLE_MONO,1,[Define if Mono embedding should be enabled]) + MONO_PLUGIN="mono" ++ PKG_CHECK_MODULES(MONO_PLATFORM, ++ [glib-sharp-2.0, gtk-sharp-2.0, gconf-sharp-2.0, gnome-sharp-2.0, ++ evolution-sharp, ndesk-dbus-1.0, ndesk-dbus-glib-1.0]) ++ AC_SUBST(MONO_PLATFORM_CFLAGS) ++ AC_SUBST(MONO_PLATFORM_LIBS) ++ MONO_BASED_PLUGINS="" ++ ++ dnl Sharepoint account setup ++ AC_ARG_ENABLE([icedesktop], ++ AC_HELP_STRING([--enable-icedesktop], ++ [Build sharepoint provider]), ++ [enable_icedesktop=$enableval],[enable_icedesktop=no]) ++ if test "x${enable_icedesktop}" = "xyes"; then ++ PKG_CHECK_MODULES(ICE_DESKTOP, [Novell.IceDesktop, solvent]) ++ AC_SUBST(ICE_DESKTOP_CFLAGS) ++ AC_SUBST(ICE_DESKTOP_LIBS) ++ MONO_BASED_PLUGINS="$MONO_BASED_PLUGINS sharepoint-account-setup" ++ fi + fi + AC_SUBST(MONO_CFLAGS) + AC_SUBST(MONO_LIBS) +@@ -1714,7 +1732,7 @@ + dnl Add any new plugins here + plugins_base_always="calendar-file calendar-http $CALENDAR_WEATHER itip-formatter plugin-manager default-source addressbook-file startup-wizard mark-all-read groupwise-features groupwise-account-setup mail-account-disable publish-calendar caldav imap-features google-account-setup webdav-account-setup" + +-plugins_base="$plugins_base_always $SA_JUNK_PLUGIN $BF_JUNK_PLUGIN $EXCHANGE_PLUGIN $MONO_PLUGIN " ++plugins_base="$plugins_base_always $SA_JUNK_PLUGIN $BF_JUNK_PLUGIN $EXCHANGE_PLUGIN $MONO_PLUGIN $MONO_BASED_PLUGINS" + all_plugins_base="$plugins_base_always sa-junk-plugin bogo-junk-plugin exchange-operations mono" + + plugins_standard_always="bbdb subject-thread save-calendar select-one-source copy-tool mail-to-task audio-inline mailing-list-actions default-mailer prefer-plain mail-notification attachment-reminder backup-restore email-custom-header templates pst-import vcard-inline" +@@ -1767,6 +1785,11 @@ + msg_plugins="$msg_plugins (and mono)" + fi + ++if test "x${enable_icedesktop}" = "xyes"; then ++ plugins_enabled="$plugins_enabled sharepoint-account-setup" ++ msg_plugins="$msg_plugins (and sharepoint)" ++fi ++ + + if test "x${enable_python}" = "xyes"; then + plugins_enabled="$plugins_enabled python" +@@ -2021,6 +2044,7 @@ + plugins/tnef-attachments/Makefile + plugins/vcard-inline/Makefile + plugins/webdav-account-setup/Makefile ++plugins/sharepoint-account-setup/Makefile + smime/Makefile + smime/lib/Makefile + smime/gui/Makefile +diff -ruN evolution-2.27.4.1/plugins/mono/mono-plugin.c evolution-2.27.4.1.patched//plugins/mono/mono-plugin.c +--- evolution-2.27.4.1/plugins/mono/mono-plugin.c 2009-07-13 09:45:13.000000000 +0200 ++++ evolution-2.27.4.1.patched//plugins/mono/mono-plugin.c 2009-07-22 13:20:43.000000000 +0200 +@@ -81,9 +81,14 @@ + MonoObject *x = NULL, *res; + gpointer *params; + +- g_print ("\n\a epm_invoke in mono-plugin.c in mono plugin loader is called \n\a"); ++ g_print ("\n\a epm_invoke in mono-plugin.c in mono plugin loader is called %s \n\a", epm->location); + + /* we need to do this every time since we may be called from any thread for some uses */ ++ if (!domain) { ++ mono_config_parse (NULL); ++ domain = mono_jit_init (epm->location); ++ } ++ + mono_thread_attach(domain); + + if (p->assembly == NULL) { +@@ -232,8 +237,6 @@ + type = g_type_register_static(e_plugin_get_type(), "EPluginMono", &info, 0); + e_plugin_register_type (type); + d(printf("\nType EPluginMono registered from the mono-plugin-loader\n")); +- domain = mono_jit_init("Evolution"); +- mono_thread_attach(domain); + } + + return GUINT_TO_POINTER(type); +diff -ruN evolution-2.27.4.1/plugins/sharepoint-account-setup/Makefile.am evolution-2.27.4.1.patched//plugins/sharepoint-account-setup/Makefile.am +--- evolution-2.27.4.1/plugins/sharepoint-account-setup/Makefile.am 1970-01-01 01:00:00.000000000 +0100 ++++ evolution-2.27.4.1.patched//plugins/sharepoint-account-setup/Makefile.am 2009-07-22 13:20:43.000000000 +0200 +@@ -0,0 +1,37 @@ ++CSC = gmcs ++ ++ASSEMBLY_NAME = SharepointAccountSetup ++TARGET = $(ASSEMBLY) ++ASSEMBLY = $(ASSEMBLY_NAME).dll ++ ++@EVO_PLUGIN_RULE@ ++ ++CSFILES = SharepointSource.cs SharepointAccount.cs SharepointAccountSetup.cs ++ ++EXTRA_DIST = org-gnome-sharepoint-account-setup.eplug.xml \ ++ org-gnome-sharepoint-ui.xml \ ++ org-gnome-sharepoint-disconnect-ui.xml \ ++ $(CSFILES) ++ ++ASSEMBLIES = \ ++ -r:System \ ++ -r:Mono.Posix \ ++ $(ICE_DESKTOP_LIBS) \ ++ $(MONO_PLATFORM_LIBS) ++ ++CSFLAGS = -noconfig -codepage:utf8 -warn:4 -debug -d:DEBUG $(ASSEMBLIES) ++ ++#endif ++#if ENABLE_RELEASE ++#CSFLAGS = -noconfig -codepage:utf8 -warn:4 ++#endif ++$(ASSEMBLY): $(CSCFILES) ++ $(CSC) -unsafe /out:$(ASSEMBLY) $(CSFLAGS) /target:library $(ASSEMBLIES) $(CSFILES) ++ ++plugin_DATA = $(ASSEMBLY) org-gnome-sharepoint-account-setup.eplug org-gnome-sharepoint-ui.xml org-gnome-sharepoint-disconnect-ui.xml ++ ++BUILT_SOURCES = $(ASSEMBLY) org-gnome-sharepoint-account-setup.eplug ++ ++all: $(ASSEMBLY) ++ ++CLEANFILES = org-gnome-sharepoint-account-setup.eplug $(ASSEMBLY) $(ASSEMBLY).mdb +diff -ruN evolution-2.27.4.1/plugins/sharepoint-account-setup/org-gnome-sharepoint-account-setup.eplug.xml evolution-2.27.4.1.patched//plugins/sharepoint-account-setup/org-gnome-sharepoint-account-setup.eplug.xml +--- evolution-2.27.4.1/plugins/sharepoint-account-setup/org-gnome-sharepoint-account-setup.eplug.xml 1970-01-01 01:00:00.000000000 +0100 ++++ evolution-2.27.4.1.patched//plugins/sharepoint-account-setup/org-gnome-sharepoint-account-setup.eplug.xml 2009-07-22 13:20:43.000000000 +0200 +@@ -0,0 +1,36 @@ ++ ++ ++ ++ ++ <_description>Create a sharepoint account for calendar and tasks ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff -ruN evolution-2.27.4.1/plugins/sharepoint-account-setup/org-gnome-sharepoint-disconnect-ui.xml evolution-2.27.4.1.patched//plugins/sharepoint-account-setup/org-gnome-sharepoint-disconnect-ui.xml +--- evolution-2.27.4.1/plugins/sharepoint-account-setup/org-gnome-sharepoint-disconnect-ui.xml 1970-01-01 01:00:00.000000000 +0100 ++++ evolution-2.27.4.1.patched//plugins/sharepoint-account-setup/org-gnome-sharepoint-disconnect-ui.xml 2009-07-22 13:20:43.000000000 +0200 +@@ -0,0 +1,16 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff -ruN evolution-2.27.4.1/plugins/sharepoint-account-setup/org-gnome-sharepoint-ui.xml evolution-2.27.4.1.patched//plugins/sharepoint-account-setup/org-gnome-sharepoint-ui.xml +--- evolution-2.27.4.1/plugins/sharepoint-account-setup/org-gnome-sharepoint-ui.xml 1970-01-01 01:00:00.000000000 +0100 ++++ evolution-2.27.4.1.patched//plugins/sharepoint-account-setup/org-gnome-sharepoint-ui.xml 2009-07-22 13:20:43.000000000 +0200 +@@ -0,0 +1,16 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff -ruN evolution-2.27.4.1/plugins/sharepoint-account-setup/SharepointAccount.cs evolution-2.27.4.1.patched//plugins/sharepoint-account-setup/SharepointAccount.cs +--- evolution-2.27.4.1/plugins/sharepoint-account-setup/SharepointAccount.cs 1970-01-01 01:00:00.000000000 +0100 ++++ evolution-2.27.4.1.patched//plugins/sharepoint-account-setup/SharepointAccount.cs 2009-07-22 13:20:43.000000000 +0200 +@@ -0,0 +1,165 @@ ++// SharepointAccount.cs created with MonoDevelop ++// User: chen at 12:30 PM 10/21/2008 ++// ++// To change standard headers go to Edit->Preferences->Coding->Standard Headers ++// ++ ++using System; ++using Evolution; ++using NDesk.DBus; ++using Gtk; ++using System.Threading; ++using GLib; ++using Novell.IceDesktop; ++ ++namespace Sharepoint ++{ ++ ++ ++ public class SharepointAccount ++ { ++ static Novell.IceDesktop.IDaemon deskIceDaemon = null; ++ static org.freedesktop.DBus.IBus sessionBus = null; ++ static ObjectPath DaemonPath = new ObjectPath (Novell.IceDesktop.ServiceName.DaemonPath); ++ static string DaemonNamespace = Novell.IceDesktop.ServiceName.DaemonNamespace; ++ static bool initialized = false; ++ static System.Threading.Thread backgroundThread = null; ++ ++ public SharepointAccount() ++ { ++ } ++ ++ public void CreateAccount () ++ { ++ try ++ { ++ if (initialized == false) { ++ BusG.Init (); ++ initialized = true; ++ } ++ ++ ++ sessionBus = Bus.Session.GetObject ("org.freedesktop.DBus", ++ new ObjectPath ("/org/freedesktop/DBus")); ++ sessionBus.NameOwnerChanged += OnDBusNameOwnerChanged; ++ ++ // Force the daemon to start up if it's not already running ++ if (Bus.Session.NameHasOwner (DaemonNamespace) == false) ++ { ++ Bus.Session.StartServiceByName (DaemonNamespace); ++ } ++ ++ ConnectToICEcoreDaemon (); ++ try { deskIceDaemon.CheckAuthentication (String.Empty); } ++ catch (NotAuthenticatedException) ++ { return; } ++ ++ Console.WriteLine ("****** Authenticated"); ++ StartFetchingFolder (); ++ ++ } ++ catch (Exception ex) ++ { ++ Console.WriteLine ("Error creating account: {0}", ex.Message); ++ Console.WriteLine (ex.StackTrace); ++ // Change the status text in the AuthDialog ++ return; ++ } ++ } ++ ++ public void DeleteAccount () ++ { ++ // we remove all share calendars. We currently support creating only one sharepoint account ++ SharepointSource spSource = new SharepointSource (CalSourceType.Event, null, null); ++ spSource.DeleteSources (); ++ spSource.Sync (); ++ } ++ ++ private static void StartFetchingFolder () ++ { ++ if (backgroundThread == null) ++ { ++ backgroundThread = new System.Threading.Thread (new ThreadStart (SetupFolders)); ++ backgroundThread.IsBackground = true; ++ backgroundThread.Start (); ++ } ++ } ++ ++ private static void SetupFolders () ++ { ++ Console.WriteLine ("Getting folders "); ++ AccountInfo accountInfo = deskIceDaemon.GetDefaultAccountInfo (); ++ SharepointSource spSource = new SharepointSource (CalSourceType.Event, accountInfo.username, ++ accountInfo.hostUrl); ++ ++ if (spSource.AccountExists) { ++ Console.WriteLine ("Account already exists"); ++ return; ++ } ++ ++ FileInfo [] workspaces = deskIceDaemon.EnumerateWorkspaces (); ++ foreach (FileInfo workspace in workspaces) ++ { ++ FileInfo[] folders = null; ++ ++ if (spSource.srcType == CalSourceType.Event) ++ folders = deskIceDaemon.GetCalendarFolders (string.Empty, workspace.Id); ++ // else get task folders ++ ++ ++ if (folders.Length == 0) ++ continue; ++ ++ spSource.CreateSources (workspace, folders); ++ } ++ spSource.Sync (); ++ Console.WriteLine ("******* Got folders "); ++ backgroundThread = null; ++ RemoveHandlers (); ++ } ++ ++ private static void RemoveHandlers () ++ { ++ sessionBus.NameOwnerChanged -= OnDBusNameOwnerChanged; ++ deskIceDaemon.Authenticated -= OnAuthenticated; ++ } ++ ++ static void OnAuthenticated (string server, string username) ++ { ++ Console.WriteLine ("Auth done\n"); ++ StartFetchingFolder (); ++ } ++ ++ static void OnDBusNameOwnerChanged (string serviceName, string oldOwner, string newOwner) ++ { ++ ++ Console.WriteLine ("O/p {0} {1}", serviceName, DaemonNamespace); ++ if (serviceName == null) ++ return; ++ if (serviceName.CompareTo (DaemonNamespace) != 0) ++ return; ++ ++ if (oldOwner != null && oldOwner.Length > 0) { ++ // The daemon just went away ++ // TODO: What should the Navigator do if the ICEcore Daemon suddenly exits? ++ Console.WriteLine ("TODO: What should the Navigator do if the ICEcore Daemon suddenly exits?"); ++ } else { ++ // Connect to the new instance of the daemon ++ ConnectToICEcoreDaemon (); ++ } ++ } ++ ++ /// ++ /// Connect with the ICEcore Daemon and register event handlers. ++ /// ++ static void ConnectToICEcoreDaemon () ++ { ++ Console.WriteLine ("Connecting the navigator to the ICEcore Daemon"); ++ // Check DBus to see if the Daemon is currently running ++ deskIceDaemon = ++ Bus.Session.GetObject (DaemonNamespace, DaemonPath); ++ // Set up the daemon event handlers ++ deskIceDaemon.Authenticated += OnAuthenticated; ++ } ++ } ++} +diff -ruN evolution-2.27.4.1/plugins/sharepoint-account-setup/SharepointAccountSetup.cs evolution-2.27.4.1.patched//plugins/sharepoint-account-setup/SharepointAccountSetup.cs +--- evolution-2.27.4.1/plugins/sharepoint-account-setup/SharepointAccountSetup.cs 1970-01-01 01:00:00.000000000 +0100 ++++ evolution-2.27.4.1.patched//plugins/sharepoint-account-setup/SharepointAccountSetup.cs 2009-07-22 13:20:43.000000000 +0200 +@@ -0,0 +1,22 @@ ++using System; ++using Sharepoint; ++using Evolution; ++using GLib; ++using Gtk; ++ ++public class SharePointAccountSetup ++{ ++ public static IntPtr SetupAccount (IntPtr pluginPtr) ++ { ++ SharepointAccount account = new SharepointAccount (); ++ account.CreateAccount (); ++ return (IntPtr) 0; ++ } ++ ++ public static IntPtr RemoveAccount (IntPtr pluginPtr) ++ { ++ SharepointAccount account = new SharepointAccount (); ++ account.DeleteAccount (); ++ return (IntPtr) 0; ++ } ++} +diff -ruN evolution-2.27.4.1/plugins/sharepoint-account-setup/SharepointSource.cs evolution-2.27.4.1.patched//plugins/sharepoint-account-setup/SharepointSource.cs +--- evolution-2.27.4.1/plugins/sharepoint-account-setup/SharepointSource.cs 1970-01-01 01:00:00.000000000 +0100 ++++ evolution-2.27.4.1.patched//plugins/sharepoint-account-setup/SharepointSource.cs 2009-07-22 13:20:43.000000000 +0200 +@@ -0,0 +1,97 @@ ++// SharepointSource.cs created with MonoDevelop ++// User: chen at 1:38 AM 10/21/2008 ++// ++// To change standard headers go to Edit->Preferences->Coding->Standard Headers ++// ++ ++using System; ++using Evolution; ++using Novell.IceDesktop; ++using GConf; ++using System.Collections.Generic; ++ ++namespace Sharepoint ++{ ++ ++ ++ public class SharepointSource ++ { ++ public CalSourceType srcType; ++ readonly string calPath = "/apps/evolution/calendar/sources"; ++ readonly string taskPath = "/apps/evolution/tasks/sources"; ++ static Client client; ++ SourceList srcList; ++ readonly string baseUri = "sharepoint://"; ++ string username; ++ string hostUrl; ++ ++ public SharepointSource(CalSourceType type, string userName, string hosturl) ++ { ++ srcType = type; ++ client = new Client (); ++ username = userName; ++ hostUrl = hosturl; ++ ++ if (type == CalSourceType.Event) ++ srcList = new SourceList (calPath); ++ else ++ srcList = new SourceList (taskPath); ++ } ++ ++ public bool AccountExists ++ { ++ get ++ { ++ foreach (SourceGroup group in srcList.Groups) ++ { ++ if (group.BaseUri == baseUri) ++ return true; ++ } ++ ++ return false; ++ } ++ } ++ ++ public void CreateSources (FileInfo workspace, FileInfo [] folders) ++ { ++ SourceGroup group = new SourceGroup (workspace.DisplayName, baseUri); ++ ++ foreach (FileInfo folder in folders) ++ { ++ Console.WriteLine (workspace.DisplayName + " folder " + folder.DisplayName); ++ string relativeUri = hostUrl + ":" + folder.Id; ++ Source source= new Source (folder.DisplayName, relativeUri); ++ source.SetProperty ("username", username); ++ source.SetProperty ("workspaceid", workspace.Id); ++ source.SetProperty ("Id", folder.Id); ++ source.SetProperty ("Auth","True"); ++ group.AddSource (source, -1); ++ } ++ group.SetProperty ("username", username); ++ srcList.AddGroup (group, -1); ++ } ++ ++ public void Sync () ++ { ++ srcList.Sync (); ++ } ++ ++ public void DeleteSources () ++ { ++ List groupsToRemove = new List (); ++ foreach (SourceGroup group in srcList.Groups) ++ { ++ if (group.BaseUri.StartsWith (baseUri)) ++ { ++ /// Currently we remove all sharepoint calendars ++ groupsToRemove.Add (group); ++ } ++ } ++ ++ foreach (SourceGroup group in groupsToRemove) ++ { ++ srcList.RemoveGroup (group); ++ } ++ } ++ } ++} +diff -ruN evolution-2.27.4.1/ui/evolution.xml evolution-2.27.4.1.patched//ui/evolution.xml +--- evolution-2.27.4.1/ui/evolution.xml 2009-07-13 09:45:14.000000000 +0200 ++++ evolution-2.27.4.1.patched//ui/evolution.xml 2009-07-22 13:20:43.000000000 +0200 +@@ -66,6 +66,8 @@ + + + ++ ++ + + + diff --git a/sp-meetingworkspace-ui.patch b/sp-meetingworkspace-ui.patch new file mode 100644 index 0000000..932dbfc --- /dev/null +++ b/sp-meetingworkspace-ui.patch @@ -0,0 +1,945 @@ +Index: evolution-2.27.2/calendar/gui/dialogs/comp-editor.c +=================================================================== +--- evolution-2.27.2.orig/calendar/gui/dialogs/comp-editor.c ++++ evolution-2.27.2/calendar/gui/dialogs/comp-editor.c +@@ -63,6 +63,7 @@ + #include "../e-cal-popup.h" + #include "../calendar-config-keys.h" + #include "cal-attachment-select-file.h" ++#include "../e-cal-event.h" + #include "widgets/misc/e-attachment-view.h" + #include "widgets/misc/e-attachment-paned.h" + +@@ -100,6 +101,7 @@ struct _CompEditorPrivate { + /* Manages menus and toolbars */ + GtkUIManager *ui_manager; + ++ GtkWidget *vbox; + gchar *summary; + + guint32 attachment_bar_visible : 1; +@@ -1606,11 +1608,11 @@ comp_editor_init (CompEditor *editor) + + container = GTK_WIDGET (editor); + +- widget = gtk_vbox_new (FALSE, 0); +- gtk_container_add (GTK_CONTAINER (container), widget); +- gtk_widget_show (widget); ++ priv->vbox = gtk_vbox_new (FALSE, 0); ++ gtk_container_add (GTK_CONTAINER (editor), priv->vbox); ++ gtk_widget_show (priv->vbox); + +- container = widget; ++ container = priv->vbox; + + widget = comp_editor_get_managed_widget (editor, "/main-menu"); + gtk_box_pack_start (GTK_BOX (container), widget, FALSE, FALSE, 0); +@@ -1955,6 +1957,22 @@ comp_editor_get_ui_manager (CompEditor * + return editor->priv->ui_manager; + } + ++GtkWidget * ++comp_editor_get_vbox (CompEditor *editor) ++{ ++ g_return_val_if_fail (IS_COMP_EDITOR (editor), NULL); ++ ++ return editor->priv->vbox; ++} ++ ++GtkNotebook * ++comp_editor_get_notebook (CompEditor *editor) ++{ ++ g_return_val_if_fail (IS_COMP_EDITOR (editor), NULL); ++ ++ return editor->priv->notebook; ++} ++ + GtkAction * + comp_editor_get_action (CompEditor *editor, + const gchar *action_name) +@@ -2112,9 +2130,15 @@ comp_editor_append_page (CompEditor *edi + + priv->pages = g_list_append (priv->pages, page); + +- if (add) ++ if (add){ + gtk_notebook_append_page (priv->notebook, page_widget, label_widget); + ++ ECalEvent *ec_event = e_cal_event_peek (); ++ ECalEventTargetCompEditor *target; ++ target = e_cal_event_target_comp_editor (ec_event, editor); ++ e_event_emit ((EEvent *) ec_event, "editor.append", (EEventTarget *) target); ++ } ++ + /* Listen for things happening on the page */ + g_signal_connect_swapped ( + page, "dates_changed", +Index: evolution-2.27.2/calendar/gui/dialogs/event-editor.c +=================================================================== +--- evolution-2.27.2.orig/calendar/gui/dialogs/event-editor.c ++++ evolution-2.27.2/calendar/gui/dialogs/event-editor.c +@@ -38,6 +38,7 @@ + #include + #include + ++#include "../e-cal-event.h" + #include "event-page.h" + #include "recurrence-page.h" + #include "schedule-page.h" +@@ -65,7 +66,7 @@ static const gchar *ui = + "" + " " + " " +-" " ++" " + " " + " " + " " +@@ -103,6 +104,17 @@ static gboolean event_editor_send_comp ( + + G_DEFINE_TYPE (EventEditor, event_editor, TYPE_COMP_EDITOR) + ++ ++CompEditorPage* ++event_editor_get_event_page (CompEditor *editor) ++{ ++ EventEditorPrivate *priv; ++ ++ priv = EVENT_EDITOR_GET_PRIVATE (editor); ++ ++ return priv->event_page; ++} ++ + static void + create_schedule_page (CompEditor *editor) + { +@@ -334,6 +346,11 @@ event_editor_constructor (GType type, + event_page_set_meeting (priv->event_page, TRUE); + priv->meeting_shown=TRUE; + } ++ ++ ECalEvent *ec_event = e_cal_event_peek (); ++ ECalEventTargetCompEditor *target; ++ target = e_cal_event_target_comp_editor (ec_event, editor); ++ e_event_emit ((EEvent *) ec_event, "editor.inited", (EEventTarget *) target); + + return object; + } +@@ -496,7 +513,6 @@ event_editor_init (EventEditor *ee) + } + + /* Hide send options. */ +- action = comp_editor_get_action (editor, "send-options"); + gtk_action_set_visible (action, FALSE); + + g_signal_connect ( +Index: evolution-2.27.2/calendar/gui/dialogs/event-editor.h +=================================================================== +--- evolution-2.27.2.orig/calendar/gui/dialogs/event-editor.h ++++ evolution-2.27.2/calendar/gui/dialogs/event-editor.h +@@ -68,6 +68,7 @@ GType event_editor_get_type (void); + CompEditor * event_editor_new (ECal *client, + CompEditorFlags flags); + void event_editor_show_meeting (EventEditor *ee); ++CompEditorPage* event_editor_get_event_page (CompEditor *editor); + + G_END_DECLS + +Index: evolution-2.27.2/calendar/gui/dialogs/event-page.c +=================================================================== +--- evolution-2.27.2.orig/calendar/gui/dialogs/event-page.c ++++ evolution-2.27.2/calendar/gui/dialogs/event-page.c +@@ -714,6 +714,26 @@ create_image_event_box (const char *imag + return box; + } + ++GtkWidget * ++event_page_get_toplevel_widget (CompEditorPage *page) ++{ ++ EventPagePrivate *priv; ++ ++ priv = EVENT_PAGE_GET_PRIVATE (page); ++ ++ return priv->main; ++} ++ ++GtkWidget * ++get_event_page_widget (EventPage *epage) ++{ ++ EventPagePrivate *priv; ++ ++ priv = EVENT_PAGE_GET_PRIVATE (epage); ++ ++ return priv->hour_selector; ++} ++ + static void + sensitize_widgets (EventPage *epage) + { +Index: evolution-2.27.2/calendar/gui/dialogs/event-page.h +=================================================================== +--- evolution-2.27.2.orig/calendar/gui/dialogs/event-page.h ++++ evolution-2.27.2/calendar/gui/dialogs/event-page.h +@@ -110,6 +110,8 @@ void event_page_add_attendee (EventPag + EMeetingAttendee *attendee); + void event_page_remove_all_attendees (EventPage *epage); + ++GtkWidget * get_event_page_widget (EventPage *epage); ++ + G_END_DECLS + + #endif +Index: evolution-2.27.2/calendar/gui/e-cal-event.c +=================================================================== +--- evolution-2.27.2.orig/calendar/gui/e-cal-event.c ++++ evolution-2.27.2/calendar/gui/e-cal-event.c +@@ -103,6 +103,16 @@ e_cal_event_target_new_component (ECalEv + return t; + } + ++ECalEventTargetCompEditor * ++e_cal_event_target_comp_editor (ECalEvent *ec_event, struct _CompEditor *editor) ++{ ++ ECalEventTargetCompEditor *t = e_event_target_new (&ec_event->event, E_CAL_EVENT_TARGET_COMP_EDITOR, sizeof (*t)); ++ ++ t->editor = g_object_ref (editor); ++ ++ return t; ++} ++ + /* ********************************************************************** */ + + static void *eceh_parent_class; +@@ -112,11 +122,18 @@ static const EEventHookTargetMask eceh_c + { NULL }, + }; + ++static const EEventHookTargetMask eceh_compeditor_masks[] = { ++ { "inited", E_CAL_EVENT_COMPEDITOR_INITED }, ++ { NULL }, ++}; ++ + static const EEventHookTargetMap eceh_targets[] = { + { "component", E_CAL_EVENT_TARGET_COMPONENT, eceh_component_masks }, ++ { "compeditor", E_CAL_EVENT_TARGET_COMP_EDITOR, eceh_compeditor_masks }, + { NULL }, + }; + ++ + static void + eceh_finalize (GObject *o) + { +Index: evolution-2.27.2/calendar/gui/e-cal-event.h +=================================================================== +--- evolution-2.27.2.orig/calendar/gui/e-cal-event.h ++++ evolution-2.27.2/calendar/gui/e-cal-event.h +@@ -37,7 +37,8 @@ typedef struct _ECalEvent ECalEvent; + typedef struct _ECalEventClass ECalEventClass; + + enum _e_cal_event_target_t { +- E_CAL_EVENT_TARGET_COMPONENT ++ E_CAL_EVENT_TARGET_COMPONENT, ++ E_CAL_EVENT_TARGET_COMP_EDITOR + }; + + /* Flags that describe TARGET_COMPONENT */ +@@ -45,6 +46,11 @@ enum { + E_CAL_EVENT_COMPONENT_MIGRATION = 1 << 0 + }; + ++ ++enum { ++ E_CAL_EVENT_COMPEDITOR_INITED = 1 << 0, ++}; ++ + typedef struct _ECalEventTargetComponent ECalEventTargetComponent; + + struct _ECalEventTargetComponent { +@@ -53,6 +59,14 @@ struct _ECalEventTargetComponent { + struct _CalendarComponent *component; + }; + ++ ++typedef struct _ECalEventTargetCompEditor ECalEventTargetCompEditor; ++ ++struct _ECalEventTargetCompEditor { ++ EEventTarget target; ++ struct _CompEditor *editor; ++}; ++ + struct _ECalEvent { + EEvent event; + +@@ -66,6 +80,7 @@ struct _ECalEventClass { + GType e_cal_event_get_type (void); + ECalEvent* e_cal_event_peek (void); + ECalEventTargetComponent* e_cal_event_target_new_component (ECalEvent *ece, struct _CalendarComponent *component, guint32 flags); ++ECalEventTargetCompEditor * e_cal_event_target_comp_editor (ECalEvent *ec_event, struct _CompEditor *editor); + + /* ********************************************************************** */ + +Index: evolution-2.27.2/plugins/sharepoint-features/Makefile.am +=================================================================== +--- /dev/null ++++ evolution-2.27.2/plugins/sharepoint-features/Makefile.am +@@ -0,0 +1,40 @@ ++INCLUDES = \ ++ -I$(top_srcdir) \ ++ -I$(top_builddir)/shell \ ++ -I$(top_srcdir)/widgets \ ++ -I$(top_srcdir)/widgets/misc \ ++ -I$(top_builddir)/calendar/gui \ ++ -I$(top_builddir)/calendar/gui/dialogs \ ++ $(EVOLUTION_CALENDAR_CFLAGS) \ ++ -DEVOLUTION_GLADEDIR=\""$(gladedir)"\" \ ++ -DCONNECTOR_GLADEDIR=\""$(gladedir)"\" \ ++ $(SOURCE_SEL_CFLAGS) ++ ++ ++@EVO_PLUGIN_RULE@ ++ ++plugin_DATA = \ ++ org-gnome-sharepoint-features.eplug ++ ++plugin_LTLIBRARIES = liborg-gnome-sharepoint-features.la ++ ++liborg_gnome_sharepoint_features_la_SOURCES = \ ++ meeting-workspace.c ++ ++liborg_gnome_sharepoint_features_la_LIBADD = \ ++ $(top_builddir)/e-util/libeutil.la \ ++ $(top_builddir)/calendar/gui/libevolution-calendar.la \ ++ $(top_builddir)/widgets/misc/libemiscwidgets.la \ ++ $(NO_UNDEFINED_REQUIRED_LIBS) \ ++ $(EVOLUTION_CALENDAR_LIBS) ++liborg_gnome_sharepoint_features_la_LDFLAGS = -module -avoid-version $(NO_UNDEFINED) ++ ++glade_DATA = meetingworkspaces.glade ++ ++EXTRA_DIST = \ ++ org-gnome-sharepoint-features.eplug.xml \ ++ $(glade_DATA) ++ ++BUILT_SOURCES = org-gnome-sharepoint-features.eplug ++ ++CLEANFILES = $(BUILT_SOURCES) +Index: evolution-2.27.2/plugins/sharepoint-features/meetingworkspaces.glade +=================================================================== +--- /dev/null ++++ evolution-2.27.2/plugins/sharepoint-features/meetingworkspaces.glade +@@ -0,0 +1,324 @@ ++ ++ ++ ++ ++ ++ ++ True ++ Meeting Workspace ++ GTK_WINDOW_TOPLEVEL ++ GTK_WIN_POS_NONE ++ False ++ True ++ False ++ True ++ False ++ False ++ GDK_WINDOW_TYPE_HINT_DIALOG ++ GDK_GRAVITY_NORTH_WEST ++ True ++ False ++ True ++ ++ ++ ++ True ++ False ++ 0 ++ ++ ++ ++ True ++ GTK_BUTTONBOX_END ++ ++ ++ ++ True ++ True ++ True ++ gtk-cancel ++ True ++ GTK_RELIEF_NORMAL ++ True ++ -6 ++ ++ ++ ++ ++ ++ True ++ True ++ True ++ gtk-ok ++ True ++ GTK_RELIEF_NORMAL ++ True ++ -5 ++ ++ ++ ++ ++ 0 ++ False ++ True ++ GTK_PACK_END ++ ++ ++ ++ ++ ++ 12 ++ True ++ False ++ 12 ++ ++ ++ ++ True ++ True ++ C_reate meeting workspace ++ True ++ GTK_RELIEF_NORMAL ++ True ++ False ++ False ++ True ++ ++ ++ 0 ++ False ++ False ++ ++ ++ ++ ++ ++ 12 ++ True ++ 2 ++ 2 ++ False ++ 12 ++ 12 ++ ++ ++ ++ True ++ T_itle: ++ True ++ False ++ GTK_JUSTIFY_LEFT ++ False ++ False ++ 0 ++ 0.5 ++ 0 ++ 0 ++ title-entry ++ PANGO_ELLIPSIZE_NONE ++ -1 ++ False ++ 0 ++ ++ ++ ++ ++ ++ 0 ++ 1 ++ 0 ++ 1 ++ fill ++ ++ ++ ++ ++ ++ ++ True ++ T_emplate: ++ True ++ False ++ GTK_JUSTIFY_LEFT ++ False ++ False ++ 0 ++ 0.5 ++ 0 ++ 0 ++ PANGO_ELLIPSIZE_NONE ++ -1 ++ False ++ 0 ++ ++ ++ ++ ++ ++ 0 ++ 1 ++ 1 ++ 2 ++ fill ++ ++ ++ ++ ++ ++ ++ True ++ True ++ True ++ True ++ 0 ++ ++ True ++ ++ False ++ ++ ++ ++ ++ ++ 1 ++ 2 ++ 0 ++ 1 ++ ++ ++ ++ ++ ++ ++ True ++ Basic Meeting Workspace ++Blank Meeting Workspace ++Decision Meeting Workspace ++Social Meeting Workspace ++Multipage Meeting Workspace ++ False ++ True ++ True ++ ++ ++ ++ ++ ++ 1 ++ 2 ++ 1 ++ 2 ++ fill ++ fill ++ ++ ++ ++ ++ 0 ++ True ++ True ++ ++ ++ ++ ++ ++ True ++ True ++ _Link to existing workspace ++ True ++ GTK_RELIEF_NORMAL ++ True ++ False ++ False ++ True ++ create-radio ++ ++ ++ 0 ++ False ++ False ++ ++ ++ ++ ++ ++ 12 ++ True ++ False ++ 12 ++ ++ ++ ++ True ++ Wo_rkspaces: ++ True ++ False ++ GTK_JUSTIFY_LEFT ++ False ++ False ++ 0.5 ++ 0.5 ++ 0 ++ 0 ++ PANGO_ELLIPSIZE_NONE ++ -1 ++ False ++ 0 ++ ++ ++ ++ ++ ++ 0 ++ False ++ False ++ ++ ++ ++ ++ ++ True ++ False ++ True ++ True ++ ++ ++ ++ ++ ++ 0 ++ True ++ True ++ ++ ++ ++ ++ 0 ++ True ++ True ++ ++ ++ ++ ++ 0 ++ True ++ True ++ ++ ++ ++ ++ ++ True ++ True ++ ++ ++ 0 ++ False ++ False ++ ++ ++ ++ ++ ++ ++ +Index: evolution-2.27.2/plugins/sharepoint-features/org-gnome-sharepoint-features.eplug.xml +=================================================================== +--- /dev/null ++++ evolution-2.27.2/plugins/sharepoint-features/org-gnome-sharepoint-features.eplug.xml +@@ -0,0 +1,20 @@ ++ ++ ++ ++ <_description>Plugin to create or link to a meeting workspace ++ ++ ++ ++ ++ ++ ++ ++ +Index: evolution-2.27.2/plugins/sharepoint-features/meeting-workspace.c +=================================================================== +--- /dev/null ++++ evolution-2.27.2/plugins/sharepoint-features/meeting-workspace.c +@@ -0,0 +1,230 @@ ++#ifdef HAVE_CONFIG_H ++#include ++#endif ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++static void action_meeting_workspace (GtkAction *action, EventEditor *editor); ++void org_gnome_meeting_workspace (EPlugin *ep, ECalEventTargetCompEditor *target); ++ ++static const gchar *ui = ++"" ++" " ++" " ++" " ++""; ++ ++static GtkActionEntry meeting_entries[] = { ++ { "meeting-workspace", ++ "stock_people", ++ N_("Meeting Workspace"), ++ NULL, ++ N_("Create or Link to Meeting Workspaces"), ++ G_CALLBACK (action_meeting_workspace) } ++}; ++ ++typedef struct { ++ GtkWidget *dialog; ++ GtkWidget *title_entry; ++ GtkWidget *template_label; ++ GtkWidget *template_combo; ++ GtkWidget *create_radio; ++ GtkWidget *link_radio; ++ GtkWidget *workspace_label; ++ GtkWidget *workspace_combo; ++ GtkWidget *statusbar; ++ gboolean got_workspaces; ++ guint contextid; ++ ++ EventEditor *editor; ++} MeetingWorkspaceWidget; ++ ++static DBusGProxy * ++get_dice_dbus_proxy () ++{ ++ GError *err = NULL; ++ DBusGConnection *conn = dbus_g_bus_get (DBUS_BUS_SESSION, &err); ++ if (!conn) { ++ g_printerr ("Failed to connect: %s\n", err->message); ++ g_error_free (err); ++ return NULL; ++ } ++ ++ return dbus_g_proxy_new_for_name (conn, "Novell.ICEDesktop.Daemon", "/Novell/ICEDesktop/Daemon", ++ "Novell.ICEDesktop.Daemon"); ++} ++ ++static MeetingWorkspaceWidget * ++setup_widgets (void) ++{ ++ char *gladefile; ++ GladeXML *xml; ++ MeetingWorkspaceWidget *mws; ++ ++ gladefile = g_build_filename (EVOLUTION_GLADEDIR, "meetingworkspaces.glade", NULL); ++ xml = glade_xml_new (gladefile, NULL, NULL); ++#define GW(name) glade_xml_get_widget (xml, name) ++ ++ mws = g_new0 (MeetingWorkspaceWidget, 1); ++ mws->dialog = GW("meeting-workspace-dialog"); ++ mws->title_entry = GW("title-entry"); ++ mws->template_label = GW("template-label"); ++ mws->template_combo = GW("template-combo"); ++ mws->create_radio = GW("create-radio"); ++ mws->link_radio = GW("link-radio"); ++ mws->workspace_label = GW("workspaces-label"); ++ mws->workspace_combo = GW("workspaces-combo"); ++ mws->statusbar = GW("statusbar"); ++ ++ return mws; ++} ++ ++static void ++create_toggled_cb (GtkToggleButton *create_radio, gpointer user_data) ++{ ++ gboolean active; ++ MeetingWorkspaceWidget *mws = user_data; ++ ++ active = gtk_toggle_button_get_active (create_radio); ++ ++ gtk_entry_set_editable ((GtkEntry *)mws->title_entry, active); ++ gtk_widget_set_sensitive (mws->template_combo, active); ++} ++ ++static void ++link_toggled_cb (GtkToggleButton *link_radio, gpointer user_data) ++{ ++ gboolean active; ++ MeetingWorkspaceWidget *mws = user_data; ++ ++ active = gtk_toggle_button_get_active (link_radio); ++ gtk_widget_set_sensitive (mws->workspace_combo, active); ++ ++ if (active && !mws->got_workspaces) { ++ gtk_statusbar_push ((GtkStatusbar *)mws->statusbar, mws->contextid, ++ _("Loading Meeting workspaces...")); ++ ++ // Get the meeting workspaces and set them ++ ++ mws->got_workspaces = TRUE; ++ } ++} ++ ++static void ++release_memory (MeetingWorkspaceWidget *mws) ++{ ++ ++} ++ ++static void ++dialog_response_cb (GtkDialog *dialog, int response_id, gpointer user_data) ++{ ++ MeetingWorkspaceWidget *mws = user_data; ++ ++ if (response_id == GTK_RESPONSE_OK) { ++ gboolean active; ++ const char *workspace_url = NULL; ++ ECalComponent *comp; ++ ++ active = gtk_toggle_button_get_active ((GtkToggleButton *) mws->link_radio); ++ ++ if (active) { ++ // Get the workspace from combo box selection ++ } else { ++ // Create the meeting workspace ++ const char *title; ++ ++ title = gtk_entry_get_text ((GtkEntry *) mws->title_entry); ++ ++ if (!title || !*title) { ++ gtk_statusbar_push ((GtkStatusbar *) mws->statusbar, mws->contextid, ++ _("Please set a title and press OK.")); ++ return; ++ } ++ ++ gtk_statusbar_push ((GtkStatusbar *) mws->statusbar, mws->contextid, ++ _("Creating Meeting Workspace. Please wait...")); ++ // Create Meeting Workspace ++ } ++ ++ // Set the workspace url to component ++ comp = comp_editor_get_comp ((CompEditor *) mws->editor); ++ } ++ ++ gtk_widget_destroy (mws->dialog); ++ release_memory (mws); ++} ++ ++static void ++init_widgets (MeetingWorkspaceWidget *mws) ++{ ++ g_signal_connect((mws->create_radio), "toggled", ++ G_CALLBACK (create_toggled_cb), mws); ++ ++ g_signal_connect((mws->link_radio), "toggled", ++ G_CALLBACK (link_toggled_cb), mws); ++ ++ g_signal_connect((mws->dialog), "response", ++ G_CALLBACK (dialog_response_cb), mws); ++ ++ gtk_widget_set_sensitive (mws->workspace_combo, FALSE); ++ ++ gtk_combo_box_set_active ((GtkComboBox *) mws->template_combo, 0); ++ ++ mws->contextid = gtk_statusbar_get_context_id ((GtkStatusbar *)mws->statusbar, "Meeting workspace status"); ++} ++ ++static void ++action_meeting_workspace (GtkAction *action, EventEditor *editor) ++{ ++ MeetingWorkspaceWidget *mws; ++ ++ mws = setup_widgets (); ++ init_widgets (mws); ++ mws->editor = editor; ++ ++ gtk_dialog_run ((GtkDialog *) mws->dialog); ++ g_print ("Clicked meeting workspace \n"); ++} ++ ++void ++org_gnome_meeting_workspace (EPlugin *ep, ECalEventTargetCompEditor *target) ++{ ++ GtkActionGroup *action_group; ++ GtkUIManager *manager; ++ GError *error = NULL; ++ CompEditor *editor = target->editor; ++ CompEditorFlags flags; ++ ECal *client; ++ const char *uri; ++ ++ client = comp_editor_get_client (editor); ++ uri = e_cal_get_uri (client); ++ flags = comp_editor_get_flags (editor); ++ ++ if (!g_str_has_prefix (uri, "sharepoint://")) ++ return; ++ ++ if (!(flags & COMP_EDITOR_MEETING && flags & COMP_EDITOR_NEW_ITEM)) ++ return; ++ ++ action_group = comp_editor_get_action_group (editor, "coordinated"); ++ gtk_action_group_add_actions (action_group, meeting_entries, ++ G_N_ELEMENTS (meeting_entries), editor); ++ ++ manager = comp_editor_get_ui_manager (editor); ++ gtk_ui_manager_add_ui_from_string (manager, ui, -1, &error); ++ if (error != NULL) { ++ g_critical ("%s: %s", G_STRFUNC, error->message); ++ g_error_free (error); ++ } ++} +Index: evolution-2.27.2/configure.ac +=================================================================== +--- evolution-2.27.2.orig/configure.ac ++++ evolution-2.27.2/configure.ac +@@ -965,6 +965,9 @@ if test "x${enable_mono}" = "xyes"; then + evolution-sharp, ndesk-dbus-1.0, ndesk-dbus-glib-1.0]) + AC_SUBST(MONO_PLATFORM_CFLAGS) + AC_SUBST(MONO_PLATFORM_LIBS) ++ PKG_CHECK_MODULES(DBUS, dbus-glib-1) ++ AC_SUBST(DBUS_CFLAGS) ++ AC_SUBST(DBUS_LIBS) + MONO_BASED_PLUGINS="" + + dnl Sharepoint account setup +@@ -976,7 +979,7 @@ if test "x${enable_mono}" = "xyes"; then + PKG_CHECK_MODULES(ICE_DESKTOP, [Novell.IceDesktop, solvent]) + AC_SUBST(ICE_DESKTOP_CFLAGS) + AC_SUBST(ICE_DESKTOP_LIBS) +- MONO_BASED_PLUGINS="$MONO_BASED_PLUGINS sharepoint-account-setup" ++ MONO_BASED_PLUGINS="$MONO_BASED_PLUGINS sharepoint-account-setup sharepoint-features" + fi + fi + AC_SUBST(MONO_CFLAGS) +@@ -2161,6 +2164,7 @@ plugins/tnef-attachments/Makefile + plugins/vcard-inline/Makefile + plugins/webdav-account-setup/Makefile + plugins/sharepoint-account-setup/Makefile ++plugins/sharepoint-features/Makefile + smime/Makefile + smime/lib/Makefile + smime/gui/Makefile diff --git a/sp-process-meetings.diff b/sp-process-meetings.diff new file mode 100644 index 0000000..36df3b8 --- /dev/null +++ b/sp-process-meetings.diff @@ -0,0 +1,440 @@ +commit 18a2f5f1206e7a7583db2b8c47862f79abf13e50 +Author: chenthill +Date: Tue Dec 30 05:00:06 2008 +0530 + + process meetings. + +diff --git a/calendar/gui/dialogs/comp-editor.c b/calendar/gui/dialogs/comp-editor.c +index 8d889bd..e1555d8 100644 +--- a/calendar/gui/dialogs/comp-editor.c ++++ b/calendar/gui/dialogs/comp-editor.c +@@ -792,6 +792,13 @@ save_comp (CompEditor *editor) + + e_cal_component_set_attachment_list (priv->comp, + get_attachment_list (editor)); ++ ++ /* Give a chance for plugins to act on the component */ ++ ECalEvent *ec_event = e_cal_event_peek (); ++ ECalEventTargetCompEditor *target; ++ target = e_cal_event_target_comp_editor (ec_event, editor); ++ e_event_emit ((EEvent *) ec_event, "editor.commit", (EEventTarget *) target); ++ + icalcomp = e_cal_component_get_icalcomponent (priv->comp); + /* send the component to the server */ + if (!cal_comp_is_on_server (priv->comp, priv->client)) { +diff --git a/plugins/sharepoint-features/Makefile.am b/plugins/sharepoint-features/Makefile.am +index f101059..9123b66 100644 +--- a/plugins/sharepoint-features/Makefile.am ++++ b/plugins/sharepoint-features/Makefile.am +@@ -19,7 +19,9 @@ plugin_DATA = \ + plugin_LTLIBRARIES = liborg-gnome-sharepoint-features.la + + liborg_gnome_sharepoint_features_la_SOURCES = \ +- meeting-workspace.c ++ process-meeting.c \ ++ comp-commit.c \ ++ meeting-workspace.c + + liborg_gnome_sharepoint_features_la_LIBADD = \ + $(top_builddir)/e-util/libeutil.la \ +@@ -33,6 +35,7 @@ glade_DATA = meetingworkspaces.glade + + EXTRA_DIST = \ + org-gnome-sharepoint-features.eplug.xml \ ++ org-gnome-share-point.error.xml \ + $(glade_DATA) + + BUILT_SOURCES = org-gnome-sharepoint-features.eplug +diff --git a/plugins/sharepoint-features/org-gnome-sharepoint-features.eplug.xml b/plugins/sharepoint-features/org-gnome-sharepoint-features.eplug.xml +index d59db73..3e318fc 100644 +--- a/plugins/sharepoint-features/org-gnome-sharepoint-features.eplug.xml ++++ b/plugins/sharepoint-features/org-gnome-sharepoint-features.eplug.xml +@@ -16,5 +16,19 @@ + target="compeditor" + /> + ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + + + diff --git a/plugins/sharepoint-features/comp-commit.c b/plugins/sharepoint-features/comp-commit.c +new file mode 100644 +index 0000000..b87df4f +--- /dev/null ++++ b/plugins/sharepoint-features/comp-commit.c +@@ -0,0 +1,88 @@ ++#ifdef HAVE_CONFIG_H ++#include ++#endif ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++void org_gnome_comp_commit (EPlugin *ep, ECalEventTargetCompEditor *target); ++ ++static icaltimezone* ++resolve_tzid_cb (const char *tzid, gpointer data) ++{ ++ ECal *client; ++ icaltimezone *zone = NULL; ++ ++ g_return_val_if_fail (data != NULL, NULL); ++ g_return_val_if_fail (E_IS_CAL (data), NULL); ++ ++ client = E_CAL (data); ++ ++ /* Try to find the builtin timezone first. */ ++ zone = icaltimezone_get_builtin_timezone_from_tzid (tzid); ++ ++ if (!zone) { ++ /* FIXME: Handle errors. */ ++ e_cal_get_timezone (client, tzid, &zone, NULL); ++ } ++ ++ return zone; ++} ++ ++static gboolean ++recur_cb (ECalComponent *comp, time_t start, time_t end, gpointer data) ++{ ++ time_t *end_date = data; ++ ++ *end_date = end; ++ ++ return TRUE; ++} ++ ++void ++org_gnome_comp_commit (EPlugin *ep, ECalEventTargetCompEditor *target) ++{ ++ CompEditor *editor = target->editor; ++ CompEditorFlags flags; ++ ECal *client; ++ ECalComponent *comp; ++ ECalComponentDateTime cdt; ++ icaltimezone *zone = NULL; ++ const char *uri; ++ time_t end_date = -1; ++ ++ client = comp_editor_get_client (editor); ++ uri = e_cal_get_uri (client); ++ flags = comp_editor_get_flags (editor); ++ ++ if (!g_str_has_prefix (uri, "sharepoint://")) ++ return; ++ ++ comp = comp_editor_get_comp (editor); ++ ++ if (!e_cal_component_has_recurrences (comp)) ++ return; ++ ++ e_cal_component_get_dtstart (comp, &cdt); ++ if (cdt.tzid != NULL) { ++ /* FIXME Will e_cal_get_timezone really not return builtin zones? */ ++ if (!e_cal_get_timezone (client, cdt.tzid, &zone, NULL)) ++ zone = icaltimezone_get_builtin_timezone_from_tzid (cdt.tzid); ++ } ++ e_cal_component_free_datetime (&cdt); ++ ++ e_cal_recur_generate_instances (comp, -1, -1, ++ recur_cb, &end_date, ++ resolve_tzid_cb, ++ client, zone); ++ ++ char *end = g_strdup_printf ("%ld",end_date); ++ e_cal_component_set_x_prop (comp, "X-SP-RECUR-ENDDATE", end); ++ g_free (end); ++ g_print ("DEBUG: the component to be saved is %s \n", e_cal_component_get_as_string (comp)); ++} +diff --git a/plugins/sharepoint-features/org-gnome-share-point.error.xml b/plugins/sharepoint-features/org-gnome-share-point.error.xml +new file mode 100644 +index 0000000..d656dea +--- /dev/null ++++ b/plugins/sharepoint-features/org-gnome-share-point.error.xml +@@ -0,0 +1,5 @@ ++ ++ ++ ++ ++ +diff --git a/plugins/sharepoint-features/process-meeting.c b/plugins/sharepoint-features/process-meeting.c +new file mode 100644 +index 0000000..917166b +--- /dev/null ++++ b/plugins/sharepoint-features/process-meeting.c +@@ -0,0 +1,258 @@ ++/* ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU Lesser General Public ++ * License as published by the Free Software Foundation; either ++ * version 2 of the License, or (at your option) version 3. ++ * ++ * 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 ++ * Lesser General Public License for more details. ++ * ++ * You should have received a copy of the GNU Lesser General Public ++ * License along with the program; if not, see ++ * ++ * ++ * Authors: ++ * Chenthill Palanisamy (pchenthill@novell.com) ++ * ++ * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com) ++ * ++ */ ++ ++#ifdef HAVE_CONFIG_H ++#include ++#endif ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++ ++typedef struct { ++ ECal *ecal; ++ icalcomponent *icalcomp; ++} ReceiveData; ++ ++ECalendarView *c_view; ++ ++void org_gnome_process_meeting (EPlugin *ep, ECalPopupTargetSelect *target); ++static void on_accept_meeting (EPopup *ep, EPopupItem *pitem, void *data); ++static void on_accept_meeting_tentative (EPopup *ep, EPopupItem *pitem, void *data); ++static void on_decline_meeting (EPopup *ep, EPopupItem *pitem, void *data); ++ ++static EPopupItem popup_items[] = { ++{ E_POPUP_ITEM, "41.accept", N_("Accept"), on_accept_meeting, NULL, GTK_STOCK_APPLY, 0, E_CAL_POPUP_SELECT_NOTEDITING | E_CAL_POPUP_SELECT_MEETING}, ++{ E_POPUP_ITEM, "42.accept", N_("Accept Tentatively"), on_accept_meeting_tentative, NULL, GTK_STOCK_DIALOG_QUESTION, 0, E_CAL_POPUP_SELECT_NOTEDITING | E_CAL_POPUP_SELECT_MEETING}, ++{ E_POPUP_ITEM, "43.decline", N_("Decline"), on_decline_meeting, NULL, GTK_STOCK_CANCEL, 0, E_CAL_POPUP_SELECT_NOTEDITING} ++}; ++ ++static void ++popup_free (EPopup *ep, GSList *items, void *data) ++{ ++ g_slist_free (items); ++ items = NULL; ++} ++ ++void ++org_gnome_process_meeting (EPlugin *ep, ECalPopupTargetSelect *target) ++{ ++ GSList *menus = NULL; ++ GList *selected; ++ int i = 0; ++ static int first = 0; ++ const char *uri = NULL; ++ ECalendarView *cal_view = E_CALENDAR_VIEW (target->target.widget); ++ ++ c_view = cal_view; ++ selected = e_calendar_view_get_selected_events (cal_view); ++ if (selected) { ++ ECalendarViewEvent *event = (ECalendarViewEvent *) selected->data; ++ ++ uri = e_cal_get_uri (event->comp_data->client); ++ } else ++ return; ++ ++ if (!uri) ++ return; ++ ++ if (! g_strrstr (uri, "sharepoint://")) ++ return ; ++ ++ /* for translation*/ ++ if (!first) { ++ popup_items[0].label = _(popup_items[0].label); ++ } ++ ++ first++; ++ ++ for (i = 0; i < sizeof (popup_items) / sizeof (popup_items[0]); i++) ++ menus = g_slist_prepend (menus, &popup_items[i]); ++ ++ e_popup_add_items (target->target.popup, menus, NULL, popup_free, NULL); ++} ++ ++static void ++finalize_receive_data (ReceiveData *r_data) ++{ ++ if (r_data->ecal) { ++ g_object_unref (r_data->ecal); ++ r_data->ecal = NULL; ++ } ++ ++ if (r_data->ecal) { ++ icalcomponent_free (r_data->icalcomp); ++ r_data->icalcomp = NULL; ++ } ++ ++ g_free (r_data); ++} ++ ++static gboolean ++receive_objects (gpointer data) ++{ ++ GError *error = NULL; ++ ReceiveData *r_data = data; ++ ++ ++ icalcomponent_set_method (r_data->icalcomp, ICAL_METHOD_REQUEST); ++ ++ if (!e_cal_receive_objects (r_data->ecal, r_data->icalcomp, &error)) { ++ /* FIXME show an error dialog */ ++ g_error_free (error); ++ } ++ ++ finalize_receive_data (r_data); ++ return TRUE; ++} ++ ++static icalproperty * ++find_attendee (icalcomponent *ical_comp, const char *address) ++{ ++ icalproperty *prop; ++ ++ if (address == NULL) ++ return NULL; ++ ++ for (prop = icalcomponent_get_first_property (ical_comp, ICAL_ATTENDEE_PROPERTY); ++ prop != NULL; ++ prop = icalcomponent_get_next_property (ical_comp, ICAL_ATTENDEE_PROPERTY)) { ++ icalvalue *value; ++ const char *attendee; ++ char *text; ++ ++ value = icalproperty_get_value (prop); ++ if (!value) ++ continue; ++ ++ attendee = icalvalue_get_string (value); ++ ++ text = g_strdup (itip_strip_mailto (attendee)); ++ text = g_strstrip (text); ++ if (!g_ascii_strcasecmp (address, text)) { ++ g_free (text); ++ break; ++ } ++ g_free (text); ++ } ++ ++ return prop; ++} ++static void ++change_status (icalcomponent *ical_comp, const char *address, icalparameter_partstat status) ++{ ++ icalproperty *prop; ++ ++ prop = find_attendee (ical_comp, address); ++ if (prop) { ++ icalparameter *param; ++ ++ icalproperty_remove_parameter (prop, ICAL_PARTSTAT_PARAMETER); ++ param = icalparameter_new_partstat (status); ++ icalproperty_add_parameter (prop, param); ++ } else { ++ icalparameter *param; ++ ++ prop = icalproperty_new_attendee (address); ++ icalcomponent_add_property (ical_comp, prop); ++ ++ param = icalparameter_new_role (ICAL_ROLE_OPTPARTICIPANT); ++ icalproperty_add_parameter (prop, param); ++ ++ param = icalparameter_new_partstat (status); ++ icalproperty_add_parameter (prop, param); ++ } ++} ++ ++static void ++process_meeting (ECalendarView *cal_view, icalparameter_partstat status) ++{ ++ GList *selected; ++ icalcomponent *clone; ++ ++ selected = e_calendar_view_get_selected_events (cal_view); ++ if (selected) { ++ ECalendarViewEvent *event = (ECalendarViewEvent *) selected->data; ++ ECalComponent *comp = e_cal_component_new (); ++ ReceiveData *r_data = g_new0 (ReceiveData, 1); ++ gboolean recurring = FALSE; ++ GThread *thread = NULL; ++ GError *error = NULL; ++ char *address = NULL; ++ ++ e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (event->comp_data->icalcomp)); ++ address = itip_get_comp_attendee (comp, event->comp_data->client); ++ ++ if (e_cal_component_has_recurrences (comp) || e_cal_component_is_instance (comp)) ++ recurring = TRUE; ++ ++ /* Free comp */ ++ g_object_unref (comp); ++ comp = NULL; ++ ++ clone = icalcomponent_new_clone (event->comp_data->icalcomp); ++ change_status (clone, address, status); ++ ++ r_data->ecal = g_object_ref (event->comp_data->client); ++ r_data->icalcomp = clone; ++ ++ g_print ("The updated meeting is %s \n", icalcomponent_as_ical_string (clone)); ++ ++ thread = g_thread_create ((GThreadFunc) receive_objects, r_data , FALSE, &error); ++ if (!thread) { ++ g_warning (G_STRLOC ": %s", error->message); ++ g_error_free (error); ++ } ++ } ++} ++ ++/*FIXME the data does not give us the ECalendarView object. ++ we should remove the global c_view variable once we get it from the data*/ ++static void ++on_accept_meeting (EPopup *ep, EPopupItem *pitem, void *data) ++{ ++ ECalendarView *cal_view = c_view; ++ ++ process_meeting (cal_view, ICAL_PARTSTAT_ACCEPTED); ++} ++static void ++on_accept_meeting_tentative (EPopup *ep, EPopupItem *pitem, void *data) ++{ ++ ECalendarView *cal_view = c_view; ++ ++ process_meeting (cal_view, ICAL_PARTSTAT_TENTATIVE); ++} ++ ++static void ++on_decline_meeting (EPopup *ep, EPopupItem *pitem, void *data) ++{ ++ ECalendarView *cal_view = c_view; ++ ++ process_meeting (cal_view, ICAL_PARTSTAT_DECLINED); ++} diff --git a/sp-tasks-setup.diff b/sp-tasks-setup.diff new file mode 100644 index 0000000..5dc6a5b --- /dev/null +++ b/sp-tasks-setup.diff @@ -0,0 +1,236 @@ +diff --git a/calendar/gui/e-cal-model.c b/calendar/gui/e-cal-model.c +index c97f61c..16fa928 100644 +--- a/calendar/gui/e-cal-model.c ++++ b/calendar/gui/e-cal-model.c +@@ -1413,6 +1413,12 @@ ensure_dates_are_in_default_zone (icalcomponent *icalcomp) + dt = icaltime_convert_to_zone (dt, zone); + icalcomponent_set_dtend (icalcomp, dt); + } ++ ++ dt = icalcomponent_get_due (icalcomp); ++ if (dt.is_utc) { ++ dt = icaltime_convert_to_zone (dt, zone); ++ icalcomponent_set_due (icalcomp, dt); ++ } + } + + static void +diff --git a/plugins/sharepoint-account-setup/SharepointAccount.cs b/plugins/sharepoint-account-setup/SharepointAccount.cs +index 5009e98..61959ac 100644 +--- a/plugins/sharepoint-account-setup/SharepointAccount.cs ++++ b/plugins/sharepoint-account-setup/SharepointAccount.cs +@@ -38,10 +38,10 @@ namespace Sharepoint + initialized = true; + } + ++ ConnectToICEcoreDaemon (); + + sessionBus = Bus.Session.GetObject ("org.freedesktop.DBus", + new ObjectPath ("/org/freedesktop/DBus")); +- sessionBus.NameOwnerChanged += OnDBusNameOwnerChanged; + + // Force the daemon to start up if it's not already running + if (Bus.Session.NameHasOwner (DaemonNamespace) == false) +@@ -49,7 +49,7 @@ namespace Sharepoint + Bus.Session.StartServiceByName (DaemonNamespace); + } + +- ConnectToICEcoreDaemon (); ++ sessionBus.NameOwnerChanged += OnDBusNameOwnerChanged; + try { deskIceDaemon.CheckAuthentication (String.Empty); } + catch (NotAuthenticatedException) + { return; } +@@ -70,7 +70,7 @@ namespace Sharepoint + public void DeleteAccount () + { + // we remove all share calendars. We currently support creating only one sharepoint account +- SharepointSource spSource = new SharepointSource (CalSourceType.Event, null, null); ++ SharepointSource spSource = new SharepointSource (null, null); + spSource.DeleteSources (); + spSource.Sync (); + } +@@ -89,7 +89,7 @@ namespace Sharepoint + { + Console.WriteLine ("Getting folders "); + AccountInfo accountInfo = deskIceDaemon.GetDefaultAccountInfo (); +- SharepointSource spSource = new SharepointSource (CalSourceType.Event, accountInfo.username, ++ SharepointSource spSource = new SharepointSource (accountInfo.username, + accountInfo.hostUrl); + + if (spSource.AccountExists) { +@@ -100,20 +100,17 @@ namespace Sharepoint + FileInfo [] workspaces = deskIceDaemon.EnumerateWorkspaces (); + foreach (FileInfo workspace in workspaces) + { +- FileInfo[] folders = null; ++ Folder[] folders = null; + +- if (spSource.srcType == CalSourceType.Event) +- folders = deskIceDaemon.GetCalendarFolders (string.Empty, workspace.Id); +- // else get task folders ++ folders = deskIceDaemon.GetCalendarFolders (string.Empty, workspace.Id); + +- + if (folders.Length == 0) + continue; + + spSource.CreateSources (workspace, folders); + } ++ + spSource.Sync (); +- Console.WriteLine ("******* Got folders "); + backgroundThread = null; + RemoveHandlers (); + } +diff --git a/plugins/sharepoint-account-setup/SharepointSource.cs b/plugins/sharepoint-account-setup/SharepointSource.cs +index c61fcf0..e9dad79 100644 +--- a/plugins/sharepoint-account-setup/SharepointSource.cs ++++ b/plugins/sharepoint-account-setup/SharepointSource.cs +@@ -16,33 +16,36 @@ namespace Sharepoint + + public class SharepointSource + { +- public CalSourceType srcType; + readonly string calPath = "/apps/evolution/calendar/sources"; + readonly string taskPath = "/apps/evolution/tasks/sources"; + static Client client; +- SourceList srcList; ++ SourceList CalsrcList; ++ SourceList TasksrcList; + readonly string baseUri = "sharepoint://"; + string username; + string hostUrl; + +- public SharepointSource(CalSourceType type, string userName, string hosturl) ++ public SharepointSource(string userName, string hosturl) + { +- srcType = type; + client = new Client (); + username = userName; + hostUrl = hosturl; + +- if (type == CalSourceType.Event) +- srcList = new SourceList (calPath); +- else +- srcList = new SourceList (taskPath); ++ CalsrcList = new SourceList (calPath); ++ TasksrcList = new SourceList (taskPath); + } + + public bool AccountExists + { + get + { +- foreach (SourceGroup group in srcList.Groups) ++ foreach (SourceGroup group in CalsrcList.Groups) ++ { ++ if (group.BaseUri == baseUri) ++ return true; ++ } ++ ++ foreach (SourceGroup group in TasksrcList.Groups) + { + if (group.BaseUri == baseUri) + return true; +@@ -52,45 +55,85 @@ namespace Sharepoint + } + } + +- public void CreateSources (FileInfo workspace, FileInfo [] folders) ++ public void CreateSources (FileInfo workspace, Folder [] folders) + { +- SourceGroup group = new SourceGroup (workspace.DisplayName, baseUri); ++ SourceGroup calGroup = new SourceGroup (workspace.DisplayName, baseUri); ++ SourceGroup taskGroup = new SourceGroup (workspace.DisplayName, baseUri); ++ bool addCalGroup = false; ++ bool addTaskGroup = false; + +- foreach (FileInfo folder in folders) ++ foreach (Folder folder in folders) + { +- Console.WriteLine (workspace.DisplayName + " folder " + folder.DisplayName); +- string relativeUri = hostUrl + ":" + folder.Id; +- Source source= new Source (folder.DisplayName, relativeUri); ++ Console.WriteLine (workspace.DisplayName + " folder " + folder.Title + " " + folder.Type); ++ string relativeUri = hostUrl + ":" + folder.ID; ++ Source source= new Source (folder.Title, relativeUri); + source.SetProperty ("username", username); + source.SetProperty ("workspaceid", workspace.Id); +- source.SetProperty ("Id", folder.Id); ++ source.SetProperty ("Id", folder.ID); + source.SetProperty ("Auth","True"); +- group.AddSource (source, -1); ++ source.SetProperty ("delete","no"); ++ if (folder.Type == FolderType.Task) ++ { ++ taskGroup.AddSource (source, -1); ++ addTaskGroup = true; ++ } else if (folder.Type == FolderType.Calendar) ++ { ++ calGroup.AddSource (source, -1); ++ addCalGroup = true; ++ } ++ } ++ ++ ++ if (addCalGroup) ++ { ++ calGroup.SetProperty ("username", username); ++ CalsrcList.AddGroup (calGroup, -1); ++ } ++ ++ if (addTaskGroup) ++ { ++ taskGroup.SetProperty ("username", username); ++ TasksrcList.AddGroup (taskGroup, -1); + } +- group.SetProperty ("username", username); +- srcList.AddGroup (group, -1); + } + + public void Sync () + { +- srcList.Sync (); ++ CalsrcList.Sync (); ++ TasksrcList.Sync (); + } + + public void DeleteSources () + { +- List groupsToRemove = new List (); +- foreach (SourceGroup group in srcList.Groups) ++ List calGroupsToRemove = new List (); ++ foreach (SourceGroup group in CalsrcList.Groups) ++ { ++ if (group.BaseUri.StartsWith (baseUri)) ++ { ++ /// Currently we remove all sharepoint calendars ++ calGroupsToRemove.Add (group); ++ } ++ } ++ ++ foreach (SourceGroup group in calGroupsToRemove) ++ { ++ CalsrcList.RemoveGroup (group); ++ } ++ ++ List TaskGroupsToRemove = new List (); ++ ++ foreach (SourceGroup group in TasksrcList.Groups) + { + if (group.BaseUri.StartsWith (baseUri)) + { + /// Currently we remove all sharepoint calendars +- groupsToRemove.Add (group); ++ TaskGroupsToRemove.Add (group); + } + } + +- foreach (SourceGroup group in groupsToRemove) ++ foreach (SourceGroup group in TaskGroupsToRemove) + { +- srcList.RemoveGroup (group); ++ TasksrcList.RemoveGroup (group); + } + } + }