[evolution-patches] ical publishing patch



Hello all,

After having put a lot of testing into this patch and a lot of coffee
into my cup, here I come with a - mostly - functional version ;-)

The calendar prefs dialog has received an extra page, which I put after
Free/Busy. It is modelled roughly on Free/Busy.

publish-editor-dialog[.c,.h,.glade] are modelled on url-editor
[.c,.h,.glade]

the data structure is shared between the two and has been lightly
modified (EPublishUri)

the actual publishing is done in e-pub-publish() and then in
itip_publish_comp() it uses gnome-vfs for most schemes apart from http
which is handled by libsoup as gnome-vfs did not work with me for http
PUT.

For ssh, the "gnome authentication manager" is used, that's why in the
configuration dialog, the password is blanked when ssh is selected
(gnome-vfs URI limitation), it fits well with gnome as it can add the
password to the gnome keyring.

For http, if a proxy is set up in the gnome preferences, it is used.

This has been tested for http PUT with authentication at www.icalx.com,
for ssh and local files. I did not test ftp or https, could anyone try
it out? The resulting files have been tested with phpical and with the
icalx.com interface (probably the same parser) and seemed to be accepted
and understood by those tools.

Free/Busy works again and can use any gnome-vfs uri too, I did not
modify the configuration dialog though.

Alarms are published if requested, Task lists are published too.

THINGS NOT DONE:

automatic publishing when a source changes: I could not figure out how
to use ECalViewListener with ECal

html generation: is this really useful in any way?

testing for Ical compliance of the resulting files. Is there a tool to
do that?

HOWTO PATCH:

patch against evolution-cvs as of today with:

patch -p0 < evolution-ical-publish.patch

from within the evolution directory.

-- 
Stéphane Konstantaropoulos
- Research Student, Computer Science
-- University of York, http://www-users.cs.york.ac.uk/~stephane
? Doxyfile
? evolution.kdevelop
? evolution.kdevelop.pcs
? evolution.kdevses
? calendar/gui/dialogs/cal-prefs-dialog.gladep
? calendar/gui/dialogs/publish-editor-dialog.c
? calendar/gui/dialogs/publish-editor-dialog.glade
? calendar/gui/dialogs/publish-editor-dialog.gladep
? calendar/gui/dialogs/publish-editor-dialog.h
? help/C/evolution-2.2-C.omf
? help/C/evolution-2.2.xml
? mail/default/zh_CN/Makefile
? mail/default/zh_CN/Makefile.in
? plugins/addressbook-groupwise
? plugins/addressbook-file/Makefile
? plugins/addressbook-file/Makefile.in
? plugins/addressbook-file/org-gnome-addressbook-file.eplug
? plugins/default-source/Makefile
? plugins/default-source/Makefile.in
? plugins/default-source/org-gnome-default-source.eplug
? plugins/exchange-account-setup/Makefile
? plugins/exchange-account-setup/Makefile.in
? plugins/exchange-account-setup/org-gnome-exchange-account-setup.eplug
? plugins/groupwise-account-setup/Makefile
? plugins/groupwise-account-setup/Makefile.in
? plugins/groupwise-account-setup/org-gnome-gw-account-setup.eplug
? plugins/groupwise-send-options/Makefile
? plugins/groupwise-send-options/Makefile.in
? plugins/groupwise-send-options/org-gnome-compose-send-options.eplug
? plugins/groupwise-status-tracking/Makefile
? plugins/groupwise-status-tracking/Makefile.in
? plugins/groupwise-status-tracking/org-gnome-status-track.eplug
? plugins/new-mail-notify/Makefile
? plugins/new-mail-notify/Makefile.in
? plugins/send-options/Makefile
? plugins/send-options/Makefile.in
? plugins/send-options/org-gnome-send-options.eplug
? plugins/shared-folder/Makefile
? plugins/shared-folder/Makefile.in
? plugins/shared-folder/org-gnome-shared-folder.eplug
Index: calendar/gui/apps_evolution_calendar.schemas.in.in
===================================================================
RCS file: /cvs/gnome/evolution/calendar/gui/apps_evolution_calendar.schemas.in.in,v
retrieving revision 1.7
diff -u -u -r1.7 apps_evolution_calendar.schemas.in.in
--- calendar/gui/apps_evolution_calendar.schemas.in.in	8 Feb 2005 00:35:55 -0000	1.7
+++ calendar/gui/apps_evolution_calendar.schemas.in.in	30 Mar 2005 04:06:15 -0000
@@ -394,8 +394,8 @@
       <list_type>string</list_type>
       <default>[]</default>
       <locale name="C">
-        <short>Free/busy server urls</short>
-        <long>List of server urls for free/busy publishing.</long>
+        <short>List of urls for online publishing</short>
+        <long>List of server urls for publishing.</long>
       </locale>
     </schema>    
 
@@ -405,9 +405,31 @@
       <owner>evolution-calendar</owner>
       <type>string</type>
       <locale name="C">
-        <short>Free/busy template url</short>
+        <short>The url template to use as an online publishing data fallback</short>
+      </locale>
+    </schema>
+    <schema>
+      <key>/schemas/apps/evolution/calendar/publish/fb-uris</key>
+      <applyto>/apps/evolution/calendar/publish/fb-uris</applyto>
+      <owner>evolution-calendar</owner>
+      <type>list</type>
+      <list_type>string</list_type>
+      <default>[]</default>
+      <locale name="C">
+        <short>List of urls for free/busy publishing</short>
+      </locale>
+    </schema>    
+
+    <schema>
+      <key>/schemas/apps/evolution/calendar/publish/fb-template</key>
+      <applyto>/apps/evolution/calendar/publish/fb-template</applyto>
+      <owner>evolution-calendar</owner>
+      <type>string</type>
+      <locale name="C">
+        <short>The url template to use as a free/busy data fallback</short>
         <long>The url template to use as a free/busy data fallback, %u is replaced by the user part of the mail address and %d is replaced by the domain.</long>
       </locale>
     </schema>
+
   </schemalist>
 </gconfschemafile>
Index: calendar/gui/calendar-commands.c
===================================================================
RCS file: /cvs/gnome/evolution/calendar/gui/calendar-commands.c,v
retrieving revision 1.159
diff -u -u -r1.159 calendar-commands.c
--- calendar/gui/calendar-commands.c	1 Feb 2005 11:46:33 -0000	1.159
+++ calendar/gui/calendar-commands.c	30 Mar 2005 04:06:18 -0000
@@ -333,7 +333,13 @@
 static void
 publish_freebusy_cmd (BonoboUIComponent *uic, gpointer data, const gchar *path)
 {
-	e_pub_publish (TRUE);
+	e_pub_publish (PUB_FREE_BUSY, TRUE);
+}
+
+static void
+publish_cmd (BonoboUIComponent *uic, gpointer data, const gchar *path)
+{
+	e_pub_publish (PUB_ONLINE, TRUE);
 }
 
 static void
@@ -617,6 +623,7 @@
 	BONOBO_UI_VERB ("ShowListView", show_list_view_clicked),
 
 	BONOBO_UI_VERB ("PublishFreeBusy", publish_freebusy_cmd),
+	BONOBO_UI_VERB ("Publish", publish_cmd),
 	BONOBO_UI_VERB ("CalendarPurge", purge_cmd),
 
 	BONOBO_UI_VERB_END
Index: calendar/gui/calendar-component.c
===================================================================
RCS file: /cvs/gnome/evolution/calendar/gui/calendar-component.c,v
retrieving revision 1.201
diff -u -u -r1.201 calendar-component.c
--- calendar/gui/calendar-component.c	22 Mar 2005 15:09:10 -0000	1.201
+++ calendar/gui/calendar-component.c	30 Mar 2005 04:06:25 -0000
@@ -111,6 +111,7 @@
 
 	GConfClient *gconf_client;
 	int gconf_notify_id;
+	int gconf_notify_fb_id;
 
 	ESourceList *source_list;
 	ESourceList *task_source_list;
@@ -743,7 +744,8 @@
 init_calendar_publishing_cb (gpointer data)
 {	
 	/* Publish if it is time to publish again */
-	e_pub_publish (FALSE);
+	e_pub_publish (PUB_ONLINE, FALSE);
+	e_pub_publish (PUB_FREE_BUSY, FALSE);
 
 	return FALSE;
 }
@@ -755,7 +757,17 @@
 		       void *user_data)
 {
 	/* publish config changed, so publish */
-	e_pub_publish (TRUE);
+	e_pub_publish (PUB_ONLINE, TRUE);
+}
+
+static void
+conf_fb_changed_callback (GConfClient *client,
+		       unsigned int connection_id,
+		       GConfEntry *entry,
+		       void *user_data)
+{
+	/* publish config changed, so publish */
+	e_pub_publish (PUB_FREE_BUSY, TRUE);
 }
 
 /* Evolution::Component CORBA methods.  */
@@ -1674,7 +1686,11 @@
 		= gconf_client_notify_add (priv->gconf_client, CALENDAR_CONFIG_PUBLISH,
 					   (GConfClientNotifyFunc) conf_changed_callback, NULL,
 					   NULL, NULL);
-	
+	priv->gconf_notify_fb_id
+		= gconf_client_notify_add (priv->gconf_client, CALENDAR_CONFIG_FB_PUBLISH,
+					   (GConfClientNotifyFunc) conf_fb_changed_callback, NULL,
+					   NULL, NULL);
+
 	idle_id = g_idle_add ((GSourceFunc) init_calendar_publishing_cb, GINT_TO_POINTER (idle_id));
 }
 
Index: calendar/gui/calendar-config-keys.h
===================================================================
RCS file: /cvs/gnome/evolution/calendar/gui/calendar-config-keys.h,v
retrieving revision 1.6
diff -u -u -r1.6 calendar-config-keys.h
--- calendar/gui/calendar-config-keys.h	18 Dec 2004 13:01:17 -0000	1.6
+++ calendar/gui/calendar-config-keys.h	30 Mar 2005 04:06:26 -0000
@@ -71,6 +71,10 @@
 #define CALENDAR_CONFIG_DEFAULT_REMINDER_UNITS CALENDAR_CONFIG_PREFIX "/other/default_reminder_units"
 
 /* Free/Busy settings */
+#define CALENDAR_CONFIG_FB_PUBLISH CALENDAR_CONFIG_PREFIX"/publish/fb-uris"
+#define CALENDAR_CONFIG_FB_TEMPLATE CALENDAR_CONFIG_PREFIX"/publish/fb-template"
+
+/* Online publish settings */
 #define CALENDAR_CONFIG_PUBLISH CALENDAR_CONFIG_PREFIX"/publish/uris"
 #define CALENDAR_CONFIG_TEMPLATE CALENDAR_CONFIG_PREFIX"/publish/template"
 
Index: calendar/gui/calendar-config.c
===================================================================
RCS file: /cvs/gnome/evolution/calendar/gui/calendar-config.c,v
retrieving revision 1.72
diff -u -u -r1.72 calendar-config.c
--- calendar/gui/calendar-config.c	31 Dec 2004 16:59:18 -0000	1.72
+++ calendar/gui/calendar-config.c	30 Mar 2005 04:06:29 -0000
@@ -1107,13 +1107,27 @@
 GSList *
 calendar_config_get_free_busy (void)
 {	
-	return gconf_client_get_list (config, CALENDAR_CONFIG_PUBLISH, 
+	return gconf_client_get_list (config, CALENDAR_CONFIG_FB_PUBLISH, 
 				      GCONF_VALUE_STRING, NULL);
 }
 
 void
 calendar_config_set_free_busy (GSList *url_list)
 {
+	gconf_client_set_list (config, CALENDAR_CONFIG_FB_PUBLISH, 
+			       GCONF_VALUE_STRING, url_list, NULL);
+}
+
+GSList *
+calendar_config_get_publish (void)
+{	
+	return gconf_client_get_list (config, CALENDAR_CONFIG_PUBLISH, 
+				      GCONF_VALUE_STRING, NULL);
+}
+
+void
+calendar_config_set_publish (GSList *url_list)
+{
 	gconf_client_set_list (config, CALENDAR_CONFIG_PUBLISH, 
 			       GCONF_VALUE_STRING, url_list, NULL);
 }
@@ -1121,12 +1135,24 @@
 gchar *
 calendar_config_get_free_busy_template (void)
 {
-	return gconf_client_get_string (config, CALENDAR_CONFIG_TEMPLATE, NULL);
+	return gconf_client_get_string (config, CALENDAR_CONFIG_FB_TEMPLATE, NULL);
 }
 
 void
 calendar_config_set_free_busy_template (const gchar *template)
 {
+	gconf_client_set_string (config, CALENDAR_CONFIG_FB_TEMPLATE, template, NULL);
+}
+
+gchar *
+calendar_config_get_publish_template (void)
+{
+	return gconf_client_get_string (config, CALENDAR_CONFIG_TEMPLATE, NULL);
+}
+
+void
+calendar_config_set_publish_template (const gchar *template)
+{
 	gconf_client_set_string (config, CALENDAR_CONFIG_TEMPLATE, template, NULL);
 }
 
@@ -1136,6 +1162,18 @@
 {
 	guint id;
 	
+	id = gconf_client_notify_add (config, CALENDAR_CONFIG_FB_TEMPLATE, func, data, 
+				      NULL, NULL);
+	
+	return id;	
+}
+
+guint 
+calendar_config_add_notification_publish_template (GConfClientNotifyFunc func, 
+						     gpointer data)
+{
+	guint id;
+	
 	id = gconf_client_notify_add (config, CALENDAR_CONFIG_TEMPLATE, func, data, 
 				      NULL, NULL);
 	
Index: calendar/gui/calendar-config.h
===================================================================
RCS file: /cvs/gnome/evolution/calendar/gui/calendar-config.h,v
retrieving revision 1.36
diff -u -u -r1.36 calendar-config.h
--- calendar/gui/calendar-config.h	31 Dec 2004 16:59:18 -0000	1.36
+++ calendar/gui/calendar-config.h	30 Mar 2005 04:06:30 -0000
@@ -206,6 +206,14 @@
 void calendar_config_set_free_busy_template (const gchar *template);
 guint calendar_config_add_notification_free_busy_template (GConfClientNotifyFunc func, 
 							   gpointer data);
+/* online publishing settings */
+GSList * calendar_config_get_publish (void);
+void calendar_config_set_publish (GSList * url_list);
+
+gchar *calendar_config_get_publish_template (void);
+void calendar_config_set_publish_template (const gchar *template);
+guint calendar_config_add_notification_free_busy_template (GConfClientNotifyFunc func, 
+							   gpointer data);
 
 /* Shows the timezone dialog if the user hasn't set a default timezone. */
 void	  calendar_config_check_timezone_set	(void);
Index: calendar/gui/e-calendar-view.c
===================================================================
RCS file: /cvs/gnome/evolution/calendar/gui/e-calendar-view.c,v
retrieving revision 1.77
diff -u -u -r1.77 e-calendar-view.c
--- calendar/gui/e-calendar-view.c	21 Mar 2005 14:29:15 -0000	1.77
+++ calendar/gui/e-calendar-view.c	30 Mar 2005 04:06:38 -0000
@@ -1251,7 +1251,13 @@
 static void
 on_publish (EPopup *ep, EPopupItem *pitem, void *data)
 {
-	e_pub_publish (TRUE);
+	e_pub_publish (PUB_ONLINE, TRUE);
+}
+
+static void
+on_publish_fb (EPopup *ep, EPopupItem *pitem, void *data)
+{
+	e_pub_publish (PUB_FREE_BUSY, TRUE);
 }
 
 static void
@@ -1390,7 +1396,8 @@
 	{ E_POPUP_BAR, "70." },
 
 	/* TODO: Why is this in a context menu when it applies globally? */
-	{ E_POPUP_ITEM, "70.publish", N_("_Publish Free/Busy Information"), on_publish, },
+	{ E_POPUP_ITEM, "70.publish", N_("_Publish Calendars"), on_publish, },
+	{ E_POPUP_ITEM, "71.publish", N_("_Publish Free/Busy Information"), on_publish_fb, },
 };
 
 static EPopupItem ecv_child_items [] = {
Index: calendar/gui/e-pub-utils.c
===================================================================
RCS file: /cvs/gnome/evolution/calendar/gui/e-pub-utils.c,v
retrieving revision 1.7
diff -u -u -r1.7 e-pub-utils.c
--- calendar/gui/e-pub-utils.c	23 Feb 2005 18:56:56 -0000	1.7
+++ calendar/gui/e-pub-utils.c	30 Mar 2005 04:06:41 -0000
@@ -1,10 +1,12 @@
 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
 
-/* Evolution calendar Free/Busy utilities and types
+/* Evolution calendar publishing utilities and types
  *
  * Copyright (C) 2004 Ximian, Inc.
  *
  * Author: Gary Ekker <gekker novell com>
+ * 
+ * iCal publishing code by Stéphane Konstantaropoulos <stephane cs york ac uk>
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of version 2 of the GNU General Public
@@ -28,23 +30,64 @@
 #include <libedataserver/e-source-list.h>
 #include <libedataserverui/e-passwords.h>
 #include <libecal/e-cal-time-util.h>
+#include <libecal/e-cal-listener.h>
 #include <libgnome/gnome-i18n.h>
 #include "calendar-config.h"
 #include "common/authentication.h"
 #include "itip-utils.h"
 #include "e-pub-utils.h"
 
+static void e_pub_uri_calendar_modified_cb(ECalListener *,
+		ECalendarStatus, const char *, gpointer);
+G_INLINE_FUNC gboolean just_published (gchar *);
+
 void
-e_pub_uri_from_xml (EPublishUri *uri, const gchar *xml)
+e_pub_uri_free(EPublishUri *uri)
+{
+	GSList *l = NULL;
+	g_return_if_fail(uri != NULL);
+
+	if(uri->location){
+		xmlFree(uri->location);
+		uri->location = NULL;
+	}
+	if(uri->username){
+		xmlFree(uri->username);
+		uri->location = NULL;
+	}
+	if(uri->last_pub_time){
+		xmlFree(uri->last_pub_time);
+		uri->last_pub_time = NULL;
+	}
+	if((l = uri->calendars)){
+		for(; l != NULL; l = l->next)
+			xmlFree(l->data);
+		g_slist_free(uri->calendars);
+		uri->calendars = NULL;
+	}
+	if((l = uri->tasks)){
+		for(; l != NULL; l = l->next)
+			xmlFree(l->data);
+		g_slist_free(uri->tasks);
+		uri->tasks = NULL;
+	}
+}
+
+void
+e_pub_uri_from_xml (EPublishUri *uri, const guchar *xml)
 {
 	xmlDocPtr doc;
 	xmlNodePtr root, p;
-	xmlChar *location, *enabled, *frequency;
+	xmlChar *location, *type, *enabled, *frequency;
 	xmlChar *username, *publish_time;
-	GSList *l = NULL;
+	xmlChar *remember_pw, *no_pw;
+	xmlChar *alarm_publish;
+	xmlChar *auto_publish;
 	
 	uri->location = NULL;
-	doc = xmlParseDoc ((char *)xml);
+	uri->calendars = NULL;
+	uri->tasks = NULL;
+	doc = xmlParseDoc ((guchar *)xml);
 	if (doc == NULL) {
 		uri->location = NULL;
 		return;
@@ -54,48 +97,87 @@
 	if (strcmp (root->name, "uri") != 0) {
 		return;
 	}
+
 	location = xmlGetProp (root, "location");
+	type = xmlGetProp (root, "type");
 	enabled = xmlGetProp (root, "enabled");
-	frequency = xmlGetProp (root, "frequency");
 	username = xmlGetProp (root, "username");
 	publish_time = xmlGetProp (root, "publish_time");
+	remember_pw = xmlGetProp (root, "remember_pw");
+	no_pw = xmlGetProp (root, "no_password");
 	
 	if (location != NULL)
-		uri->location = g_strdup (location);
-	if (enabled != NULL)
+		uri->location = location;
+
+	if (type != NULL) {
+		uri->type = atoi (type);
+		xmlFree(type);	
+	}
+	if (enabled != NULL) {
 		uri->enabled = atoi (enabled);
-	if (frequency != NULL)
-		uri->publish_freq = atoi (frequency);
+		xmlFree(enabled);
+	}
 	if (username != NULL)
-		uri->username = g_strdup (username);
+		uri->username = username;
+	if(no_pw != NULL) {
+		uri->no_pw = atoi(no_pw);
+		xmlFree(no_pw);
+	}
+	if(remember_pw != NULL) {
+		uri->remember_pw = atoi(remember_pw);
+		xmlFree(remember_pw);
+	}
+
 	if (publish_time != NULL)
-		uri->last_pub_time = g_strdup (publish_time);
+		uri->last_pub_time = publish_time;
 	
-	uri->password = g_strdup ("");
+	if(uri->type == PUB_ONLINE) {
+		auto_publish = xmlGetProp (root, "auto_publish");
+		alarm_publish = xmlGetProp (root, "alarm_publish");
+
+		if (auto_publish != NULL) {
+			uri->auto_publish = atoi(auto_publish);
+			xmlFree(auto_publish);
+		}
+		if (alarm_publish != NULL) {
+			uri->alarm_publish = atoi(alarm_publish);
+			xmlFree(alarm_publish);
+		}
+		for (p = root->children; p != NULL; p = p->next) {
+			xmlChar *uid = xmlGetProp (p, "uid_task");
+			if(uid)
+				uri->tasks = g_slist_append (uri->tasks, uid);
+		}	
+	}
+
+	if(uri->type == PUB_FREE_BUSY) {
+		frequency = xmlGetProp (root, "frequency");
+		if (frequency != NULL) {
+			uri->publish_freq = atoi (frequency);
+			xmlFree(frequency);
+		}
+	}
 
 	for (p = root->children; p != NULL; p = p->next) {
 		xmlChar *uid = xmlGetProp (p, "uid");
-
-		l = g_slist_append (l, uid);
+		if(uid)
+			uri->calendars = g_slist_append (uri->calendars, uid);
 	}	
-	uri->calendars = l;
-	
-	xmlFree(location);
-	xmlFree(enabled);
+
 	xmlFreeDoc(doc);
 	return;
 }
 
-gchar *
+guchar *
 e_pub_uri_to_xml (EPublishUri *uri)
 {
 	xmlDocPtr doc;
 	xmlNodePtr root;
-	gchar *enabled, *frequency;
 	GSList *cals = NULL;
 	xmlChar *xml_buffer;
 	char *returned_buffer;
 	int xml_buffer_size;
+	gchar *str; /* temporary string from value to xml */
 
 	g_return_val_if_fail (uri != NULL, NULL);
 	g_return_val_if_fail (uri->location != NULL, NULL);
@@ -103,13 +185,43 @@
 	doc = xmlNewDoc ("1.0");
 
 	root = xmlNewDocNode (doc, NULL, "uri", NULL);
-	enabled = g_strdup_printf ("%d", uri->enabled);
-	frequency = g_strdup_printf ("%d", uri->publish_freq);
+	str = g_strdup_printf ("%d", uri->type);
+	xmlSetProp (root, "type", str);
+	g_free(str);
+	str = g_strdup_printf ("%d", uri->enabled);
+	xmlSetProp (root, "enabled", str);
+	g_free(str);
 	xmlSetProp (root, "location", uri->location);
-	xmlSetProp (root, "enabled", enabled);
-	xmlSetProp (root, "frequency", frequency);
 	xmlSetProp (root, "username", uri->username);
+	xmlSetProp (root, "username", uri->username);
+	str = g_strdup_printf ("%d", uri->no_pw);
+	xmlSetProp (root, "no_password", str);
+	g_free(str);
+	str = g_strdup_printf ("%d", uri->remember_pw);
+	xmlSetProp (root, "remember_pw", str);
+	g_free(str);
+
 	xmlSetProp (root, "publish_time", uri->last_pub_time);
+
+	if(uri->type == PUB_FREE_BUSY) {
+		str = g_strdup_printf ("%d", uri->publish_freq);
+		xmlSetProp (root, "frequency", str);
+		g_free(str);
+	}
+	
+	if(uri->type == PUB_ONLINE) {
+		str = g_strdup_printf ("%d", uri->auto_publish);
+		xmlSetProp (root, "auto_publish", str);
+		g_free(str);
+		str = g_strdup_printf ("%d", uri->alarm_publish);
+		xmlSetProp (root, "alarm_publish", str);
+		g_free(str);
+		for (cals = uri->tasks; cals != NULL; cals = cals->next) {
+			xmlNodePtr node;
+			node = xmlNewChild (root, NULL, "source", NULL);
+			xmlSetProp (node, "uid_task", cals->data);
+		}
+	}
 	
 	for (cals = uri->calendars; cals != NULL; cals = cals->next) {
 		xmlNodePtr node;
@@ -126,7 +238,6 @@
 	memcpy (returned_buffer, xml_buffer, xml_buffer_size);
 	returned_buffer [xml_buffer_size] = '\0';
 	xmlFree (xml_buffer);
-	g_free (enabled);
 
 	return returned_buffer;
 }
@@ -136,44 +247,58 @@
 	icaltimezone *utc;
 	struct icaltimetype current_itt, adjust_itt;
 
+	utc = icaltimezone_get_utc_timezone ();
+	current_itt = icaltime_current_time_with_zone (utc);
+
 	if (!uri->last_pub_time) {
-		utc = icaltimezone_get_utc_timezone ();
-		current_itt = icaltime_current_time_with_zone (utc);		
-		uri->last_pub_time = g_strdup (icaltime_as_ical_string (current_itt));
+		uri->last_pub_time = xmlCharStrdup(icaltime_as_ical_string (current_itt));
 		return TRUE;
-		
 	} else {
 		if (strlen (uri->last_pub_time) == 0) {
-			uri->last_pub_time = g_strdup (icaltime_as_ical_string (current_itt));
+			xmlFree(uri->last_pub_time);
+			uri->last_pub_time = xmlCharStrdup(icaltime_as_ical_string (current_itt));
 			return TRUE;
 		}
 		
-		utc = icaltimezone_get_utc_timezone ();
-		current_itt = icaltime_current_time_with_zone (utc);
 		adjust_itt = icaltime_from_string (uri->last_pub_time);
-		
-		switch (uri->publish_freq) {
+
+		if(uri->type == PUB_FREE_BUSY){ 
+			switch (uri->publish_freq) {
 			case URI_PUBLISH_DAILY:
 				icaltime_adjust (&adjust_itt, 1, 0, 0, 0);
 				if (icaltime_compare_date_only (adjust_itt, current_itt ) < 0) {
-					uri->last_pub_time = g_strdup (icaltime_as_ical_string (current_itt));
+					xmlFree(uri->last_pub_time);
+					uri->last_pub_time = xmlCharStrdup(icaltime_as_ical_string (current_itt));
 					return TRUE;
-				}
+				} else
+					return FALSE;
 				break;
 			case URI_PUBLISH_WEEKLY:
 				icaltime_adjust (&adjust_itt, 7, 0, 0, 0);
 				if (icaltime_compare_date_only (adjust_itt, current_itt ) < 0) {
-					uri->last_pub_time = g_strdup (icaltime_as_ical_string (current_itt));
+					xmlFree(uri->last_pub_time);
+					uri->last_pub_time = xmlCharStrdup(icaltime_as_ical_string (current_itt));
 					return TRUE;
-				}
+				} else
+					return FALSE;
+				break;
+			case URI_PUBLISH_USER:
+				xmlFree(uri->last_pub_time);
+				uri->last_pub_time = xmlCharStrdup(icaltime_as_ical_string (current_itt));
+				return TRUE;
 				break;
+			default:
+				return FALSE;
+			}
 		}
 	}
+	xmlFree(uri->last_pub_time);
+	uri->last_pub_time = xmlCharStrdup(icaltime_as_ical_string (current_itt));
 	
-	return FALSE;
+	return TRUE;
 }
 
-static gboolean
+G_INLINE_FUNC gboolean
 just_published (gchar *last_pub_time) {
 	icaltimezone *utc;
 	struct icaltimetype current_itt, adjust_itt;
@@ -182,156 +307,245 @@
 		utc = icaltimezone_get_utc_timezone ();
 		adjust_itt = icaltime_from_string (last_pub_time);
 		current_itt = icaltime_current_time_with_zone (utc);
-		icaltime_adjust (&adjust_itt, 0, 0, 0, 3);
-		if (icaltime_compare (adjust_itt, current_itt) < 0)
+		icaltime_adjust (&adjust_itt, 0, 0, 10, 0);
+//		g_message(G_STRLOC "last_pub_time = %s, current time = %s\n",
+//				last_pub_time, icaltime_as_ical_string(current_itt));
+		if (icaltime_compare (adjust_itt, current_itt) > 0)
 			return TRUE;
 		else
 			return FALSE;
 	}
-
 	
-	return TRUE;
+	return FALSE;
+}
+
+static void e_pub_uri_calendar_modified_cb(ECalListener *listener,
+		ECalendarStatus status,
+		const char *id, gpointer data){ /* not used */
+	g_return_if_fail(listener != NULL);
+	g_return_if_fail(E_IS_CAL_LISTENER(listener));
+	if(status != E_CALENDAR_STATUS_OK)
+		return;
+	e_pub_publish(PUB_ONLINE, TRUE);	
 }
 
 void
-e_pub_publish (gboolean publish) {
-	icaltimezone *utc;
+e_pub_publish (EPublishUriType type, gboolean publish) {
+	icaltimezone *utc = NULL;
 	time_t start = time (NULL), end;
-	GSList *uri_config_list, *l, *uri_list = NULL;
-	ESourceList *source_list;
-	GConfClient *gconf_client;
+	GSList *uri_config_list = NULL, *l = NULL, *uri_list = NULL;
+	ESourceList *source_list_cal, *source_list_tasks;
 	gboolean published = FALSE;
-	
-	gconf_client = gconf_client_get_default ();
-	source_list = e_source_list_new_for_gconf (gconf_client, "/apps/evolution/calendar/sources");
-	
+
+	source_list_cal = e_source_list_new_for_gconf_default(
+			"/apps/evolution/calendar/sources");
+	source_list_tasks = e_source_list_new_for_gconf_default(
+			"/apps/evolution/tasks/sources");
+
 	utc = icaltimezone_get_utc_timezone ();	
 	start = time_day_begin_with_zone (start, utc);
 	end = time_add_week_with_zone (start, 6, utc);
-		
-	uri_config_list = calendar_config_get_free_busy ();
-
+	
+	switch(type) {
+	case PUB_ONLINE:	
+		uri_config_list = calendar_config_get_publish ();
+		break;
+	case PUB_FREE_BUSY:
+		uri_config_list = calendar_config_get_free_busy ();
+		break;
+	}
+	
+	/* loop URIs */
 	for (l = uri_config_list; l != NULL; l = l->next) {
 		GSList *p =NULL;
-		EPublishUri *uri;
-		ECalComponent *clone = NULL;
-		gboolean cloned = FALSE;
+		EPublishUri uri;
 		ECal *client = NULL;
-		char *prompt;
+		gchar *prompt;
 		gboolean remember = FALSE;
-		gchar *password;
+		gchar *password = NULL;
 
-		gchar *xml = (gchar *)l->data;
+		guchar *xml = (guchar *)l->data;
 		
-		uri = g_new0 (EPublishUri, 1);		
-		e_pub_uri_from_xml (uri, xml);
+		e_pub_uri_from_xml (&uri, xml);
 		
 		/* kludge to safeguard against loop from gconf update */
-		if (!just_published (uri->last_pub_time))
-			return;
+		if (just_published (uri.last_pub_time)){
+			continue;
+		}
 		
-		/* TODO: make sure we're online */
 		/* skip this url if it isn't enabled or if it is manual */
-		if (!uri->enabled) {
-			uri_config_list = g_slist_next (uri_config_list);
+		if (!uri.enabled)
 			continue;
-		}	
 		
 		if (!publish) {
 			/* a g_idle publish, make sure we are not set to user only */
-			if (uri->publish_freq == URI_PUBLISH_USER) {
-				uri_config_list = g_slist_next (uri_config_list);
+			if (uri.publish_freq == URI_PUBLISH_USER)
 				continue;
-			}
 			
 			/* If not is it time to publish again? */
-			publish = is_publish_time (uri);
-				
+			publish = is_publish_time (&uri);
+
+			/* TODO: register the notifiers for calendars
+			 * marked auto_publish */
 		}
 		
 		/* User published or config change */
 		if (publish) {
+			icalcomponent *toplevel; /* new toplevel component that will hold all the data */
 			/* We still need to set the last_pub_time */
-			uri->last_pub_time = 0;
-			is_publish_time (uri);
+			if(uri.last_pub_time != NULL)
+				g_free(uri.last_pub_time);
+			uri.last_pub_time = NULL;
+			is_publish_time (&uri);
+			
+			toplevel = e_cal_util_new_top_level ();
+			icalcomponent_set_method (toplevel, ICAL_METHOD_PUBLISH);
 			
-			for (p = uri->calendars; p != NULL; p = p->next) {
-				GList *comp_list = NULL;
-				gchar *source_uid;
+			/* loop calendars */
+			for (p = uri.calendars; p != NULL; p = p->next) {
+				GList *comp_list = NULL; /* list of icalcomponents for this calendar */
+				GList *tmp;
 				ESource * source;
+				gboolean ret = FALSE;
 	
-				source_uid = g_strdup (p->data);
-				source =  e_source_list_peek_source_by_uid (source_list, source_uid);
+				source =  e_source_list_peek_source_by_uid (source_list_cal, (gchar *) p->data);
 				if (source)
 					client = auth_new_cal_from_source (source, E_CAL_SOURCE_TYPE_EVENT);
 
 				if (!client) {
-					g_warning (G_STRLOC ": Could not publish Free/Busy: Calendar backend no longer exists");
+					g_warning (G_STRLOC ": Could not publish calendar: Calendar backend no longer exists.");
 
 					continue;
 				}
-			
-				e_cal_open (client, TRUE, NULL);
-				
-				if (e_cal_get_free_busy ((ECal *) client, NULL,
+				if(!e_cal_open (client, TRUE, NULL)){
+					g_warning (G_STRLOC ": Could not publish calendar: could not open calendar.");
+					continue;
+				}
+
+				switch(type) {
+				case PUB_ONLINE:
+					ret = e_cal_get_object_list (client, "#t",
+							&comp_list, NULL);
+					break;
+				case PUB_FREE_BUSY:
+					/* TODO fix this, it no longer works!!! */
+					{
+					gboolean cloned = FALSE;	
+					ECalComponent *clone = NULL;
+					ret = e_cal_get_free_busy (client, NULL,
 							 start, end, 
-							 &comp_list, NULL)) {
+							 &tmp, NULL);
+					for (; tmp; tmp = tmp->next) {
+						ECalComponent *comp = E_CAL_COMPONENT (tmp->data);
+						cloned = itip_publish_begin (comp, cloned, &clone);
+						g_object_unref (comp);
+					}
+					comp_list = g_list_append(comp_list, itip_comp_fb_normalize(
+								e_cal_component_get_icalcomponent(clone)));
+					ret = cloned;
+					break;
+					}
+				}
+				
+				if (ret) {
 					GList *l;
-	
 					for (l = comp_list; l; l = l->next) {
-						ECalComponent *comp = E_CAL_COMPONENT (l->data);
-					
-						cloned = itip_publish_begin (comp, (ECal *) client, cloned, &clone);
-						g_object_unref (comp);
+						if(!uri.alarm_publish){
+							ECalComponent *e = e_cal_component_new();
+							if(!e_cal_component_set_icalcomponent(e, (icalcomponent *)l->data)){
+								g_warning(G_STRLOC " - e_cal_component_set_icalcomponent_failed.");
+							} else if(e_cal_component_has_alarms(e)){
+									e_cal_component_remove_all_alarms(e);
+									icalcomponent_add_component(toplevel, e_cal_component_get_icalcomponent(e));
+							}
+							g_object_unref(e);
+							continue;
+						}
+						icalcomponent_add_component(toplevel, l->data);
 					}
 					g_list_free (comp_list);
 				}
+//				offline |= e_source_get_property (source, "offline");
 				
 				g_object_unref (client);
-			
-				g_free (source_uid);
-			}
+				client = NULL;
+			} /* end loop calendars */
 
-			/* add password to the uri */
-			password = e_passwords_get_password ("Calendar", 
-							     (gchar *)uri->location);
-			
-			if (!password) {
-				prompt = g_strdup_printf (_("Enter the password for %s"), (gchar *)uri->location);
-				password = e_passwords_ask_password (_("Enter password"), 
-								     "Calendar", (gchar *)uri->location, 
-								     prompt,
-								     E_PASSWORDS_REMEMBER_FOREVER|E_PASSWORDS_SECRET|E_PASSWORDS_ONLINE,
-								     &remember, NULL);
+			/* loop task lists */
+			for (p = uri.tasks; type == PUB_ONLINE && p != NULL; p = p->next) {
+				GList *comp_list = NULL; /* list of icalcomponents for this task list */
+				ESource * source;
+				gboolean ret = FALSE;
+	
+				source =  e_source_list_peek_source_by_uid (source_list_tasks, (gchar *) p->data);
+				if (source)
+					client = auth_new_cal_from_source (source, E_CAL_SOURCE_TYPE_TODO);
 
-				g_free (prompt);
-					
-				if (!password) {
-					g_slist_free (p);
+				if (!client) {
+					g_warning (G_STRLOC " - Could not publish task list: backend no longer exists.");
+					continue;
+				}
+				if(!e_cal_open (client, TRUE, NULL)){
+					g_warning (G_STRLOC " - Could not publish task list: could not open it.");
 					continue;
 				}
+
+				ret = e_cal_get_object_list (client, "#t",
+							&comp_list, NULL);
+	
+				if (ret) {
+					GList *l;
+					for (l = comp_list; l; l = l->next) {
+						icalcomponent_add_component(toplevel, l->data);
+					}
+					g_list_free (comp_list);
+				}
+	
+				g_object_unref (client);
+			} /* end loop tasks */
+
+			/* add password to the uri */
+			if(!uri.no_pw) {
+				password = e_passwords_get_password ("Calendar", 
+							     (gchar *)uri.location);
+				if (!password) {
+					prompt = g_strdup_printf (
+						_("Enter the password for %s"), (gchar *)uri.location);
+					password = e_passwords_ask_password (_("Enter password"), 
+							     "Calendar", (gchar *)uri.location, 
+							     prompt,
+							     E_PASSWORDS_REMEMBER_FOREVER|E_PASSWORDS_SECRET|E_PASSWORDS_ONLINE,
+							     &remember, NULL);
+					g_free (prompt);
+				}
 			}
-		
-			if (cloned && clone)
-				published = itip_publish_comp ((ECal *) client,
-						       uri->location,
-						       uri->username, 
-						       password, &clone);
-			
-			g_slist_free (p);
-		}
-		xml = e_pub_uri_to_xml (uri);
+//			e_cal_component_set_url(e_toplevel, uri.location);
+
+			published = itip_publish_comp (toplevel, TRUE,//offline,
+					       uri.location,
+					       uri.username, 
+					       password);
+		} /* end if(publish) */
+
+		xml = e_pub_uri_to_xml (&uri);
 		if (xml != NULL) {
 			uri_list = g_slist_append (uri_list, xml);
 		}
-		g_free (uri);
-	}
+		e_pub_uri_free(&uri);
+	} /* end loop URIs */
 	
 	if (published) {
 		/* Update gconf so we have the last_pub_time */
-		calendar_config_set_free_busy (uri_list);
+		switch (type) {
+		case PUB_ONLINE:
+			calendar_config_set_publish (uri_list);
+			break;
+		case PUB_FREE_BUSY:
+			calendar_config_set_free_busy (uri_list);
+			break;
+		}
 	}
-		
+
 	g_slist_free (uri_config_list);
 	g_slist_free (uri_list);
 }
Index: calendar/gui/e-pub-utils.h
===================================================================
RCS file: /cvs/gnome/evolution/calendar/gui/e-pub-utils.h,v
retrieving revision 1.1
diff -u -u -r1.1 e-pub-utils.h
--- calendar/gui/e-pub-utils.h	13 Jan 2004 01:59:28 -0000	1.1
+++ calendar/gui/e-pub-utils.h	30 Mar 2005 04:06:41 -0000
@@ -6,6 +6,8 @@
  *
  * Author: Gary Ekker <gekker novell com>
  *
+ * iCal publishing code by Stéphane Konstantaropoulos <stephane cs york ac uk>
+ *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of version 2 of the GNU General Public
  * License as published by the Free Software Foundation.
@@ -28,11 +30,11 @@
 
 G_BEGIN_DECLS
 
-enum publish_frequency{
+typedef enum {
 	URI_PUBLISH_DAILY,
 	URI_PUBLISH_WEEKLY,
-	URI_PUBLISH_USER
-};
+	URI_PUBLISH_USER,
+} EPublishFreq;
 
 static const int pub_frequency_type_map[] = {
 	URI_PUBLISH_DAILY,
@@ -41,21 +43,33 @@
 	-1
 };
 
-struct _EPublishUri {
+typedef enum {
+	PUB_FREE_BUSY,
+	PUB_ONLINE
+} EPublishUriType;
+
+typedef struct {
+	/* for both types */
+	EPublishUriType type;
 	gint enabled;
-	gchar *location;
-	gint publish_freq;
-	gchar *username;
-	gchar *password;
+	guchar *location;
+	guchar *username;
+	gboolean no_pw;
+	gboolean remember_pw;
 	GSList *calendars;
-	gchar *last_pub_time;
-};
-
-typedef struct _EPublishUri EPublishUri;
-
-void e_pub_uri_from_xml (EPublishUri *uri, const gchar *xml);
-gchar  *e_pub_uri_to_xml (EPublishUri *uri);
-void e_pub_publish (gboolean publish) ;
+	guchar *last_pub_time;
+	/* only for PUB_FREE_BUSY */
+	EPublishFreq publish_freq;
+	/* only for PUB_ONLINE */
+	GSList *tasks;
+	gboolean auto_publish;
+	gboolean alarm_publish;
+} EPublishUri;
+
+void e_pub_uri_free(EPublishUri *uri);
+void e_pub_uri_from_xml (EPublishUri *uri, const guchar *xml);
+guchar  *e_pub_uri_to_xml (EPublishUri *uri);
+void e_pub_publish (EPublishUriType type, gboolean publish) ;
 
 G_END_DECLS
 
Index: calendar/gui/itip-utils.c
===================================================================
RCS file: /cvs/gnome/evolution/calendar/gui/itip-utils.c,v
retrieving revision 1.98
diff -u -u -r1.98 itip-utils.c
--- calendar/gui/itip-utils.c	15 Mar 2005 16:05:07 -0000	1.98
+++ calendar/gui/itip-utils.c	30 Mar 2005 04:06:47 -0000
@@ -36,9 +36,12 @@
 #include <e-util/e-time-utils.h>
 #include <libecal/e-cal-time-util.h>
 #include <libecal/e-cal-util.h>
+#include <libedataserverui/e-passwords.h>
 #include <libsoup/soup-session-async.h>
 #include <libsoup/soup-message.h>
 #include <libsoup/soup-uri.h>
+#include <libgnomevfs/gnome-vfs.h>
+#include <gconf/gconf-client.h>
 #include "calendar-config.h"
 #include "itip-utils.h"
 #include "dialogs/cal-attachment.h"
@@ -1052,36 +1055,32 @@
 }
 
 gboolean
-itip_publish_begin (ECalComponent *pub_comp, ECal *client, 
+itip_publish_begin (ECalComponent *pub_comp, 
 		    gboolean cloned, ECalComponent **clone)
 {
 	icalcomponent *icomp =NULL, *icomp_clone = NULL;
 	icalproperty *prop;
-		
-	if (e_cal_component_get_vtype (pub_comp) == E_CAL_COMPONENT_FREEBUSY) {
-				
+	if (e_cal_component_get_vtype (pub_comp) == E_CAL_COMPONENT_FREEBUSY) {		
 		if (!cloned) {
 			*clone = e_cal_component_clone (pub_comp);
-			cloned = TRUE;
 		} else {
-			
 			icomp = e_cal_component_get_icalcomponent (pub_comp);
 			icomp_clone = e_cal_component_get_icalcomponent (*clone);
 			for (prop = icalcomponent_get_first_property (icomp,
 						      ICAL_FREEBUSY_PROPERTY);
 	     			prop != NULL;
-	     			prop = icalcomponent_get_next_property (icomp, 
+     				prop = icalcomponent_get_next_property (icomp, 
 						       ICAL_FREEBUSY_PROPERTY))
 			{
 				icalproperty *p;
-		
+	
 				p = icalproperty_new_clone (prop);
 				icalcomponent_add_property (icomp_clone, p);
 			}
-		}		
+		}
+		return TRUE;
 	}
-
-	return TRUE;
+	return FALSE;
 }
 
 static void
@@ -1111,8 +1110,8 @@
 	}
 }
 
-static icalcomponent *
-comp_fb_normalize (icalcomponent *icomp)
+icalcomponent *
+itip_comp_fb_normalize (icalcomponent *icomp)
 {
 	icalcomponent *iclone;
 	icalproperty *prop, *p;
@@ -1197,64 +1196,164 @@
 }
 
 gboolean
-itip_publish_comp (ECal *client, gchar *uri, gchar *username, 
-		   gchar *password, ECalComponent **pub_comp)
+itip_publish_comp (icalcomponent *toplevel, gboolean offline,
+		gchar *uri, gchar *username, gchar *password)
 {
-	icalcomponent *toplevel = NULL, *icalcomp = NULL;
-	icalcomponent *icomp = NULL;
-	SoupSession *session;
-	SoupMessage *msg;
-	SoupUri *real_uri;
+	icalcomponent *icalcomp = NULL;
 	char *ical_string;
+	gboolean http;
+	GnomeVFSURI *vfs_uri;
+	GnomeVFSHandle *handle = NULL;
+	GnomeVFSResult result;
+	GnomeVFSFileSize bytes;
+	GnomeVFSFileSize bytes_written = 0;
+
+	/* for URIs that need password input, like ssh */
+	gnome_authentication_manager_init();
+
+	if(strncasecmp(uri, "http", 4) == 0){
+		/* Publish the component with SOAP */
+		GConfClient *client = gconf_client_get_default();
+		SoupSession *session;
+		SoupUri *real_uri;
+		SoupMessage *msg;
+		if(gconf_client_get_bool(client, "/system/http_proxy/use_http_proxy", NULL)){
+			SoupUri *proxy_uri;
+			char *proxy_string;
+			char *host = gconf_client_get_string(client,
+					"/system/http_proxy/host", NULL);
+			int port = gconf_client_get_int(client,
+					"/system/http_proxy/port", NULL);
+			if(gconf_client_get_bool(client,
+					"/system/http_proxy/use_authentication", NULL)){
+				char *user = gconf_client_get_string (client,
+					"/system/http_proxy/authentication_user", NULL);
+				char *password = gconf_client_get_string (client,
+					"/system/http_proxy/authentication_password", NULL);
+				proxy_string = g_strdup_printf("http://%s:%s %s:%d", user, password, host, port);
+				g_free(user);
+				g_free(password);
+			} else {
+				proxy_string = g_strdup_printf("http://%s:%d";, host, port);
+			}
+			proxy_uri = soup_uri_new(proxy_string);
+			g_free(host);
+			g_free(proxy_string);
+			session = soup_session_async_new_with_options(SOUP_SESSION_PROXY_URI, proxy_uri, NULL);
+		} else
+			session = soup_session_async_new ();
+		real_uri = soup_uri_new (uri);
+		if (!real_uri || !real_uri->host) {
+			g_warning (G_STRLOC ": Invalid URL: %s", uri);
+			g_object_unref (session);
+			g_object_unref (client);
+			return FALSE;
+		}
+  
+		real_uri->user = g_strdup (username);
+		real_uri->passwd = g_strdup (password);
+  	
+		/* build the SOAP message */
+		msg = soup_message_new_from_uri (SOUP_METHOD_PUT, real_uri);
+		if (!msg) {
+			g_warning (G_STRLOC ": Could not build SOAP message");
+			soup_uri_free (real_uri);
+			g_object_unref (session);
+			g_object_unref (client);
+			return FALSE;
+		}
+		soup_message_set_flags (msg, SOUP_MESSAGE_NO_REDIRECT);	
+		ical_string = icalcomponent_as_ical_string (toplevel);
+		soup_message_set_request (msg, "text/calendar", SOUP_BUFFER_USER_OWNED,
+					  ical_string, strlen (ical_string));
+  
+		/* send message to server */
+		soup_session_send_message (session, msg);
+		if (!SOUP_STATUS_IS_SUCCESSFUL (msg->status_code)) {
+			g_warning(G_STRLOC ": Could not publish calendars: %d: %s", 
+					msg->status_code, 
+					soup_status_get_phrase (msg->status_code));
+			soup_uri_free (real_uri);
+			g_object_unref (session);
+			g_object_unref (client);
+			return FALSE;
+		}
+  
+		soup_uri_free (real_uri);
+		g_object_unref (session);
+		g_object_unref (client);
+		return TRUE;
+	}
 	
-	toplevel = e_cal_util_new_top_level ();
-	icalcomponent_set_method (toplevel, ICAL_METHOD_PUBLISH);
-	
-	e_cal_component_set_url (*pub_comp, uri);
-	
-	icalcomp = e_cal_component_get_icalcomponent (*pub_comp);
+	if((vfs_uri = gnome_vfs_uri_new(uri)) == NULL){
+		g_warning (G_STRLOC ": Invalid URL: %s", uri);
+		return FALSE;
+	}
+	if(!gnome_vfs_uri_is_local(vfs_uri)){
+		/* TODO: if this is not a local uri. make sure we're online */
+	/*
+		GNOME_Evolution_Offline offline_obj;
+		CORBA_Environment ev;
+		CORBA_boolean offline = FALSE;
+		
+		CORBA_exception_init (&ev);
+		interface = Bonobo_Unknown_queryInterface(
+		objref, "IDL:GNOME/Evolution/Offline:1.0", &ev);
+
+		if (ev._major != CORBA_NO_EXCEPTION) {
+			CORBA_exception_free (&ev);
+			return;
+		}
+		
+		offline = GNOME_Evolution_Offline__get_isOffline(offline_obj, &ev);
+		if (ev._major != CORBA_NO_EXCEPTION) {
+			CORBA_exception_free (&ev);
+			//error querying CORBA object
+			return;
+		}
+		
+		if (offline) {
+			//error... we are offline
+			CORBA_exception_free (&ev);
+			return;
+		}
 	
-	icomp = comp_fb_normalize (icalcomp);	
-
-	icalcomponent_add_component (toplevel, icomp);
-	ical_string = icalcomponent_as_ical_string (toplevel);
+		CORBA_exception_free (&ev);
+	*/
+	}
 
-	/* Publish the component */
-	session = soup_session_async_new ();
+	gnome_vfs_uri_set_user_name(vfs_uri, username);
+	gnome_vfs_uri_set_password(vfs_uri, password);
+	if(!gnome_vfs_uri_exists(vfs_uri)) {
+		result = gnome_vfs_create_uri(&handle, vfs_uri,
+			GNOME_VFS_OPEN_WRITE,
+			FALSE, GNOME_VFS_PERM_USER_WRITE | GNOME_VFS_PERM_USER_READ);
+	} else {
+		result = gnome_vfs_open_uri(&handle, vfs_uri, GNOME_VFS_OPEN_WRITE);
+	}
 
-	real_uri = soup_uri_new (uri);
-	if (!real_uri || !real_uri->host) {
-		g_warning (G_STRLOC ": Invalid URL: %s", uri);
-		g_object_unref (session);
+	if(result != GNOME_VFS_OK){
+		g_warning("Publish: Cannot open uri: %s, %s", uri, gnome_vfs_result_to_string(result));
 		return FALSE;
 	}
 	
-	real_uri->user = g_strdup (username);
-	real_uri->passwd = g_strdup (password);
-		
-	/* build the SOAP message */
-	msg = soup_message_new_from_uri (SOUP_METHOD_PUT, real_uri);
-	if (!msg) {
-		g_warning (G_STRLOC ": Could not build SOAP message");
-		g_object_unref (session);
-		return FALSE;
+	ical_string = icalcomponent_as_ical_string (toplevel);
+	bytes = strlen (ical_string);
+	while(bytes > bytes_written) {
+		bytes = bytes - bytes_written;
+		ical_string = ical_string + bytes_written;
+		result = gnome_vfs_write(handle, ical_string, bytes, &bytes_written);
+		if(result != GNOME_VFS_OK){
+			g_warning(gnome_vfs_result_to_string(result));
+			return FALSE;
+		}
 	}
-	soup_message_set_flags (msg, SOUP_MESSAGE_NO_REDIRECT);	
-	soup_message_set_request (msg, "text/calendar", SOUP_BUFFER_USER_OWNED,
-				  ical_string, strlen (ical_string));
-	
-	/* send message to server */
-	soup_session_send_message (session, msg);
-	if (!SOUP_STATUS_IS_SUCCESSFUL (msg->status_code)) {
-		g_warning(G_STRLOC ": Could not publish Free/Busy: %d: %s", 
-			  msg->status_code, 
-			  soup_status_get_phrase (msg->status_code));
-		g_object_unref (session);
+
+	result = gnome_vfs_close(handle);
+	if(result != GNOME_VFS_OK){
+		g_warning("Publish: Cannot close uri: %s, %s", uri, gnome_vfs_result_to_string(result));
 		return FALSE;
 	}
 	
-	soup_uri_free (real_uri);
-	g_object_unref (session);
-	
 	return TRUE;
 }
Index: calendar/gui/itip-utils.h
===================================================================
RCS file: /cvs/gnome/evolution/calendar/gui/itip-utils.h,v
retrieving revision 1.17
diff -u -u -r1.17 itip-utils.h
--- calendar/gui/itip-utils.h	8 Jan 2005 10:53:53 -0000	1.17
+++ calendar/gui/itip-utils.h	30 Mar 2005 04:06:47 -0000
@@ -31,10 +31,11 @@
 gboolean itip_send_comp (ECalComponentItipMethod method, ECalComponent *comp,
 			 ECal *client, icalcomponent *zones, GSList *attachments_list);
 
-gboolean itip_publish_comp (ECal *client, gchar* uri, gchar* username, 
-			    gchar* password, ECalComponent **pub_comp);
+gboolean itip_publish_comp (icalcomponent *toplevel, gboolean offline,
+		gchar* uri, gchar* username, gchar* password);
 
-gboolean itip_publish_begin (ECalComponent *pub_comp, ECal *client, 
+gboolean itip_publish_begin (ECalComponent *pub_comp, 
 			     gboolean cloned, ECalComponent **clone);
+icalcomponent *itip_comp_fb_normalize (icalcomponent *icomp);
 
 #endif
Index: calendar/gui/dialogs/Makefile.am
===================================================================
RCS file: /cvs/gnome/evolution/calendar/gui/dialogs/Makefile.am,v
retrieving revision 1.69
diff -u -u -r1.69 Makefile.am
--- calendar/gui/dialogs/Makefile.am	8 Jan 2005 10:53:52 -0000	1.69
+++ calendar/gui/dialogs/Makefile.am	30 Mar 2005 04:06:48 -0000
@@ -62,6 +62,8 @@
 	event-page.h		\
 	meeting-page.c		\
 	meeting-page.h		\
+	publish-editor-dialog.c	\
+	publish-editor-dialog.h	\
 	recurrence-page.c	\
 	recurrence-page.h	\
 	recur-comp.c		\
@@ -91,6 +93,7 @@
 	e-delegate-dialog.glade		\
 	event-page.glade		\
 	meeting-page.glade		\
+	publish-editor-dialog.glade	\
 	recurrence-page.glade		\
 	schedule-page.glade		\
 	task-details-page.glade		\
Index: calendar/gui/dialogs/cal-prefs-dialog.c
===================================================================
RCS file: /cvs/gnome/evolution/calendar/gui/dialogs/cal-prefs-dialog.c,v
retrieving revision 1.41
diff -u -u -r1.41 cal-prefs-dialog.c
--- calendar/gui/dialogs/cal-prefs-dialog.c	31 Dec 2004 16:59:18 -0000	1.41
+++ calendar/gui/dialogs/cal-prefs-dialog.c	30 Mar 2005 04:06:55 -0000
@@ -35,6 +35,7 @@
 #include "cal-prefs-dialog.h"
 #include "../calendar-config.h"
 #include "url-editor-dialog.h"
+#include "publish-editor-dialog.h"
 
 #include <gtk/gtk.h>
 #include <gtk/gtkmain.h>
@@ -87,6 +88,18 @@
 						   GtkTreeViewColumn *column, 
 						   DialogData *dialog_data);
 static void show_fb_config (DialogData *dialog_data);
+static void show_publish_config (DialogData *dialog_data);
+
+static void cal_prefs_dialog_pub_url_add_clicked (GtkWidget *button, DialogData *dialog_data);
+static void cal_prefs_dialog_pub_url_edit_clicked (GtkWidget *button, DialogData *dialog_data);
+static void cal_prefs_dialog_pub_url_remove_clicked (GtkWidget *button, DialogData *dialog_data);
+static void cal_prefs_dialog_pub_url_enable_clicked (GtkWidget *button, DialogData *dialog_data);
+static void cal_prefs_dialog_pub_url_list_change (GtkTreeSelection *selection, DialogData *dialog_data);
+static void cal_prefs_dialog_pub_url_list_enable_toggled (GtkCellRendererToggle *renderer, const char *path_string, DialogData *dialog_data);
+static void cal_prefs_dialog_pub_url_list_double_click(GtkTreeView *treeview, 
+						   GtkTreePath *path, 
+						   GtkTreeViewColumn *column, 
+						   DialogData *dialog_data);
 
 GtkWidget *cal_prefs_dialog_create_time_edit (void);
 
@@ -346,8 +359,6 @@
 	GtkTreeIter iter;
 	gboolean valid;
 	
-	url_list = NULL;
-	
 	model = (GtkListStore *) gtk_tree_view_get_model (dialog_data->url_list);
 	
 	valid = gtk_tree_model_get_iter_first ((GtkTreeModel *) model, &iter);
@@ -356,7 +367,7 @@
 		char *xml;
 		
 		gtk_tree_model_get ((GtkTreeModel *) model, &iter, 
-				    URL_LIST_FREE_BUSY_URL_COLUMN, &url, 
+				    URL_LIST_URL_COLUMN, &url, 
 				    -1);
 		
 		if ((xml = e_pub_uri_to_xml (url)))
@@ -371,12 +382,48 @@
 }
 
 static void
+pub_url_list_changed (DialogData *dialog_data)
+{
+	GtkListStore *model = NULL;
+	GSList *url_list = NULL;
+	GtkTreeIter iter;
+	gboolean valid;
+	
+	model = (GtkListStore *) gtk_tree_view_get_model (dialog_data->pub_url_list);
+	
+	valid = gtk_tree_model_get_iter_first ((GtkTreeModel *) model, &iter);
+	while (valid) {
+		EPublishUri *url;
+		char *xml;
+		
+		gtk_tree_model_get ((GtkTreeModel *) model, &iter, 
+				    URL_LIST_URL_COLUMN, &url, 
+				    -1);
+		
+		if ((xml = e_pub_uri_to_xml (url)))
+			url_list = g_slist_append (url_list, xml);
+		
+		valid = gtk_tree_model_iter_next ((GtkTreeModel *) model, &iter);
+	}
+	
+	calendar_config_set_publish (url_list);
+	
+	g_slist_free (url_list);
+}
+
+static void
 template_url_changed (GtkEntry *entry, DialogData *dialog_data)
 {
 	calendar_config_set_free_busy_template (gtk_entry_get_text (entry));
 }
 
 static void
+pub_template_url_changed (GtkEntry *entry, DialogData *dialog_data)
+{
+	calendar_config_set_publish_template (gtk_entry_get_text (entry));
+}
+
+static void
 setup_changes (DialogData *dialog_data)
 {
 	int i;
@@ -420,6 +467,7 @@
 			  G_CALLBACK (default_reminder_units_changed), dialog_data);
 
 	g_signal_connect (dialog_data->template_url, "changed", G_CALLBACK (template_url_changed), dialog_data);
+	g_signal_connect (dialog_data->pub_template_url, "changed", G_CALLBACK (pub_template_url_changed), dialog_data);
 }
 
 /* Gets the widgets from the XML file and returns if they are all available.
@@ -473,6 +521,12 @@
 
 	data->template_url = GW("template_url");
 
+	data->pub_url_add = GW ("pub_url_add");
+	data->pub_url_edit = GW ("pub_url_edit");
+	data->pub_url_remove = GW ("pub_url_remove");
+	data->pub_url_enable = GW ("pub_url_enable");
+	data->pub_url_list = GTK_TREE_VIEW (GW ("pub_url_list"));
+	data->pub_template_url = GW("pub_template_url");
 #undef GW
 
 	return (data->page
@@ -506,7 +560,12 @@
 		&& data->url_edit
 		&& data->url_remove
 		&& data->url_enable
-		&& data->url_list);
+		&& data->url_list
+		&& data->pub_url_add
+		&& data->pub_url_edit
+		&& data->pub_url_remove
+		&& data->pub_url_enable
+		&& data->pub_url_list);
 }
 
 
@@ -596,6 +655,66 @@
 	g_signal_connect (dialog_data->url_list, "row-activated",
 			 G_CALLBACK (cal_prefs_dialog_url_list_double_click),
 			 dialog_data);
+	g_signal_connect (selection, "changed",
+			 G_CALLBACK (cal_prefs_dialog_url_list_change),
+			 dialog_data);
+
+	/* Online Publishing */
+	g_signal_connect (dialog_data->pub_url_add, "clicked",
+			  G_CALLBACK (cal_prefs_dialog_pub_url_add_clicked),
+			  dialog_data);
+	
+	g_signal_connect (dialog_data->pub_url_edit, "clicked",
+			  G_CALLBACK (cal_prefs_dialog_pub_url_edit_clicked),
+			  dialog_data);
+	
+	g_signal_connect (dialog_data->pub_url_remove, "clicked",
+			  G_CALLBACK (cal_prefs_dialog_pub_url_remove_clicked),
+			  dialog_data);
+	
+	g_signal_connect (dialog_data->pub_url_enable, "clicked",
+			  G_CALLBACK (cal_prefs_dialog_pub_url_enable_clicked),
+			  dialog_data);
+	
+	/* Online Publishing Listview */
+	renderer = gtk_cell_renderer_toggle_new();
+	g_object_set ((GObject *) renderer, "activatable", TRUE, NULL);
+	
+	model = gtk_list_store_new (URL_LIST_N_COLUMNS, G_TYPE_BOOLEAN,
+				    G_TYPE_STRING, G_TYPE_POINTER);
+	
+	gtk_tree_view_set_model (dialog_data->pub_url_list, 
+				 (GtkTreeModel *) model);
+
+	gtk_tree_view_insert_column_with_attributes (dialog_data->pub_url_list, -1,
+						    _("Enabled"), renderer,
+						    "active", 
+						     URL_LIST_ENABLED_COLUMN, 
+						    NULL);
+
+	g_signal_connect (renderer, "toggled", 
+			 G_CALLBACK (cal_prefs_dialog_pub_url_list_enable_toggled),
+			 dialog_data);
+	
+	renderer = gtk_cell_renderer_text_new ();
+	gtk_tree_view_insert_column_with_attributes(dialog_data->pub_url_list, -1, 
+						    _("Location"), renderer,
+						    "text", 
+						    URL_LIST_LOCATION_COLUMN, 
+						    NULL);
+	
+	selection = gtk_tree_view_get_selection (
+			(GtkTreeView *) dialog_data->pub_url_list);
+	gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE);
+	gtk_tree_view_set_headers_visible (
+			(GtkTreeView *) dialog_data->pub_url_list, TRUE);
+	
+	g_signal_connect (dialog_data->pub_url_list, "row-activated",
+			 G_CALLBACK (cal_prefs_dialog_pub_url_list_double_click),
+			 dialog_data);
+	g_signal_connect (selection, "changed",
+			 G_CALLBACK (cal_prefs_dialog_pub_url_list_change),
+			 dialog_data);
 }
 
 /* Sets the color in a color picker from an X color spec */
@@ -638,7 +757,7 @@
 					   url->enabled,
 					   URL_LIST_LOCATION_COLUMN, 
 					   g_strdup (url->location),
-					   URL_LIST_FREE_BUSY_URL_COLUMN, url,
+					   URL_LIST_URL_COLUMN, url,
 					   -1);
 			
 			url_list_changed (dialog_data);
@@ -669,7 +788,7 @@
 		selection = gtk_tree_view_get_selection ((GtkTreeView *) dialog_data->url_list);
 		if (gtk_tree_selection_get_selected (selection, &model, &iter)){
 			gtk_tree_model_get (model, &iter, 
-					    URL_LIST_FREE_BUSY_URL_COLUMN, 
+					    URL_LIST_URL_COLUMN, 
 					    &url, 
 					    -1);
 
@@ -683,7 +802,7 @@
 					   g_strdup (url->location), 
 					   URL_LIST_ENABLED_COLUMN, 
 					   url->enabled, 
-					   URL_LIST_FREE_BUSY_URL_COLUMN, url,
+					   URL_LIST_URL_COLUMN, url,
 					   -1);
 			
 			url_list_changed (dialog_data);
@@ -715,7 +834,7 @@
 	selection = gtk_tree_view_get_selection (dialog_data->url_list);
 	if (gtk_tree_selection_get_selected (selection, &model, &iter))
 		gtk_tree_model_get (model, &iter, 
-				    URL_LIST_FREE_BUSY_URL_COLUMN, &url, 
+				    URL_LIST_URL_COLUMN, &url, 
 				    -1);
 	
 	/* make sure we have a valid account selected and that 
@@ -757,7 +876,7 @@
 			gtk_widget_set_sensitive (GTK_WIDGET (dialog_data->url_remove), FALSE);
 			gtk_widget_set_sensitive (GTK_WIDGET (dialog_data->url_enable), FALSE);
 		}
-		g_free (url);
+		g_free(url);
 		url_list_changed (dialog_data);
 	}
 }
@@ -773,7 +892,7 @@
 	selection = gtk_tree_view_get_selection (dialog_data->url_list);
 	if (gtk_tree_selection_get_selected (selection, &model, &iter)) {
 		gtk_tree_model_get (model, &iter, 
-				    URL_LIST_FREE_BUSY_URL_COLUMN, &url, 
+				    URL_LIST_URL_COLUMN, &url, 
 				    -1);
 		url->enabled = !url->enabled;
 		
@@ -807,7 +926,7 @@
 
 	if (gtk_tree_model_get_iter (model, &iter, path)) {
 		gtk_tree_model_get (model, &iter, 
-				    URL_LIST_FREE_BUSY_URL_COLUMN, &url, 
+				    URL_LIST_URL_COLUMN, &url, 
 				    -1);
 		
 		url->enabled = !url->enabled;
@@ -846,7 +965,7 @@
 	state = gtk_tree_selection_get_selected (selection, &model, &iter);
 	if (state) {
 		gtk_tree_model_get (model, &iter, 
-				    URL_LIST_FREE_BUSY_URL_COLUMN, &url, 
+				    URL_LIST_URL_COLUMN, &url, 
 				    -1);
 
 		if (url->location && url->enabled)
@@ -902,6 +1021,7 @@
 		gchar *xml = (gchar *)url_config_list->data;
 		EPublishUri *url;
 		url = g_new0 (EPublishUri, 1);
+		url->type = PUB_FREE_BUSY;
 		
 		e_pub_uri_from_xml (url, xml);
 		if (url->location) {
@@ -911,7 +1031,7 @@
 					   url->enabled,
 					   URL_LIST_LOCATION_COLUMN, 
 					   url->location,
-					   URL_LIST_FREE_BUSY_URL_COLUMN, url,
+					   URL_LIST_URL_COLUMN, url,
 					   -1);
 		}
 
@@ -928,6 +1048,323 @@
 	g_free (template_url);
 }
 
+/* Shows the current Online Publishing settings in the dialog */
+static void
+show_publish_config (DialogData *dialog_data)
+{
+	GSList *url_config_list = NULL;
+	GtkListStore *model;
+	GtkTreeIter iter;
+	gchar *template_url;
+	
+	model = (GtkListStore *) gtk_tree_view_get_model (dialog_data->pub_url_list);
+	gtk_list_store_clear (model);
+	
+	/* restore urls from gconf */
+	url_config_list = calendar_config_get_publish();
+
+	if (!url_config_list) {
+		/* list is empty-disable edit, remove, and enable buttons */
+		gtk_widget_set_sensitive (GTK_WIDGET (dialog_data->pub_url_edit), 
+					 FALSE);
+
+		gtk_widget_set_sensitive (GTK_WIDGET (dialog_data->pub_url_remove), 
+					 FALSE);
+
+		gtk_widget_set_sensitive (GTK_WIDGET (dialog_data->pub_url_enable), 
+					 FALSE);
+	}	else {
+		gtk_widget_set_sensitive (GTK_WIDGET (dialog_data->pub_url_edit), 
+					 TRUE);
+
+		gtk_widget_set_sensitive (GTK_WIDGET (dialog_data->pub_url_remove), 
+					 TRUE);
+
+		gtk_widget_set_sensitive (GTK_WIDGET (dialog_data->pub_url_enable), 
+					 TRUE);
+	}
+	
+	while (url_config_list) {
+		gchar *xml = (gchar *)url_config_list->data;
+		EPublishUri *url;
+		url = g_new0 (EPublishUri, 1);
+		url->type = PUB_ONLINE;
+		
+		e_pub_uri_from_xml (url, xml);
+		if (url->location) {
+			gtk_list_store_append (model, &iter);
+			gtk_list_store_set (model, &iter, 
+					   URL_LIST_ENABLED_COLUMN, 
+					   url->enabled,
+					   URL_LIST_LOCATION_COLUMN, 
+					   url->location,
+					   URL_LIST_URL_COLUMN, url,
+					   -1);
+		}
+
+		url_config_list = g_slist_next (url_config_list);
+		g_free (xml);
+	}
+
+	g_slist_foreach (url_config_list, (GFunc) g_free, NULL);
+	g_slist_free (url_config_list);
+
+	template_url = calendar_config_get_publish_template ();
+	gtk_entry_set_text (GTK_ENTRY (dialog_data->pub_template_url), template_url);
+
+	g_free (template_url);
+}
+
+static void
+cal_prefs_dialog_pub_url_add_clicked (GtkWidget *button, DialogData *dialog_data)
+{
+	EPublishUri *url = NULL;
+	GtkTreeModel *model;
+	GtkTreeIter iter;
+	GtkTreeSelection *selection;
+	
+	model = gtk_tree_view_get_model (dialog_data->pub_url_list);
+	url = g_new0 (EPublishUri, 1);
+	url->enabled = TRUE;
+	url->location = "";
+	
+	if (!dialog_data->publish_editor) {
+		dialog_data->publish_editor = publish_editor_dialog_new (dialog_data, 
+								 url);
+
+		if (url->location != NULL) {
+			gtk_list_store_append(GTK_LIST_STORE (model), &iter);
+			gtk_list_store_set (GTK_LIST_STORE(model), &iter, 
+					   URL_LIST_ENABLED_COLUMN, 
+					   url->enabled,
+					   URL_LIST_LOCATION_COLUMN, 
+					   g_strdup (url->location),
+					   URL_LIST_URL_COLUMN, url,
+					   -1);
+			
+			pub_url_list_changed (dialog_data);
+	
+			if (!GTK_WIDGET_SENSITIVE (
+					(GtkWidget *) dialog_data->pub_url_remove)) {
+				selection = gtk_tree_view_get_selection ((GtkTreeView *) dialog_data->pub_url_list);
+				gtk_tree_model_get_iter_first ((GtkTreeModel *) model, &iter);
+				gtk_widget_set_sensitive ((GtkWidget*) dialog_data->pub_url_remove, TRUE);
+				gtk_tree_selection_select_iter (selection, &iter);
+			}	
+		}
+		dialog_data->publish_editor = FALSE;
+		dialog_data->publish_editor_dlg = NULL;
+	} else {
+		gdk_window_raise (dialog_data->publish_editor_dlg->window);
+	}	
+}
+
+static void
+cal_prefs_dialog_pub_url_edit_clicked (GtkWidget *button, DialogData *dialog_data)
+{
+	if (!dialog_data->publish_editor) {
+		GtkTreeSelection *selection;
+		EPublishUri *url = NULL;
+		GtkTreeModel *model;
+		GtkTreeIter iter;
+		
+		selection = gtk_tree_view_get_selection ((GtkTreeView *) dialog_data->pub_url_list);
+		if (gtk_tree_selection_get_selected (selection, &model, &iter)){
+			gtk_tree_model_get (model, &iter, 
+					    URL_LIST_URL_COLUMN, 
+					    &url, 
+					    -1);
+
+		}
+
+		if (url) {
+			dialog_data->publish_editor = publish_editor_dialog_new (dialog_data, url);
+			
+			gtk_list_store_set ((GtkListStore *) model, &iter, 
+					   URL_LIST_LOCATION_COLUMN, 
+					   g_strdup (url->location), 
+					   URL_LIST_ENABLED_COLUMN, 
+					   url->enabled, 
+					   URL_LIST_URL_COLUMN, url,
+					   -1);
+			
+			pub_url_list_changed (dialog_data);
+			
+			if (!GTK_WIDGET_SENSITIVE ((GtkWidget *) dialog_data->pub_url_remove)) {
+				selection = gtk_tree_view_get_selection ((GtkTreeView *) dialog_data->pub_url_list);
+				gtk_tree_model_get_iter_first ((GtkTreeModel *) model, &iter);
+				gtk_widget_set_sensitive ((GtkWidget*) dialog_data->pub_url_remove, TRUE);
+				gtk_tree_selection_select_iter (selection, &iter);
+			}
+			dialog_data->publish_editor = FALSE;
+			dialog_data->publish_editor_dlg = NULL;
+		}
+	} else {
+		gdk_window_raise (dialog_data->publish_editor_dlg->window);
+	}	
+}
+
+static void
+cal_prefs_dialog_pub_url_remove_clicked (GtkWidget *button, DialogData *dialog_data)
+{
+	EPublishUri *url = NULL;
+	GtkTreeSelection * selection;
+	GtkTreeModel *model;
+	GtkWidget *confirm;
+	GtkTreeIter iter;
+	int ans;
+	
+	selection = gtk_tree_view_get_selection (dialog_data->pub_url_list);
+	if (gtk_tree_selection_get_selected (selection, &model, &iter))
+		gtk_tree_model_get (model, &iter, 
+				    URL_LIST_URL_COLUMN, &url, 
+				    -1);
+	
+	/* make sure we have a valid account selected and that 
+	   we aren't editing anything... */
+	if (url == NULL || dialog_data->publish_editor)
+		return;
+	
+	confirm = gtk_message_dialog_new (PREFS_WINDOW (dialog_data),
+					  GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT,
+					  GTK_MESSAGE_QUESTION, 
+					  GTK_BUTTONS_NONE,
+					  _("Are you sure you want to remove this URL?"));
+	
+	button = gtk_button_new_from_stock (GTK_STOCK_YES);
+	gtk_button_set_label ((GtkButton *) button, _("Remove"));
+	gtk_dialog_add_action_widget ((GtkDialog *) confirm, (GtkWidget *) button, GTK_RESPONSE_YES);
+	gtk_widget_show ((GtkWidget *) button);
+	
+	button = gtk_button_new_from_stock (GTK_STOCK_NO);
+	gtk_button_set_label ((GtkButton *) button, _("Don't Remove"));
+	gtk_dialog_add_action_widget ((GtkDialog *) confirm, 
+				      (GtkWidget *) button, GTK_RESPONSE_NO);
+
+	gtk_widget_show ((GtkWidget *) button);
+	
+	ans = gtk_dialog_run ((GtkDialog *) confirm);
+	gtk_widget_destroy (confirm);
+	
+	if (ans == GTK_RESPONSE_YES) {
+		int len;
+		
+		gtk_list_store_remove ((GtkListStore *) model, &iter);
+		
+		len = gtk_tree_model_iter_n_children (GTK_TREE_MODEL (model), NULL);
+		if (len > 0) {
+			gtk_tree_selection_select_iter (selection, &iter);
+		} else {
+			gtk_widget_set_sensitive (GTK_WIDGET (dialog_data->pub_url_edit), FALSE);
+			gtk_widget_set_sensitive (GTK_WIDGET (dialog_data->pub_url_remove), FALSE);
+			gtk_widget_set_sensitive (GTK_WIDGET (dialog_data->pub_url_enable), FALSE);
+		}
+		g_free(url);
+		pub_url_list_changed (dialog_data);
+	}
+}
+
+static void
+cal_prefs_dialog_pub_url_enable_clicked (GtkWidget *button, DialogData *dialog_data)
+{
+	EPublishUri *url = NULL;
+	GtkTreeSelection * selection;
+	GtkTreeModel *model;
+	GtkTreeIter iter;
+	
+	selection = gtk_tree_view_get_selection (dialog_data->pub_url_list);
+	if (gtk_tree_selection_get_selected (selection, &model, &iter)) {
+		gtk_tree_model_get (model, &iter, 
+				    URL_LIST_URL_COLUMN, &url, 
+				    -1);
+		url->enabled = !url->enabled;
+		
+		gtk_tree_selection_select_iter (selection, &iter);
+		
+		gtk_list_store_set ((GtkListStore *) model, &iter, 
+				    URL_LIST_ENABLED_COLUMN, url->enabled, 
+				    -1);
+		
+		gtk_button_set_label ((GtkButton *) dialog_data->pub_url_enable, 
+				      url->enabled ? _("Disable") : _("Enable"));
+		
+		pub_url_list_changed (dialog_data);
+	}
+}
+ 
+static void
+cal_prefs_dialog_pub_url_list_enable_toggled (GtkCellRendererToggle *renderer, 
+					  const char *path_string, 
+					  DialogData *dialog_data)
+{
+	GtkTreeSelection * selection;
+	EPublishUri *url = NULL;
+	GtkTreeModel *model;
+	GtkTreePath *path;
+	GtkTreeIter iter;
+	
+	path = gtk_tree_path_new_from_string (path_string);
+	model = gtk_tree_view_get_model (dialog_data->pub_url_list);
+	selection = gtk_tree_view_get_selection (dialog_data->pub_url_list);
+
+	if (gtk_tree_model_get_iter (model, &iter, path)) {
+		gtk_tree_model_get (model, &iter, 
+				    URL_LIST_URL_COLUMN, &url, 
+				    -1);
+		
+		url->enabled = !url->enabled;
+		gtk_list_store_set((GtkListStore *) model, &iter, 
+				   URL_LIST_ENABLED_COLUMN,
+				   url->enabled, -1);
+		
+		if (gtk_tree_selection_iter_is_selected (selection, &iter))
+			gtk_button_set_label ((GtkButton *) dialog_data->pub_url_enable, 
+					      url->enabled ? _("Disable") : _("Enable"));
+		
+		pub_url_list_changed (dialog_data);
+	}
+
+	gtk_tree_path_free (path);
+}
+
+static void
+cal_prefs_dialog_pub_url_list_double_click (GtkTreeView *treeview, 
+					GtkTreePath *path, 
+					GtkTreeViewColumn *column, 
+					DialogData *dialog_data)
+{
+	cal_prefs_dialog_pub_url_edit_clicked  (NULL, dialog_data);
+}				
+
+static void
+cal_prefs_dialog_pub_url_list_change (GtkTreeSelection *selection, 
+				  DialogData *dialog_data)
+{
+	EPublishUri *url = NULL;
+	GtkTreeModel *model;
+	GtkTreeIter iter;
+	int state;
+	
+	state = gtk_tree_selection_get_selected (selection, &model, &iter);
+	if (state) {
+		gtk_tree_model_get (model, &iter, 
+				    URL_LIST_URL_COLUMN, &url, 
+				    -1);
+
+		if (url->location && url->enabled)
+			gtk_button_set_label ((GtkButton *) dialog_data->pub_url_enable, _("Disable"));
+		else
+			gtk_button_set_label ((GtkButton *) dialog_data->pub_url_enable, _("Enable"));
+	} else {
+		gtk_widget_grab_focus (GTK_WIDGET (dialog_data->pub_url_add));
+	}
+	
+	gtk_widget_set_sensitive (GTK_WIDGET (dialog_data->pub_url_edit), state);
+	gtk_widget_set_sensitive (GTK_WIDGET (dialog_data->pub_url_remove), state);
+	gtk_widget_set_sensitive (GTK_WIDGET (dialog_data->pub_url_enable), state);
+}
+
+
 /* Shows the current task list settings in the dialog */
 static void
 show_task_list_config (DialogData *dialog_data)
@@ -1027,6 +1464,9 @@
 	/* Free/Busy */
 	show_fb_config (dialog_data);
 
+	/* Online Publishing */
+	show_publish_config (dialog_data);
+
 	/* Other page */
 
 	e_dialog_toggle_set (dialog_data->confirm_delete, calendar_config_get_confirm_delete ());
Index: calendar/gui/dialogs/cal-prefs-dialog.glade
===================================================================
RCS file: /cvs/gnome/evolution/calendar/gui/dialogs/cal-prefs-dialog.glade,v
retrieving revision 1.31
diff -u -u -r1.31 cal-prefs-dialog.glade
--- calendar/gui/dialogs/cal-prefs-dialog.glade	26 Jan 2005 11:48:21 -0000	1.31
+++ calendar/gui/dialogs/cal-prefs-dialog.glade	30 Mar 2005 04:07:02 -0000
@@ -2012,6 +2012,479 @@
 	      <property name="type">tab</property>
 	    </packing>
 	  </child>
+
+	  <child>
+	    <widget class="GtkVBox" id="vbox19">
+	      <property name="border_width">12</property>
+	      <property name="visible">True</property>
+	      <property name="homogeneous">False</property>
+	      <property name="spacing">12</property>
+
+	      <child>
+		<widget class="GtkFrame" id="frame3">
+		  <property name="visible">True</property>
+		  <property name="label_xalign">0</property>
+		  <property name="label_yalign">0.5</property>
+		  <property name="shadow_type">GTK_SHADOW_NONE</property>
+
+		  <child>
+		    <widget class="GtkAlignment" id="alignment9">
+		      <property name="visible">True</property>
+		      <property name="xalign">0.5</property>
+		      <property name="yalign">0.5</property>
+		      <property name="xscale">1</property>
+		      <property name="yscale">1</property>
+		      <property name="top_padding">12</property>
+		      <property name="bottom_padding">0</property>
+		      <property name="left_padding">12</property>
+		      <property name="right_padding">0</property>
+
+		      <child>
+			<widget class="GtkHBox" id="hbox31">
+			  <property name="visible">True</property>
+			  <property name="homogeneous">False</property>
+			  <property name="spacing">6</property>
+
+			  <child>
+			    <widget class="GtkScrolledWindow" id="scrolledwindow2">
+			      <property name="visible">True</property>
+			      <property name="can_focus">True</property>
+			      <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+			      <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+			      <property name="shadow_type">GTK_SHADOW_IN</property>
+			      <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
+
+			      <child>
+				<widget class="GtkTreeView" id="pub_url_list">
+				  <property name="visible">True</property>
+				  <property name="can_focus">True</property>
+				  <property name="headers_visible">True</property>
+				  <property name="rules_hint">False</property>
+				  <property name="reorderable">False</property>
+				  <property name="enable_search">True</property>
+				</widget>
+			      </child>
+			    </widget>
+			    <packing>
+			      <property name="padding">0</property>
+			      <property name="expand">True</property>
+			      <property name="fill">True</property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkVBox" id="vbox20">
+			      <property name="visible">True</property>
+			      <property name="homogeneous">False</property>
+			      <property name="spacing">6</property>
+
+			      <child>
+				<widget class="GtkVButtonBox" id="vbuttonbox5">
+				  <property name="visible">True</property>
+				  <property name="layout_style">GTK_BUTTONBOX_START</property>
+				  <property name="spacing">6</property>
+
+				  <child>
+				    <widget class="GtkButton" id="pub_url_add">
+				      <property name="visible">True</property>
+				      <property name="can_default">True</property>
+				      <property name="can_focus">True</property>
+				      <property name="relief">GTK_RELIEF_NORMAL</property>
+				      <property name="focus_on_click">True</property>
+
+				      <child>
+					<widget class="GtkAlignment" id="alignment10">
+					  <property name="visible">True</property>
+					  <property name="can_default">True</property>
+					  <property name="can_focus">True</property>
+					  <property name="xalign">0.5</property>
+					  <property name="yalign">0.5</property>
+					  <property name="xscale">0</property>
+					  <property name="yscale">0</property>
+					  <property name="top_padding">0</property>
+					  <property name="bottom_padding">0</property>
+					  <property name="left_padding">0</property>
+					  <property name="right_padding">0</property>
+
+					  <child>
+					    <widget class="GtkHBox" id="hbox32">
+					      <property name="visible">True</property>
+					      <property name="homogeneous">False</property>
+					      <property name="spacing">2</property>
+
+					      <child>
+						<widget class="GtkImage" id="image3">
+						  <property name="visible">True</property>
+						  <property name="stock">gtk-add</property>
+						  <property name="icon_size">4</property>
+						  <property name="xalign">0.5</property>
+						  <property name="yalign">0.5</property>
+						  <property name="xpad">0</property>
+						  <property name="ypad">0</property>
+						</widget>
+						<packing>
+						  <property name="padding">0</property>
+						  <property name="expand">False</property>
+						  <property name="fill">False</property>
+						</packing>
+					      </child>
+
+					      <child>
+						<widget class="GtkLabel" id="label64">
+						  <property name="visible">True</property>
+						  <property name="can_default">True</property>
+						  <property name="can_focus">True</property>
+						  <property name="label" translatable="yes">_Add URL</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>
+						</widget>
+						<packing>
+						  <property name="padding">0</property>
+						  <property name="expand">False</property>
+						  <property name="fill">False</property>
+						</packing>
+					      </child>
+					    </widget>
+					  </child>
+					</widget>
+				      </child>
+				    </widget>
+				  </child>
+
+				  <child>
+				    <widget class="GtkButton" id="pub_url_edit">
+				      <property name="visible">True</property>
+				      <property name="sensitive">False</property>
+				      <property name="can_default">True</property>
+				      <property name="can_focus">True</property>
+				      <property name="relief">GTK_RELIEF_NORMAL</property>
+				      <property name="focus_on_click">True</property>
+
+				      <child>
+					<widget class="GtkAlignment" id="alignment11">
+					  <property name="visible">True</property>
+					  <property name="xalign">0.5</property>
+					  <property name="yalign">0.5</property>
+					  <property name="xscale">0</property>
+					  <property name="yscale">0</property>
+					  <property name="top_padding">0</property>
+					  <property name="bottom_padding">0</property>
+					  <property name="left_padding">0</property>
+					  <property name="right_padding">0</property>
+
+					  <child>
+					    <widget class="GtkHBox" id="hbox33">
+					      <property name="visible">True</property>
+					      <property name="homogeneous">False</property>
+					      <property name="spacing">2</property>
+
+					      <child>
+						<widget class="GtkImage" id="image4">
+						  <property name="visible">True</property>
+						  <property name="stock">gtk-properties</property>
+						  <property name="icon_size">4</property>
+						  <property name="xalign">0.5</property>
+						  <property name="yalign">0.5</property>
+						  <property name="xpad">0</property>
+						  <property name="ypad">0</property>
+						</widget>
+						<packing>
+						  <property name="padding">0</property>
+						  <property name="expand">False</property>
+						  <property name="fill">False</property>
+						</packing>
+					      </child>
+
+					      <child>
+						<widget class="GtkLabel" id="label65">
+						  <property name="visible">True</property>
+						  <property name="label" translatable="yes">_Edit</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>
+						</widget>
+						<packing>
+						  <property name="padding">0</property>
+						  <property name="expand">False</property>
+						  <property name="fill">False</property>
+						</packing>
+					      </child>
+					    </widget>
+					  </child>
+					</widget>
+				      </child>
+				    </widget>
+				  </child>
+
+				  <child>
+				    <widget class="GtkButton" id="pub_url_remove">
+				      <property name="visible">True</property>
+				      <property name="sensitive">False</property>
+				      <property name="can_default">True</property>
+				      <property name="can_focus">True</property>
+				      <property name="label">gtk-remove</property>
+				      <property name="use_stock">True</property>
+				      <property name="relief">GTK_RELIEF_NORMAL</property>
+				      <property name="focus_on_click">True</property>
+				    </widget>
+				  </child>
+
+				  <child>
+				    <widget class="GtkButton" id="pub_url_enable">
+				      <property name="visible">True</property>
+				      <property name="can_default">True</property>
+				      <property name="can_focus">True</property>
+				      <property name="label" translatable="yes">E_nable</property>
+				      <property name="use_underline">True</property>
+				      <property name="relief">GTK_RELIEF_NORMAL</property>
+				      <property name="focus_on_click">True</property>
+				    </widget>
+				  </child>
+				</widget>
+				<packing>
+				  <property name="padding">0</property>
+				  <property name="expand">False</property>
+				  <property name="fill">False</property>
+				</packing>
+			      </child>
+
+			      <child>
+				<widget class="GtkVButtonBox" id="vbuttonbox6">
+				  <property name="visible">True</property>
+				  <property name="layout_style">GTK_BUTTONBOX_START</property>
+				  <property name="spacing">3</property>
+				</widget>
+				<packing>
+				  <property name="padding">0</property>
+				  <property name="expand">False</property>
+				  <property name="fill">False</property>
+				</packing>
+			      </child>
+
+			      <child>
+				<widget class="GtkLabel" id="label66">
+				  <property name="visible">True</property>
+				  <property name="label" translatable="yes"></property>
+				  <property name="use_underline">False</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>
+				</widget>
+				<packing>
+				  <property name="padding">0</property>
+				  <property name="expand">False</property>
+				  <property name="fill">False</property>
+				</packing>
+			      </child>
+			    </widget>
+			    <packing>
+			      <property name="padding">0</property>
+			      <property name="expand">False</property>
+			      <property name="fill">False</property>
+			    </packing>
+			  </child>
+			</widget>
+		      </child>
+		    </widget>
+		  </child>
+
+		  <child>
+		    <widget class="GtkLabel" id="label67">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes">&lt;b&gt;Publishing&lt;/b&gt;</property>
+		      <property name="use_underline">False</property>
+		      <property name="use_markup">True</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>
+		    </widget>
+		    <packing>
+		      <property name="type">label_item</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="GtkFrame" id="frame4">
+		  <property name="visible">True</property>
+		  <property name="label_xalign">0</property>
+		  <property name="label_yalign">0.5</property>
+		  <property name="shadow_type">GTK_SHADOW_NONE</property>
+
+		  <child>
+		    <widget class="GtkAlignment" id="alignment12">
+		      <property name="visible">True</property>
+		      <property name="xalign">0.5</property>
+		      <property name="yalign">0.5</property>
+		      <property name="xscale">1</property>
+		      <property name="yscale">1</property>
+		      <property name="top_padding">12</property>
+		      <property name="bottom_padding">0</property>
+		      <property name="left_padding">12</property>
+		      <property name="right_padding">0</property>
+
+		      <child>
+			<widget class="GtkVBox" id="vbox21">
+			  <property name="visible">True</property>
+			  <property name="homogeneous">False</property>
+			  <property name="spacing">6</property>
+
+			  <child>
+			    <widget class="GtkHBox" id="hbox34">
+			      <property name="visible">True</property>
+			      <property name="homogeneous">False</property>
+			      <property name="spacing">12</property>
+
+			      <child>
+				<widget class="GtkLabel" id="label68">
+				  <property name="visible">True</property>
+				  <property name="label" translatable="yes">Template:</property>
+				  <property name="use_underline">False</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>
+				</widget>
+				<packing>
+				  <property name="padding">0</property>
+				  <property name="expand">False</property>
+				  <property name="fill">False</property>
+				</packing>
+			      </child>
+
+			      <child>
+				<widget class="GtkEntry" id="pub_template_url">
+				  <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" translatable="yes">*</property>
+				  <property name="activates_default">False</property>
+				</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">False</property>
+			      <property name="fill">False</property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkLabel" id="label69">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">&lt;i&gt;%u and %d will be replaced by user and domain from the email address.&lt;/i&gt;</property>
+			      <property name="use_underline">False</property>
+			      <property name="use_markup">True</property>
+			      <property name="justify">GTK_JUSTIFY_LEFT</property>
+			      <property name="wrap">True</property>
+			      <property name="selectable">False</property>
+			      <property name="xalign">0.49</property>
+			      <property name="yalign">0.5</property>
+			      <property name="xpad">0</property>
+			      <property name="ypad">0</property>
+			    </widget>
+			    <packing>
+			      <property name="padding">0</property>
+			      <property name="expand">False</property>
+			      <property name="fill">False</property>
+			    </packing>
+			  </child>
+			</widget>
+		      </child>
+		    </widget>
+		  </child>
+
+		  <child>
+		    <widget class="GtkLabel" id="label70">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes">&lt;b&gt;Default Server&lt;/b&gt;</property>
+		      <property name="use_underline">False</property>
+		      <property name="use_markup">True</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>
+		    </widget>
+		    <packing>
+		      <property name="type">label_item</property>
+		    </packing>
+		  </child>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">False</property>
+		  <property name="fill">True</property>
+		</packing>
+	      </child>
+	    </widget>
+	    <packing>
+	      <property name="tab_expand">False</property>
+	      <property name="tab_fill">True</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkLabel" id="label63">
+	      <property name="visible">True</property>
+	      <property name="label" translatable="yes">Online Publishing</property>
+	      <property name="use_underline">True</property>
+	      <property name="use_markup">False</property>
+	      <property name="justify">GTK_JUSTIFY_CENTER</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>
+	    </widget>
+	    <packing>
+	      <property name="type">tab</property>
+	    </packing>
+	  </child>
 	</widget>
 	<packing>
 	  <property name="padding">0</property>
Index: calendar/gui/dialogs/cal-prefs-dialog.h
===================================================================
RCS file: /cvs/gnome/evolution/calendar/gui/dialogs/cal-prefs-dialog.h,v
retrieving revision 1.11
diff -u -u -r1.11 cal-prefs-dialog.h
--- calendar/gui/dialogs/cal-prefs-dialog.h	18 Dec 2004 13:01:17 -0000	1.11
+++ calendar/gui/dialogs/cal-prefs-dialog.h	30 Mar 2005 04:07:03 -0000
@@ -42,7 +42,7 @@
 enum {
 	URL_LIST_ENABLED_COLUMN,
 	URL_LIST_LOCATION_COLUMN,
-	URL_LIST_FREE_BUSY_URL_COLUMN,
+	URL_LIST_URL_COLUMN,
 	URL_LIST_N_COLUMNS
 };
 
@@ -82,11 +82,20 @@
 	GtkTreeView *url_list;
 	gboolean url_editor;
 	GtkWidget* url_editor_dlg;
-	guint destroyed : 1;
 
 	/* widgets for the Free/Busy template */
 	GtkWidget *template_url;
-		
+
+	/* Widgets for the Online Publishing options */
+	GtkWidget *pub_url_add;
+	GtkWidget *pub_url_edit;
+	GtkWidget *pub_url_remove;
+	GtkWidget *pub_url_enable;
+	GtkTreeView *pub_url_list;
+	gboolean publish_editor;
+	GtkWidget* publish_editor_dlg;
+	GtkWidget *pub_template_url;
+	
 	/* Other page options */
 	GtkWidget *confirm_delete;
 	GtkWidget *default_reminder;
Index: calendar/gui/dialogs/url-editor-dialog.c
===================================================================
RCS file: /cvs/gnome/evolution/calendar/gui/dialogs/url-editor-dialog.c,v
retrieving revision 1.7
diff -u -u -r1.7 url-editor-dialog.c
--- calendar/gui/dialogs/url-editor-dialog.c	23 Feb 2005 18:56:57 -0000	1.7
+++ calendar/gui/dialogs/url-editor-dialog.c	30 Mar 2005 04:07:05 -0000
@@ -66,6 +66,7 @@
 url_editor_dialog_new (DialogData *dialog_data, EPublishUri *uri)
 {
 	int b;
+	char *password;
 
 	UrlDialogData *url_dlg_data = g_new0 (UrlDialogData, 1);
 	url_dlg_data->xml = glade_xml_new (EVOLUTION_GLADEDIR "/url-editor-dialog.glade", NULL, NULL);
@@ -95,17 +96,19 @@
 		}
 	}
 	
-	uri->password = e_passwords_get_password ("Calendar", url_dlg_data->url_data->location);
+	password = e_passwords_get_password ("Calendar", url_dlg_data->url_data->location);
 	
-	if (uri->password) {
-		if (strlen(uri->password) != 0) {
+	if (password) {
+		if (strlen(password) != 0) {
 			gtk_entry_set_text (url_dlg_data->password_entry, 
-					    uri->password);
+					    password);
 
 			e_dialog_toggle_set (url_dlg_data->remember_pw, TRUE);
 		} else {
 			e_dialog_toggle_set (url_dlg_data->remember_pw, FALSE);
 		}
+		g_free(password);
+		password = NULL;
 	}
 	
 	switch (uri->publish_freq) {
@@ -136,9 +139,9 @@
 		if ((GtkEntry *) url_dlg_data->url_entry) {
 			url_editor_dialog_fb_url_activated (url_dlg_data->url_entry, url_dlg_data);
 			url_dlg_data->url_data->username = g_strdup (gtk_entry_get_text ((GtkEntry *) url_dlg_data->username_entry));
-			url_dlg_data->url_data->password = g_strdup (gtk_entry_get_text ((GtkEntry *) url_dlg_data->password_entry));
+			password = g_strdup (gtk_entry_get_text ((GtkEntry *) url_dlg_data->password_entry));
 			if (e_dialog_toggle_get (url_dlg_data->remember_pw)) {
-				e_passwords_add_password (url_dlg_data->url_data->location, url_dlg_data->url_data->password);
+				e_passwords_add_password (url_dlg_data->url_data->location, password);
 				e_passwords_remember_password ("Calendar", url_dlg_data->url_data->location);				
 			} else {
 				e_passwords_forget_password ("Calendar", url_dlg_data->url_data->location);
@@ -306,11 +309,10 @@
 				      void *data)
 {
 	UrlDialogData *url_dlg_data  = (UrlDialogData *) data;
-	enum publish_frequency frequency;
 	
-	frequency = e_dialog_radio_get (url_dlg_data->daily, 
+	url_dlg_data->url_data->publish_freq = 
+		e_dialog_radio_get (url_dlg_data->daily, 
 					pub_frequency_type_map);
-	url_dlg_data->url_data->publish_freq = frequency;
 	gtk_widget_set_sensitive ((GtkWidget *) url_dlg_data->ok, TRUE);
 }
 
Index: ui/evolution-calendar.xml
===================================================================
RCS file: /cvs/gnome/evolution/ui/evolution-calendar.xml,v
retrieving revision 1.69
diff -u -u -r1.69 evolution-calendar.xml
--- ui/evolution-calendar.xml	16 Dec 2004 18:26:54 -0000	1.69
+++ ui/evolution-calendar.xml	30 Mar 2005 04:07:12 -0000
@@ -24,6 +24,7 @@
     <cmd name="DeleteOccurrence" _tip="Delete this occurrence" pixtype="stock" pixname="gtk-delete"/>
     <cmd name="DeleteAllOccurrences" _tip="Delete All Occurrences" pixtype="stock" pixname="gtk-delete"/>
 
+    <cmd name="Publish" _tip="Publish this calendar to a remote server"/>
     <cmd name="PublishFreeBusy" _tip="Publish Free/Busy information for this calendar"/>
     <cmd name="CalendarPurge" _label="Purg_e" _tip="Purge old appointments and meetings" accel="*Control*e"/>
   </commands>
@@ -70,6 +71,7 @@
     <submenu name="Actions" _label="_Actions">
       <placeholder name="ComponentActionsPlaceholder">
         <separator/>
+        <menuitem name="Publish" verb="" _label="Publish this calendar to a remote server"/>
 	<menuitem name="PublishFreeBusy" verb="" _label="_Publish Free/Busy Information"/>
 	<menuitem name="CalendarPurge" verb=""/>
       </placeholder>
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ calendar/gui/dialogs/publish-editor-dialog.h	2005-03-30 02:12:27.377718096 +0000
@@ -0,0 +1,30 @@
+/* Evolution calendar
+ * Configuration dialog for iCal remote publishing
+ *
+ * Copyright (C) 2005 Stéphane Konstantaropoulos <stephane cs york ac uk>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of version 2 of the GNU General Public
+ * License as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#ifndef _PUBLISH_EDITOR_DIALOG_H_
+#define _PUBLISH_EDITOR_DIALOG_H_
+
+G_BEGIN_DECLS
+
+gboolean			
+publish_editor_dialog_new (DialogData *dialog_data, EPublishUri *pub_uri);
+
+G_END_DECLS
+
+#endif /* _PUBLISH_EDITOR_DIALOG_H_ */
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ calendar/gui/dialogs/publish-editor-dialog.c	2005-03-30 02:12:56.572279848 +0000
@@ -0,0 +1,522 @@
+/* Evolution calendar
+ * Configuration dialog for iCal remote publishing
+ *
+ * Copyright (C) 2005 Stéphane Konstantaropoulos <stephane cs york ac uk>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of version 2 of the GNU General Public
+ * License as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "cal-prefs-dialog.h"
+#include "publish-editor-dialog.h"
+
+#include <libedataserverui/e-passwords.h>
+#include <libedataserverui/e-source-selector.h>
+#include <gtk/gtk.h>
+#include <gtk/gtksignal.h>
+#include <gtk/gtkoptionmenu.h>
+#include <gtk/gtktogglebutton.h>
+#include <libgnomeui/gnome-color-picker.h>
+#include <libgnomevfs/gnome-vfs.h>
+#include <glade/glade.h>
+#include <e-util/e-dialog-widgets.h>
+#include <e-util/e-icon-factory.h>
+#include <widgets/misc/e-dateedit.h>
+#include <stdlib.h>
+#include <string.h>
+
+struct _PublishEditorDialogData {
+	GladeXML *xml;
+	DialogData *url_dialog;
+	GtkWidget *publish_editor;
+
+	GtkEntry *url_entry;
+	GtkWidget *auto_publish;
+	GtkWidget *alarm_publish;
+	GtkWidget *scheme_combo;
+	
+	GtkWidget *calendar_list_label;
+	GtkWidget *scrolled_window;
+	GtkWidget *scrolled_window_todo;
+	
+	GtkEntry *username_entry;
+	GtkEntry *password_entry;
+	GtkWidget *no_pw;
+	GtkWidget *remember_pw;
+	
+	GtkWidget *cancel;
+	GtkWidget *ok;
+	EPublishUri *url_data;
+};
+typedef struct _PublishEditorDialogData PublishEditorDialogData;
+
+
+enum scheme {
+	LOCAL, HTTP, HTTPS, FTP, SSH
+};
+
+G_INLINE_FUNC gboolean get_widgets (PublishEditorDialogData *);
+G_INLINE_FUNC void init_widgets (PublishEditorDialogData *);
+
+static void scheme_combo_changed (GtkComboBox *, gpointer);
+static void url_changed (GtkEntry *, gpointer);
+static void url_activated (GtkEntry *, gpointer);
+static void ok_enable (GtkWidget *, gpointer);
+static void auto_toggled(GtkWidget *, gpointer);
+static void alarm_toggled(GtkWidget *, gpointer);
+static void no_pw_toggled(GtkWidget *, gpointer);
+static void selection_changed_callback (ESourceSelector *, gpointer); 
+static void selection_todo_changed_callback (ESourceSelector *, gpointer);
+
+/**
+ * publish_editor_dialog_new:
+ **/
+gboolean
+publish_editor_dialog_new (DialogData *dialog_data, EPublishUri *uri)
+{
+	int b;
+	gboolean remember_pw = uri->remember_pw;
+	char *password;
+
+	PublishEditorDialogData self;
+	self.xml = glade_xml_new(EVOLUTION_GLADEDIR "/publish-editor-dialog.glade", NULL, NULL);
+	if (!self.xml) {
+		g_message("publish_editor_dialog_new(): Could not load the .glade file!");
+		return FALSE;
+	}
+
+	if (!get_widgets(&self)) {
+		g_message ("publish_editor_dialog_new(): Could not find all the widgets in the .glade file!");
+		return FALSE;
+	}
+	
+	self.url_dialog = dialog_data;
+	self.url_data = uri;
+	
+	if (self.url_data->type != PUB_ONLINE)
+		self.url_data->type = PUB_ONLINE;
+	
+	init_widgets(&self);
+
+	/* check whether the URL is local or remote
+	 * then update the combobox, which should update
+	 * the url_entry and show/hide the authentication box */
+	if (self.url_data->location) {
+		GnomeVFSURI *uri = gnome_vfs_uri_new(self.url_data->location);
+
+		if(uri == NULL) {
+			g_message ("publish_editor_dialog_new(): "
+			"Malformed URI: %s", self.url_data->location);
+			goto next;
+		}
+
+		if(gnome_vfs_uri_is_local(uri)) {
+			gtk_combo_box_set_active(GTK_COMBO_BOX(self.scheme_combo),
+					LOCAL);
+		} else {
+			const char *scheme_str = gnome_vfs_uri_get_scheme(uri);
+			if(strncasecmp(scheme_str, "http", 4) == 0)
+				gtk_combo_box_set_active(
+					GTK_COMBO_BOX(self.scheme_combo),
+					HTTP);
+			else if(strncasecmp(scheme_str, "https", 5) == 0)
+				gtk_combo_box_set_active(
+					GTK_COMBO_BOX(self.scheme_combo),
+					HTTPS);
+			else if(strncasecmp(scheme_str, "ftp", 3) == 0)
+				gtk_combo_box_set_active(
+					GTK_COMBO_BOX(self.scheme_combo),
+					FTP);
+			else if(strncasecmp(scheme_str, "sftp", 4) == 0)
+				gtk_combo_box_set_active(
+					GTK_COMBO_BOX(self.scheme_combo),
+					SSH);
+			else
+				gtk_combo_box_set_active(
+					GTK_COMBO_BOX(self.scheme_combo),
+					LOCAL);
+
+			if (self.url_data->username &&
+					(strlen(self.url_data->username) != 0)){
+				gtk_entry_set_text(self.username_entry, 
+					    self.url_data->username);
+			}
+			/* passwords make sense only for a remote URL
+			 * and only if no_pw was not set 
+			 */
+			if (!self.url_data->no_pw) {
+				password = 
+					e_passwords_get_password ("Calendar",
+							self.url_data->location);
+				if (password && (strlen(password) != 0)) {
+					gtk_entry_set_text(self.password_entry, password);
+					e_dialog_toggle_set(self.remember_pw,
+							self.url_data->remember_pw);
+					e_dialog_toggle_set(self.no_pw, FALSE);
+				} else {
+					e_dialog_toggle_set(self.remember_pw, FALSE);
+					e_dialog_toggle_set(self.no_pw, TRUE);
+				}
+				if(password)
+					g_free(password);
+			}
+		}
+
+		if (strlen(self.url_data->location) != 0) {
+			gtk_entry_set_text (self.url_entry, 
+					    self.url_data->location);
+		}
+
+		gnome_vfs_uri_unref(uri);
+	}
+next:
+	dialog_data->publish_editor = TRUE; 
+	dialog_data->publish_editor_dlg = (GtkWidget *) &self;
+	gtk_widget_set_sensitive ((GtkWidget *) self.ok, FALSE);
+	
+	b = gtk_dialog_run ((GtkDialog *) self.publish_editor);
+	
+	if (b == GTK_RESPONSE_OK) {
+		if ((GtkEntry *) self.url_entry) {
+			url_activated(self.url_entry, &self);
+			self.url_data->username = g_strdup(gtk_entry_get_text(
+					(GtkEntry *) self.username_entry));
+			if((self.url_data->no_pw =
+					e_dialog_toggle_get(self.no_pw)))
+				;
+			else {
+				password = gtk_entry_get_text(GTK_ENTRY(self.password_entry));
+				if(password && (strlen(password) > 0)){
+					e_passwords_add_password(self.url_data->location, password);
+					if (e_dialog_toggle_get(self.remember_pw))
+						e_passwords_remember_password ("Calendar", self.url_data->location);
+				}
+				if (remember_pw ==TRUE && self.url_data->remember_pw == FALSE)
+					e_passwords_forget_password ("Calendar", self.url_data->location);
+			}
+			self.url_data->auto_publish =
+				e_dialog_toggle_get(self.auto_publish);
+			self.url_data->alarm_publish =
+				e_dialog_toggle_get(self.alarm_publish);
+		}
+	}
+	
+	gtk_widget_destroy (self.publish_editor);
+	g_object_unref (self.xml);
+	return FALSE;
+}
+
+G_INLINE_FUNC gboolean
+get_widgets (PublishEditorDialogData *data)
+{
+#define GW(name) glade_xml_get_widget (data->xml, name)
+
+	data->publish_editor = GW ("publish_editor");
+	data->url_entry = GTK_ENTRY (GW ("url_entry_local"));
+	data->auto_publish = GW ("auto_publish");
+	data->alarm_publish = GW ("alarm_publish");
+	data->scheme_combo = GW ("scheme_combo");
+	data->calendar_list_label = GW ("calendar_list_label");
+	data->scrolled_window =  GW ("scrolled_window");
+	data->scrolled_window_todo =  GW ("scrolled_window_todo");
+	data->username_entry = GTK_ENTRY (GW ("username_entry"));
+	data->password_entry = GTK_ENTRY (GW ("password_entry"));
+	data->no_pw = GW ("no_pw");
+	data->remember_pw = GW ("remember_pw");
+	data->cancel = GW ("cancel");
+	data->ok = GW ("ok");
+
+#undef GW
+
+	return (data ->publish_editor
+		&& data->url_entry
+		&& data->auto_publish
+		&& data->alarm_publish
+		&& data->scheme_combo
+		&& data->calendar_list_label
+		&& data->scrolled_window
+		&& data->scrolled_window_todo
+		&& data->username_entry
+		&& data->password_entry
+		&& data->no_pw
+		&& data->remember_pw
+		&& data->cancel
+		&& data->ok);
+}
+
+static void
+selection_changed_callback (ESourceSelector *selector,
+			    gpointer data)
+{
+	PublishEditorDialogData *self  = (PublishEditorDialogData *) data;
+	GSList *selection = e_source_selector_get_selection (selector);
+	
+	if (selection != NULL) {
+		GSList *p, *l =  NULL;
+		
+		for (p = selection; p != NULL; p = p->next) {
+			ESource *source = E_SOURCE(p->data);
+			gchar* source_uid = g_strdup(e_source_peek_uid(source));
+			
+			l = g_slist_append(l, source_uid);
+		}
+		self->url_data->calendars = l;
+	}
+	
+	e_source_selector_free_selection(selection);
+	gtk_widget_set_sensitive ((GtkWidget *) self->ok, TRUE);
+}
+
+static void
+selection_todo_changed_callback (ESourceSelector *selector,
+			    gpointer data)
+{
+	PublishEditorDialogData *self  = (PublishEditorDialogData *) data;
+	GSList *selection = e_source_selector_get_selection (selector);
+	
+	if (selection != NULL) {
+		GSList *p, *l =  NULL;
+		
+		for (p = selection; p != NULL; p = p->next) {
+			ESource *source = E_SOURCE(p->data);
+			gchar* source_uid = g_strdup(e_source_peek_uid(source));
+			
+			l = g_slist_append(l, source_uid);
+		}
+		self->url_data->tasks = l;
+	}
+	
+	e_source_selector_free_selection(selection);
+	gtk_widget_set_sensitive ((GtkWidget *) self->ok, TRUE);
+}
+
+/* Connects any necessary signal handlers. */
+G_INLINE_FUNC void
+init_widgets (PublishEditorDialogData *self)
+{
+	ESourceList *source_list = e_source_list_new_for_gconf_default(
+			"/apps/evolution/calendar/sources");
+	ESourceList *source_list_todo = e_source_list_new_for_gconf_default(
+			"/apps/evolution/tasks/sources");
+	GtkWidget *selector = e_source_selector_new (source_list);
+	GtkWidget *selector_todo = e_source_selector_new (source_list_todo);
+	GList *icon_list;
+	
+	gtk_widget_ensure_style(self->publish_editor);
+	gtk_container_set_border_width(GTK_CONTAINER(
+			GTK_DIALOG(self->publish_editor)->vbox), 0);
+	gtk_container_set_border_width(GTK_CONTAINER(
+			GTK_DIALOG(self->publish_editor)->action_area), 12);
+	g_object_set(G_OBJECT(glade_xml_get_widget(self->xml, "gnome_entry")),
+			"filechooser-action", GTK_FILE_CHOOSER_ACTION_SAVE, NULL, NULL);
+	g_signal_connect(self->scheme_combo, "changed",
+			G_CALLBACK(scheme_combo_changed), self);
+	g_signal_connect (glade_xml_get_widget(self->xml, "url_entry_local"), "changed", 
+			  G_CALLBACK(url_changed), self);
+	g_signal_connect (glade_xml_get_widget(self->xml, "url_entry_remote"), "changed", 
+			  G_CALLBACK(url_changed), self);
+	g_signal_connect (self->username_entry, "changed", 
+			  G_CALLBACK (ok_enable), self);
+	g_signal_connect (self->password_entry, "changed", 
+			  G_CALLBACK (ok_enable), self);
+	g_signal_connect (self->remember_pw, "toggled",
+			  G_CALLBACK (ok_enable), self);
+	g_signal_connect (self->url_entry, "activate",
+			  G_CALLBACK (url_activated), self);
+	g_signal_connect (self->auto_publish, "toggled",
+			  G_CALLBACK (auto_toggled), self);
+	e_dialog_toggle_set(self->auto_publish, self->url_data->auto_publish);
+	g_signal_connect (self->alarm_publish, "toggled",
+			  G_CALLBACK (alarm_toggled), self);
+	e_dialog_toggle_set(self->alarm_publish, self->url_data->alarm_publish);
+	g_signal_connect (self->no_pw, "toggled",
+			  G_CALLBACK (no_pw_toggled), self);
+	e_dialog_toggle_set(self->no_pw, self->url_data->no_pw);
+
+	gtk_combo_box_set_active(GTK_COMBO_BOX(self->scheme_combo), HTTP);
+
+	if (self->url_data->calendars) {
+		ESource *source;
+		GSList *p;
+
+		for(p = self->url_data->calendars; p != NULL; p = p->next) {
+			source =  e_source_list_peek_source_by_uid(source_list,
+					(char *) p->data);			
+			e_source_selector_select_source(
+					(ESourceSelector *)selector, source);
+		}
+	}
+
+	if (self->url_data->tasks) {
+		ESource *source;
+		GSList *p;
+
+		for(p = self->url_data->tasks; p != NULL; p = p->next) {
+			source =  e_source_list_peek_source_by_uid(source_list_todo,
+					(char *) p->data);			
+			e_source_selector_select_source(
+					(ESourceSelector *)selector_todo, source);
+		}
+	}
+
+	e_source_selector_show_selection ((ESourceSelector *) selector, TRUE);
+	g_signal_connect (selector, "selection_changed", 
+			  G_CALLBACK (selection_changed_callback), self);
+
+	gtk_label_set_mnemonic_widget (GTK_LABEL(self->calendar_list_label),
+				       selector);
+	gtk_widget_show (selector);
+	gtk_container_add (GTK_CONTAINER(self->scrolled_window), 
+			   selector);
+
+	e_source_selector_show_selection ((ESourceSelector *) selector_todo, TRUE);
+	g_signal_connect (selector_todo, "selection_changed", 
+			  G_CALLBACK (selection_todo_changed_callback), self);
+
+	gtk_label_set_mnemonic_widget (GTK_LABEL(self->calendar_list_label),
+				       selector_todo);
+	gtk_widget_show (selector_todo);
+	gtk_container_add (GTK_CONTAINER(self->scrolled_window_todo), 
+			   selector_todo);
+
+	icon_list = e_icon_factory_get_icon_list ("stock_calendar");
+	if (icon_list) {
+		gtk_window_set_icon_list (GTK_WINDOW(self->publish_editor), icon_list);
+		g_list_foreach (icon_list, (GFunc) g_object_unref, NULL);
+		g_list_free (icon_list);
+	}
+	gtk_widget_show (self->scrolled_window);
+	gtk_widget_show (self->scrolled_window_todo);
+
+	g_object_unref(G_OBJECT(source_list));
+	g_object_unref(G_OBJECT(source_list_todo));
+}
+
+static void scheme_combo_changed (GtkComboBox *box, gpointer data)
+{
+	PublishEditorDialogData *self = (PublishEditorDialogData *) data;
+	enum scheme i = gtk_combo_box_get_active(box);
+	GtkWidget *auth_box = glade_xml_get_widget(self->xml, "auth_box");
+	GtkWidget *gnome_entry = glade_xml_get_widget(self->xml, "gnome_entry");
+	GtkEntry *url_entry_remote = GTK_ENTRY(glade_xml_get_widget(self->xml, "url_entry_remote"));
+	switch(i) {
+		case LOCAL:
+			if(GTK_WIDGET_VISIBLE(GTK_WIDGET(url_entry_remote)))
+				gtk_widget_hide(GTK_WIDGET(url_entry_remote));
+			if(!GTK_WIDGET_VISIBLE(gnome_entry))
+				gtk_widget_show(gnome_entry);
+			if(GTK_WIDGET_VISIBLE(auth_box))
+				gtk_widget_hide(auth_box);
+			self->url_entry = GTK_ENTRY(glade_xml_get_widget(
+					self->xml, "url_entry_local"));
+			e_dialog_toggle_set(self->no_pw, TRUE);
+			return;
+			break;
+		case HTTP:
+			gtk_entry_set_text(url_entry_remote, "http://";);
+			break;
+		case HTTPS:
+			gtk_entry_set_text(url_entry_remote, "https://";);
+			break;
+		case FTP:
+			gtk_entry_set_text(url_entry_remote, "ftp://";);
+			break;
+		case SSH:
+			gtk_entry_set_text(url_entry_remote, "sftp://";);
+			e_dialog_toggle_set(self->no_pw, TRUE);
+			break;
+	}
+	if(GTK_WIDGET_VISIBLE(gnome_entry))
+		gtk_widget_hide(gnome_entry);
+	if(!GTK_WIDGET_VISIBLE(GTK_WIDGET(url_entry_remote)))
+		gtk_widget_show(GTK_WIDGET(url_entry_remote));
+	if(!GTK_WIDGET_VISIBLE(auth_box))
+		gtk_widget_show(auth_box);
+	self->url_entry = url_entry_remote;
+}
+static void
+url_activated (GtkEntry *url_entry, gpointer data)
+{
+	PublishEditorDialogData *self = (PublishEditorDialogData *) data;
+	
+	self->url_data->location = g_strdup (gtk_entry_get_text ((GtkEntry *) url_entry));
+}
+
+static void
+url_changed (GtkEntry *url_entry, gpointer data)
+{
+	PublishEditorDialogData *self = (PublishEditorDialogData *) data;
+	
+	const gchar *entry_contents;
+	GtkListStore *model;
+	GtkTreeIter iter;
+	gboolean valid;
+
+	model = (GtkListStore *) gtk_tree_view_get_model (self->url_dialog->url_list);
+	
+	entry_contents = gtk_entry_get_text ((GtkEntry *) url_entry);
+	/* duplicate check */
+	valid = gtk_tree_model_get_iter_first ((GtkTreeModel *) model, &iter);
+	while (valid) {
+		gchar *url_name;
+		gtk_tree_model_get ((GtkTreeModel *) model, &iter, 
+				    URL_LIST_LOCATION_COLUMN, &url_name, 
+				    -1);
+
+		if (!strcasecmp (url_name, entry_contents)) {
+			gtk_widget_set_sensitive ((GtkWidget *) self->ok, FALSE);
+			return;
+		}
+		valid = gtk_tree_model_iter_next ((GtkTreeModel *) model, &iter);
+	}
+	/* valid and unique */
+	gtk_widget_set_sensitive (GTK_WIDGET (self->ok), TRUE);
+	gtk_widget_grab_default (GTK_WIDGET (self->ok));
+	gtk_entry_set_activates_default ((GtkEntry*) self->url_entry, TRUE);
+}
+
+static void ok_enable (GtkWidget *widget, gpointer data) {
+	PublishEditorDialogData *self = (PublishEditorDialogData *) data;
+
+	gtk_widget_set_sensitive (GTK_WIDGET(self->ok), TRUE);
+}
+
+/* ToggleButtons callbacks, can do better than repeating the same function 
+ * 5 times, no? Later
+ */
+static void auto_toggled(GtkWidget *button, gpointer data)
+{
+	PublishEditorDialogData *self = (PublishEditorDialogData *) data;
+	self->url_data->auto_publish = e_dialog_toggle_get (button);
+	gtk_widget_set_sensitive (GTK_WIDGET(self->ok), TRUE);	
+}
+
+static void alarm_toggled(GtkWidget *button, gpointer data)
+{
+	PublishEditorDialogData *self = (PublishEditorDialogData *) data;
+	self->url_data->alarm_publish = e_dialog_toggle_get (button);
+	gtk_widget_set_sensitive (GTK_WIDGET(self->ok), TRUE);	
+}
+
+static void no_pw_toggled(GtkWidget *button, gpointer data)
+{
+	PublishEditorDialogData *self = (PublishEditorDialogData *) data;
+	self->url_data->no_pw = e_dialog_toggle_get (button);
+	gtk_widget_set_sensitive(GTK_WIDGET(self->password_entry), !self->url_data->no_pw);
+	gtk_widget_set_sensitive(self->remember_pw , !self->url_data->no_pw);
+	gtk_widget_set_sensitive (GTK_WIDGET(self->ok), TRUE);	
+}
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ calendar/gui/dialogs/publish-editor-dialog.glade	2005-03-24 15:33:56.320295728 +0000
@@ -0,0 +1,694 @@
+<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
+<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd";>
+
+<glade-interface>
+<requires lib="gnome"/>
+
+<widget class="GtkDialog" id="publish_editor">
+  <property name="visible">True</property>
+  <property name="title" translatable="yes">Online Publishing Settings</property>
+  <property name="type">GTK_WINDOW_TOPLEVEL</property>
+  <property name="window_position">GTK_WIN_POS_CENTER_ON_PARENT</property>
+  <property name="modal">False</property>
+  <property name="default_width">380</property>
+  <property name="default_height">508</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="has_separator">False</property>
+
+  <child internal-child="vbox">
+    <widget class="GtkVBox" id="publish">
+      <property name="visible">True</property>
+      <property name="homogeneous">False</property>
+      <property name="spacing">0</property>
+
+      <child internal-child="action_area">
+	<widget class="GtkHButtonBox" id="hbuttonbox1">
+	  <property name="visible">True</property>
+	  <property name="layout_style">GTK_BUTTONBOX_END</property>
+
+	  <child>
+	    <widget class="GtkButton" id="cancel">
+	      <property name="visible">True</property>
+	      <property name="can_default">True</property>
+	      <property name="has_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="ok">
+	      <property name="visible">True</property>
+	      <property name="sensitive">False</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="vbox2">
+	  <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="calendar_list_label">
+	      <property name="visible">True</property>
+	      <property name="label" translatable="yes">&lt;b&gt;Calendars to publish:&lt;/b&gt;</property>
+	      <property name="use_underline">True</property>
+	      <property name="use_markup">True</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>
+	    </widget>
+	    <packing>
+	      <property name="padding">0</property>
+	      <property name="expand">False</property>
+	      <property name="fill">False</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkHBox" id="hbox3">
+	      <property name="height_request">100</property>
+	      <property name="visible">True</property>
+	      <property name="homogeneous">False</property>
+	      <property name="spacing">12</property>
+
+	      <child>
+		<widget class="GtkLabel" id="label6">
+		  <property name="visible">True</property>
+		  <property name="label" translatable="yes"></property>
+		  <property name="use_underline">False</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>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">False</property>
+		  <property name="fill">False</property>
+		</packing>
+	      </child>
+
+	      <child>
+		<widget class="GtkScrolledWindow" id="scrolled_window">
+		  <property name="height_request">150</property>
+		  <property name="visible">True</property>
+		  <property name="can_focus">True</property>
+		  <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+		  <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+		  <property name="shadow_type">GTK_SHADOW_IN</property>
+		  <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
+
+		  <child>
+		    <placeholder/>
+		  </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="GtkLabel" id="label17">
+	      <property name="visible">True</property>
+	      <property name="label" translatable="yes">&lt;b&gt;Task lists to publish:&lt;/b&gt;</property>
+	      <property name="use_underline">True</property>
+	      <property name="use_markup">True</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>
+	    </widget>
+	    <packing>
+	      <property name="padding">0</property>
+	      <property name="expand">False</property>
+	      <property name="fill">False</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkHBox" id="hbox10">
+	      <property name="height_request">90</property>
+	      <property name="visible">True</property>
+	      <property name="homogeneous">False</property>
+	      <property name="spacing">12</property>
+
+	      <child>
+		<widget class="GtkLabel" id="label16">
+		  <property name="visible">True</property>
+		  <property name="label" translatable="yes"></property>
+		  <property name="use_underline">False</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>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">False</property>
+		  <property name="fill">False</property>
+		</packing>
+	      </child>
+
+	      <child>
+		<widget class="GtkScrolledWindow" id="scrolled_window_todo">
+		  <property name="height_request">150</property>
+		  <property name="visible">True</property>
+		  <property name="can_focus">True</property>
+		  <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+		  <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+		  <property name="shadow_type">GTK_SHADOW_IN</property>
+		  <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
+
+		  <child>
+		    <placeholder/>
+		  </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="GtkHBox" id="hbox2">
+	      <property name="visible">True</property>
+	      <property name="homogeneous">False</property>
+	      <property name="spacing">12</property>
+
+	      <child>
+		<widget class="GtkLabel" id="label4">
+		  <property name="visible">True</property>
+		  <property name="label" translatable="yes"></property>
+		  <property name="use_underline">False</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>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">False</property>
+		  <property name="fill">False</property>
+		</packing>
+	      </child>
+
+	      <child>
+		<widget class="GtkVBox" id="vbox3">
+		  <property name="visible">True</property>
+		  <property name="homogeneous">False</property>
+		  <property name="spacing">6</property>
+
+		  <child>
+		    <widget class="GtkCheckButton" id="auto_publish">
+		      <property name="visible">True</property>
+		      <property name="can_focus">True</property>
+		      <property name="label" translatable="yes">Automatically publish changes</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="GtkHBox" id="hbox8">
+		      <property name="visible">True</property>
+		      <property name="homogeneous">False</property>
+		      <property name="spacing">0</property>
+
+		      <child>
+			<widget class="GtkCheckButton" id="alarm_publish">
+			  <property name="visible">True</property>
+			  <property name="can_focus">True</property>
+			  <property name="label" translatable="yes">Publish calendar alarms</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">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>
+	    </widget>
+	    <packing>
+	      <property name="padding">0</property>
+	      <property name="expand">True</property>
+	      <property name="fill">True</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkHBox" id="hbox9">
+	      <property name="visible">True</property>
+	      <property name="homogeneous">False</property>
+	      <property name="spacing">12</property>
+
+	      <child>
+		<widget class="GtkLabel" id="label15">
+		  <property name="visible">True</property>
+		  <property name="label" translatable="yes">Publish my calendar with</property>
+		  <property name="use_underline">False</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>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">False</property>
+		  <property name="fill">False</property>
+		</packing>
+	      </child>
+
+	      <child>
+		<widget class="GtkComboBox" id="scheme_combo">
+		  <property name="visible">True</property>
+		  <property name="items" translatable="yes">local
+http
+https
+ftp
+ssh</property>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">False</property>
+		  <property name="fill">True</property>
+		</packing>
+	      </child>
+	    </widget>
+	    <packing>
+	      <property name="padding">0</property>
+	      <property name="expand">False</property>
+	      <property name="fill">True</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkLabel" id="label5">
+	      <property name="visible">True</property>
+	      <property name="label" translatable="yes">&lt;b&gt;Publishing URL:&lt;/b&gt;</property>
+	      <property name="use_underline">True</property>
+	      <property name="use_markup">True</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>
+	    </widget>
+	    <packing>
+	      <property name="padding">0</property>
+	      <property name="expand">False</property>
+	      <property name="fill">False</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkVBox" id="vbox4">
+	      <property name="visible">True</property>
+	      <property name="homogeneous">False</property>
+	      <property name="spacing">0</property>
+
+	      <child>
+		<widget class="GtkEntry" id="url_entry_remote">
+		  <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" translatable="yes">*</property>
+		  <property name="activates_default">False</property>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">False</property>
+		  <property name="fill">False</property>
+		</packing>
+	      </child>
+
+	      <child>
+		<widget class="GnomeFileEntry" id="gnome_entry">
+		  <property name="visible">True</property>
+		  <property name="history_id">publish_editor_dialog</property>
+		  <property name="max_saved">10</property>
+		  <property name="browse_dialog_title" translatable="yes">Choose a file to publish to</property>
+		  <property name="directory_entry">False</property>
+		  <property name="modal">True</property>
+		  <property name="use_filechooser">True</property>
+
+		  <child internal-child="entry">
+		    <widget class="GtkEntry" id="url_entry_local">
+		      <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" translatable="yes">*</property>
+		      <property name="activates_default">False</property>
+		    </widget>
+		  </child>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">False</property>
+		  <property name="fill">False</property>
+		</packing>
+	      </child>
+	    </widget>
+	    <packing>
+	      <property name="padding">0</property>
+	      <property name="expand">False</property>
+	      <property name="fill">False</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkVBox" id="auth_box">
+	      <property name="visible">True</property>
+	      <property name="homogeneous">False</property>
+	      <property name="spacing">0</property>
+
+	      <child>
+		<widget class="GtkLabel" id="label7">
+		  <property name="visible">True</property>
+		  <property name="label" translatable="yes">&lt;b&gt;Authentication:&lt;/b&gt;</property>
+		  <property name="use_underline">False</property>
+		  <property name="use_markup">True</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>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">False</property>
+		  <property name="fill">False</property>
+		</packing>
+	      </child>
+
+	      <child>
+		<widget class="GtkHBox" id="hbox4">
+		  <property name="visible">True</property>
+		  <property name="homogeneous">False</property>
+		  <property name="spacing">12</property>
+
+		  <child>
+		    <widget class="GtkLabel" id="label8">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes"></property>
+		      <property name="use_underline">False</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>
+		    </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="visible">True</property>
+		      <property name="n_rows">3</property>
+		      <property name="n_columns">2</property>
+		      <property name="homogeneous">False</property>
+		      <property name="row_spacing">6</property>
+		      <property name="column_spacing">12</property>
+
+		      <child>
+			<widget class="GtkLabel" id="label9">
+			  <property name="visible">True</property>
+			  <property name="label" translatable="yes">_Username:</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">username_entry</property>
+			</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="label10">
+			  <property name="visible">True</property>
+			  <property name="label" translatable="yes">_Password:</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">password_entry</property>
+			</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="username_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" translatable="yes">*</property>
+			  <property name="activates_default">False</property>
+			</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="GtkEntry" id="password_entry">
+			  <property name="visible">True</property>
+			  <property name="can_focus">True</property>
+			  <property name="editable">True</property>
+			  <property name="visibility">False</property>
+			  <property name="max_length">0</property>
+			  <property name="text" translatable="yes"></property>
+			  <property name="has_frame">True</property>
+			  <property name="invisible_char" translatable="yes">*</property>
+			  <property name="activates_default">False</property>
+			</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="y_options"></property>
+			</packing>
+		      </child>
+
+		      <child>
+			<widget class="GtkCheckButton" id="remember_pw">
+			  <property name="visible">True</property>
+			  <property name="can_focus">True</property>
+			  <property name="label" translatable="yes">_Remember password</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="left_attach">1</property>
+			  <property name="right_attach">2</property>
+			  <property name="top_attach">2</property>
+			  <property name="bottom_attach">3</property>
+			  <property name="x_options"></property>
+			  <property name="y_options"></property>
+			</packing>
+		      </child>
+
+		      <child>
+			<widget class="GtkCheckButton" id="no_pw">
+			  <property name="visible">True</property>
+			  <property name="can_focus">True</property>
+			  <property name="label" translatable="yes">No password</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="left_attach">0</property>
+			  <property name="right_attach">1</property>
+			  <property name="top_attach">2</property>
+			  <property name="bottom_attach">3</property>
+			  <property name="x_padding">2</property>
+			  <property name="x_options"></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>
+		</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>
+    </widget>
+  </child>
+</widget>
+
+</glade-interface>

Attachment: signature.asc
Description: Ceci est une partie de message =?ISO-8859-1?Q?num=E9riquement?= =?ISO-8859-1?Q?_sign=E9e?=



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]