File sharepoint-account-setup.patch of Package evolution

diff --git a/plugins/mono/mono-plugin.c b/plugins/mono/mono-plugin.c
index 5c5182e..542e6f0 100644
--- a/plugins/mono/mono-plugin.c
+++ b/plugins/mono/mono-plugin.c
@@ -79,9 +79,14 @@ epm_invoke(EPlugin *ep, const char *name, void *data)
 	MonoObject *x = NULL, *res;
 	void **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) {
@@ -230,8 +235,6 @@ load_plugin_type_register_function (void *a, void *b)
 		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 --git a/plugins/sharepoint-account-setup/Makefile.am b/plugins/sharepoint-account-setup/Makefile.am
new file mode 100644
index 0000000..b01f3df
--- /dev/null
+++ b/plugins/sharepoint-account-setup/Makefile.am
@@ -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 --git a/plugins/sharepoint-account-setup/SharepointAccount.cs b/plugins/sharepoint-account-setup/SharepointAccount.cs
new file mode 100644
index 0000000..5009e98
--- /dev/null
+++ b/plugins/sharepoint-account-setup/SharepointAccount.cs
@@ -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 --git a/plugins/sharepoint-account-setup/SharepointAccountSetup.cs b/plugins/sharepoint-account-setup/SharepointAccountSetup.cs
new file mode 100644
index 0000000..70d6b15
--- /dev/null
+++ b/plugins/sharepoint-account-setup/SharepointAccountSetup.cs
@@ -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 --git a/plugins/sharepoint-account-setup/SharepointSource.cs b/plugins/sharepoint-account-setup/SharepointSource.cs
new file mode 100644
index 0000000..c61fcf0
--- /dev/null
+++ b/plugins/sharepoint-account-setup/SharepointSource.cs
@@ -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 --git a/plugins/sharepoint-account-setup/org-gnome-sharepoint-account-setup.eplug.xml b/plugins/sharepoint-account-setup/org-gnome-sharepoint-account-setup.eplug.xml
new file mode 100644
index 0000000..80cdeb8
--- /dev/null
+++ b/plugins/sharepoint-account-setup/org-gnome-sharepoint-account-setup.eplug.xml
@@ -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 --git a/plugins/sharepoint-account-setup/org-gnome-sharepoint-disconnect-ui.xml b/plugins/sharepoint-account-setup/org-gnome-sharepoint-disconnect-ui.xml
new file mode 100644
index 0000000..d2545f8
--- /dev/null
+++ b/plugins/sharepoint-account-setup/org-gnome-sharepoint-disconnect-ui.xml
@@ -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 --git a/plugins/sharepoint-account-setup/org-gnome-sharepoint-ui.xml b/plugins/sharepoint-account-setup/org-gnome-sharepoint-ui.xml
new file mode 100644
index 0000000..f92e097
--- /dev/null
+++ b/plugins/sharepoint-account-setup/org-gnome-sharepoint-ui.xml
@@ -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 --git a/ui/evolution.xml b/ui/evolution.xml
index 9b4231e..4008c95 100644
--- a/ui/evolution.xml
+++ b/ui/evolution.xml
@@ -66,6 +66,8 @@
 	<placeholder name="ComponentItems"/>
       </submenu>
 
+      <placeholder name="FileNewItems"/>
+
       <menuitem name="OpenNewWindow" verb="" pixtype="pixbuf"/>
 
       <separator f="" name="eshell4"/>
--- a/configure.in	2008-11-05 16:29:35.000000000 +0530
+++ b/configure.in	2008-11-06 18:48:19.000000000 +0530
@@ -900,7 +900,27 @@ if test "x${enable_mono}" = "xyes"; then
 	AC_DEFINE(ENABLE_MONO,1,[Define if Mono embedding should be enabled])
 	mono_package="mono"
 	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, solvent])
+	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])
+		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)
 
 dnl Python hooks
 dnl This should just define python CFLAGS etc here, it is used later to
@@ -1732,7 +1752,7 @@ AC_ARG_ENABLE([plugins],
 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 mark-calendar-offline audio-inline mailing-list-actions default-mailer import-ics-attachments prefer-plain mail-notification attachment-reminder face backup-restore email-custom-header templates pst-import" 
@@ -1784,6 +1804,11 @@ if test "x${enable_mono}" = "xyes"; then
 	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"
@@ -2072,6 +2097,7 @@ plugins/pst-import/Makefile
 plugins/face/Makefile
 plugins/external-editor/Makefile
 plugins/webdav-account-setup/Makefile
+plugins/sharepoint-account-setup/Makefile
 smime/Makefile
 smime/lib/Makefile
 smime/gui/Makefile
openSUSE Build Service is sponsored by