aboutsummaryrefslogtreecommitdiffstats
path: root/camel/camel-provider.c
diff options
context:
space:
mode:
authorbertrand <Bertrand.Guiheneuf@aful.org>1999-08-12 18:24:01 +0800
committerBertrand Guiheneuf <bertrand@src.gnome.org>1999-08-12 18:24:01 +0800
commitf888058fc6e6db2309336426662023502a461d5a (patch)
treed414fa4a003e9c3746980396061f4b54b4b49419 /camel/camel-provider.c
parenta478ee7e9d44ea7947b2dc51fcf5d7f09735ee52 (diff)
downloadgsoc2013-evolution-f888058fc6e6db2309336426662023502a461d5a.tar.gz
gsoc2013-evolution-f888058fc6e6db2309336426662023502a461d5a.tar.zst
gsoc2013-evolution-f888058fc6e6db2309336426662023502a461d5a.zip
new function: returns a store for an URL.
1999-08-12 bertrand <Bertrand.Guiheneuf@aful.org> * camel/camel-session.c (camel_session_get_store): new function: returns a store for an URL. (camel_session_get_store_for_protocol): new functionc: returns a store for a given store protocol (as IMAP/POP/MH ...) * camel/string-utils.c (g_strcase_equal): (g_strcase_hash): case insensitive hash table funcs. * camel/camel-session.c (camel_session_init): hash table keys are case insensitive. * camel/camel-provider.c (camel_provider_get_for_protocol): new function, returns the last registered provider for a protocol. svn path=/trunk/; revision=1106
Diffstat (limited to 'camel/camel-provider.c')
-rw-r--r--camel/camel-provider.c61
1 files changed, 60 insertions, 1 deletions
diff --git a/camel/camel-provider.c b/camel/camel-provider.c
index 0018e262e0..98c43bd7ce 100644
--- a/camel/camel-provider.c
+++ b/camel/camel-provider.c
@@ -72,7 +72,9 @@ camel_provider_register (CamelProvider *provider)
// camel_provider_unref (CAMEL_PROVIDER (old_provider_node->data));
old_provider_node->data = provider;
} else {
- _provider_list = g_list_append (_provider_list, provider);
+ /* be careful, we use prepend here, so that last registered
+ providers come first */
+ _provider_list = g_list_prepend (_provider_list, provider);
}
// camel_provider_ref (provider);
@@ -122,3 +124,60 @@ camel_provider_register_as_module (const gchar *module_path)
}
+
+
+
+
+/*
+ be careful to this function, @a is expected to be
+ a provider, @b a protocol name (const gchar *)
+*/
+static gint
+_provider_protocol_find (gconstpointer a, gconstpointer b)
+{
+ CamelProvider *provider_a = CAMEL_PROVIDER (a);
+ const gchar *name_b = (const gchar *)b;
+
+ return g_strcasecmp ( provider_a->name, name_b);
+}
+
+/**
+ * camel_provider_get_for_protocol: get a registered provider for a protocol
+ * @protocol: protocol name (case insensitive)
+ * @type: provider type (transport, store, ...)
+ *
+ * Look into the list of registered provider if
+ * one correspond both to the protocol name
+ * and to the protocol type. When several providerss
+ * exist for a same protocol, the last registered
+ * is returned.
+ *
+ * Return value: Matching provider or NULL if none exists.
+ **/
+const CamelProvider *
+camel_provider_get_for_protocol (const gchar *protocol, ProviderType type)
+{
+ GList *found_provider_node;
+ CamelProvider *found_provider = NULL;
+
+ g_assert (protocol);
+ g_return_val_if_fail (_provider_list, NULL);
+
+ /* we've got a compilation warning here because of bad prototype of
+ g_list_find_custom (), don't worry about that */
+ do {
+ found_provider_node = g_list_find_custom (_provider_list, (gconstpointer)protocol, _provider_name_cmp);
+ /* we will get the last registered provider
+ here because providers are registered
+ using g_list_prepend(). This is a bit
+ dangerous however because we rely on
+ the way g_list_find_custom() is implemented.
+ This should be changed one day */
+ if (found_provider_node)
+ found_provider = (CamelProvider*)found_provider_node->data;
+ else found_provider = NULL;
+ }
+ while (found_provider && (found_provider->provider_type != type));
+
+ return found_provider;
+}