[evolution] Move some ESource-plugin common code to e-plugin-util.h/.c



commit 9a8fa88b6a3fe12409ff0358bed45187c9c743a5
Author: Milan Crha <mcrha redhat com>
Date:   Thu Feb 4 12:55:42 2010 +0100

    Move some ESource-plugin common code to e-plugin-util.h/.c

 e-util/Makefile.am                                 |    4 +-
 e-util/e-plugin-util.c                             |  462 ++++++++++++++++++++
 e-util/e-plugin-util.h                             |   46 ++
 plugins/caldav/caldav-source.c                     |  365 ++--------------
 plugins/calendar-file/Makefile.am                  |    1 +
 plugins/calendar-file/calendar-file.c              |  134 +------
 plugins/calendar-http/Makefile.am                  |    1 +
 plugins/calendar-http/calendar-http.c              |  413 +++---------------
 plugins/calendar-weather/calendar-weather.c        |  209 ++--------
 plugins/default-source/Makefile.am                 |    1 +
 plugins/default-source/default-source.c            |   67 +---
 plugins/google-account-setup/google-source.c       |  145 +------
 .../org-gnome-evolution-google.eplug.xml           |    4 +-
 plugins/webdav-account-setup/Makefile.am           |    1 +
 .../webdav-account-setup/webdav-contacts-source.c  |  117 ++----
 po/POTFILES.in                                     |    1 +
 16 files changed, 713 insertions(+), 1258 deletions(-)
---
diff --git a/e-util/Makefile.am b/e-util/Makefile.am
index 8a15c52..b34e037 100644
--- a/e-util/Makefile.am
+++ b/e-util/Makefile.am
@@ -39,6 +39,7 @@ eutilinclude_HEADERS = 				\
 	e-print.h				\
 	e-plugin.h				\
 	e-plugin-ui.h				\
+	e-plugin-util.h				\
 	e-profile-event.h			\
 	e-selection.h				\
 	e-signature.h				\
@@ -112,8 +113,9 @@ libeutil_la_SOURCES =				\
 	e-mktemp.c				\
 	e-module.c				\
 	e-non-intrusive-error-dialog.c		\
-	e-plugin-ui.c				\
 	e-plugin.c				\
+	e-plugin-ui.c				\
+	e-plugin-util.c				\
 	e-print.c				\
 	e-profile-event.c			\
 	e-selection.c				\
diff --git a/e-util/e-plugin-util.c b/e-util/e-plugin-util.c
new file mode 100644
index 0000000..885d017
--- /dev/null
+++ b/e-util/e-plugin-util.c
@@ -0,0 +1,462 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) version 3.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with the program; if not, see <http://www.gnu.org/licenses/>
+ *
+ *
+ * Copyright (C) 1999-2010 Novell, Inc. (www.novell.com)
+ */
+
+#include <glib.h>
+#include <glib/gi18n.h>
+#include <gtk/gtk.h>
+#include <libsoup/soup.h>
+#include <libedataserver/e-source.h>
+#include <string.h>
+
+#include "e-plugin-util.h"
+
+/* name of a property on a widget with corresponding property name for an ESource */
+#define EPU_SP_NAME "e-source-property-name"
+
+#define EPU_CHECK_TRUE "epu-check-true-value"
+#define EPU_CHECK_FALSE "epu-check-false-value"
+
+static gboolean
+epu_is_uri_proto (const gchar *uri, const gchar *protocol)
+{
+	gboolean res;
+
+	g_return_val_if_fail (uri != NULL, FALSE);
+	g_return_val_if_fail (protocol != NULL, FALSE);
+
+	res = uri && g_ascii_strncasecmp (uri, protocol, strlen (protocol)) == 0;
+
+	if (res)
+		res = strchr (protocol, ':') != NULL || uri[strlen (protocol)] == ':';
+
+	return res;
+}
+
+/**
+ * e_plugin_util_is_source_proto:
+ * @source: #ESource object
+ * @protocol: protocol to check on, like "http", "https", ...
+ *
+ * Returns whether given source's uri is of the given protocol.
+ **/
+gboolean
+e_plugin_util_is_source_proto (ESource *source, const gchar *protocol)
+{
+	gchar *uri;
+	gboolean res;
+
+	g_return_val_if_fail (source != NULL, FALSE);
+	g_return_val_if_fail (E_IS_SOURCE (source), FALSE);
+	g_return_val_if_fail (protocol != NULL, FALSE);
+
+	uri = e_source_get_uri (source);
+	res = epu_is_uri_proto (uri, protocol);
+	g_free (uri);
+
+	return res;
+}
+
+/**
+ * e_plugin_util_is_group_proto:
+ * @group: #ESourceGroup object
+ * @protocol: protocol to check on, like "http", "https", ...
+ *
+ * Returns whether given groups' base uri is of the given protocol.
+ **/
+gboolean
+e_plugin_util_is_group_proto (ESourceGroup *group, const gchar *protocol)
+{
+	g_return_val_if_fail (group != NULL, FALSE);
+	g_return_val_if_fail (E_IS_SOURCE_GROUP (group), FALSE);
+	g_return_val_if_fail (protocol != NULL, FALSE);
+
+	return epu_is_uri_proto (e_source_group_peek_base_uri (group), protocol);
+}
+
+/**
+ * e_plugin_util_replace_at_sign:
+ * @str: string to work with
+ *
+ * Replaces all '@' with '%40' in @str.
+ * Returns newly allocated string.
+ **/
+gchar *
+e_plugin_util_replace_at_sign (const gchar *str)
+{
+	gchar *res, *at;
+
+	if (!str)
+		return NULL;
+
+	res = g_strdup (str);
+	while (at = strchr (res, '@'), at) {
+		gchar *tmp = g_malloc0 (sizeof (gchar) * (1 + strlen (res) + 2));
+
+		strncpy (tmp, res, at - res);
+		strcat (tmp, "%40");
+		strcat (tmp, at + 1);
+
+		g_free (res);
+		res = tmp;
+	}
+
+	return res;
+}
+
+/**
+ * e_plugin_util_uri_no_proto:
+ * @uri: #SoupURI object
+ *
+ * Returns uri encoded as string, without protocol part.
+ * Returned pointer should be freed with g_free.
+ **/
+gchar *
+e_plugin_util_uri_no_proto (SoupURI *uri)
+{
+	gchar *full_uri, *uri_noproto;
+	const gchar *tmp;
+
+	g_return_val_if_fail (uri != NULL, NULL);
+
+	full_uri = soup_uri_to_string (uri, FALSE);
+	g_return_val_if_fail (full_uri != NULL, NULL);
+
+	tmp = strstr (full_uri, "://");
+	if (tmp && tmp < strchr (full_uri, '/')) {
+		uri_noproto = g_strdup (tmp + 3);
+	} else {
+		uri_noproto = full_uri;
+		full_uri = NULL;
+	}
+
+	g_free (full_uri);
+
+	return uri_noproto;
+}
+
+static void
+epu_update_source_property (ESource *source, GObject *object, const gchar *value)
+{
+	const gchar *property_name;
+
+	g_return_if_fail (source != NULL);
+	g_return_if_fail (E_IS_SOURCE (source));
+	g_return_if_fail (object != NULL);
+	g_return_if_fail (G_IS_OBJECT (object));
+
+	property_name = g_object_get_data (object, EPU_SP_NAME);
+	g_return_if_fail (property_name != NULL);
+
+	e_source_set_property (source, property_name, value);
+}
+
+static void
+epu_entry_changed_cb (GObject *entry, ESource *source)
+{
+	g_return_if_fail (entry != NULL);
+	g_return_if_fail (GTK_IS_ENTRY (entry));
+
+	epu_update_source_property (source, entry, gtk_entry_get_text (GTK_ENTRY (entry)));
+}
+
+static void
+epu_check_toggled_cb (GObject *button, ESource *source)
+{
+	const gchar *true_value, *false_value;
+
+	g_return_if_fail (button != NULL);
+	g_return_if_fail (GTK_IS_TOGGLE_BUTTON (button));
+
+	true_value = g_object_get_data (button, EPU_CHECK_TRUE);
+	false_value = g_object_get_data (button, EPU_CHECK_FALSE);
+
+	epu_update_source_property (source, button, gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button)) ? true_value : false_value);
+}
+
+/**
+ * e_plugin_util_add_entry:
+ * @parent: two-columns #GtkTable or #GtkContainer, where to add new entry
+ * @label: label for the entry; can be NULL for no label
+ * @source: #ESource object to which tight the entry change; can be NULL for no property binding
+ * @source_property: source's property name to use for a value; can be NULL for no property binding
+ *
+ * Adds a #GtkEntry to the table at the last row or to the container, with a given label.
+ * The entry will be always at the second column of the table.
+ * Value of an entry will be prefilled with a property value of the given
+ * source, and the source will be updated on any change of the entry automatically.
+ * Entry is shown by default.
+ *
+ * Returns pointer to newly added #GtkEntry.
+ **/
+GtkWidget *
+e_plugin_util_add_entry (GtkWidget *parent, const gchar *label, ESource *source, const gchar *source_property)
+{
+	GtkWidget *entry, *lbl = NULL;
+	const gchar *value;
+	gint row = -1;
+
+	g_return_val_if_fail (parent != NULL, NULL);
+	g_return_val_if_fail (GTK_IS_TABLE (parent) || GTK_IS_CONTAINER (parent), NULL);
+
+	if (source || source_property) {
+		g_return_val_if_fail (source != NULL, NULL);
+		g_return_val_if_fail (E_IS_SOURCE (source), NULL);
+		g_return_val_if_fail (source_property != NULL, NULL);
+		g_return_val_if_fail (*source_property != 0, NULL);
+	}
+
+	if (GTK_IS_TABLE (parent))
+		row = GTK_TABLE (parent)->nrows;
+
+	if (label) {
+		lbl = gtk_label_new_with_mnemonic (label);
+		gtk_widget_show (lbl);
+		gtk_misc_set_alignment (GTK_MISC (lbl), 0.0, 0.5);
+		if (row != -1)
+			gtk_table_attach (GTK_TABLE (parent), lbl, 0, 1, row, row + 1, GTK_FILL, 0, 0, 0);
+		else
+			gtk_container_add (GTK_CONTAINER (parent), lbl);
+	}
+
+	if (source)
+		value = e_source_get_property (source, source_property);
+	else
+		value = NULL;
+
+	entry = gtk_entry_new ();
+	gtk_widget_show (entry);
+	gtk_entry_set_text (GTK_ENTRY (entry), value ? value : "");
+	if (row != -1)
+		gtk_table_attach (GTK_TABLE (parent), entry, 1, 2, row, row + 1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+	else
+		gtk_container_add (GTK_CONTAINER (parent), entry);
+
+	if (lbl)
+		gtk_label_set_mnemonic_widget (GTK_LABEL (lbl), entry);
+
+	if (source) {
+		g_object_set_data_full (G_OBJECT (entry), EPU_SP_NAME, g_strdup (source_property), g_free);
+		g_signal_connect (G_OBJECT (entry), "changed", G_CALLBACK (epu_entry_changed_cb), source);
+	}
+
+	return entry;
+}
+
+/**
+ * e_plugin_util_add_check:
+ * @parent: either two-columns #GtkTable or #GtkContainer where to add new check box; or NULL to just create it
+ * @label: label for the check; cannot be NULL
+ * @source: #ESource object to which tight the check change; can be NULL for no property binding
+ * @source_property: source's property name to use for a value; can be NULL for no property binding
+ * @true_value: what value use for a checked state in a source
+ * @false_value: what value use for an unchecked state in a source
+ *
+ * Adds a #GtkCheckButton to the parent (if provided) at the last row, with a given label.
+ * The check will be always at the second column of the table.
+ * Value of a check will be prefilled with a property value of the given
+ * source, and the source will be updated on any change of the check automatically.
+ * Check is shown by default.
+ *
+ * Returns pointer to newly added #GtkCheckButton.
+ **/
+GtkWidget *
+e_plugin_util_add_check (GtkWidget *parent, const gchar *label, ESource *source, const gchar *source_property, const gchar *true_value, const gchar *false_value)
+{
+	GtkWidget *check;
+	const gchar *value;
+
+	g_return_val_if_fail (parent == NULL || GTK_IS_TABLE (parent) || GTK_IS_CONTAINER (parent), NULL);
+	g_return_val_if_fail (label != NULL, NULL);
+
+	if (source || source_property) {
+		g_return_val_if_fail (source != NULL, NULL);
+		g_return_val_if_fail (E_IS_SOURCE (source), NULL);
+		g_return_val_if_fail (source_property != NULL, NULL);
+		g_return_val_if_fail (*source_property != 0, NULL);
+	}
+
+	if (source)
+		value = e_source_get_property (source, source_property);
+	else
+		value = NULL;
+
+	check = gtk_check_button_new_with_mnemonic (label);
+	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check),
+		value && (value == true_value ||
+			  (true_value && g_str_equal (value, true_value)) ||
+			  (!source && g_str_equal (value, "1"))));
+	gtk_widget_show (check);
+
+	if (parent && GTK_IS_TABLE (parent)) {
+		gint row = GTK_TABLE (parent)->nrows;
+
+		gtk_table_attach (GTK_TABLE (parent), check, 1, 2, row , row + 1, GTK_FILL, 0, 0, 0);
+	} else if (parent) {
+		gtk_container_add (GTK_CONTAINER (parent), check);
+	}
+
+	if (source) {
+		g_object_set_data_full (G_OBJECT (check), EPU_SP_NAME, g_strdup (source_property), g_free);
+		g_object_set_data_full (G_OBJECT (check), EPU_CHECK_TRUE, g_strdup (true_value), g_free);
+		g_object_set_data_full (G_OBJECT (check), EPU_CHECK_FALSE, g_strdup (false_value), g_free);
+		g_signal_connect (G_OBJECT (check), "toggled", G_CALLBACK (epu_check_toggled_cb), source);
+	}
+
+	return check;
+}
+
+static void
+epu_update_refresh_value (GtkWidget *spin, GtkWidget *combobox, ESource *source)
+{
+	gchar *value;
+	gint setting = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin));
+	switch (gtk_combo_box_get_active (GTK_COMBO_BOX (combobox))) {
+	case 0:
+		/* minutes */
+		break;
+	case 1:
+		/* hours */
+		setting *= 60;
+		break;
+	case 2:
+		/* days */
+		setting *= 1440;
+		break;
+	case 3:
+		/* weeks */
+		setting *= 10080;
+		break;
+	default:
+		g_warning ("%s: Time unit out of range", G_STRFUNC);
+		break;
+	}
+
+	value = g_strdup_printf ("%d", setting);
+	epu_update_source_property (source, G_OBJECT (spin), value);
+	g_free (value);
+}
+
+static void
+epu_refresh_spin_changed_cb (GtkWidget *spin, ESource *source)
+{
+	g_return_if_fail (spin != NULL);
+	g_return_if_fail (GTK_IS_SPIN_BUTTON (spin));
+
+	epu_update_refresh_value (spin, g_object_get_data (G_OBJECT (spin), "refresh-combo"), source);
+}
+
+static void
+epu_refresh_combo_changed_cb (GtkWidget *combobox, ESource *source)
+{
+	g_return_if_fail (combobox != NULL);
+	g_return_if_fail (GTK_IS_COMBO_BOX (combobox));
+
+	epu_update_refresh_value (g_object_get_data (G_OBJECT (combobox), "refresh-spin"), combobox, source);
+}
+
+/**
+ * e_plugin_util_add_refresh:
+ * @parent: two-columns #GtkTable where to add new "refresh" setup widgets or NULL to just create an hbox
+ * @label: label for the widgets; can be NULL, but for parent == NULL is ignored
+ * @source: #ESource object to which tight the refresh change; cannot be NULL
+ * @source_property: source's property name to use for a value; cannot be NULL
+ *
+ * Adds widgets to setup Refresh interval. The stored value is in minutes.
+ * Returns pointer to an HBox, which contains two widgets, spin and a combo box.
+ * Both can be accessed by g_object_get_data with a name "refresh-spin" and "refresh-combo".
+ **/
+GtkWidget *
+e_plugin_util_add_refresh (GtkWidget *parent, const gchar *label, ESource *source, const gchar *source_property)
+{
+	GtkWidget *lbl = NULL, *hbox, *spin, *combo;
+	const gchar *value;
+	gint row = -1, value_num, item_num = 0;
+
+	g_return_val_if_fail (parent == NULL || GTK_IS_TABLE (parent), NULL);
+	g_return_val_if_fail (source != NULL, NULL);
+	g_return_val_if_fail (E_IS_SOURCE (source), NULL);
+	g_return_val_if_fail (source_property != NULL, NULL);
+	g_return_val_if_fail (*source_property != 0, NULL);
+
+	if (parent)
+		row = GTK_TABLE (parent)->nrows;
+
+	value = e_source_get_property (source, source_property);
+	if (!value) {
+		value = "30";
+		e_source_set_property (source, source_property, value);
+	}
+
+	if (label && parent) {
+		lbl = gtk_label_new_with_mnemonic (label);
+		gtk_widget_show (lbl);
+		gtk_misc_set_alignment (GTK_MISC (lbl), 0.0, 0.5);
+		gtk_table_attach (GTK_TABLE (parent), lbl, 0, 1, row, row + 1, GTK_FILL, 0, 0, 0);
+	}
+
+	hbox = gtk_hbox_new (FALSE, 6);
+	gtk_widget_show (hbox);
+
+	spin = gtk_spin_button_new_with_range (0, 100, 1);
+	gtk_widget_show (spin);
+	gtk_box_pack_start (GTK_BOX (hbox), spin, FALSE, TRUE, 0);
+
+	combo = gtk_combo_box_new_text ();
+	gtk_widget_show (combo);
+	gtk_combo_box_append_text (GTK_COMBO_BOX (combo), _("minutes"));
+	gtk_combo_box_append_text (GTK_COMBO_BOX (combo), _("hours"));
+	gtk_combo_box_append_text (GTK_COMBO_BOX (combo), _("days"));
+	gtk_combo_box_append_text (GTK_COMBO_BOX (combo), _("weeks"));
+	gtk_box_pack_start (GTK_BOX (hbox), combo, FALSE, TRUE, 0);
+
+	value_num = value ? atoi (value) : 30;
+
+	if (value_num && !(value_num % 10080)) {
+		/* weeks */
+		item_num = 3;
+		value_num /= 10080;
+	} else if (value_num && !(value_num % 1440)) {
+		/* days */
+		item_num = 2;
+		value_num /= 1440;
+	} else if (value_num && !(value_num % 60)) {
+		/* hours */
+		item_num = 1;
+		value_num /= 60;
+	}
+
+	gtk_combo_box_set_active (GTK_COMBO_BOX (combo), item_num);
+	gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin), value_num);
+
+	if (lbl)
+		gtk_label_set_mnemonic_widget (GTK_LABEL (lbl), spin);
+
+	g_object_set_data_full (G_OBJECT (spin), EPU_SP_NAME, g_strdup (source_property), g_free);
+
+	g_object_set_data (G_OBJECT (combo), "refresh-spin", spin);
+	g_object_set_data (G_OBJECT (spin), "refresh-combo", combo);
+	g_object_set_data (G_OBJECT (hbox), "refresh-spin", spin);
+	g_object_set_data (G_OBJECT (hbox), "refresh-combo", combo);
+	g_signal_connect (G_OBJECT (combo), "changed", G_CALLBACK (epu_refresh_combo_changed_cb), source);
+	g_signal_connect (G_OBJECT (spin), "value-changed", G_CALLBACK (epu_refresh_spin_changed_cb), source);
+
+	if (parent)
+		gtk_table_attach (GTK_TABLE (parent), hbox, 1, 2, row, row + 1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+
+	return hbox;
+}
diff --git a/e-util/e-plugin-util.h b/e-util/e-plugin-util.h
new file mode 100644
index 0000000..6bee4d0
--- /dev/null
+++ b/e-util/e-plugin-util.h
@@ -0,0 +1,46 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) version 3.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with the program; if not, see <http://www.gnu.org/licenses/>
+ *
+ *
+ * Authors:
+ *
+ * Copyright (C) 1999-2010 Novell, Inc. (www.novell.com)
+ *
+ */
+
+#ifndef _E_PLUGIN_UTIL_H
+#define _E_PLUGIN_UTIL_H
+
+#include <glib.h>
+#include <gtk/gtk.h>
+
+#include <libsoup/soup.h>
+
+#include <libedataserver/e-source.h>
+#include <libedataserver/e-source.h>
+
+gboolean e_plugin_util_is_source_proto (ESource *source, const gchar *protocol);
+gboolean e_plugin_util_is_group_proto (ESourceGroup *group, const gchar *protocol);
+
+gchar *e_plugin_util_replace_at_sign (const gchar *str);
+gchar *e_plugin_util_uri_no_proto (SoupURI *uri);
+
+/* common widgets used in plugin setup */
+GtkWidget *e_plugin_util_add_entry (GtkWidget *parent, const gchar *label, ESource *source, const gchar *source_property);
+GtkWidget *e_plugin_util_add_check (GtkWidget *parent, const gchar *label, ESource *source, const gchar *source_property, const gchar *true_value, const gchar *false_value);
+
+/* multipack widgets */
+GtkWidget *e_plugin_util_add_refresh (GtkWidget *parent, const gchar *label, ESource *source, const gchar *source_property);
+
+#endif /* _E_PLUGIN_UTIL_H */
diff --git a/plugins/caldav/caldav-source.c b/plugins/caldav/caldav-source.c
index 4821cbf..d2bc2f6 100644
--- a/plugins/caldav/caldav-source.c
+++ b/plugins/caldav/caldav-source.c
@@ -31,8 +31,8 @@
 
 #include <e-util/e-config.h>
 #include <e-util/e-plugin.h>
+#include <e-util/e-plugin-util.h>
 #include <calendar/gui/e-cal-config.h>
-#include <libedataserver/e-url.h>
 #include <libedataserver/e-account-list.h>
 #include <libecal/e-cal.h>
 
@@ -81,228 +81,66 @@ e_plugin_lib_enable (EPlugin *ep, gint enable)
 	return 0;
 }
 
-/* replaces all '@' with '%40' in str; returns newly allocated string */
-static gchar *
-replace_at_sign (const gchar *str)
-{
-	gchar *res, *at;
-
-	if (!str)
-		return NULL;
-
-	res = g_strdup (str);
-	while (at = strchr (res, '@'), at) {
-		gchar *tmp = g_malloc0 (sizeof (gchar) * (1 + strlen (res) + 2));
-
-		strncpy (tmp, res, at - res);
-		strcat (tmp, "%40");
-		strcat (tmp, at + 1);
-
-		g_free (res);
-		res = tmp;
-	}
-
-	return res;
-}
-
 /*****************************************************************************/
-/* the location field for caldav sources */
-
-/* stolen from calendar-weather eplugin */
-static gchar *
-print_uri_noproto (EUri *uri)
-{
-	gchar *uri_noproto, *user, *pass;
-
-	if (uri->user)
-		user = replace_at_sign (uri->user);
-	else
-		user = NULL;
-
-	if (uri->passwd)
-		pass = replace_at_sign (uri->passwd);
-	else
-		pass = NULL;
-
-	if (uri->port != 0)
-		uri_noproto = g_strdup_printf (
-			"%s%s%s%s%s%s%s:%d%s%s%s",
-			user ? user : "",
-			uri->authmech ? ";auth=" : "",
-			uri->authmech ? uri->authmech : "",
-			pass ? ":" : "",
-			pass ? pass : "",
-			user ? "@" : "",
-			uri->host ? uri->host : "",
-			uri->port,
-			uri->path ? uri->path : "",
-			uri->query ? "?" : "",
-			uri->query ? uri->query : "");
-	else
-		uri_noproto = g_strdup_printf (
-			"%s%s%s%s%s%s%s%s%s%s",
-			user ? user : "",
-			uri->authmech ? ";auth=" : "",
-			uri->authmech ? uri->authmech : "",
-			pass ? ":" : "",
-			pass ? pass : "",
-			user ? "@" : "",
-			uri->host ? uri->host : "",
-			uri->path ? uri->path : "",
-			uri->query ? "?" : "",
-			uri->query ? uri->query : "");
-
-	g_free (user);
-	g_free (pass);
-
-	return uri_noproto;
-}
 
 static void
-location_changed (GtkEntry *editable, ESource *source)
+location_changed_cb (GtkEntry *editable, ESource *source)
 {
-	EUri       *euri;
+	SoupURI     *suri;
 	gchar       *ruri;
 	const gchar *uri, *username;
 
-	uri = gtk_entry_get_text (GTK_ENTRY (editable));
+	uri = gtk_entry_get_text (editable);
 
-	euri = e_uri_new (uri);
-	g_return_if_fail (euri != NULL);
+	suri = soup_uri_new (uri);
+	if (!suri)
+		return;
 
 	username = e_source_get_property (source, "username");
 	if (username && !*username)
 		username = NULL;
 
-	if ((!euri->user && username) || (euri->user && username && !g_str_equal (euri->user, username))) {
-		g_free (euri->user);
-		euri->user = g_strdup (username);
-	}
+	soup_uri_set_user (suri, username);
 
-	ruri = print_uri_noproto (euri);
+	ruri = e_plugin_util_uri_no_proto (suri);
 	e_source_set_relative_uri (source, ruri);
 	g_free (ruri);
-	e_uri_free (euri);
+	soup_uri_free (suri);
 }
 
 static void
-ssl_changed (GtkToggleButton *button, ESource *source)
+user_changed_cb (GtkEntry *editable, ESource *source)
 {
-	e_source_set_property(source, "ssl",
-			      gtk_toggle_button_get_active(button) ? "1" : "0");
-}
-
-static void
-user_changed (GtkEntry *editable, ESource *source)
-{
-	EUri       *euri;
-	gchar       *uri;
-	gchar       *ruri;
+	SoupURI     *suri;
+	gchar       *uri, *ruri;
 	const gchar *user;
 
 	uri = e_source_get_uri (source);
-	user = gtk_entry_get_text (GTK_ENTRY (editable));
+	user = gtk_entry_get_text (editable);
 
-	if (uri == NULL) {
-		g_free (uri);
+	if (uri == NULL)
+		return;
+
+	suri = soup_uri_new (uri);
+	g_free (uri);
+
+	if (suri == NULL)
 		return;
-	}
 
-	euri = e_uri_new (uri);
-	g_free (euri->user);
-	euri->user = NULL;
+	soup_uri_set_user (suri, NULL);
 
 	if (user != NULL && *user) {
-		euri->user = g_strdup (user);
+		soup_uri_set_user (suri, user);
 		e_source_set_property (source, "auth", "1");
 	} else {
 		e_source_set_property (source, "auth", NULL);
 	}
 
 	e_source_set_property (source, "username", user);
-	ruri = print_uri_noproto (euri);
+	ruri = e_plugin_util_uri_no_proto (suri);
 	e_source_set_relative_uri (source, ruri);
 	g_free (ruri);
-	e_uri_free (euri);
-}
-
-static void
-set_refresh_time (ESource *source, GtkWidget *spin, GtkWidget *combobox)
-{
-	gint time;
-	gint item_num = 0;
-	const gchar *refresh_str = e_source_get_property (source, "refresh");
-	time = refresh_str ? atoi (refresh_str) : 30;
-
-	if (time  && !(time % 10080)) {
-		/* weeks */
-		item_num = 3;
-		time /= 10080;
-	} else if (time && !(time % 1440)) {
-		/* days */
-		item_num = 2;
-		time /= 1440;
-	} else if (time && !(time % 60)) {
-		/* hours */
-		item_num = 1;
-		time /= 60;
-	}
-	gtk_combo_box_set_active (GTK_COMBO_BOX (combobox), item_num);
-	gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin), time);
-}
-
-static gchar *
-get_refresh_minutes (GtkWidget *spin, GtkWidget *combobox)
-{
-	gint setting = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin));
-	switch (gtk_combo_box_get_active (GTK_COMBO_BOX (combobox))) {
-	case 0:
-		/* minutes */
-		break;
-	case 1:
-		/* hours */
-		setting *= 60;
-		break;
-	case 2:
-		/* days */
-		setting *= 1440;
-		break;
-	case 3:
-		/* weeks - is this *really* necessary? */
-		setting *= 10080;
-		break;
-	default:
-		g_warning ("Time unit out of range");
-		break;
-	}
-
-	return g_strdup_printf ("%d", setting);
-}
-
-static void
-spin_changed (GtkSpinButton *spin, ESource *source)
-{
-	gchar *refresh_str;
-	GtkWidget *combobox;
-
-	combobox = g_object_get_data (G_OBJECT (spin), "combobox");
-
-	refresh_str = get_refresh_minutes ((GtkWidget *) spin, combobox);
-	e_source_set_property (source, "refresh", refresh_str);
-	g_free (refresh_str);
-}
-
-static void
-combobox_changed (GtkComboBox *combobox, ESource *source)
-{
-	gchar *refresh_str;
-	GtkWidget *spin;
-
-	spin = g_object_get_data (G_OBJECT (combobox), "spin");
-
-	refresh_str = get_refresh_minutes (spin, (GtkWidget *) combobox);
-	e_source_set_property (source, "refresh", refresh_str);
-	g_free (refresh_str);
+	soup_uri_free (suri);
 }
 
 static void
@@ -344,168 +182,59 @@ oge_caldav  (EPlugin                    *epl,
 {
 	ECalConfigTargetSource *t = (ECalConfigTargetSource *) data->target;
 	ESource      *source;
-	ESourceGroup *group;
-	EUri         *euri;
-	GtkWidget    *parent;
-	GtkWidget    *lurl;
-	GtkWidget    *cssl;
-	GtkWidget    *location;
-	GtkWidget    *widget;
-	GtkWidget    *luser;
-	GtkWidget    *user;
-	GtkWidget    *browse_cal;
-	GtkWidget    *label, *hbox, *spin, *combobox;
-	gchar         *uri;
-	gchar         *username;
-	const gchar   *ssl_prop;
-	gboolean      ssl_enabled;
-	gint           row;
+	SoupURI      *suri;
+	GtkWidget    *parent, *location, *ssl, *user, *browse_cal, *refresh;
+	gchar        *uri, *username;
 
 	source = t->source;
-	group = e_source_peek_group (source);
-
-	widget = NULL;
 
-	if (!g_str_has_prefix (e_source_group_peek_base_uri (group),
-			       "caldav")) {
+	if (!e_plugin_util_is_group_proto (e_source_peek_group (source), "caldav")) {
 		return NULL;
 	}
 
 	/* Extract the username from the uri so we can prefill the
 	 * dialog right, remove the username from the url then */
 	uri = e_source_get_uri (source);
-	euri = e_uri_new (uri);
+	suri = soup_uri_new (uri);
 	g_free (uri);
 
-	if (euri == NULL) {
-		return NULL;
+	if (suri) {
+		soup_uri_set_user (suri, NULL);
+		soup_uri_set_password (suri, NULL);
+		uri = soup_uri_to_string (suri, FALSE);
+		soup_uri_free (suri);
+	} else {
+		uri = g_strdup ("");
 	}
 
-	g_free (euri->user);
-	euri->user = NULL;
-	uri = e_uri_to_string (euri, FALSE);
-
 	username = e_source_get_duped_property (source, "username");
 
-	ssl_prop = e_source_get_property (source, "ssl");
-	if (ssl_prop && ssl_prop[0] == '1') {
-		ssl_enabled = TRUE;
-	} else {
-		ssl_enabled = FALSE;
-	}
-
 	/* Build up the UI */
 	parent = data->parent;
 
-	row = GTK_TABLE (parent)->nrows;
-
-	lurl = gtk_label_new_with_mnemonic (_("_URL:"));
-	gtk_widget_show (lurl);
-	gtk_misc_set_alignment (GTK_MISC (lurl), 0.0, 0.5);
-	gtk_table_attach (GTK_TABLE (parent),
-			  lurl, 0, 1,
-			  row, row+1,
-			  GTK_FILL, 0, 0, 0);
-
-	location = gtk_entry_new ();
-	gtk_widget_show (location);
+	location = e_plugin_util_add_entry (parent, _("_URL:"), NULL, NULL);
 	gtk_entry_set_text (GTK_ENTRY (location), uri);
-	gtk_table_attach (GTK_TABLE (parent), location,
-			  1, 2, row, row+1,
-			  GTK_EXPAND | GTK_FILL, 0, 0, 0);
-
-	gtk_label_set_mnemonic_widget (GTK_LABEL (lurl), location);
-
-	g_signal_connect (G_OBJECT (location),
-			  "changed",
-			  G_CALLBACK (location_changed),
-			  source);
-
-	row++;
-
-	cssl = gtk_check_button_new_with_mnemonic (_("Use _SSL"));
-	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cssl), ssl_enabled);
-	gtk_widget_show (cssl);
-	gtk_table_attach (GTK_TABLE (parent),
-			  cssl, 1, 2,
-			  row , row + 1,
-			  GTK_FILL, 0, 0, 0);
-
-	g_signal_connect (G_OBJECT (cssl),
-			  "toggled",
-			  G_CALLBACK (ssl_changed),
-			  source);
-
-	row++;
-
-	luser = gtk_label_new_with_mnemonic (_("User_name:"));
-	gtk_widget_show (luser);
-	gtk_misc_set_alignment (GTK_MISC (luser), 0.0, 0.5);
-	gtk_table_attach (GTK_TABLE (parent),
-			  luser, 0, 1,
-			  row, row + 1,
-			  GTK_FILL, 0, 0, 0);
-
-	user = gtk_entry_new ();
-	gtk_widget_show (user);
-	gtk_entry_set_text (GTK_ENTRY (user), username ? username : "");
-	gtk_table_attach (GTK_TABLE (parent), user,
-			  1, 2, row, row + 1,
-			  GTK_EXPAND | GTK_FILL, 0, 0, 0);
-
-	gtk_label_set_mnemonic_widget (GTK_LABEL (luser), user);
+	g_signal_connect (G_OBJECT (location), "changed", G_CALLBACK (location_changed_cb), source);
 
-	g_signal_connect (G_OBJECT (user),
-			  "changed",
-			  G_CALLBACK (user_changed),
-			  source);
+	ssl = e_plugin_util_add_check (parent, _("Use _SSL"), source, "ssl", "1", "0");
 
-	row++;
+	user = e_plugin_util_add_entry (parent, _("User_name:"), NULL, NULL);
+	gtk_entry_set_text (GTK_ENTRY (user), username ? username : "");
+	g_signal_connect (G_OBJECT (user), "changed", G_CALLBACK (user_changed_cb), source);
 
         g_free (uri);
 	g_free (username);
 
 	browse_cal = gtk_button_new_with_mnemonic (_("Brows_e server for a calendar"));
 	gtk_widget_show (browse_cal);
-	gtk_table_attach (GTK_TABLE (parent), browse_cal, 1, 2, row, row + 1, GTK_FILL, 0, 0, 0);
+	gtk_table_attach (GTK_TABLE (parent), browse_cal, 1, 2, GTK_TABLE (parent)->nrows, GTK_TABLE (parent)->nrows + 1, GTK_FILL, 0, 0, 0);
 
 	g_object_set_data (G_OBJECT (browse_cal), "caldav-url", location);
 	g_object_set_data (G_OBJECT (browse_cal), "caldav-username", user);
-	g_object_set_data (G_OBJECT (browse_cal), "caldav-ssl", cssl);
+	g_object_set_data (G_OBJECT (browse_cal), "caldav-ssl", ssl);
 	g_signal_connect  (G_OBJECT (browse_cal), "clicked", G_CALLBACK (browse_cal_clicked_cb), GINT_TO_POINTER (t->source_type));
 
-	row++;
-
-	/* add refresh option */
-	label = gtk_label_new_with_mnemonic (_("Re_fresh:"));
-	gtk_widget_show (label);
-	gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
-	gtk_table_attach (GTK_TABLE (parent), label, 0, 1, row, row+1, GTK_FILL, 0, 0, 0);
-
-	hbox = gtk_hbox_new (FALSE, 6);
-	gtk_widget_show (hbox);
-
-	spin = gtk_spin_button_new_with_range (0, 100, 1);
-	gtk_label_set_mnemonic_widget (GTK_LABEL (label), spin);
-	gtk_widget_show (spin);
-	gtk_box_pack_start (GTK_BOX (hbox), spin, FALSE, TRUE, 0);
+	refresh = e_plugin_util_add_refresh (parent, _("Re_fresh:"), source, "refresh");
 
-	combobox = gtk_combo_box_new_text ();
-	gtk_widget_show (combobox);
-	gtk_combo_box_append_text (GTK_COMBO_BOX (combobox), _("minutes"));
-	gtk_combo_box_append_text (GTK_COMBO_BOX (combobox), _("hours"));
-	gtk_combo_box_append_text (GTK_COMBO_BOX (combobox), _("days"));
-	gtk_combo_box_append_text (GTK_COMBO_BOX (combobox), _("weeks"));
-	set_refresh_time (source, spin, combobox);
-	gtk_box_pack_start (GTK_BOX (hbox), combobox, FALSE, TRUE, 0);
-
-	g_object_set_data (G_OBJECT (combobox), "spin", spin);
-	g_signal_connect (G_OBJECT (combobox), "changed", G_CALLBACK (combobox_changed), source);
-	g_object_set_data (G_OBJECT (spin), "combobox", combobox);
-	g_signal_connect (G_OBJECT (spin), "value-changed", G_CALLBACK (spin_changed), source);
-
-	gtk_table_attach (GTK_TABLE (parent), hbox, 1, 2, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
-
-	return widget;
+	return location;
 }
-
diff --git a/plugins/calendar-file/Makefile.am b/plugins/calendar-file/Makefile.am
index ba8af51..a4577e5 100644
--- a/plugins/calendar-file/Makefile.am
+++ b/plugins/calendar-file/Makefile.am
@@ -16,6 +16,7 @@ liborg_gnome_calendar_file_la_SOURCES = calendar-file.c
 liborg_gnome_calendar_file_la_LDFLAGS = -module -avoid-version $(NO_UNDEFINED)
 
 liborg_gnome_calendar_file_la_LIBADD = 		\
+	$(top_builddir)/e-util/libeutil.la	\
 	$(EVOLUTION_CALENDAR_LIBS)		\
 	$(GNOME_PLATFORM_LIBS)
 
diff --git a/plugins/calendar-file/calendar-file.c b/plugins/calendar-file/calendar-file.c
index b5fe2c2..e82feaa 100644
--- a/plugins/calendar-file/calendar-file.c
+++ b/plugins/calendar-file/calendar-file.c
@@ -21,9 +21,9 @@
 
 #include <gtk/gtk.h>
 #include <e-util/e-config.h>
+#include <e-util/e-plugin-util.h>
 #include <calendar/gui/e-cal-config.h>
 #include <libedataserver/e-source.h>
-#include <libedataserver/e-url.h>
 #include <glib/gi18n.h>
 #include <string.h>
 
@@ -41,85 +41,6 @@ location_changed (GtkFileChooserButton *widget, ESource *source)
 }
 
 static void
-set_refresh_time (ESource *source, GtkWidget *spin, GtkWidget *combobox)
-{
-	gint time;
-	gint item_num = 0;
-	const gchar *refresh_str = e_source_get_property (source, "refresh");
-	time = refresh_str ? atoi (refresh_str) : 30;
-
-	if (time  && !(time % 10080)) {
-		/* weeks */
-		item_num = 3;
-		time /= 10080;
-	} else if (time && !(time % 1440)) {
-		/* days */
-		item_num = 2;
-		time /= 1440;
-	} else if (time && !(time % 60)) {
-		/* hours */
-		item_num = 1;
-		time /= 60;
-	}
-	gtk_combo_box_set_active (GTK_COMBO_BOX (combobox), item_num);
-	gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin), time);
-}
-
-static gchar *
-get_refresh_minutes (GtkWidget *spin, GtkWidget *combobox)
-{
-	gint setting = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin));
-	switch (gtk_combo_box_get_active (GTK_COMBO_BOX (combobox))) {
-	case 0:
-		/* minutes */
-		break;
-	case 1:
-		/* hours */
-		setting *= 60;
-		break;
-	case 2:
-		/* days */
-		setting *= 1440;
-		break;
-	case 3:
-		/* weeks - is this *really* necessary? */
-		setting *= 10080;
-		break;
-	default:
-		g_warning ("Time unit out of range");
-		break;
-	}
-
-	return g_strdup_printf ("%d", setting);
-}
-
-static void
-spin_changed (GtkSpinButton *spin, ESource *source)
-{
-	gchar *refresh_str;
-	GtkWidget *combobox;
-
-	combobox = g_object_get_data (G_OBJECT (spin), "combobox");
-
-	refresh_str = get_refresh_minutes ((GtkWidget *) spin, combobox);
-	e_source_set_property (source, "refresh", refresh_str);
-	g_free (refresh_str);
-}
-
-static void
-combobox_changed (GtkComboBox *combobox, ESource *source)
-{
-	gchar *refresh_str;
-	GtkWidget *spin;
-
-	spin = g_object_get_data (G_OBJECT (combobox), "spin");
-
-	refresh_str = get_refresh_minutes (spin, (GtkWidget *) combobox);
-	e_source_set_property (source, "refresh", refresh_str);
-	g_free (refresh_str);
-}
-
-static void
 maincheck_toggled (GtkToggleButton *check, ESource *source)
 {
 	GtkWidget *w;
@@ -147,34 +68,25 @@ maincheck_toggled (GtkToggleButton *check, ESource *source)
 static void
 refresh_type_changed (GtkComboBox *refresh_type, ESource *source)
 {
-	GtkWidget *spin, *combobox;
+	GtkWidget *refresh_hbox;
 	gint active = gtk_combo_box_get_active (refresh_type);
 	gchar buff[2] = {0};
 
-	spin = g_object_get_data (G_OBJECT (refresh_type), "spin");
-	combobox = g_object_get_data (G_OBJECT (refresh_type), "combobox");
+	refresh_hbox = g_object_get_data (G_OBJECT (refresh_type), "refresh-hbox");
 
 	if (active < 0 || active > 2)
 		active = 0;
 
 	if (active == 2) {
-		gtk_widget_show (spin);
-		gtk_widget_show (combobox);
+		gtk_widget_show (refresh_hbox);
 	} else {
-		gtk_widget_hide (spin);
-		gtk_widget_hide (combobox);
+		gtk_widget_hide (refresh_hbox);
 	}
 
 	buff [0] = '0' + active;
 	e_source_set_property (source, "refresh-type", buff);
 }
 
-static void
-force_readonly_toggled (GtkToggleButton *check, ESource *source)
-{
-	e_source_set_property (source, "custom-file-readonly", gtk_toggle_button_get_active (check) ? "1" : NULL);
-}
-
 GtkWidget *e_calendar_file_customs (EPlugin *epl, EConfigHookItemFactoryData *data);
 
 GtkWidget *
@@ -182,23 +94,15 @@ e_calendar_file_customs (EPlugin *epl, EConfigHookItemFactoryData *data)
 {
 	ECalConfigTargetSource *t = (ECalConfigTargetSource *) data->target;
 	ESource *source = t->source;
-	gchar *uri_text;
 	const gchar *relative_uri, *value;
-	GtkWidget *w1, *w2, *w3, *box1, *box2, *mainbox, *maincheck;
-
-        uri_text = e_source_get_uri (source);
-	if (strncmp (uri_text, "file", 4)) {
-		g_free (uri_text);
+	GtkWidget *w1, *w2, *box1, *box2, *mainbox, *maincheck;
 
+	if (!e_plugin_util_is_source_proto (source, "file"))
 		return NULL;
-	}
 
 	relative_uri = e_source_peek_relative_uri (source);
-
-	if (relative_uri && g_str_equal (relative_uri, "system")) {
-		g_free (uri_text);
+	if (relative_uri && g_str_equal (relative_uri, "system"))
 		return NULL;
-	}
 
 	e_source_set_relative_uri (source, e_source_peek_uid (source));
 
@@ -286,29 +190,14 @@ e_calendar_file_customs (EPlugin *epl, EConfigHookItemFactoryData *data)
 	gtk_combo_box_set_active ((GtkComboBox *)w2, (value && *value && !value[1] && value [0] >= '0' && value [0] <= '2') ? value [0] - '0' : 0);
 
 	w1 = w2;
-	w2 = gtk_spin_button_new_with_range (1, 100, 1);
+	w2 = e_plugin_util_add_refresh (NULL, NULL, source, "refresh");
 	gtk_box_pack_start (GTK_BOX (box2), w2, FALSE, TRUE, 0);
 
-	w3 = gtk_combo_box_new_text ();
-	gtk_combo_box_append_text (GTK_COMBO_BOX (w3), _("minutes"));
-	gtk_combo_box_append_text (GTK_COMBO_BOX (w3), _("hours"));
-	gtk_combo_box_append_text (GTK_COMBO_BOX (w3), _("days"));
-	gtk_combo_box_append_text (GTK_COMBO_BOX (w3), _("weeks"));
-	set_refresh_time (source, w2, w3);
-	gtk_box_pack_start (GTK_BOX (box2), w3, FALSE, TRUE, 0);
-
-	g_object_set_data (G_OBJECT (w1), "spin", w2);
-	g_object_set_data (G_OBJECT (w1), "combobox", w3);
-	g_object_set_data (G_OBJECT (w2), "combobox", w3);
+	g_object_set_data (G_OBJECT (w1), "refresh-hbox", w2);
 
 	g_signal_connect (G_OBJECT (w1), "changed", G_CALLBACK (refresh_type_changed), source);
-	g_signal_connect (G_OBJECT (w2), "value-changed", G_CALLBACK (spin_changed), source);
-	g_signal_connect (G_OBJECT (w3), "changed", G_CALLBACK (combobox_changed), source);
 
-	w2 = gtk_check_button_new_with_mnemonic (_("Force read _only"));
-	value = e_source_get_property (source, "custom-file-readonly");
-	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w2), value && g_str_equal (value, "1"));
-	g_signal_connect (G_OBJECT (w2), "toggled", G_CALLBACK (force_readonly_toggled), source);
+	w2 = e_plugin_util_add_check (NULL, _("Force read _only"), source, "custom-file-readonly", "1", NULL);
 	gtk_box_pack_start ((GtkBox *)box1, w2, TRUE, TRUE, 2);
 
 	gtk_widget_show_all (mainbox);
@@ -316,7 +205,6 @@ e_calendar_file_customs (EPlugin *epl, EConfigHookItemFactoryData *data)
 	/* w1 is a refresh-type combobox, and it hides widgets,
 	   thus should be called after show_all call */
 	refresh_type_changed (GTK_COMBO_BOX (w1), source);
-	g_free (uri_text);
 
 	return mainbox;
 }
diff --git a/plugins/calendar-http/Makefile.am b/plugins/calendar-http/Makefile.am
index 2e2a49b..54457c3 100644
--- a/plugins/calendar-http/Makefile.am
+++ b/plugins/calendar-http/Makefile.am
@@ -16,6 +16,7 @@ liborg_gnome_calendar_http_la_SOURCES = calendar-http.c
 liborg_gnome_calendar_http_la_LDFLAGS = -module -avoid-version $(NO_UNDEFINED)
 
 liborg_gnome_calendar_http_la_LIBADD =		\
+	$(top_builddir)/e-util/libeutil.la	\
 	$(EVOLUTION_CALENDAR_LIBS)		\
 	$(GNOME_PLATFORM_LIBS)
 
diff --git a/plugins/calendar-http/calendar-http.c b/plugins/calendar-http/calendar-http.c
index d2e8f90..1137d06 100644
--- a/plugins/calendar-http/calendar-http.c
+++ b/plugins/calendar-http/calendar-http.c
@@ -21,9 +21,10 @@
 
 #include <gtk/gtk.h>
 #include <e-util/e-config.h>
+#include <e-util/e-plugin-util.h>
 #include <calendar/gui/e-cal-config.h>
 #include <libedataserver/e-source.h>
-#include <libedataserver/e-url.h>
+#include <libsoup/soup.h>
 #include <glib/gi18n.h>
 #include <string.h>
 
@@ -33,88 +34,18 @@ gboolean   e_calendar_http_check (EPlugin *epl, EConfigHookPageCheckData *data);
 GtkWidget * e_calendar_http_secure (EPlugin *epl, EConfigHookItemFactoryData *data);
 GtkWidget *e_calendar_http_auth (EPlugin *epl, EConfigHookItemFactoryData *data);
 
-/* replaces all '@' with '%40' in str; returns newly allocated string */
-static gchar *
-replace_at_sign (const gchar *str)
-{
-	gchar *res, *at;
-
-	if (!str)
-		return NULL;
-
-	res = g_strdup (str);
-	while (at = strchr (res, '@'), at) {
-		gchar *tmp = g_malloc0 (sizeof (gchar) * (1 + strlen (res) + 2));
-
-		strncpy (tmp, res, at - res);
-		strcat (tmp, "%40");
-		strcat (tmp, at + 1);
-
-		g_free (res);
-		res = tmp;
-	}
-
-	return res;
-}
-
-static gchar *
-print_uri_noproto (EUri *uri)
-{
-	gchar *uri_noproto, *user, *pass;
-
-	if (uri->user)
-		user = replace_at_sign (uri->user);
-	else
-		user = NULL;
-
-	if (uri->passwd)
-		pass = replace_at_sign (uri->passwd);
-	else
-		pass = NULL;
-
-	if (uri->port != 0)
-		uri_noproto = g_strdup_printf (
-			"%s%s%s%s%s%s%s:%d%s%s%s",
-			user ? user : "",
-			uri->authmech ? ";auth=" : "",
-			uri->authmech ? uri->authmech : "",
-			pass ? ":" : "",
-			pass ? pass : "",
-			user ? "@" : "",
-			uri->host ? uri->host : "",
-			uri->port,
-			uri->path ? uri->path : "",
-			uri->query ? "?" : "",
-			uri->query ? uri->query : "");
-	else
-		uri_noproto = g_strdup_printf (
-			"%s%s%s%s%s%s%s%s%s%s",
-			user ? user : "",
-			uri->authmech ? ";auth=" : "",
-			uri->authmech ? uri->authmech : "",
-			pass ? ":" : "",
-			pass ? pass : "",
-			user ? "@" : "",
-			uri->host ? uri->host : "",
-			uri->path ? uri->path : "",
-			uri->query ? "?" : "",
-			uri->query ? uri->query : "");
-
-	g_free (user);
-	g_free (pass);
-
-	return uri_noproto;
-}
-
 static void
 url_changed (GtkEntry *entry, ESource *source)
 {
-	EUri *uri;
+	SoupURI *uri;
 	gchar *relative_uri;
 
-	uri = e_uri_new (gtk_entry_get_text (GTK_ENTRY (entry)));
+	uri = soup_uri_new (gtk_entry_get_text (GTK_ENTRY (entry)));
+
+	if (!uri)
+		return;
 
-	if (strncmp (uri->protocol, "https", sizeof ("https") - 1) == 0) {
+	if (uri->scheme && strncmp (uri->scheme, "https", sizeof ("https") - 1) == 0) {
 		gpointer secure_checkbox;
 
 		secure_checkbox = g_object_get_data (G_OBJECT (gtk_widget_get_parent (GTK_WIDGET (entry))),
@@ -123,261 +54,79 @@ url_changed (GtkEntry *entry, ESource *source)
 		gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (secure_checkbox), TRUE);
 	}
 
-	g_free (uri->user);
-	uri->user = g_strdup (e_source_get_property (source, "username"));
-	relative_uri = print_uri_noproto (uri);
+	soup_uri_set_user (uri, e_source_get_property (source, "username"));
+	relative_uri = e_plugin_util_uri_no_proto (uri);
 	e_source_set_relative_uri (source, relative_uri);
 	g_free (relative_uri);
-	e_uri_free (uri);
+	soup_uri_free (uri);
 }
 
 GtkWidget *
 e_calendar_http_url (EPlugin *epl, EConfigHookItemFactoryData *data)
 {
-	static GtkWidget *label;
-	GtkWidget *entry, *parent;
-	gint row;
+	GtkWidget *entry;
 	ECalConfigTargetSource *t = (ECalConfigTargetSource *) data->target;
-	EUri *uri;
+	SoupURI *uri;
 	gchar *uri_text;
-	static GtkWidget *hidden = NULL;
 
-	if (!hidden)
-		hidden = gtk_label_new ("");
-
-	if (data->old)
-		gtk_widget_destroy (label);
-
-	uri_text = e_source_get_uri (t->source);
-	uri = e_uri_new (uri_text);
-	if ((strcmp (uri->protocol, "http") &&
-	     strcmp (uri->protocol, "https") &&
-	     strcmp (uri->protocol, "webcal"))) {
-		e_uri_free (uri);
-		g_free (uri_text);
-		return hidden;
+	if ((!e_plugin_util_is_source_proto (t->source, "http") &&
+	     !e_plugin_util_is_source_proto (t->source, "https") &&
+	     !e_plugin_util_is_source_proto (t->source, "webcal"))) {
+		return NULL;
 	}
-	g_free (uri->user);
-	uri->user = NULL;
 
+	uri_text = e_source_get_uri (t->source);
+	uri = soup_uri_new (uri_text);
 	g_free (uri_text);
-	uri_text = e_uri_to_string (uri, FALSE);
-	e_uri_free (uri);
-
-	parent = data->parent;
 
-	row = ((GtkTable*)parent)->nrows;
+	if (uri) {
+		soup_uri_set_user (uri, NULL);
+		soup_uri_set_password (uri, NULL);
 
-	label = gtk_label_new_with_mnemonic (_("_URL:"));
-	gtk_widget_show (label);
-	gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
-	gtk_table_attach (GTK_TABLE (parent), label, 0, 1, row, row+1, GTK_FILL, 0, 0, 0);
+		uri_text = soup_uri_to_string (uri, FALSE);
+		soup_uri_free (uri);
+	} else {
+		uri_text = g_strdup ("");
+	}
 
-	entry = gtk_entry_new ();
-	gtk_widget_show (entry);
+	entry = e_plugin_util_add_entry (data->parent, _("_URL:"), NULL, NULL);
 	gtk_entry_set_text (GTK_ENTRY (entry), uri_text);
-	gtk_table_attach (GTK_TABLE (parent), entry, 1, 2, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
-	gtk_label_set_mnemonic_widget (GTK_LABEL (label), entry);
 	g_signal_connect (G_OBJECT (entry), "changed", G_CALLBACK (url_changed), t->source);
-
 	g_free (uri_text);
-	return entry;
-}
-
-static void
-set_refresh_time (ESource *source, GtkWidget *spin, GtkWidget *combobox)
-{
-	gint time;
-	gint item_num = 0;
-	const gchar *refresh_str = e_source_get_property (source, "refresh");
-	time = refresh_str ? atoi (refresh_str) : 30;
-
-	if (time  && !(time % 10080)) {
-		/* weeks */
-		item_num = 3;
-		time /= 10080;
-	} else if (time && !(time % 1440)) {
-		/* days */
-		item_num = 2;
-		time /= 1440;
-	} else if (time && !(time % 60)) {
-		/* hours */
-		item_num = 1;
-		time /= 60;
-	}
-	gtk_combo_box_set_active (GTK_COMBO_BOX (combobox), item_num);
-	gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin), time);
-}
-
-static gchar *
-get_refresh_minutes (GtkWidget *spin, GtkWidget *combobox)
-{
-	gint setting = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin));
-	switch (gtk_combo_box_get_active (GTK_COMBO_BOX (combobox))) {
-	case 0:
-		/* minutes */
-		break;
-	case 1:
-		/* hours */
-		setting *= 60;
-		break;
-	case 2:
-		/* days */
-		setting *= 1440;
-		break;
-	case 3:
-		/* weeks - is this *really* necessary? */
-		setting *= 10080;
-		break;
-	default:
-		g_warning ("Time unit out of range");
-		break;
-	}
-
-	return g_strdup_printf ("%d", setting);
-}
-
-static void
-spin_changed (GtkSpinButton *spin, ECalConfigTargetSource *t)
-{
-	gchar *refresh_str;
-	GtkWidget *combobox;
-
-	combobox = g_object_get_data (G_OBJECT (spin), "combobox");
-
-	refresh_str = get_refresh_minutes ((GtkWidget *) spin, combobox);
-	e_source_set_property (t->source, "refresh", refresh_str);
-	g_free (refresh_str);
-}
-
-static void
-combobox_changed (GtkComboBox *combobox, ECalConfigTargetSource *t)
-{
-	gchar *refresh_str;
-	GtkWidget *spin;
 
-	spin = g_object_get_data (G_OBJECT (combobox), "spin");
-
-	refresh_str = get_refresh_minutes (spin, (GtkWidget *) combobox);
-	e_source_set_property (t->source, "refresh", refresh_str);
-	g_free (refresh_str);
-}
-
-static void
-secure_setting_changed (GtkWidget *widget, ESource *source)
-{
-	if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)))
-		e_source_set_property (source, "use_ssl", "1");
-	else
-		e_source_set_property (source, "use_ssl", "0");
+	return entry;
 }
 
 GtkWidget *
 e_calendar_http_refresh (EPlugin *epl, EConfigHookItemFactoryData *data)
 {
-	static GtkWidget *label;
-	GtkWidget *combobox, *spin, *hbox, *parent;
-	gint row;
 	ECalConfigTargetSource *t = (ECalConfigTargetSource *) data->target;
-	ESource *source = t->source;
-	EUri *uri;
-	gchar * uri_text;
-	static GtkWidget *hidden = NULL;
 
-	if (!hidden)
-		hidden = gtk_label_new ("");
-
-	if (data->old)
-		gtk_widget_destroy (label);
-
-	uri_text = e_source_get_uri (t->source);
-	uri = e_uri_new (uri_text);
-	g_free (uri_text);
-	if ((strcmp (uri->protocol, "http") &&
-	     strcmp (uri->protocol, "https") &&
-	     strcmp (uri->protocol, "webcal"))) {
-		e_uri_free (uri);
-		return hidden;
+	if ((!e_plugin_util_is_source_proto (t->source, "http") &&
+	     !e_plugin_util_is_source_proto (t->source, "https") &&
+	     !e_plugin_util_is_source_proto (t->source, "webcal"))) {
+		return NULL;
 	}
-	e_uri_free (uri);
 
-	parent = data->parent;
-
-	row = ((GtkTable*)parent)->nrows;
-
-	label = gtk_label_new_with_mnemonic (_("Re_fresh:"));
-	gtk_widget_show (label);
-	gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
-	gtk_table_attach (GTK_TABLE (parent), label, 0, 1, row, row+1, GTK_FILL, 0, 0, 0);
-
-	hbox = gtk_hbox_new (FALSE, 6);
-	gtk_widget_show (hbox);
-
-	spin = gtk_spin_button_new_with_range (0, 100, 1);
-	gtk_label_set_mnemonic_widget (GTK_LABEL (label), spin);
-	gtk_widget_show (spin);
-	gtk_box_pack_start (GTK_BOX (hbox), spin, FALSE, TRUE, 0);
-
-	combobox = gtk_combo_box_new_text ();
-	gtk_widget_show (combobox);
-	gtk_combo_box_append_text (GTK_COMBO_BOX (combobox), _("minutes"));
-	gtk_combo_box_append_text (GTK_COMBO_BOX (combobox), _("hours"));
-	gtk_combo_box_append_text (GTK_COMBO_BOX (combobox), _("days"));
-	gtk_combo_box_append_text (GTK_COMBO_BOX (combobox), _("weeks"));
-	set_refresh_time (source, spin, combobox);
-	gtk_box_pack_start (GTK_BOX (hbox), combobox, FALSE, TRUE, 0);
-
-	g_object_set_data (G_OBJECT (combobox), "spin", spin);
-	g_signal_connect (G_OBJECT (combobox), "changed", G_CALLBACK (combobox_changed), t);
-	g_object_set_data (G_OBJECT (spin), "combobox", combobox);
-	g_signal_connect (G_OBJECT (spin), "value-changed", G_CALLBACK (spin_changed), t);
-
-	gtk_table_attach (GTK_TABLE (parent), hbox, 1, 2, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
-
-	return hbox;
+	return e_plugin_util_add_refresh (data->parent, _("Re_fresh:"), t->source, "refresh");
 }
 
 GtkWidget *
 e_calendar_http_secure (EPlugin *epl, EConfigHookItemFactoryData *data)
 {
 	ECalConfigTargetSource *t = (ECalConfigTargetSource *) data->target;
-	GtkWidget *secure_setting, *parent;
-	const gchar *secure_prop;
-	gint row;
-	EUri *uri;
-	gchar * uri_text;
-	static GtkWidget *hidden = NULL;
-
-	if (!hidden)
-		hidden = gtk_label_new ("");
+	GtkWidget *secure_setting;
 
-	uri_text = e_source_get_uri (t->source);
-	uri = e_uri_new (uri_text);
-	g_free (uri_text);
-	if ((strcmp (uri->protocol, "http") &&
-	     strcmp (uri->protocol, "https") &&
-	     strcmp (uri->protocol, "webcal"))) {
-		e_uri_free (uri);
-		return hidden;
+	if ((!e_plugin_util_is_source_proto (t->source, "http") &&
+	     !e_plugin_util_is_source_proto (t->source, "https") &&
+	     !e_plugin_util_is_source_proto (t->source, "webcal"))) {
+		return NULL;
 	}
-	e_uri_free (uri);
-
-	parent = data->parent;
-
-	row = ((GtkTable*)parent)->nrows;
-
-	secure_setting = gtk_check_button_new_with_mnemonic (_("_Secure connection"));
-
-	secure_prop = e_source_get_property (t->source, "use_ssl");
-	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (secure_setting), (secure_prop && g_str_equal (secure_prop, "1"))  ? TRUE : FALSE);
-
-	g_signal_connect (secure_setting, "toggled", G_CALLBACK (secure_setting_changed), t->source);
 
-	gtk_widget_show (secure_setting);
-	gtk_table_attach (GTK_TABLE (parent), secure_setting, 1, 2, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+	secure_setting = e_plugin_util_add_check (data->parent, _("_Secure connection"), t->source, "use_ssl", "1", "0");
 
 	/* Store pointer to secure checkbox so we can retrieve it in url_changed() */
-	g_object_set_data (G_OBJECT (parent), "secure_checkbox", (gpointer)secure_setting);
+	g_object_set_data (G_OBJECT (data->parent), "secure_checkbox", (gpointer)secure_setting);
 
 	return secure_setting;
 }
@@ -396,24 +145,24 @@ username_changed (GtkEntry *entry, ESource *source)
 	} else {
 		e_source_set_property (source, "auth", NULL);
 		e_source_set_property (source, "username", NULL);
+		username = NULL;
 	}
 
 	uri = e_source_get_uri (source);
 	if (uri != NULL) {
-		EUri *euri;
+		SoupURI *suri;
 		gchar *ruri;
 
-		if (username && !*username)
-			username = NULL;
+		suri = soup_uri_new (uri);
+		if (!suri)
+			return;
 
-		euri = e_uri_new (uri);
+		soup_uri_set_user (suri, username);
+		soup_uri_set_password (suri, NULL);
 
-		g_free (euri->user);
-		euri->user = g_strdup (username);
-
-		ruri = print_uri_noproto (euri);
+		ruri = e_plugin_util_uri_no_proto (suri);
 		e_source_set_relative_uri (source, ruri);
-		e_uri_free (euri);
+		soup_uri_free (suri);
 		g_free (ruri);
 		g_free (uri);
 	}
@@ -422,51 +171,22 @@ username_changed (GtkEntry *entry, ESource *source)
 GtkWidget *
 e_calendar_http_auth (EPlugin *epl, EConfigHookItemFactoryData *data)
 {
-	static GtkWidget *label;
-	GtkWidget *entry, *parent;
-	gint row;
 	ECalConfigTargetSource *t = (ECalConfigTargetSource *) data->target;
-	EUri *uri;
-	gchar *uri_text;
+	GtkWidget *entry;
 	const gchar *username;
-	static GtkWidget *hidden = NULL;
-
-	if (!hidden)
-		hidden = gtk_label_new ("");
 
-	if (data->old)
-		gtk_widget_destroy (label);
-
-	uri_text = e_source_get_uri (t->source);
-	uri = e_uri_new (uri_text);
-	g_free (uri_text);
-	if ((strcmp (uri->protocol, "http") &&
-	     strcmp (uri->protocol, "https") &&
-	     strcmp (uri->protocol, "webcal"))) {
-		e_uri_free (uri);
-		return hidden;
+	if ((!e_plugin_util_is_source_proto (t->source, "http") &&
+	     !e_plugin_util_is_source_proto (t->source, "https") &&
+	     !e_plugin_util_is_source_proto (t->source, "webcal"))) {
+		return NULL;
 	}
-	e_uri_free (uri);
-
-	parent = data->parent;
-
-	row = ((GtkTable*)parent)->nrows;
-
-	label = gtk_label_new_with_mnemonic (_("Userna_me:"));
-	gtk_widget_show (label);
-	gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.0);
-	gtk_table_attach (GTK_TABLE (parent), label, 0, 1, row, row+1, GTK_FILL, GTK_SHRINK, 0, 0);
 
 	username = e_source_get_property (t->source, "username");
 
-	entry = gtk_entry_new ();
-	gtk_widget_show (entry);
+	entry = e_plugin_util_add_entry (data->parent, _("Userna_me:"), NULL, NULL);
 	gtk_entry_set_text (GTK_ENTRY (entry), username ? username : "");
-	gtk_label_set_mnemonic_widget (GTK_LABEL (label), entry);
 	g_signal_connect (G_OBJECT (entry), "changed", G_CALLBACK (username_changed), t->source);
 
-	gtk_table_attach (GTK_TABLE (parent), entry, 1, 2, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
-
 	return entry;
 }
 
@@ -475,27 +195,18 @@ e_calendar_http_check (EPlugin *epl, EConfigHookPageCheckData *data)
 {
 	/* FIXME - check pageid */
 	ECalConfigTargetSource *t = (ECalConfigTargetSource *) data->target;
-	EUri *uri;
 	gboolean ok = FALSE;
-	ESourceGroup *group = e_source_peek_group (t->source);
-	gchar *uri_text;
 
-	if (strncmp (e_source_group_peek_base_uri (group), "webcal", 6))
+	if (!e_plugin_util_is_group_proto (e_source_peek_group (t->source), "webcal"))
 		return TRUE;
 
-	uri_text = e_source_get_uri (t->source);
-	if (!strncmp (uri_text, "file:", 5)) {
-		g_free (uri_text);
+	if (e_plugin_util_is_source_proto (t->source, "file"))
 		return FALSE;
-	}
 
-	uri = e_uri_new (uri_text);
-	ok = ((!strcmp (uri->protocol, "webcal")) ||
-	      (!strcmp (uri->protocol, "http")) ||
-	      (!strcmp (uri->protocol, "https")) ||
-	      (!strcmp (uri->protocol, "file")) );
-	e_uri_free (uri);
-	g_free (uri_text);
+	ok = e_plugin_util_is_source_proto (t->source, "webcal") ||
+	     e_plugin_util_is_source_proto (t->source, "http")   ||
+	     e_plugin_util_is_source_proto (t->source, "https")  ||
+	     e_plugin_util_is_source_proto (t->source, "file");
 
 	return ok;
 }
diff --git a/plugins/calendar-weather/calendar-weather.c b/plugins/calendar-weather/calendar-weather.c
index ad2c273..50c698d 100644
--- a/plugins/calendar-weather/calendar-weather.c
+++ b/plugins/calendar-weather/calendar-weather.c
@@ -21,11 +21,11 @@
 
 #include <gtk/gtk.h>
 #include <e-util/e-config.h>
-#include "e-util/e-icon-factory.h"
+#include <e-util/e-icon-factory.h>
+#include <e-util/e-plugin-util.h>
 #include <calendar/gui/e-cal-config.h>
 #include <calendar/gui/e-cal-event.h>
 #include <libedataserver/e-source.h>
-#include <libedataserver/e-url.h>
 #include <libedataserver/e-categories.h>
 #include <glib/gi18n.h>
 #include <libxml/parser.h>
@@ -211,7 +211,7 @@ create_source_selector (ESource *source)
 	GtkCellRenderer *text;
 	GtkTreeSelection *selection;
 	gchar *uri_text;
-	EUri *uri;
+	SoupURI *suri;
 
 	/* FIXME - should show an error here if it fails*/
 	if (store == NULL)
@@ -238,8 +238,8 @@ create_source_selector (ESource *source)
 	gtk_tree_selection_set_mode (selection, GTK_SELECTION_BROWSE);
 
 	uri_text = e_source_get_uri (source);
-	uri = e_uri_new (uri_text);
-	if (uri->path && strlen (uri->path)) {
+	suri = soup_uri_new (uri_text);
+	if (suri && suri->path && *suri->path) {
 		GtkTreeIter *iter = find_location (store, uri_text + 10);
 		GtkTreePath *path = gtk_tree_model_get_path (GTK_TREE_MODEL (store), iter);
 		gtk_tree_view_expand_to_path (GTK_TREE_VIEW (treeview), path);
@@ -247,7 +247,8 @@ create_source_selector (ESource *source)
 		gtk_tree_path_free (path);
 	}
 	g_free (uri_text);
-	e_uri_free (uri);
+	if (suri)
+		soup_uri_free (suri);
 
 	g_signal_connect (G_OBJECT (selection), "changed", G_CALLBACK (selection_changed), dialog);
 	g_object_set_data (G_OBJECT (dialog), "treeview", treeview);
@@ -332,30 +333,21 @@ location_clicked (GtkButton *button, ESource *source)
 GtkWidget *
 e_calendar_weather_location (EPlugin *epl, EConfigHookItemFactoryData *data)
 {
-	static GtkWidget *label;
-	GtkWidget *button, *parent, *text;
+	GtkWidget *button, *parent, *text, *label;
 	gint row;
 	ECalConfigTargetSource *t = (ECalConfigTargetSource *) data->target;
 	ESource *source = t->source;
-	EUri *uri;
+	SoupURI *suri;
 	gchar *uri_text;
-	static GtkWidget *hidden;
+
+	if (!e_plugin_util_is_source_proto (t->source, "weather"))
+		return NULL;
 
 	if (store == NULL)
 		store = gweather_xml_load_locations ();
 
-	if (!hidden)
-		hidden = gtk_label_new ("");
-
-	if (data->old)
-		gtk_widget_destroy (label);
-
 	uri_text = e_source_get_uri (t->source);
-	uri = e_uri_new (uri_text);
-	if (strcmp ((const gchar *)uri->protocol, "weather")) {
-		e_uri_free (uri);
-		return hidden;
-	}
+	suri = soup_uri_new (uri_text);
 
 	parent = data->parent;
 
@@ -370,7 +362,7 @@ e_calendar_weather_location (EPlugin *epl, EConfigHookItemFactoryData *data)
 	g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (location_clicked), source);
 	gtk_widget_show (button);
 
-	if (uri->path && strlen (uri->path)) {
+	if (suri && suri->path && *suri->path) {
 		GtkTreeIter *iter = find_location (store, uri_text + 10);
 		gchar *location = build_location_path (iter);
 		text = gtk_label_new (location);
@@ -381,7 +373,8 @@ e_calendar_weather_location (EPlugin *epl, EConfigHookItemFactoryData *data)
 	gtk_widget_show (text);
 	gtk_label_set_ellipsize (GTK_LABEL (text), PANGO_ELLIPSIZE_START);
 	gtk_container_add (GTK_CONTAINER (button), text);
-	e_uri_free (uri);
+	if (suri)
+		soup_uri_free (suri);
 	g_free (uri_text);
 
 	gtk_table_attach (GTK_TABLE (parent), button, 1, 2, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
@@ -389,145 +382,15 @@ e_calendar_weather_location (EPlugin *epl, EConfigHookItemFactoryData *data)
 	return button;
 }
 
-static void
-set_refresh_time (ESource *source, GtkWidget *spin, GtkWidget *combobox)
-{
-	gint time;
-	gint item_num = 0;
-	const gchar *refresh_str = e_source_get_property (source, "refresh");
-	time = refresh_str ? atoi (refresh_str) : 30;
-
-	if (time && !(time % 10080)) {
-		/* weeks */
-		item_num = 3;
-		time /= 10080;
-	} else if (time && !(time % 1440)) {
-		/* days */
-		item_num = 2;
-		time /= 1440;
-	} else if (time && !(time % 60)) {
-		/* hours */
-		item_num = 1;
-		time /= 60;
-	}
-	gtk_combo_box_set_active (GTK_COMBO_BOX (combobox), item_num);
-	gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin), time);
-}
-
-static gchar *
-get_refresh_minutes (GtkWidget *spin, GtkWidget *combobox)
-{
-	gint setting = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin));
-	switch (gtk_combo_box_get_active (GTK_COMBO_BOX (combobox))) {
-	case 0:
-		/* minutes */
-		break;
-	case 1:
-		/* hours */
-		setting *= 60;
-		break;
-	case 2:
-		/* days */
-		setting *= 1440;
-		break;
-	case 3:
-		/* weeks - is this *really* necessary? */
-		setting *= 10080;
-		break;
-	default:
-		g_warning ("Time unit out of range");
-		break;
-	}
-	return g_strdup_printf ("%d", setting);
-}
-
-static void
-spin_changed (GtkSpinButton *spin, ECalConfigTargetSource *t)
-{
-	gchar *refresh_str;
-	GtkWidget *combobox;
-
-	combobox = g_object_get_data (G_OBJECT (spin), "combobox");
-
-	refresh_str = get_refresh_minutes ((GtkWidget *) spin, combobox);
-	e_source_set_property (t->source, "refresh", refresh_str);
-	g_free (refresh_str);
-}
-
-static void
-combobox_changed (GtkComboBox *combobox, ECalConfigTargetSource *t)
-{
-	gchar *refresh_str;
-	GtkWidget *spin;
-
-	spin = g_object_get_data (G_OBJECT (combobox), "spin");
-
-	refresh_str = get_refresh_minutes (spin, (GtkWidget *) combobox);
-	e_source_set_property (t->source, "refresh", refresh_str);
-	g_free (refresh_str);
-}
-
 GtkWidget *
 e_calendar_weather_refresh (EPlugin *epl, EConfigHookItemFactoryData *data)
 {
-	static GtkWidget *label;
-	GtkWidget *spin, *combobox, *hbox, *parent;
-	gint row;
 	ECalConfigTargetSource *t = (ECalConfigTargetSource *) data->target;
-	ESource *source = t->source;
-	EUri *uri;
-	gchar *uri_text;
-	static GtkWidget *hidden = NULL;
-
-	if (!hidden)
-		hidden = gtk_label_new ("");
-
-	if (data->old)
-		gtk_widget_destroy (label);
-
-	uri_text = e_source_get_uri (t->source);
-	uri = e_uri_new (uri_text);
-	g_free (uri_text);
-	if (strcmp ((const gchar *)uri->protocol, "weather")) {
-		e_uri_free (uri);
-		return hidden;
-	}
-	e_uri_free (uri);
-
-	parent = data->parent;
-
-	row = ((GtkTable*)parent)->nrows;
-
-	label = gtk_label_new_with_mnemonic (_("Re_fresh:"));
-	gtk_widget_show (label);
-	gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
-	gtk_table_attach (GTK_TABLE (parent), label, 0, 1, row, row+1, GTK_FILL, 0, 0, 0);
 
-	hbox = gtk_hbox_new (FALSE, 6);
-	gtk_widget_show (hbox);
-
-	spin = gtk_spin_button_new_with_range (0, 100, 1);
-	gtk_label_set_mnemonic_widget (GTK_LABEL (label), spin);
-	gtk_widget_show (spin);
-	gtk_box_pack_start (GTK_BOX (hbox), spin, FALSE, TRUE, 0);
-
-	combobox = gtk_combo_box_new_text ();
-	gtk_widget_show (combobox);
-	gtk_combo_box_append_text (GTK_COMBO_BOX (combobox), _("minutes"));
-	gtk_combo_box_append_text (GTK_COMBO_BOX (combobox), _("hours"));
-	gtk_combo_box_append_text (GTK_COMBO_BOX (combobox), _("days"));
-	gtk_combo_box_append_text (GTK_COMBO_BOX (combobox), _("weeks"));
-	set_refresh_time (source, spin, combobox);
-	gtk_box_pack_start (GTK_BOX (hbox), combobox, FALSE, TRUE, 0);
-
-	g_object_set_data (G_OBJECT (combobox), "spin", spin);
-	g_signal_connect (G_OBJECT (combobox), "changed", G_CALLBACK (combobox_changed), t);
-	g_object_set_data (G_OBJECT (spin), "combobox", combobox);
-	g_signal_connect (G_OBJECT (spin), "value-changed", G_CALLBACK (spin_changed), t);
-
-	gtk_table_attach (GTK_TABLE (parent), hbox, 1, 2, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+	if (!e_plugin_util_is_source_proto (t->source, "weather"))
+		return NULL;
 
-	return hbox;
+	return e_plugin_util_add_refresh (data->parent, _("Re_fresh:"), t->source, "refresh");
 }
 
 static void
@@ -568,29 +431,13 @@ units_changed (GtkComboBox *combobox, ECalConfigTargetSource *t)
 GtkWidget *
 e_calendar_weather_units (EPlugin *epl, EConfigHookItemFactoryData *data)
 {
-	static GtkWidget *label;
-	GtkWidget *combobox, *parent;
+	GtkWidget *combobox, *parent, *label;
 	gint row;
 	ECalConfigTargetSource *t = (ECalConfigTargetSource *) data->target;
 	ESource *source = t->source;
-	EUri *uri;
-	gchar *uri_text;
-	static GtkWidget *hidden = NULL;
-
-	if (!hidden)
-		hidden = gtk_label_new ("");
 
-	if (data->old)
-		gtk_widget_destroy (label);
-
-	uri_text = e_source_get_uri (t->source);
-	uri = e_uri_new (uri_text);
-	g_free (uri_text);
-	if (strcmp ((const gchar *)uri->protocol, "weather")) {
-		e_uri_free (uri);
-		return hidden;
-	}
-	e_uri_free (uri);
+	if (!e_plugin_util_is_source_proto (t->source, "weather"))
+		return NULL;
 
 	parent = data->parent;
 
@@ -618,18 +465,18 @@ e_calendar_weather_check (EPlugin *epl, EConfigHookPageCheckData *data)
 {
 	/* FIXME - check pageid */
 	ECalConfigTargetSource *t = (ECalConfigTargetSource *) data->target;
-	EUri *uri;
+	SoupURI *suri;
 	gboolean ok = FALSE;
-	ESourceGroup *group = e_source_peek_group (t->source);
 
 	/* always return TRUE if this isn't a weather source */
-	if (strncmp (e_source_group_peek_base_uri (group), "weather", 7))
+	if (!e_plugin_util_is_group_proto (e_source_peek_group (t->source), "weather"))
 		return TRUE;
 
-	uri = e_uri_new (e_source_get_uri (t->source));
+	suri = soup_uri_new (e_source_get_uri (t->source));
 	/* make sure that the protocol is weather:// and that the path isn't empty */
-	ok = (uri->path && strlen (uri->path));
-	e_uri_free (uri);
+	ok = suri && suri->path && *suri->path;
+	if (suri)
+		soup_uri_free (suri);
 
 	return ok;
 }
diff --git a/plugins/default-source/Makefile.am b/plugins/default-source/Makefile.am
index 6f4a904..8afa604 100644
--- a/plugins/default-source/Makefile.am
+++ b/plugins/default-source/Makefile.am
@@ -17,6 +17,7 @@ liborg_gnome_default_source_la_SOURCES = default-source.c
 liborg_gnome_default_source_la_LDFLAGS = -module -avoid-version $(NO_UNDEFINED)
 
 liborg_gnome_default_source_la_LIBADD =		\
+	$(top_builddir)/e-util/libeutil.la	\
 	$(EVOLUTION_CALENDAR_LIBS)		\
 	$(EVOLUTION_ADDRESSBOOK_LIBS)		\
 	$(GNOME_PLATFORM_LIBS)
diff --git a/plugins/default-source/default-source.c b/plugins/default-source/default-source.c
index 1d8a7e0..db8423a 100644
--- a/plugins/default-source/default-source.c
+++ b/plugins/default-source/default-source.c
@@ -22,12 +22,12 @@
 #include <gtk/gtk.h>
 
 #include <e-util/e-config.h>
+#include <e-util/e-plugin-util.h>
 #include <calendar/gui/e-cal-config.h>
 #include <libedataserver/e-source.h>
 #include <addressbook/gui/widgets/eab-config.h>
 #include <libebook/e-book.h>
 #include <libecal/e-cal.h>
-#include <libedataserver/e-source.h>
 #include <glib/gi18n.h>
 #include <string.h>
 
@@ -62,71 +62,30 @@ commit_default_book (EPlugin *epl, EConfigTarget *target)
 
 }
 
-static void
-default_source_changed (GtkWidget *check_box, ESource *source)
-{
-
-	if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (check_box)))
-		e_source_set_property (source, "default", "true");
-	else
-		e_source_set_property (source, "default", NULL);
-}
-
-static void
-autocomplete_book_changed (GtkWidget *check_box, ESource *source)
-{
-
-	if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (check_box)))
-		e_source_set_property (source, "completion", "true");
-	else
-		e_source_set_property (source, "completion", NULL);
-}
-
 GtkWidget *
 org_gnome_default_book (EPlugin *epl, EConfigHookItemFactoryData *data)
 {
-	GtkWidget *widget;
-	ESource *source;
 	EABConfigTargetSource *book_target;
 
 	if (data->old)
 		return data->old;
-	widget = gtk_check_button_new_with_mnemonic (_("Mark as _default address book"));
+
 	book_target = (EABConfigTargetSource *) data->target;
-	source = book_target->source;
 
-	if (e_source_get_property (source, "default"))
-		gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), TRUE);
-	else
-		gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), FALSE);
-	gtk_container_add (GTK_CONTAINER (data->parent), widget);
-
-	g_signal_connect (GTK_TOGGLE_BUTTON (widget), "toggled", G_CALLBACK (default_source_changed), source);
-	gtk_widget_show (widget);
-	return widget;
+	return e_plugin_util_add_check (data->parent, _("Mark as _default address book"), book_target->source, "default", "true", NULL);
 }
 
 GtkWidget *
 org_gnome_autocomplete_book (EPlugin *epl, EConfigHookItemFactoryData *data)
 {
-	GtkWidget *widget;
-	ESource *source;
 	EABConfigTargetSource *book_target;
 
 	if (data->old)
 		return data->old;
 
-	widget = gtk_check_button_new_with_mnemonic (_("A_utocomplete with this address book"));
 	book_target = (EABConfigTargetSource *) data->target;
-	source = book_target->source;
 
-	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), e_source_get_property (source, "completion") && g_str_equal (e_source_get_property (source, "completion"), "true"));
-	gtk_container_add (GTK_CONTAINER (data->parent), widget);
-
-	g_signal_connect (GTK_TOGGLE_BUTTON (widget), "toggled", G_CALLBACK (autocomplete_book_changed), source);
-	gtk_widget_show (widget);
-
-	return widget;
+	return e_plugin_util_add_check (data->parent, _("A_utocomplete with this address book"), book_target->source, "completion", "true", NULL);
 }
 
 static const gchar *
@@ -149,26 +108,12 @@ GtkWidget *org_gnome_default_cal (EPlugin *epl, EConfigHookItemFactoryData *data
 GtkWidget *
 org_gnome_default_cal (EPlugin *epl, EConfigHookItemFactoryData *data)
 {
-	GtkWidget *widget;
-	ESource *source;
 	ECalConfigTargetSource *cal_target;
-	gint i;
 
 	if (data->old)
 		return data->old;
-	cal_target = (ECalConfigTargetSource *) data->target;
-	source = cal_target->source;
-	widget = gtk_check_button_new_with_mnemonic (get_calendar_option_caption (cal_target->source_type));
 
-	if (e_source_get_property (source, "default"))
-		gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), TRUE);
-	else
-		gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), FALSE);
-
-	i = ((GtkTable *)data->parent)->nrows;
-	gtk_table_attach((GtkTable *)data->parent, widget, 1, 2, i, i+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+	cal_target = (ECalConfigTargetSource *) data->target;
 
-	g_signal_connect (GTK_TOGGLE_BUTTON (widget), "toggled", G_CALLBACK (default_source_changed), source);
-	gtk_widget_show (widget);
-	return widget;
+	return e_plugin_util_add_check (data->parent, get_calendar_option_caption (cal_target->source_type), cal_target->source, "default", "true", NULL);
 }
diff --git a/plugins/google-account-setup/google-source.c b/plugins/google-account-setup/google-source.c
index 9452422..26b80f0 100644
--- a/plugins/google-account-setup/google-source.c
+++ b/plugins/google-account-setup/google-source.c
@@ -34,6 +34,7 @@
 
 #include <e-util/e-config.h>
 #include <e-util/e-plugin.h>
+#include <e-util/e-plugin-util.h>
 
 #include <calendar/gui/e-cal-config.h>
 #include <calendar/gui/e-cal-event.h>
@@ -303,85 +304,6 @@ user_changed (GtkEntry *editable, ESource *source)
 	init_combo_values (GTK_COMBO_BOX (g_object_get_data (G_OBJECT (editable), "CalendarCombo")), _("Default"), NULL);
 }
 
-static gchar *
-get_refresh_minutes (GtkWidget *spin, GtkWidget *combobox)
-{
-	gint setting = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin));
-	switch (gtk_combo_box_get_active (GTK_COMBO_BOX (combobox))) {
-	case 0:
-		/* minutes */
-		break;
-	case 1:
-		/* hours */
-		setting *= 60;
-		break;
-	case 2:
-		/* days */
-		setting *= 1440;
-		break;
-	case 3:
-		/* weeks - is this *really* necessary? */
-		setting *= 10080;
-		break;
-	default:
-		g_warning ("Time unit out of range");
-		break;
-	}
-
-	return g_strdup_printf ("%d", setting);
-}
-
-static void
-spin_changed (GtkSpinButton *spin, ECalConfigTargetSource *t)
-{
-	gchar *refresh_str;
-	GtkWidget *combobox;
-
-	combobox = g_object_get_data (G_OBJECT(spin), "combobox");
-
-	refresh_str = get_refresh_minutes ((GtkWidget *)spin, combobox);
-	e_source_set_property (t->source, "refresh", refresh_str);
-	g_free (refresh_str);
-}
-
-static void
-combobox_changed (GtkComboBox *combobox, ECalConfigTargetSource *t)
-{
-	gchar *refresh_str;
-	GtkWidget *spin;
-
-	spin = g_object_get_data (G_OBJECT(combobox), "spin");
-
-	refresh_str = get_refresh_minutes (spin, (GtkWidget *)combobox);
-	e_source_set_property (t->source, "refresh", refresh_str);
-	g_free (refresh_str);
-}
-
-static void
-set_refresh_time (ESource *source, GtkWidget *spin, GtkWidget *combobox)
-{
-	gint time;
-	gint item_num = 0;
-	const gchar *refresh_str = e_source_get_property (source, "refresh");
-	time = refresh_str ? atoi (refresh_str) : 30;
-
-	if (time  && !(time % 10080)) {
-		/* weeks */
-		item_num = 3;
-		time /= 10080;
-	} else if (time && !(time % 1440)) {
-		/* days */
-		item_num = 2;
-		time /= 1440;
-	} else if (time && !(time % 60)) {
-		/* hours */
-		item_num = 1;
-		time /= 60;
-	}
-	gtk_combo_box_set_active (GTK_COMBO_BOX (combobox), item_num);
-	gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin), time);
-}
-
 enum {
 	COL_COLOR = 0, /* GDK_TYPE_COLOR */
 	COL_TITLE,     /* G_TYPE_STRING */
@@ -656,7 +578,6 @@ plugin_google  (EPlugin                    *epl,
 	EUri         *euri;
 	GtkWidget    *parent;
 	GtkWidget    *widget;
-	GtkWidget    *luser;
 	GtkWidget    *user;
 	GtkWidget    *label;
 	GtkWidget    *combo;
@@ -666,7 +587,7 @@ plugin_google  (EPlugin                    *epl,
 	GtkCellRenderer *renderer;
 	GtkListStore *store;
 
-	GtkWidget *combobox, *spin, *hbox;
+	GtkWidget *hbox;
 
 	source = t->source;
 	group = e_source_peek_group (source);
@@ -695,70 +616,22 @@ plugin_google  (EPlugin                    *epl,
 
 	/* Build up the UI */
 	parent = data->parent;
-	row = GTK_TABLE (parent)->nrows;
-
-	luser = gtk_label_new_with_mnemonic (_("User_name:"));
-	gtk_widget_show (luser);
-	gtk_misc_set_alignment (GTK_MISC (luser), 0.0, 0.5);
-	gtk_table_attach (GTK_TABLE (parent),
-			  luser, 0, 1,
-			  row + 1, row + 2,
-			  GTK_FILL, 0, 0, 0);
 
-	user = gtk_entry_new ();
-	gtk_widget_show (user);
+	user = e_plugin_util_add_entry (parent, _("User_name:"), NULL, NULL);
 	gtk_entry_set_text (GTK_ENTRY (user), username ? username : "");
-	gtk_table_attach (GTK_TABLE (parent), user,
-			  1, 2, row + 1, row + 2,
-			  GTK_EXPAND | GTK_FILL, 0, 0, 0);
-
-	gtk_label_set_mnemonic_widget (GTK_LABEL (luser), user);
-
-	label = gtk_label_new_with_mnemonic (_("Re_fresh:"));
-	gtk_widget_show (label);
-	gtk_misc_set_alignment (GTK_MISC(label), 0.0, 0.5);
-	gtk_table_attach (GTK_TABLE (parent),
-			  label,
-			  0, 1,
-			  row + 2, row + 3,
-			 GTK_EXPAND | GTK_FILL, 0, 0, 0);
-
-	hbox = gtk_hbox_new (FALSE, 6);
-	gtk_widget_show (hbox);
-
-	spin = gtk_spin_button_new_with_range (1, 100, 1);
-	gtk_label_set_mnemonic_widget (GTK_LABEL(label), spin);
-	gtk_widget_show (spin);
-	gtk_box_pack_start (GTK_BOX(hbox), spin, FALSE, TRUE, 0);
-
-	if (!e_source_get_property (source, "refresh"))
-		e_source_set_property (source, "refresh", "30");
-
-	combobox = gtk_combo_box_new_text ();
-	gtk_widget_show (combobox);
-	gtk_combo_box_append_text (GTK_COMBO_BOX (combobox), _("minutes"));
-	gtk_combo_box_append_text (GTK_COMBO_BOX (combobox), _("hours"));
-	gtk_combo_box_append_text (GTK_COMBO_BOX (combobox), _("days"));
-	gtk_combo_box_append_text (GTK_COMBO_BOX (combobox), _("weeks"));
-	set_refresh_time (source, spin, combobox);
-	gtk_box_pack_start (GTK_BOX (hbox), combobox, FALSE, TRUE, 0);
-
-	g_object_set_data (G_OBJECT (combobox), "spin", spin);
-	g_signal_connect (G_OBJECT (combobox), "changed", G_CALLBACK (combobox_changed), t);
-	g_object_set_data (G_OBJECT (spin), "combobox", combobox);
-	g_signal_connect (G_OBJECT (spin), "value-changed", G_CALLBACK (spin_changed), t);
-
-	gtk_table_attach (GTK_TABLE (parent), hbox, 1, 2, row + 2, row + 3, GTK_EXPAND | GTK_FILL, 0, 0, 0);
-
 	g_signal_connect (G_OBJECT (user),
 			  "changed",
 			  G_CALLBACK (user_changed),
 			  source);
 
+	e_plugin_util_add_refresh (parent, _("Re_fresh:"), source, "refresh");
+
+	row = GTK_TABLE (parent)->nrows;
+
 	label = gtk_label_new_with_mnemonic (_("Cal_endar:"));
 	gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
 	gtk_widget_show (label);
-	gtk_table_attach (GTK_TABLE (parent), label, 0, 1, row + 3, row + 4, GTK_FILL | GTK_EXPAND, 0, 0, 0);
+	gtk_table_attach (GTK_TABLE (parent), label, 0, 1, row, row + 1, GTK_FILL | GTK_EXPAND, 0, 0, 0);
 
 	store = gtk_list_store_new (
 		NUM_COLUMNS,
@@ -798,7 +671,7 @@ plugin_google  (EPlugin                    *epl,
 	gtk_widget_set_sensitive (label, username && *username);
 
 	gtk_widget_show_all (hbox);
-	gtk_table_attach (GTK_TABLE (parent), hbox, 1, 2, row + 3, row + 4, GTK_FILL | GTK_EXPAND, 0, 0, 0);
+	gtk_table_attach (GTK_TABLE (parent), hbox, 1, 2, row, row + 1, GTK_FILL | GTK_EXPAND, 0, 0, 0);
 
 	return widget;
 }
diff --git a/plugins/google-account-setup/org-gnome-evolution-google.eplug.xml b/plugins/google-account-setup/org-gnome-evolution-google.eplug.xml
index afccbd3..8eefe3d 100644
--- a/plugins/google-account-setup/org-gnome-evolution-google.eplug.xml
+++ b/plugins/google-account-setup/org-gnome-evolution-google.eplug.xml
@@ -8,7 +8,7 @@
 
     <hook class="org.gnome.evolution.calendar.config:1.0">
       <group target="source" id="org.gnome.evolution.calendar.calendarProperties">
-        <item type="item_table" path="00.general/00.source/15.google" factory="plugin_google"/>
+        <item type="item_table" path="00.general/00.source/99.google" factory="plugin_google"/>
       </group>
     </hook>
     <hook class="org.gnome.evolution.calendar.events:1.0">
@@ -17,7 +17,7 @@
 
     <hook class="org.gnome.evolution.addressbook.config:1.0">
       <group target="source" id="com.novell.evolution.addressbook.config.accountEditor">
-        <item type="item" path="00.general/10.display/00.google" factory="plugin_google_contacts"/>
+        <item type="item" path="00.general/10.display/99.google" factory="plugin_google_contacts"/>
       </group>
     </hook>
   </e-plugin>
diff --git a/plugins/webdav-account-setup/Makefile.am b/plugins/webdav-account-setup/Makefile.am
index f1096df..305d4ff 100644
--- a/plugins/webdav-account-setup/Makefile.am
+++ b/plugins/webdav-account-setup/Makefile.am
@@ -15,6 +15,7 @@ liborg_gnome_evolution_webdav_la_SOURCES = \
 	webdav-contacts-source.c
 
 liborg_gnome_evolution_webdav_la_LIBADD =	\
+	$(top_builddir)/e-util/libeutil.la	\
 	$(EPLUGIN_LIBS)				\
 	$(EVOLUTION_ADDRESSBOOK_LIBS)		\
 	$(GNOME_PLATFORM_LIBS)
diff --git a/plugins/webdav-account-setup/webdav-contacts-source.c b/plugins/webdav-account-setup/webdav-contacts-source.c
index 990a541..9f35d0b 100644
--- a/plugins/webdav-account-setup/webdav-contacts-source.c
+++ b/plugins/webdav-account-setup/webdav-contacts-source.c
@@ -31,11 +31,11 @@
 
 #include <e-util/e-config.h>
 #include <e-util/e-plugin.h>
+#include <e-util/e-plugin-util.h>
 #include <addressbook/gui/widgets/eab-config.h>
 
 #include <libedataserver/e-source.h>
 #include <libedataserver/e-source-list.h>
-#include <libedataserver/e-url.h>
 #include <libedataserver/e-account-list.h>
 
 #define BASE_URI "webdav://"
@@ -96,48 +96,12 @@ remove_webdav_contacts_source_group(void)
 	g_object_unref(source_list);
 }
 
-/* stolen from caldav plugin which stole it from calendar-weather eplugin */
-static gchar *
-print_uri_noproto(EUri *uri)
-{
-	gchar *uri_noproto;
-
-	if (uri->port != 0)
-		uri_noproto = g_strdup_printf(
-				"%s%s%s%s%s%s%s:%d%s%s%s",
-				uri->user ? uri->user : "",
-				uri->authmech ? ";auth=" : "",
-				uri->authmech ? uri->authmech : "",
-				uri->passwd ? ":" : "",
-				uri->passwd ? uri->passwd : "",
-				uri->user ? "@" : "",
-				uri->host ? uri->host : "",
-				uri->port,
-				uri->path ? uri->path : "",
-				uri->query ? "?" : "",
-				uri->query ? uri->query : "");
-	else
-		uri_noproto = g_strdup_printf(
-				"%s%s%s%s%s%s%s%s%s%s",
-				uri->user ? uri->user : "",
-				uri->authmech ? ";auth=" : "",
-				uri->authmech ? uri->authmech : "",
-				uri->passwd ? ":" : "",
-				uri->passwd ? uri->passwd : "",
-				uri->user ? "@" : "",
-				uri->host ? uri->host : "",
-				uri->path ? uri->path : "",
-				uri->query ? "?" : "",
-				uri->query ? uri->query : "");
-	return uri_noproto;
-}
-
 static void
 set_ui_from_source(ui_data *data)
 {
 	ESource    *source  = data->source;
 	const gchar *url     = e_source_get_uri(source);
-	EUri       *uri     = e_uri_new(url);
+	SoupURI     *suri    = soup_uri_new (url);
 	gchar       *url_ui;
 	const gchar *property;
 	gboolean    use_ssl;
@@ -159,75 +123,66 @@ set_ui_from_source(ui_data *data)
 	gtk_toggle_button_set_active(data->avoid_ifmatch_toggle, avoid_ifmatch);
 
 	/* it's really a http or https protocol */
-	g_free(uri->protocol);
-	uri->protocol = g_strdup(use_ssl ? "https" : "http");
+	if (suri)
+		soup_uri_set_scheme (suri, use_ssl ? "https" : "http");
 
 	/* remove user/username and set user field */
-	if (uri->user != NULL) {
-		gtk_entry_set_text(data->username_entry, uri->user);
-		g_free(uri->user);
-		uri->user = NULL;
+	if (suri && suri->user != NULL) {
+		gtk_entry_set_text (data->username_entry, suri->user);
+		soup_uri_set_user (suri, NULL);
 	} else {
 		gtk_entry_set_text(data->username_entry, "");
 	}
 
-	url_ui = e_uri_to_string(uri, TRUE);
-	gtk_entry_set_text(data->url_entry, url_ui);
+	if (suri)
+		url_ui = soup_uri_to_string (suri, FALSE);
+	else
+		url_ui = g_strdup ("");
+	gtk_entry_set_text (data->url_entry, url_ui);
+	g_free (url_ui);
 
-	g_free(url_ui);
-	e_uri_free(uri);
+	if (suri)
+		soup_uri_free (suri);
 }
 
 static void
-set_source_from_ui(ui_data *data)
+set_source_from_ui (ui_data *data)
 {
 	ESource    *source        = data->source;
 	gboolean    avoid_ifmatch = gtk_toggle_button_get_active(data->avoid_ifmatch_toggle);
 	const gchar *url           = gtk_entry_get_text(data->url_entry);
-	EUri       *uri           = e_uri_new(url);
+	SoupURI     *suri          = soup_uri_new (url);
 	gchar       *url_noprotocol;
 	gboolean    use_ssl;
 
+	if (!suri)
+		return;
+
 	e_source_set_property(source, "avoid_ifmatch", avoid_ifmatch ? "1" : "0");
 
 	/* put username into uri */
-	g_free(uri->user);
-	uri->user = g_strdup(gtk_entry_get_text(data->username_entry));
+	soup_uri_set_user (suri, gtk_entry_get_text (data->username_entry));
 
-	if (uri->user[0] != '\0') {
+	if (suri->user && *suri->user) {
 		e_source_set_property(source, "auth", "plain/password");
-		e_source_set_property(source, "username", uri->user);
+		e_source_set_property(source, "username", suri->user);
 	} else {
 		e_source_set_property(source, "auth", NULL);
 		e_source_set_property(source, "username", NULL);
 	}
 
 	/* set use_ssl based on protocol in URL */
-	if (strcmp(uri->protocol, "https") == 0) {
+	if (suri->scheme && g_str_equal (suri->scheme, "https")) {
 		use_ssl = TRUE;
 	} else {
 		use_ssl = FALSE;
 	}
 	e_source_set_property(source, "use_ssl", use_ssl ? "1" : "0");
 
-	url_noprotocol = print_uri_noproto(uri);
-	e_source_set_relative_uri(source, url_noprotocol);
-	g_free(url_noprotocol);
-	e_uri_free(uri);
-}
-
-static void
-on_entry_changed(GtkEntry *entry, gpointer user_data)
-{
-	(void) entry;
-	set_source_from_ui(user_data);
-}
-
-static void
-on_toggle_changed(GtkToggleButton *tb, gpointer user_data)
-{
-	(void) tb;
-	set_source_from_ui(user_data);
+	url_noprotocol = e_plugin_util_uri_no_proto (suri);
+	e_source_set_relative_uri (source, url_noprotocol);
+	g_free (url_noprotocol);
+	soup_uri_free (suri);
 }
 
 static void
@@ -246,8 +201,6 @@ plugin_webdav_contacts(EPlugin *epl, EConfigHookItemFactoryData *data)
 {
 	EABConfigTargetSource *t = (EABConfigTargetSource *) data->target;
 	ESource      *source;
-	ESourceGroup *group;
-	const gchar   *base_uri;
 	GtkWidget    *parent;
 	GtkWidget    *vbox;
 
@@ -261,13 +214,10 @@ plugin_webdav_contacts(EPlugin *epl, EConfigHookItemFactoryData *data)
 	ui_data      *uidata;
 
 	source = t->source;
-	group  = e_source_peek_group (source);
-
-	base_uri = e_source_group_peek_base_uri (group);
 
 	g_object_set_data (G_OBJECT (epl), "wwidget", NULL);
 
-	if (strcmp(base_uri, BASE_URI) != 0) {
+	if (!e_plugin_util_is_group_proto (e_source_peek_group (source), BASE_URI)) {
 		return NULL;
 	}
 
@@ -330,12 +280,9 @@ plugin_webdav_contacts(EPlugin *epl, EConfigHookItemFactoryData *data)
 	g_object_set_data_full(G_OBJECT(epl), "wwidget", uidata, destroy_ui_data);
 	g_signal_connect (uidata->box, "destroy", G_CALLBACK (gtk_widget_destroyed), &uidata->box);
 
-	g_signal_connect(G_OBJECT(uidata->username_entry), "changed",
-			G_CALLBACK(on_entry_changed), uidata);
-	g_signal_connect(G_OBJECT(uidata->url_entry), "changed",
-			G_CALLBACK(on_entry_changed), uidata);
-	g_signal_connect(G_OBJECT(uidata->avoid_ifmatch_toggle), "toggled",
-			G_CALLBACK(on_toggle_changed), uidata);
+	g_signal_connect_swapped (G_OBJECT(uidata->username_entry), "changed", G_CALLBACK (set_source_from_ui), uidata);
+	g_signal_connect_swapped (G_OBJECT(uidata->url_entry), "changed", G_CALLBACK (set_source_from_ui), uidata);
+	g_signal_connect_swapped (G_OBJECT(uidata->avoid_ifmatch_toggle), "toggled", G_CALLBACK (set_source_from_ui), uidata);
 
 	return NULL;
 }
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 6488dd4..ba833a0 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -155,6 +155,7 @@ e-util/e-module.c
 e-util/e-non-intrusive-error-dialog.c
 e-util/e-non-intrusive-error-dialog.h
 e-util/e-plugin.c
+e-util/e-plugin-util.c
 e-util/e-print.c
 e-util/e-signature.c
 e-util/e-system.error.xml



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