From ba6b73fe56390dc752b43443701073fff7289709 Mon Sep 17 00:00:00 2001 From: Dan Winship Date: Thu, 4 May 2000 15:23:43 +0000 Subject: New function to replace camel_provider_scan. Returns a list of either (a) * camel-session.c (camel_session_list_providers): New function to replace camel_provider_scan. Returns a list of either (a) all currently-loaded providers, or (b) all available providers. * camel-url.[ch]: Add an "empty" flag to CamelURL (indicating that it contains only a protocol). * camel-service.c (camel_service_query_auth_types): Make this take a CamelException (since it may have to try to connect to the server, and it might not able to.) * providers/pop3/camel-pop3-store.c: add KPOP (Kerberized POP) support. This is mostly so I have two kinds of authmech to play with instead of just one. (But it does actually work.) * providers/smtp/camel-smtp-transport.c (query_auth_types): update for prototype change, but disable the functionality, since it doesn't really support any auth types yet. (camel_smtp_transport_get_type): add an object init function to set the service url_flags. svn path=/trunk/; revision=2797 --- camel/camel-session.c | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) (limited to 'camel/camel-session.c') diff --git a/camel/camel-session.c b/camel/camel-session.c index 06a708b752..bddd22bfe2 100644 --- a/camel/camel-session.c +++ b/camel/camel-session.c @@ -95,6 +95,68 @@ camel_session_register_provider (CamelSession *session, g_hash_table_insert (session->providers, provider->protocol, provider); } +static void +ensure_loaded (gpointer key, gpointer value, gpointer user_data) +{ + CamelSession *session = user_data; + char *name = key; + char *path = value; + + if (!g_hash_table_lookup (session->providers, name)) { + CamelException ex; + + camel_exception_init (&ex); + camel_provider_load (session, path, &ex); + camel_exception_clear (&ex); + } +} + +static gint +provider_compare (gconstpointer a, gconstpointer b) +{ + const CamelProvider *cpa = (const CamelProvider *)a; + const CamelProvider *cpb = (const CamelProvider *)b; + + return strcmp (cpa->name, cpb->name); +} + +static void +add_to_list (gpointer key, gpointer value, gpointer user_data) +{ + GList **list = user_data; + CamelProvider *prov = value; + + *list = g_list_insert_sorted (*list, prov, provider_compare); +} + +/** + * camel_session_list_providers: + * @session: the session + * @load: whether or not to load in providers that are not already loaded + * + * This returns a list of available providers in this session. If @load + * is %TRUE, it will first load in all available providers that haven't + * yet been loaded. + * + * Return value: a GList of providers, which the caller must free. + **/ +GList * +camel_session_list_providers (CamelSession *session, gboolean load) +{ + GList *list; + + g_return_val_if_fail (CAMEL_IS_SESSION (session), NULL); + + if (load) { + g_hash_table_foreach (session->modules, ensure_loaded, + session); + } + + list = NULL; + g_hash_table_foreach (session->providers, add_to_list, &list); + return list; +} + CamelService * camel_session_get_service (CamelSession *session, const char *url_string, -- cgit