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
This commit is contained in:
OBS User autobuild 2010-08-27 19:59:53 +00:00 committed by Git OBS Bridge
parent 3870365981
commit 2db054edd1
9 changed files with 2201 additions and 52 deletions

3
evolution-2.31.6.tar.bz2 Normal file
View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:a4c36b0773d810cf234ba466904da180af4ea35f270a87d0f7091d938f141d0b
size 31567308

View File

@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:a3a667c80cb616552cf67b32e81b5cbe4435a8e3d6de6ca07ae4f41370b6bc58
size 31784062

View File

@ -0,0 +1,42 @@
commit 5c49c70d5568a9a68daa5facaa531ab317d1f005
Author: Fridrich Štrba <fridrich.strba@bluewin.ch>
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);

View File

@ -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

View File

@ -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

View File

@ -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 @@
+<?xml version="1.0"?>
+<e-plugin-list>
+ <e-plugin id="org.gnome.evolution.sharepoint.account.setup" type="mono"
+ _name="Sharepoint account setup"
+ location="@PLUGINDIR@/SharepointAccountSetup.dll" handler="SharePointAccountSetup">
+ <author name="Chenthill Palanisamy" email="pchenthill@novell.com"/>
+ <_description>Create a sharepoint account for calendar and tasks</_description>
+
+ <hook class="org.gnome.evolution.shell.bonobomenu:1.0">
+ <menu id="org.gnome.evolution.shell" target="shell">
+ <!-- the path to the bonobo menu description -->
+ <ui file="@PLUGINDIR@/org-gnome-sharepoint-ui.xml"/>
+ <item
+ type="item"
+ verb="SharepointSetup"
+ path="/commands/SharepointSetup"
+ enable="all"
+ activate="SetupAccount"/>
+ </menu>
+ </hook>
+
+ <hook class="org.gnome.evolution.shell.bonobomenu:1.0">
+ <menu id="org.gnome.evolution.shell" target="shell">
+ <!-- the path to the bonobo menu description -->
+ <ui file="@PLUGINDIR@/org-gnome-sharepoint-disconnect-ui.xml"/>
+ <item
+ type="item"
+ verb="SharepointDisconnect"
+ path="/commands/SharepointDisconnect"
+ enable="all"
+ activate="RemoveAccount"/>
+ </menu>
+ </hook>
+
+ </e-plugin>
+</e-plugin-list>
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 @@
+<Root>
+ <commands>
+ <cmd name="SharepointDisconnect" _label="Disconnect SharePoint"
+ _tip="Remove sharepoint account"
+ pixtype="stock"
+ pixname="gtk-disconnect"/>
+ </commands>
+
+ <menu>
+ <placeholder name="ActionsPlaceholder">
+ <submenu name="Actions">
+ <menuitem name="SharepointDisconnect" verb="" />
+ </submenu>
+ </placeholder>
+ </menu>
+</Root>
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 @@
+<Root>
+ <commands>
+ <cmd name="SharepointSetup" _label="Connect to SharePoint"
+ _tip="Setup sharepoint account"
+ pixtype="stock"
+ pixname="gtk-connect"/>
+ </commands>
+
+ <menu>
+ <placeholder name="ActionsPlaceholder">
+ <submenu name="Actions">
+ <menuitem name="SharepointSetup" verb="" />
+ </submenu>
+ </placeholder>
+ </menu>
+</Root>
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.IBus> ("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 ();
+ }
+ }
+
+ /// <summary>
+ /// Connect with the ICEcore Daemon and register event handlers.
+ /// </summary>
+ 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<IDaemon> (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<SourceGroup> groupsToRemove = new List<SourceGroup> ();
+ 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 @@
<placeholder name="ComponentItems"/>
</submenu>
+ <placeholder name="FileNewItems"/>
+
<menuitem name="OpenNewWindow" verb="" pixtype="pixbuf"/>
<separator f="" name="eshell4"/>

View File

@ -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 <e-util/e-util-private.h>
#include <evolution-shell-component-utils.h>
+#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 =
"<ui>"
" <menubar action='main-menu'>"
" <menu action='view-menu'>"
-" <menuitem action='view-type'/>"
+" <menuitem action='view-type'/>"
" <menuitem action='view-status'/>"
" <menuitem action='view-role'/>"
" <menuitem action='view-rsvp'/>"
@@ -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 @@
+<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
+<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd">
+
+<glade-interface>
+
+<widget class="GtkDialog" id="meeting-workspace-dialog">
+ <property name="visible">True</property>
+ <property name="title" translatable="yes">Meeting Workspace</property>
+ <property name="type">GTK_WINDOW_TOPLEVEL</property>
+ <property name="window_position">GTK_WIN_POS_NONE</property>
+ <property name="modal">False</property>
+ <property name="resizable">True</property>
+ <property name="destroy_with_parent">False</property>
+ <property name="decorated">True</property>
+ <property name="skip_taskbar_hint">False</property>
+ <property name="skip_pager_hint">False</property>
+ <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
+ <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
+ <property name="focus_on_map">True</property>
+ <property name="urgency_hint">False</property>
+ <property name="has_separator">True</property>
+
+ <child internal-child="vbox">
+ <widget class="GtkVBox" id="dialog-vbox1">
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">0</property>
+
+ <child internal-child="action_area">
+ <widget class="GtkHButtonBox" id="dialog-action_area1">
+ <property name="visible">True</property>
+ <property name="layout_style">GTK_BUTTONBOX_END</property>
+
+ <child>
+ <widget class="GtkButton" id="cancelbutton1">
+ <property name="visible">True</property>
+ <property name="can_default">True</property>
+ <property name="can_focus">True</property>
+ <property name="label">gtk-cancel</property>
+ <property name="use_stock">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <property name="response_id">-6</property>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkButton" id="okbutton1">
+ <property name="visible">True</property>
+ <property name="can_default">True</property>
+ <property name="can_focus">True</property>
+ <property name="label">gtk-ok</property>
+ <property name="use_stock">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <property name="response_id">-5</property>
+ </widget>
+ </child>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="pack_type">GTK_PACK_END</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkVBox" id="vbox3">
+ <property name="border_width">12</property>
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">12</property>
+
+ <child>
+ <widget class="GtkRadioButton" id="create-radio">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">C_reate meeting workspace</property>
+ <property name="use_underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <property name="active">False</property>
+ <property name="inconsistent">False</property>
+ <property name="draw_indicator">True</property>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkTable" id="table1">
+ <property name="border_width">12</property>
+ <property name="visible">True</property>
+ <property name="n_rows">2</property>
+ <property name="n_columns">2</property>
+ <property name="homogeneous">False</property>
+ <property name="row_spacing">12</property>
+ <property name="column_spacing">12</property>
+
+ <child>
+ <widget class="GtkLabel" id="title-label">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">T_itle:</property>
+ <property name="use_underline">True</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="mnemonic_widget">title-entry</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ <accessibility>
+ <atkrelation target="title-entry" type="label-for"/>
+ </accessibility>
+ </widget>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ <property name="top_attach">0</property>
+ <property name="bottom_attach">1</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="template-label">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">T_emplate:</property>
+ <property name="use_underline">True</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ <accessibility>
+ <atkrelation target="template-combo" type="label-for"/>
+ </accessibility>
+ </widget>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkEntry" id="title-entry">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="editable">True</property>
+ <property name="visibility">True</property>
+ <property name="max_length">0</property>
+ <property name="text" translatable="yes"></property>
+ <property name="has_frame">True</property>
+ <property name="invisible_char">●</property>
+ <property name="activates_default">False</property>
+ <accessibility>
+ <atkrelation target="title-label" type="labelled-by"/>
+ </accessibility>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">0</property>
+ <property name="bottom_attach">1</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkComboBoxEntry" id="template-combo">
+ <property name="visible">True</property>
+ <property name="items" translatable="yes">Basic Meeting Workspace
+Blank Meeting Workspace
+Decision Meeting Workspace
+Social Meeting Workspace
+Multipage Meeting Workspace</property>
+ <property name="add_tearoffs">False</property>
+ <property name="has_frame">True</property>
+ <property name="focus_on_click">True</property>
+ <accessibility>
+ <atkrelation target="template-label" type="labelled-by"/>
+ </accessibility>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">fill</property>
+ <property name="y_options">fill</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkRadioButton" id="link-radio">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">_Link to existing workspace</property>
+ <property name="use_underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <property name="active">False</property>
+ <property name="inconsistent">False</property>
+ <property name="draw_indicator">True</property>
+ <property name="group">create-radio</property>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkHBox" id="hbox2">
+ <property name="border_width">12</property>
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">12</property>
+
+ <child>
+ <widget class="GtkLabel" id="workspaces-label">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Wo_rkspaces:</property>
+ <property name="use_underline">True</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ <accessibility>
+ <atkrelation target="workspaces-combo" type="label-for"/>
+ </accessibility>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkComboBoxEntry" id="workspaces-combo">
+ <property name="visible">True</property>
+ <property name="add_tearoffs">False</property>
+ <property name="has_frame">True</property>
+ <property name="focus_on_click">True</property>
+ <accessibility>
+ <atkrelation target="workspaces-label" type="labelled-by"/>
+ </accessibility>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkStatusbar" id="statusbar">
+ <property name="visible">True</property>
+ <property name="has_resize_grip">True</property>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+</widget>
+
+</glade-interface>
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 @@
+<e-plugin-list>
+ <e-plugin
+ type="shlib"
+ id="org.gnome.evolution.calendar-meeting-workspace"
+ _name="Create or Link to meeting workspaces"
+ location="@PLUGINDIR@/liborg-gnome-sharepoint-features@SOEXT@">
+
+ <_description>Plugin to create or link to a meeting workspace</_description>
+
+ <author name="Chenthill" email="pchenthill@novell.com"/>
+
+ <hook class="org.gnome.evolution.calendar.events:1.0">
+ <event
+ id="editor.inited"
+ handle="org_gnome_meeting_workspace"
+ target="compeditor"
+ />
+ </hook>
+ </e-plugin>
+</e-plugin-list>
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 <config.h>
+#endif
+
+#include <gtk/gtk.h>
+#include <e-util/e-plugin.h>
+#include <glib/gi18n.h>
+#include <e-util/e-plugin-ui.h>
+#include <e-util/e-util-private.h>
+#include <e-cal-event.h>
+#include <calendar/gui/dialogs/event-editor.h>
+#include <dbus/dbus-glib.h>
+#include <dbus/dbus-glib-lowlevel.h>
+#include <glade/glade.h>
+
+static void action_meeting_workspace (GtkAction *action, EventEditor *editor);
+void org_gnome_meeting_workspace (EPlugin *ep, ECalEventTargetCompEditor *target);
+
+static const gchar *ui =
+"<ui>"
+" <toolbar name='main-toolbar'>"
+" <toolitem action='meeting-workspace'/>"
+" </toolbar>"
+"</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

440
sp-process-meetings.diff Normal file
View File

@ -0,0 +1,440 @@
commit 18a2f5f1206e7a7583db2b8c47862f79abf13e50
Author: chenthill <chen@rocky.blr.novell.com>
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"
/>
</hook>
+
+ <hook class="org.gnome.evolution.calendar.events:1.0">
+ <event
+ id="editor.commit"
+ handle="org_gnome_comp_commit"
+ target="compeditor"
+ />
+ </hook>
+
+ <hook class="org.gnome.evolution.calendar.popup:1.0">
+ <menu id="org.gnome.evolution.calendar.view.popup" target="select" factory = "org_gnome_process_meeting">
+ </menu>
+ </hook>
+
</e-plugin>
</e-plugin-list>
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 <config.h>
+#endif
+
+#include <gtk/gtk.h>
+#include <e-util/e-plugin.h>
+#include <glib/gi18n.h>
+#include <e-util/e-plugin-ui.h>
+#include <e-util/e-util-private.h>
+#include <e-cal-event.h>
+#include <calendar/gui/dialogs/event-editor.h>
+
+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 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<error-list domain="org.gnome.evolution.sharepoint">
+
+</error-list>
+
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 <http://www.gnu.org/licenses/>
+ *
+ *
+ * Authors:
+ * Chenthill Palanisamy (pchenthill@novell.com)
+ *
+ * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <string.h>
+#include <glib/gi18n.h>
+#include <gtk/gtk.h>
+#include <calendar/gui/e-cal-popup.h>
+#include <calendar/gui/e-calendar-view.h>
+#include <calendar/gui/itip-utils.h>
+#include <e-util/e-error.h>
+#include <libecal/e-cal.h>
+
+
+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);
+}

236
sp-tasks-setup.diff Normal file
View File

@ -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.IBus> ("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<SourceGroup> groupsToRemove = new List<SourceGroup> ();
- foreach (SourceGroup group in srcList.Groups)
+ List<SourceGroup> calGroupsToRemove = new List<SourceGroup> ();
+ 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<SourceGroup> TaskGroupsToRemove = new List<SourceGroup> ();
+
+ 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);
}
}
}