Index: camel/providers/pop3/ChangeLog
===================================================================
--- camel/providers/pop3/ChangeLog	(revision 10220)
+++ camel/providers/pop3/ChangeLog	(working copy)
@@ -1,3 +1,11 @@
+2009-04-20  Milan Crha  <mcrha@redhat.com>
+
+	** Part of fix for bug #552583
+
+	* camel-pop3-provider.c: (pop3_url_hash), (pop3_url_equal),
+	(camel_provider_module_init), (add_hash), (check_equal):
+	Compare URLs only on protocol, user, host and port.
+
 2008-12-09  Milan Crha  <mcrha@redhat.com>
 
 	** Fix for bug #552986
Index: camel/providers/pop3/camel-pop3-provider.c
===================================================================
--- camel/providers/pop3/camel-pop3-provider.c	(revision 10220)
+++ camel/providers/pop3/camel-pop3-provider.c	(working copy)
@@ -35,6 +35,8 @@
 #include "camel-session.h"
 #include "camel-url.h"
 
+static guint pop3_url_hash (gconstpointer key);
+static gint pop3_url_equal (gconstpointer a, gconstpointer b);
 
 static CamelProviderConfEntry pop3_conf_entries[] = {
 	{ CAMEL_PROVIDER_CONF_SECTION_START, "storage", NULL,
@@ -95,8 +97,8 @@ camel_provider_module_init(void)
 	CamelServiceAuthType *auth;
 
 	pop3_provider.object_types[CAMEL_PROVIDER_STORE] = camel_pop3_store_get_type();
-	pop3_provider.url_hash = camel_url_hash;
-	pop3_provider.url_equal = camel_url_equal;
+	pop3_provider.url_hash = pop3_url_hash;
+	pop3_provider.url_equal = pop3_url_equal;
 
 	pop3_provider.authtypes = camel_sasl_authtype_list (FALSE);
 	auth = camel_sasl_authtype("LOGIN");
@@ -108,3 +110,50 @@ camel_provider_module_init(void)
 
 	camel_provider_register(&pop3_provider);
 }
+
+static void
+add_hash (guint *hash, char *s)
+{
+	if (s)
+		*hash ^= g_str_hash(s);
+}
+
+static guint
+pop3_url_hash (gconstpointer key)
+{
+	const CamelURL *u = (CamelURL *)key;
+	guint hash = 0;
+
+	add_hash (&hash, u->user);
+	add_hash (&hash, u->host);
+	hash ^= u->port;
+	
+	return hash;
+}
+
+static gint
+check_equal (char *s1, char *s2)
+{
+	if (s1 == NULL) {
+		if (s2 == NULL)
+			return TRUE;
+		else
+			return FALSE;
+	}
+	
+	if (s2 == NULL)
+		return FALSE;
+
+	return strcmp (s1, s2) == 0;
+}
+
+static gint
+pop3_url_equal (gconstpointer a, gconstpointer b)
+{
+	const CamelURL *u1 = a, *u2 = b;
+	
+	return check_equal (u1->protocol, u2->protocol)
+		&& check_equal (u1->user, u2->user)
+		&& check_equal (u1->host, u2->host)
+		&& u1->port == u2->port;
+}
Index: camel/providers/smtp/ChangeLog
===================================================================
--- camel/providers/smtp/ChangeLog	(revision 10220)
+++ camel/providers/smtp/ChangeLog	(working copy)
@@ -1,3 +1,11 @@
+2009-04-20  Milan Crha  <mcrha@redhat.com>
+
+	** Part of fix for bug #552583
+
+	* camel-smtp-provider.c: (smtp_url_hash), (smtp_url_equal),
+	(camel_provider_module_init), (add_hash), (check_equal):
+	Compare URLs only on protocol, user, host and port.
+
 2008-09-26  Milan Crha  <mcrha@redhat.com>
 
 	** Part of fix for bug #553301
Index: camel/providers/smtp/camel-smtp-provider.c
===================================================================
--- camel/providers/smtp/camel-smtp-provider.c	(revision 10220)
+++ camel/providers/smtp/camel-smtp-provider.c	(working copy)
@@ -34,6 +34,9 @@
 #include "camel-smtp-transport.h"
 #include "camel-url.h"
 
+static guint smtp_url_hash (gconstpointer key);
+static gint smtp_url_equal (gconstpointer a, gconstpointer b);
+
 static CamelProvider smtp_provider = {
 	"smtp",
 	N_("SMTP"),
@@ -56,12 +59,56 @@ camel_provider_module_init(void)
 	smtp_provider.object_types[CAMEL_PROVIDER_TRANSPORT] = camel_smtp_transport_get_type ();
 	smtp_provider.authtypes = g_list_append (camel_sasl_authtype_list (TRUE), camel_sasl_authtype ("LOGIN"));
 	smtp_provider.authtypes = g_list_append (smtp_provider.authtypes, camel_sasl_authtype ("POPB4SMTP"));
-	smtp_provider.url_hash = camel_url_hash;
-	smtp_provider.url_equal = camel_url_equal;
+	smtp_provider.url_hash = smtp_url_hash;
+	smtp_provider.url_equal = smtp_url_equal;
 	smtp_provider.translation_domain = GETTEXT_PACKAGE;
 	
 	camel_provider_register(&smtp_provider);
 }
 
+static void
+add_hash (guint *hash, char *s)
+{
+	if (s)
+		*hash ^= g_str_hash(s);
+}
+
+static guint
+smtp_url_hash (gconstpointer key)
+{
+	const CamelURL *u = (CamelURL *)key;
+	guint hash = 0;
 
+	add_hash (&hash, u->user);
+	add_hash (&hash, u->host);
+	hash ^= u->port;
+	
+	return hash;
+}
 
+static gint
+check_equal (char *s1, char *s2)
+{
+	if (s1 == NULL) {
+		if (s2 == NULL)
+			return TRUE;
+		else
+			return FALSE;
+	}
+	
+	if (s2 == NULL)
+		return FALSE;
+
+	return strcmp (s1, s2) == 0;
+}
+
+static gint
+smtp_url_equal (gconstpointer a, gconstpointer b)
+{
+	const CamelURL *u1 = a, *u2 = b;
+	
+	return check_equal (u1->protocol, u2->protocol)
+		&& check_equal (u1->user, u2->user)
+		&& check_equal (u1->host, u2->host)
+		&& u1->port == u2->port;
+}
