From 130bb0e5710983ce14d1151f2611beaff6891379 Mon Sep 17 00:00:00 2001 From: Peter Williams Date: Tue, 22 Aug 2000 20:09:11 +0000 Subject: Automatically connect services when given a valid URL (should hopefully disconnect, too); remove the old movemail folder correctly. svn path=/trunk/; revision=4965 --- camel/camel-exception-list.def | 3 +- camel/camel-service.c | 126 ++++++++++++++++++++-------- camel/camel-service.h | 14 ++-- camel/camel-store.c | 3 - camel/providers/imap/camel-imap-store.c | 44 +++++++--- camel/providers/nntp/camel-nntp-store.c | 17 ++-- camel/providers/pop3/camel-pop3-store.c | 61 +++++++++----- camel/providers/smtp/camel-smtp-transport.c | 23 +++-- 8 files changed, 196 insertions(+), 95 deletions(-) (limited to 'camel') diff --git a/camel/camel-exception-list.def b/camel/camel-exception-list.def index cdb95b1a81..e7ecd50ad5 100644 --- a/camel/camel-exception-list.def +++ b/camel/camel-exception-list.def @@ -33,4 +33,5 @@ CAMEL_EXCEPTION_SERVICE_NULL = 300, CAMEL_EXCEPTION_SERVICE_INVALID, CAMEL_EXCEPTION_SERVICE_URL_INVALID, CAMEL_EXCEPTION_SERVICE_UNAVAILABLE, -CAMEL_EXCEPTION_SERVICE_CANT_AUTHENTICATE +CAMEL_EXCEPTION_SERVICE_CANT_AUTHENTICATE, +CAMEL_EXCEPTION_SERVICE_NOT_CONNECTED \ No newline at end of file diff --git a/camel/camel-service.c b/camel/camel-service.c index 5631b6caf5..6554bad5cb 100644 --- a/camel/camel-service.c +++ b/camel/camel-service.c @@ -38,8 +38,8 @@ static CamelObjectClass *parent_class = NULL; static gboolean service_connect(CamelService *service, CamelException *ex); static gboolean service_disconnect(CamelService *service, CamelException *ex); -static gboolean is_connected (CamelService *service); -static GList * query_auth_types (CamelService *service, CamelException *ex); +/*static gboolean is_connected (CamelService *service);*/ +static GList * query_auth_types_func (CamelService *service, CamelException *ex); static void free_auth_types (CamelService *service, GList *authtypes); static char * get_name (CamelService *service, gboolean brief); static gboolean check_url (CamelService *service, CamelException *ex); @@ -53,8 +53,9 @@ camel_service_class_init (CamelServiceClass *camel_service_class) /* virtual method definition */ camel_service_class->connect = service_connect; camel_service_class->disconnect = service_disconnect; - camel_service_class->is_connected = is_connected; - camel_service_class->query_auth_types = query_auth_types; + /*camel_service_class->is_connected = is_connected;*/ + camel_service_class->query_auth_types_connected = query_auth_types_func; + camel_service_class->query_auth_types_generic = query_auth_types_func; camel_service_class->free_auth_types = free_auth_types; camel_service_class->get_name = get_name; } @@ -64,6 +65,19 @@ camel_service_finalize (CamelObject *object) { CamelService *camel_service = CAMEL_SERVICE (object); + if (camel_service->connected) { + CamelException ex; + + /*g_warning ("camel_service_finalize: finalizing while still connected!");*/ + camel_exception_init (&ex); + CSERV_CLASS (camel_service)->disconnect (camel_service, &ex); + if (camel_exception_is_set (&ex)) { + g_warning ("camel_service_finalize: silent disconnect failure: %s", + camel_exception_get_description(&ex)); + } + camel_exception_clear (&ex); + } + if (camel_service->url) camel_url_free (camel_service->url); if (camel_service->session) @@ -145,6 +159,9 @@ camel_service_new (CamelType type, CamelSession *session, CamelURL *url, g_return_val_if_fail (CAMEL_IS_SESSION (session), NULL); service = CAMEL_SERVICE (camel_object_new (type)); + + /*service->connect_level = 0;*/ + service->url = url; if (!url->empty && !check_url (service, ex)) { camel_object_unref (CAMEL_OBJECT (service)); @@ -154,6 +171,17 @@ camel_service_new (CamelType type, CamelSession *session, CamelURL *url, service->session = session; camel_object_ref (CAMEL_OBJECT (session)); + service->connected = FALSE; + + if (!url->empty) { + if (CSERV_CLASS (service)->connect (service, ex) == FALSE) { + camel_object_unref (CAMEL_OBJECT (service)); + return NULL; + } + + service->connected = TRUE; + } + return service; } @@ -161,8 +189,10 @@ camel_service_new (CamelType type, CamelSession *session, CamelURL *url, static gboolean service_connect (CamelService *service, CamelException *ex) { - service->connected = TRUE; - return TRUE; + /* Things like the CamelMboxStore can validly + * not define a connect function. + */ + return TRUE; } /** @@ -175,21 +205,31 @@ service_connect (CamelService *service, CamelException *ex) * * Return value: whether or not the connection succeeded **/ -gboolean -camel_service_connect (CamelService *service, CamelException *ex) -{ - g_return_val_if_fail (CAMEL_IS_SERVICE (service), FALSE); - g_return_val_if_fail (service->session != NULL, FALSE); - g_return_val_if_fail (service->url != NULL, FALSE); - - return CSERV_CLASS (service)->connect (service, ex); -} - +/** + *gboolean + *camel_service_connect (CamelService *service, CamelException *ex) + *{ + * g_return_val_if_fail (CAMEL_IS_SERVICE (service), FALSE); + * g_return_val_if_fail (service->session != NULL, FALSE); + * g_return_val_if_fail (service->url != NULL, FALSE); + * + * if (service->connect_level > 0) { + * service->connect_level++; + * return TRUE; + * } + * + * return CSERV_CLASS (service)->connect (service, ex); + *} + **/ static gboolean service_disconnect (CamelService *service, CamelException *ex) { - service->connected = FALSE; + /*service->connect_level--;*/ + + /* We let people get away with not having a disconnect + * function -- CamelMboxStore, for example. + */ return TRUE; } @@ -204,19 +244,27 @@ service_disconnect (CamelService *service, CamelException *ex) * Return value: whether or not the disconnection succeeded without * errors. (Consult @ex if %FALSE.) **/ -gboolean -camel_service_disconnect (CamelService *service, CamelException *ex) -{ - return CSERV_CLASS (service)->disconnect (service, ex); -} - - -static gboolean -is_connected (CamelService *service) -{ - return service->connected; -} +/** + *gboolean + *camel_service_disconnect (CamelService *service, CamelException *ex) + *{ + * if (service->connect_level < 1) { + * camel_exception_set (ex, CAMEL_EXCEPTION_SERVICE_NOT_CONNECTED, + * "Trying to disconnect from a service that isn't connected"); + * return FALSE; + * } + * + * return CSERV_CLASS (service)->disconnect (service, ex); + *} + **/ +/** + *static gboolean + *is_connected (CamelService *service) + *{ + * return (service->connect_level > 0); + *} + **/ /** * camel_service_is_connected: @@ -224,12 +272,13 @@ is_connected (CamelService *service) * * Return value: whether or not the service is connected **/ -gboolean -camel_service_is_connected (CamelService *service) -{ - return CSERV_CLASS (service)->is_connected (service); -} - +/** + *gboolean + *camel_service_is_connected (CamelService *service) + *{ + * return CSERV_CLASS (service)->is_connected (service); + *} + **/ /** * camel_service_get_url: @@ -294,7 +343,7 @@ camel_service_get_session (CamelService *service) GList * -query_auth_types (CamelService *service, CamelException *ex) +query_auth_types_func (CamelService *service, CamelException *ex) { return NULL; } @@ -321,7 +370,10 @@ query_auth_types (CamelService *service, CamelException *ex) GList * camel_service_query_auth_types (CamelService *service, CamelException *ex) { - return CSERV_CLASS (service)->query_auth_types (service, ex); + if (service->connected) + return CSERV_CLASS (service)->query_auth_types_connected (service, ex); + else + return CSERV_CLASS (service)->query_auth_types_generic (service, ex); } diff --git a/camel/camel-service.h b/camel/camel-service.h index 50f0c2d4b4..3558d5a72b 100644 --- a/camel/camel-service.h +++ b/camel/camel-service.h @@ -62,10 +62,12 @@ typedef struct { gboolean (*disconnect) (CamelService *service, CamelException *ex); - gboolean (*is_connected) (CamelService *service); + /*gboolean (*is_connected) (CamelService *service);*/ - GList * (*query_auth_types) (CamelService *service, - CamelException *ex); + GList * (*query_auth_types_connected) (CamelService *service, + CamelException *ex); + GList * (*query_auth_types_generic) (CamelService *service, + CamelException *ex); void (*free_auth_types) (CamelService *service, GList *authtypes); @@ -110,12 +112,6 @@ CamelService * camel_service_new (CamelType type, CamelURL *url, CamelException *ex); -gboolean camel_service_connect (CamelService *service, - CamelException *ex); -gboolean camel_service_disconnect (CamelService *service, - CamelException *ex); -gboolean camel_service_is_connected (CamelService *service); - char * camel_service_get_url (CamelService *service); char * camel_service_get_name (CamelService *service, gboolean brief); diff --git a/camel/camel-store.c b/camel/camel-store.c index dd2d5e41a0..a036d52694 100644 --- a/camel/camel-store.c +++ b/camel/camel-store.c @@ -268,9 +268,6 @@ camel_store_get_folder (CamelStore *store, const char *folder_name, char *name; CamelFolder *folder = NULL; - if (!camel_service_is_connected (CAMEL_SERVICE (store))) - camel_service_connect (CAMEL_SERVICE (store), ex); - name = CS_CLASS (store)->get_folder_name (store, folder_name, ex); if (name) { folder = get_folder_internal (store, name, create, ex); diff --git a/camel/providers/imap/camel-imap-store.c b/camel/providers/imap/camel-imap-store.c index 0a2be4f326..f7662ade84 100644 --- a/camel/providers/imap/camel-imap-store.c +++ b/camel/providers/imap/camel-imap-store.c @@ -60,7 +60,8 @@ static void finalize (CamelObject *object); static gboolean imap_create (CamelFolder *folder, CamelException *ex); static gboolean imap_connect (CamelService *service, CamelException *ex); static gboolean imap_disconnect (CamelService *service, CamelException *ex); -static GList *query_auth_types (CamelService *service, CamelException *ex); +static GList *query_auth_types_generic (CamelService *service, CamelException *ex); +static GList *query_auth_types_connected (CamelService *service, CamelException *ex); static void free_auth_types (CamelService *service, GList *authtypes); static char *get_name (CamelService *service, gboolean brief); static CamelFolder *get_folder (CamelStore *store, const char *folder_name, gboolean create, @@ -84,7 +85,8 @@ camel_imap_store_class_init (CamelImapStoreClass *camel_imap_store_class) /* virtual method overload */ camel_service_class->connect = imap_connect; camel_service_class->disconnect = imap_disconnect; - camel_service_class->query_auth_types = query_auth_types; + camel_service_class->query_auth_types_generic = query_auth_types_generic; + camel_service_class->query_auth_types_connected = query_auth_types_connected; camel_service_class->free_auth_types = free_auth_types; camel_service_class->get_name = get_name; @@ -129,11 +131,14 @@ camel_imap_store_get_type (void) static void finalize (CamelObject *object) { - CamelException ex; - - camel_exception_init (&ex); - imap_disconnect (CAMEL_SERVICE (object), &ex); - camel_exception_clear (&ex); + /* Done for us now */ + /* + *CamelException ex; + * + *camel_exception_init (&ex); + *imap_disconnect (CAMEL_SERVICE (object), &ex); + *camel_exception_clear (&ex); + */ } static CamelServiceAuthType password_authtype = { @@ -178,17 +183,18 @@ try_connect (CamelService *service, CamelException *ex) #endif static GList * -query_auth_types (CamelService *service, CamelException *ex) +query_auth_types_connected (CamelService *service, CamelException *ex) { +#if 0 GList *ret = NULL; gboolean passwd = TRUE; -#if 0 + if (service->url) { passwd = try_connect (service, ex); if (camel_exception_get_id (ex) != CAMEL_EXCEPTION_NONE) return NULL; } -#endif + if (passwd) ret = g_list_append (ret, &password_authtype); @@ -200,6 +206,16 @@ query_auth_types (CamelService *service, CamelException *ex) } return ret; +#else + g_warning ("imap::query_auth_types_connected: not implemented. Defaulting."); + return query_auth_types_generic (service, ex); +#endif +} + +static GList * +query_auth_types_generic (CamelService *service, CamelException *ex) +{ + return g_list_append (NULL, &password_authtype); } static void @@ -408,9 +424,11 @@ imap_disconnect (CamelService *service, CamelException *ex) char *result; int status; - if (!service->connected) - return TRUE; - + + /*if (!service->connected) + * return TRUE; + */ + /* send the logout command */ status = camel_imap_command_extended (CAMEL_IMAP_STORE (service), NULL, &result, "LOGOUT"); if (status != CAMEL_IMAP_OK) { diff --git a/camel/providers/nntp/camel-nntp-store.c b/camel/providers/nntp/camel-nntp-store.c index 74952015a4..c412c0f6a3 100644 --- a/camel/providers/nntp/camel-nntp-store.c +++ b/camel/providers/nntp/camel-nntp-store.c @@ -123,8 +123,9 @@ nntp_store_disconnect (CamelService *service, CamelException *ex) { CamelNNTPStore *store = CAMEL_NNTP_STORE (service); - if (!service->connected) - return TRUE; + /*if (!service->connected) + * return TRUE; + */ camel_nntp_command (store, NULL, "QUIT"); @@ -188,11 +189,13 @@ nntp_store_get_folder_name (CamelStore *store, const char *folder_name, static void finalize (CamelObject *object) { - CamelException ex; - - camel_exception_init (&ex); - nntp_store_disconnect (CAMEL_SERVICE (object), &ex); - camel_exception_clear (&ex); + /* Done for us now */ + /*CamelException ex; + * + *camel_exception_init (&ex); + *nntp_store_disconnect (CAMEL_SERVICE (object), &ex); + *camel_exception_clear (&ex); + */ } static void diff --git a/camel/providers/pop3/camel-pop3-store.c b/camel/providers/pop3/camel-pop3-store.c index 78d7d106e5..c140ffd57a 100644 --- a/camel/providers/pop3/camel-pop3-store.c +++ b/camel/providers/pop3/camel-pop3-store.c @@ -62,7 +62,8 @@ static void finalize (CamelObject *object); static gboolean pop3_connect (CamelService *service, CamelException *ex); static gboolean pop3_disconnect (CamelService *service, CamelException *ex); -static GList *query_auth_types (CamelService *service, CamelException *ex); +static GList *query_auth_types_connected (CamelService *service, CamelException *ex); +static GList *query_auth_types_generic (CamelService *service, CamelException *ex); static void free_auth_types (CamelService *service, GList *authtypes); static char *get_name (CamelService *service, gboolean brief); @@ -88,7 +89,8 @@ camel_pop3_store_class_init (CamelPop3StoreClass *camel_pop3_store_class) /* virtual method overload */ camel_service_class->connect = pop3_connect; camel_service_class->disconnect = pop3_disconnect; - camel_service_class->query_auth_types = query_auth_types; + camel_service_class->query_auth_types_connected = query_auth_types_connected; + camel_service_class->query_auth_types_generic = query_auth_types_generic; camel_service_class->free_auth_types = free_auth_types; camel_service_class->get_name = get_name; @@ -129,11 +131,12 @@ static void finalize (CamelObject *object) { CamelPop3Store *pop3_store = CAMEL_POP3_STORE (object); - CamelException ex; + /*CamelException ex;*/ - camel_exception_init (&ex); - pop3_disconnect (CAMEL_SERVICE (object), &ex); - camel_exception_clear (&ex); + /*camel_exception_init (&ex); + *pop3_disconnect (CAMEL_SERVICE (object), &ex); + *camel_exception_clear (&ex); + */ if (pop3_store->apop_timestamp) g_free (pop3_store->apop_timestamp); @@ -315,7 +318,7 @@ connect_to_server (CamelService *service, gboolean real, CamelException *ex) } static GList * -query_auth_types (CamelService *service, CamelException *ex) +query_auth_types_connected (CamelService *service, CamelException *ex) { CamelPop3Store *store = CAMEL_POP3_STORE (service); GList *ret = NULL; @@ -362,6 +365,20 @@ query_auth_types (CamelService *service, CamelException *ex) return ret; } +static GList * +query_auth_types_generic (CamelService *service, CamelException *ex) +{ + GList *ret; + + ret = g_list_append (NULL, &password_authtype); + ret = g_list_append (ret, &apop_authtype); +#ifdef HAVE_KRB4 + ret = g_list_append (ret, &kpop_authtype); +#endif + + return ret; +} + static void free_auth_types (CamelService *service, GList *authtypes) { @@ -556,10 +573,12 @@ get_folder (CamelStore *store, const char *folder_name, { CamelService *service = CAMEL_SERVICE (store); - if (!camel_service_is_connected (service)) { - if (!camel_service_connect (service, ex)) - return NULL; - } + /* if (!camel_service_is_connected (service)) { + * if (!camel_service_connect (service, ex)) + * return NULL; + *} + */ + return camel_pop3_folder_new (store, ex); } @@ -610,15 +629,17 @@ camel_pop3_command (CamelPop3Store *store, char **ret, char *fmt, ...) va_list ap; if (!store->ostream) { - CamelException ex; - - camel_exception_init (&ex); - if (!camel_service_connect (CAMEL_SERVICE (store), &ex)) { - if (ret) - *ret = g_strdup (camel_exception_get_description (&ex)); - camel_exception_clear (&ex); - return CAMEL_POP3_FAIL; - } + /*CamelException ex; + * + *camel_exception_init (&ex); + *if (!camel_service_connect (CAMEL_SERVICE (store), &ex)) { + * if (ret) + * *ret = g_strdup (camel_exception_get_description (&ex)); + * camel_exception_clear (&ex); + */ + + return CAMEL_POP3_FAIL; + /*}*/ } va_start (ap, fmt); diff --git a/camel/providers/smtp/camel-smtp-transport.c b/camel/providers/smtp/camel-smtp-transport.c index 0486e4da75..19668a30fa 100644 --- a/camel/providers/smtp/camel-smtp-transport.c +++ b/camel/providers/smtp/camel-smtp-transport.c @@ -61,7 +61,8 @@ static gboolean _send_to (CamelTransport *transport, CamelMedium *message, GList static gboolean smtp_connect (CamelService *service, CamelException *ex); static gboolean smtp_disconnect (CamelService *service, CamelException *ex); static GList *esmtp_get_authtypes(gchar *buffer); -static GList *query_auth_types (CamelService *service, CamelException *ex); +static GList *query_auth_types_connected (CamelService *service, CamelException *ex); +static GList *query_auth_types_generic (CamelService *service, CamelException *ex); static void free_auth_types (CamelService *service, GList *authtypes); static char *get_name (CamelService *service, gboolean brief); static gchar *smtp_get_email_addr_from_text (gchar *text); @@ -88,7 +89,8 @@ camel_smtp_transport_class_init (CamelSmtpTransportClass *camel_smtp_transport_c /* virtual method overload */ camel_service_class->connect = smtp_connect; camel_service_class->disconnect = smtp_disconnect; - camel_service_class->query_auth_types = query_auth_types; + camel_service_class->query_auth_types_generic = query_auth_types_generic; + camel_service_class->query_auth_types_connected = query_auth_types_connected; camel_service_class->free_auth_types = free_auth_types; camel_service_class->get_name = get_name; @@ -224,8 +226,9 @@ smtp_disconnect (CamelService *service, CamelException *ex) { CamelSmtpTransport *transport = CAMEL_SMTP_TRANSPORT (service); - if (!service->connected) - return TRUE; + /*if (!service->connected) + * return TRUE; + */ /* send the QUIT command to the SMTP server */ smtp_quit(transport, ex); @@ -290,7 +293,17 @@ static CamelServiceAuthType cram_md5_authtype = { #endif static GList * -query_auth_types (CamelService *service, CamelException *ex) +query_auth_types_connected (CamelService *service, CamelException *ex) +{ + /* FIXME: Re-enable this when auth types are actually + * implemented. + */ + + return NULL; +} + +static GList * +query_auth_types_generic (CamelService *service, CamelException *ex) { /* FIXME: Re-enable this when auth types are actually * implemented. -- cgit v1.2.3