Automatically connect services when given a valid URL (should hopefully disconnect...
authorPeter Williams <peterw@src.gnome.org>
Tue, 22 Aug 2000 20:09:10 +0000 (20:09 +0000)
committerPeter Williams <peterw@src.gnome.org>
Tue, 22 Aug 2000 20:09:10 +0000 (20:09 +0000)
camel/camel-exception-list.def
camel/camel-service.c
camel/camel-service.h
camel/camel-store.c
camel/providers/imap/camel-imap-store.c
camel/providers/nntp/camel-nntp-store.c
camel/providers/pop3/camel-pop3-store.c
camel/providers/smtp/camel-smtp-transport.c

index cdb95b1..e7ecd50 100644 (file)
@@ -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
index 5631b6c..6554bad 100644 (file)
@@ -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);
 }
 
 
index 50f0c2d..3558d5a 100644 (file)
@@ -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);
index dd2d5e4..a036d52 100644 (file)
@@ -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);
index 0a2be4f..f7662ad 100644 (file)
@@ -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) {
index 7495201..c412c0f 100644 (file)
@@ -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
index 78d7d10..c140ffd 100644 (file)
@@ -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);
index 0486e4d..19668a3 100644 (file)
@@ -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.