From cd157eecb933748212bf87b41dcf5fa863e75fd5 Mon Sep 17 00:00:00 2001 From: Dan Winship <danw@src.gnome.org> Date: Thu, 15 Jun 2000 22:19:44 +0000 Subject: Kill. Folders are now always open, and handle "closing" sorts of * camel-folder.c: (camel_folder_open, camel_folder_is_open, camel_folder_get_mode): Kill. Folders are now always open, and handle "closing" sorts of operations at sync or finalize time. (camel_folder_sync): renamed from camel_folder_close. Syncs state to the store but doesn't necessarily close/disconnect. * providers/*/camel-*-folder.c: Merge "open" methods into "init" methods. Rename close to sync and update appropriately. * providers/imap/camel-imap-store.c: Remove camel_imap_store_open and camel_imap_store_close, which should not have been copied from the POP provider (where the exist to work around limitations of the POP protocol). svn path=/trunk/; revision=3581 --- camel/providers/pop3/camel-pop3-folder.c | 23 +++---------- camel/providers/pop3/camel-pop3-store.c | 57 ++++++++++++++------------------ camel/providers/pop3/camel-pop3-store.h | 4 +-- 3 files changed, 31 insertions(+), 53 deletions(-) (limited to 'camel/providers/pop3') diff --git a/camel/providers/pop3/camel-pop3-folder.c b/camel/providers/pop3/camel-pop3-folder.c index 807a810d06..9a2d982fcd 100644 --- a/camel/providers/pop3/camel-pop3-folder.c +++ b/camel/providers/pop3/camel-pop3-folder.c @@ -38,10 +38,8 @@ static CamelFolderClass *parent_class; static void finalize (GtkObject *object); -static void pop3_open (CamelFolder *folder, CamelFolderOpenMode mode, +static void pop3_sync (CamelFolder *folder, gboolean expunge, CamelException *ex); -static void pop3_close (CamelFolder *folder, gboolean expunge, - CamelException *ex); static gint get_message_count (CamelFolder *folder, CamelException *ex); static GPtrArray *get_uids (CamelFolder *folder, CamelException *ex); @@ -64,8 +62,7 @@ camel_pop3_folder_class_init (CamelPop3FolderClass *camel_pop3_folder_class) parent_class = gtk_type_class (camel_folder_get_type ()); /* virtual method overload */ - camel_folder_class->open = pop3_open; - camel_folder_class->close = pop3_close; + camel_folder_class->sync = pop3_sync; camel_folder_class->get_message_count = get_message_count; camel_folder_class->get_uids = get_uids; @@ -138,20 +135,10 @@ camel_pop3_folder_new (CamelStore *parent, CamelException *ex) } static void -pop3_open (CamelFolder *folder, CamelFolderOpenMode mode, CamelException *ex) +pop3_sync (CamelFolder *folder, gboolean expunge, CamelException *ex) { - camel_pop3_store_open (CAMEL_POP3_STORE (folder->parent_store), ex); - if (camel_exception_get_id (ex) == CAMEL_EXCEPTION_NONE) - parent_class->open (folder, mode, ex); -} - -static void -pop3_close (CamelFolder *folder, gboolean expunge, CamelException *ex) -{ - camel_pop3_store_close (CAMEL_POP3_STORE (folder->parent_store), - expunge, ex); - if (camel_exception_get_id (ex) == CAMEL_EXCEPTION_NONE) - parent_class->close (folder, expunge, ex); + if (expunge) + camel_pop3_store_expunge (CAMEL_POP3_STORE (folder->parent_store), ex); } diff --git a/camel/providers/pop3/camel-pop3-store.c b/camel/providers/pop3/camel-pop3-store.c index c915b0916f..b465faa499 100644 --- a/camel/providers/pop3/camel-pop3-store.c +++ b/camel/providers/pop3/camel-pop3-store.c @@ -372,44 +372,18 @@ free_auth_types (CamelService *service, GList *authtypes) } /** - * camel_pop3_store_open: Connect to the server if we are currently - * disconnected. + * camel_pop3_store_expunge: * @store: the store * @ex: a CamelException * - * The POP protocol does not allow deleted messages to be expunged - * except by closing the connection. Thus, camel_pop3_folder_{open,close} - * sometimes need to connect to or disconnect from the server. This - * routine reconnects to the server if we have disconnected. - * + * Expunge messages from the store. This will result in the connection + * being closed, which may cause later commands to fail if they can't + * reconnect. **/ void -camel_pop3_store_open (CamelPop3Store *store, CamelException *ex) +camel_pop3_store_expunge (CamelPop3Store *store, CamelException *ex) { - CamelService *service = CAMEL_SERVICE (store); - - if (!camel_service_is_connected (service)) - pop3_connect (service, ex); -} - -/** - * camel_pop3_store_close: Close the connection to the server and - * possibly expunge deleted messages. - * @store: the store - * @expunge: whether or not to expunge deleted messages - * @ex: a CamelException - * - * See camel_pop3_store_open for an explanation of why this is needed. - * - **/ -void -camel_pop3_store_close (CamelPop3Store *store, gboolean expunge, - CamelException *ex) -{ - if (expunge) - camel_pop3_command (store, NULL, "QUIT"); - else - camel_pop3_command (store, NULL, "RSET"); + camel_pop3_command (store, NULL, "QUIT"); pop3_disconnect (CAMEL_SERVICE (store), ex); } @@ -539,6 +513,12 @@ static CamelFolder * get_folder (CamelStore *store, const char *folder_name, gboolean create, CamelException *ex) { + CamelService *service = CAMEL_SERVICE (store); + + if (!camel_service_is_connected (service)) { + if (!camel_service_connect (service, ex)) + return NULL; + } return camel_pop3_folder_new (store, ex); } @@ -585,10 +565,23 @@ get_root_folder_name (CamelStore *store, CamelException *ex) int camel_pop3_command (CamelPop3Store *store, char **ret, char *fmt, ...) { + CamelService *service = CAMEL_SERVICE (store); char *cmdbuf, *respbuf; va_list ap; int status; + if (!store->ostream) { + CamelException ex; + + camel_exception_init (&ex); + if (!camel_service_connect (service, &ex)) { + if (ret) + *ret = g_strdup (camel_exception_get_description (&ex)); + camel_exception_clear (&ex); + return CAMEL_POP3_FAIL; + } + } + va_start (ap, fmt); cmdbuf = g_strdup_vprintf (fmt, ap); va_end (ap); diff --git a/camel/providers/pop3/camel-pop3-store.h b/camel/providers/pop3/camel-pop3-store.h index 97d65741f9..74174a32f2 100644 --- a/camel/providers/pop3/camel-pop3-store.h +++ b/camel/providers/pop3/camel-pop3-store.h @@ -62,9 +62,7 @@ typedef struct { /* public methods */ -void camel_pop3_store_open (CamelPop3Store *store, CamelException *ex); -void camel_pop3_store_close (CamelPop3Store *store, gboolean expunge, - CamelException *ex); +void camel_pop3_store_expunge (CamelPop3Store *store, CamelException *ex); /* support functions */ enum { CAMEL_POP3_OK, CAMEL_POP3_ERR, CAMEL_POP3_FAIL }; -- cgit