From 0524f7c06a47544f26997da30317b35361c9d62b Mon Sep 17 00:00:00 2001 From: Dan Winship Date: Sun, 30 Apr 2000 15:36:16 +0000 Subject: Tweak the definition of CamelProvider. Among other things, a provider may * camel-provider.h: Tweak the definition of CamelProvider. Among other things, a provider may now be both a store and a transport. * camel-provider.c: Remove a lot of code we had no intention of using. This now only contains two functions: camel_provider_init to read the installed .urls files, and camel_provider_load to load and register a new provider. * camel-session.c: Remove more unused code and simplify some of the remaining code. The list of available provider modules is now stored in the session, and it handles calling camel_provider_load to load them as needed. Provider registration is now done by calling back from the module init routine, which allows a single module to register providers for multiple URL types. * providers/*: Update provider structures and init routines for the new stuff. Add a .urls file to each provider specifying what urls it handles, and install that with the library. * providers/nntp/camel-nntp-provider.c: Add hints towards supporting both news: and nntp: URLs, and using nntp as both a store and a transport. svn path=/trunk/; revision=2691 --- camel/camel-session.c | 274 +++++++++++--------------------------------------- 1 file changed, 58 insertions(+), 216 deletions(-) (limited to 'camel/camel-session.c') diff --git a/camel/camel-session.c b/camel/camel-session.c index 7b672c5c60..06a708b752 100644 --- a/camel/camel-session.c +++ b/camel/camel-session.c @@ -1,15 +1,16 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* camel-session.c : Abstract class for an email session */ -/* +/* * - * Author : + * Author: * Bertrand Guiheneuf + * Dan Winship * * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.com) * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * @@ -24,9 +25,6 @@ * USA */ - - - #include #include "camel-session.h" #include "camel-store.h" @@ -36,59 +34,36 @@ #include "camel-url.h" #include "hash-table-utils.h" - - -static GtkObjectClass *parent_class=NULL; - - - -/* Returns the class for a CamelSession */ -#define CSS_CLASS(so) CAMEL_SESSION_CLASS (GTK_OBJECT(so)->klass) - - -static void -camel_session_class_init (CamelSessionClass *camel_session_class) -{ - parent_class = gtk_type_class (gtk_object_get_type ()); - - /* virtual method definition */ - /* virtual method overload */ -} - - - - - static void camel_session_init (CamelSession *session) { - session->store_provider_list = g_hash_table_new (g_strcase_hash, g_strcase_equal); - session->transport_provider_list = g_hash_table_new (g_strcase_hash, g_strcase_equal); + session->modules = camel_provider_init (); + session->providers = g_hash_table_new (g_strcase_hash, + g_strcase_equal); } - - GtkType camel_session_get_type (void) { static GtkType camel_session_type = 0; - - if (!camel_session_type) { - GtkTypeInfo camel_session_info = + + if (!camel_session_type) { + GtkTypeInfo camel_session_info = { "CamelSession", sizeof (CamelSession), sizeof (CamelSessionClass), - (GtkClassInitFunc) camel_session_class_init, + (GtkClassInitFunc) NULL, (GtkObjectInitFunc) camel_session_init, /* reserved_1 */ NULL, /* reserved_2 */ NULL, (GtkClassInitFunc) NULL, }; - - camel_session_type = gtk_type_unique (gtk_object_get_type (), &camel_session_info); + + camel_session_type = gtk_type_unique (gtk_object_get_type (), + &camel_session_info); } - + return camel_session_type; } @@ -103,158 +78,67 @@ camel_session_new (CamelAuthCallback authenticator) } /** - * camel_session_set_provider: set the default provider for a protocol - * @session: session object for wich the provider will the default + * camel_session_register_provider: + * @session: a session object + * @protocol: the protocol the provider provides for * @provider: provider object - * - * Set the default implementation for a protocol. The protocol - * is determined by provider->protocol field (See CamelProvider). - * It overrides the default provider for this protocol. - * + * + * Registers a protocol to provider mapping for the session. **/ -void -camel_session_set_provider (CamelSession *session, CamelProvider *provider) +void +camel_session_register_provider (CamelSession *session, + CamelProvider *provider) { - GHashTable *table; + g_return_if_fail (CAMEL_IS_SESSION (session)); + g_return_if_fail (provider != NULL); - g_assert(session); - g_assert(provider); - - if (provider->provider_type == PROVIDER_STORE) - table = session->store_provider_list; - else - table = session->transport_provider_list; - - g_hash_table_insert (table, (gpointer)(provider->protocol), (gpointer)(provider)); - + g_hash_table_insert (session->providers, provider->protocol, provider); } - - - -/** - * camel_session_get_store_from_provider: create a folder instance for a given provider - * @session: session object the folder will be initialized with - * @provider: provider folder to instantiate - * @ex: a CamelException - * - * - * Return value: the newly instantiated store - **/ -CamelStore * -camel_session_get_store_from_provider (CamelSession *session, - CamelProvider *provider, - CamelException *ex) +CamelService * +camel_session_get_service (CamelSession *session, const char *url_string, + CamelProviderType type, CamelException *ex) { - g_assert(session); - g_assert(provider); - - return CAMEL_STORE (camel_service_new (provider->object_type, - session, NULL, ex)); -} - - + CamelURL *url; + const CamelProvider *provider; -/** - * get_store_for_protocol_with_url: private helper routine - * @session: CamelSession object - * @protocol: protocol name - * @url: a URL, or NULL - * @ex: a CamelException - * - * Used by camel_session_get_store_for_protocol and - * camel_session_get_store. - * - * Return value: initialized store associated with this protocol, or NULL if no provider was found. - **/ -static CamelStore * -get_store_for_protocol_with_url (CamelSession *session, const char *protocol, - CamelURL *url, CamelException *ex) -{ - const CamelProvider *provider = NULL; + url = camel_url_new (url_string, ex); + if (!url) + return NULL; - /* See if there is a provider assiciated with this - * protocol in this session. - */ - provider = CAMEL_PROVIDER (g_hash_table_lookup (session->store_provider_list, protocol)); + provider = g_hash_table_lookup (session->providers, url->protocol); if (!provider) { - /* No provider was found in this session. See - * if there is a registered provider for this - * protocol. - */ - provider = camel_provider_get_for_protocol (protocol, PROVIDER_STORE); + /* See if there's one we can load. */ + char *path; + + path = g_hash_table_lookup (session->modules, url->protocol); + if (path) { + camel_provider_load (session, path, ex); + if (camel_exception_get_id (ex) != + CAMEL_EXCEPTION_NONE) { + camel_url_free (url); + return NULL; + } + } + provider = g_hash_table_lookup (session->providers, + url->protocol); } - if (!provider) { + + if (!provider || !provider->object_types[type]) { camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_URL_INVALID, - "No provider available for protocol " - "`%s'", protocol); + "No %s available for protocol `%s'", + camel_provider_type_name[type], + url->protocol); + camel_url_free (url); return NULL; } - return CAMEL_STORE (camel_service_new (provider->object_type, - session, url, ex)); -} - - -/** - * camel_session_get_store_for_protocol: get the store associated to a protocol - * @session: CamelSession object - * @protocol: protocol name - * @ex: a CamelException - * - * Return a CamelStore object associated with a given - * store protocol. If a provider has been set for this - * protocol in the session @session using - * camel_session_set_provider (), then a store - * obtained from this provider is returned. - * Otherwise, if one or more providers corresponding - * to this protocol have been registered (See - * camel_provider_register_as_module), the last registered - * one is used. - * - * Return value: store associated with this protocol, or NULL if no provider was found. - **/ -CamelStore * -camel_session_get_store_for_protocol (CamelSession *session, - const char *protocol, - CamelException *ex) -{ - return get_store_for_protocol_with_url (session, protocol, NULL, ex); -} - - - -/** - * camel_session_get_store: get a store object for an URL - * @session: session object - * @url_string: url - * @ex: a CamelException - * - * return a store corresponding to an URL. - * - * Return value: the store, or NULL if no provider correponds to the protocol - **/ -CamelStore * -camel_session_get_store (CamelSession *session, const char *url_string, - CamelException *ex) -{ - CamelURL *url; - CamelStore *store; - - url = camel_url_new (url_string, ex); - if (!url) - return NULL; - - store = get_store_for_protocol_with_url (session, url->protocol, - url, ex); - if (store == NULL) - camel_url_free (url); - return store; + return camel_service_new (provider->object_types[type], session, + url, ex); } - /** * camel_session_query_authenticator: query the session authenticator * @session: session object @@ -286,45 +170,3 @@ camel_session_query_authenticator (CamelSession *session, char *prompt, { return session->authenticator (prompt, secret, service, item, ex); } - - - -/** - * camel_session_get_transport_for_protocol: get the transport for a protocol - * @session: the session - * @protocol: protocol name - * @ex: a CamelException - * - * Return a CamelTransport object associated with a given transport - * protocol. If a provider has been set for this protocol in the - * session @session using camel_session_set_provider (), then a transport - * obtained from this provider is returned. Otherwise, if one or more - * providers corresponding to this protocol have been registered (See - * camel_provider_register_as_module), the last registered one is - * used. - * - * Return value: transport associated with this protocol, or NULL if no provider was found. - **/ -CamelTransport * -camel_session_get_transport_for_protocol (CamelSession *session, - const char *protocol, - CamelException *ex) -{ - const CamelProvider *provider = NULL; - - /* See if there is a provider assiciated with this - * protocol in this session. - */ - provider = CAMEL_PROVIDER (g_hash_table_lookup (session->transport_provider_list, protocol)); - if (!provider) { - /* No provider was found in this session. See - * if there is a registered provider for this - * protocol. - */ - provider = camel_provider_get_for_protocol (protocol, PROVIDER_TRANSPORT); - } - if (!provider) - return NULL; - - return CAMEL_TRANSPORT (gtk_object_new (provider->object_type, NULL)); -} -- cgit