diff options
-rw-r--r-- | camel/ChangeLog | 19 | ||||
-rw-r--r-- | camel/providers/imap4/camel-imap4-folder.c | 4 | ||||
-rw-r--r-- | camel/providers/imap4/camel-imap4-store.c | 71 |
3 files changed, 86 insertions, 8 deletions
diff --git a/camel/ChangeLog b/camel/ChangeLog index 44cdd79de5..e077b4207c 100644 --- a/camel/ChangeLog +++ b/camel/ChangeLog @@ -1,3 +1,22 @@ +2004-10-20 Jeffrey Stedfast <fejj@ximian.com> + + * providers/imap4/camel-imap4-store.c (imap4_get_folder): Don't + allow users to create folders in offline mode. When in offline + mode, use a different codepath to get a folder object. + (imap4_noop): Handle offline mode. + (imap4_unsubscribe_folder): Throw an exception if we are in + offline mode. + (imap4_subscribe_folder): Same. + (imap4_get_folder_info): Started to implement offline + support. Also, even if we are in online mode but the engine has + not yet been connected, we should follow the "offline" code path + and get the folder info's from the cache. + (imap4_rename_folder): Disallow in offline mode. + (imap4_delete_folder): Same. + (imap4_connect): Handle offline mode. + (imap4_disconnect): Handle offline mode and do proper locking. + (imap4_query_auth_types): Same. + 2004-10-19 Jeffrey Stedfast <fejj@ximian.com> * providers/imap4/camel-imap4-summary.c (imap4_summary_fetch_all): diff --git a/camel/providers/imap4/camel-imap4-folder.c b/camel/providers/imap4/camel-imap4-folder.c index f0f8793933..58aebfd092 100644 --- a/camel/providers/imap4/camel-imap4-folder.c +++ b/camel/providers/imap4/camel-imap4-folder.c @@ -404,7 +404,7 @@ imap4_sync (CamelFolder *folder, gboolean expunge, CamelException *ex) int id, max, i; int retval; - if (!camel_session_is_online (!session)) + if (!camel_session_is_online (session)) return; CAMEL_SERVICE_LOCK (folder->parent_store, connect_lock); @@ -855,7 +855,7 @@ imap4_transfer_messages_to (CamelFolder *src, GPtrArray *uids, CamelFolder *dest GPtrArray **transferred_uids, gboolean move, CamelException *ex) { CamelIMAP4Engine *engine = ((CamelIMAP4Store *) src->parent_store)->engine; - CamelSession *session = ((CamelService *) folder->parent_store)->session; + CamelSession *session = ((CamelService *) src->parent_store)->session; int i, j, n, id, dest_namelen; CamelMessageInfo *info; CamelIMAP4Command *ic; diff --git a/camel/providers/imap4/camel-imap4-store.c b/camel/providers/imap4/camel-imap4-store.c index c643bbf901..02f38401fa 100644 --- a/camel/providers/imap4/camel-imap4-store.c +++ b/camel/providers/imap4/camel-imap4-store.c @@ -296,7 +296,7 @@ connect_to_server_wrapper (CamelIMAP4Engine *engine, CamelException *ex) int mode, ret, i; char *serv; const char *port; - + if ((ssl_mode = camel_url_get_param (service->url, "use_ssl"))) { for (i = 0; ssl_options[i].value; i++) if (!strcmp (ssl_options[i].value, ssl_mode)) @@ -489,6 +489,9 @@ imap4_connect (CamelService *service, CamelException *ex) { gboolean retval; + if (!camel_session_is_online (service->session)) + return TRUE; + CAMEL_SERVICE_LOCK (service, connect_lock); retval = imap4_reconnect (((CamelIMAP4Store *) service)->engine, ex); CAMEL_SERVICE_UNLOCK (service, connect_lock); @@ -503,6 +506,10 @@ imap4_disconnect (CamelService *service, gboolean clean, CamelException *ex) CamelIMAP4Command *ic; int id; + if (!camel_session_is_online (service->session)) + return TRUE; + + CAMEL_SERVICE_LOCK (store, connect_lock); if (clean && !store->engine->istream->disconnected) { ic = camel_imap4_engine_queue (store->engine, NULL, "LOGOUT\r\n"); while ((id = camel_imap4_engine_iterate (store->engine)) < ic->id && id != -1) @@ -510,6 +517,7 @@ imap4_disconnect (CamelService *service, gboolean clean, CamelException *ex) camel_imap4_command_unref (ic); } + CAMEL_SERVICE_UNLOCK (store, connect_lock); return 0; } @@ -524,6 +532,9 @@ imap4_query_auth_types (CamelService *service, CamelException *ex) GList *sasl_types, *t, *next; gboolean connected; + if (!camel_session_is_online (service->session)) + return NULL; + CAMEL_SERVICE_LOCK (store, connect_lock); connected = connect_to_server_wrapper (store->engine, ex); CAMEL_SERVICE_UNLOCK (store, connect_lock); @@ -588,6 +599,7 @@ static CamelFolder * imap4_get_folder (CamelStore *store, const char *folder_name, guint32 flags, CamelException *ex) { CamelIMAP4Engine *engine = ((CamelIMAP4Store *) store)->engine; + CamelSession *session = ((CamelService *) store)->session; CamelFolder *folder = NULL; camel_imap4_list_t *list; CamelIMAP4Command *ic; @@ -599,6 +611,19 @@ imap4_get_folder (CamelStore *store, const char *folder_name, guint32 flags, Cam CAMEL_SERVICE_LOCK (store, connect_lock); + if (!camel_session_is_online (session)) { + if ((flags & CAMEL_STORE_FOLDER_CREATE) != 0) { + camel_exception_set (ex, CAMEL_EXCEPTION_SYSTEM, _("Cannot create IMAP folders in offline mode.")); + } else { + /* FIXME: implement me */ + /*folder = camel_imap4_folder_new_offline (store, folder_name, ex);*/ + } + + CAMEL_SERVICE_UNLOCK (store, connect_lock); + + return folder; + } + /* make sure the folder exists - try LISTing it? */ utf7_name = imap4_folder_utf7_name (store, folder_name, '\0'); ic = camel_imap4_engine_queue (engine, NULL, "LIST \"\" %S\r\n", utf7_name); @@ -676,6 +701,7 @@ imap4_create_folder (CamelStore *store, const char *parent_name, const char *fol * contain subfolders - delete them and re-create with the * proper hint */ CamelIMAP4Engine *engine = ((CamelIMAP4Store *) store)->engine; + CamelSession *session = ((CamelService *) store)->session; CamelFolderInfo *fi = NULL; CamelIMAP4Command *ic; char *utf7_name; @@ -700,6 +726,11 @@ imap4_create_folder (CamelStore *store, const char *parent_name, const char *fol c++; } + if (!camel_session_is_online (session)) { + camel_exception_set (ex, CAMEL_EXCEPTION_SYSTEM, _("Cannot create IMAP folders in offline mode.")); + return NULL; + } + if (parent_name != NULL && *parent_name) name = g_strdup_printf ("%s/%s", parent_name, folder_name); else @@ -769,6 +800,7 @@ static void imap4_delete_folder (CamelStore *store, const char *folder_name, CamelException *ex) { CamelIMAP4Engine *engine = ((CamelIMAP4Store *) store)->engine; + CamelSession *session = ((CamelService *) store)->session; CamelFolder *selected = (CamelFolder *) engine->folder; CamelIMAP4Command *ic, *ic0 = NULL; CamelFolderInfo *fi; @@ -785,6 +817,11 @@ imap4_delete_folder (CamelStore *store, const char *folder_name, CamelException return; } + if (!camel_session_is_online (session)) { + camel_exception_set (ex, CAMEL_EXCEPTION_SYSTEM, _("Cannot delete IMAP folders in offline mode.")); + return; + } + CAMEL_SERVICE_LOCK (store, connect_lock); if (selected && !strcmp (folder_name, selected->full_name)) @@ -857,6 +894,7 @@ static void imap4_rename_folder (CamelStore *store, const char *old_name, const char *new_name, CamelException *ex) { CamelIMAP4Engine *engine = ((CamelIMAP4Store *) store)->engine; + CamelSession *session = ((CamelService *) store)->session; char *old_uname, *new_uname; CamelIMAP4Command *ic; int id; @@ -869,6 +907,11 @@ imap4_rename_folder (CamelStore *store, const char *old_name, const char *new_na return; } + if (!camel_session_is_online (session)) { + camel_exception_set (ex, CAMEL_EXCEPTION_SYSTEM, _("Cannot rename IMAP folders in offline mode.")); + return; + } + CAMEL_SERVICE_LOCK (store, connect_lock); old_uname = imap4_folder_utf7_name (store, old_name, '\0'); @@ -1067,6 +1110,7 @@ static CamelFolderInfo * imap4_get_folder_info (CamelStore *store, const char *top, guint32 flags, CamelException *ex) { CamelIMAP4Engine *engine = ((CamelIMAP4Store *) store)->engine; + CamelSession *session = ((CamelService *) store)->session; CamelIMAP4Command *ic, *ic0 = NULL; CamelFolderInfo *fi = NULL; camel_imap4_list_t *list; @@ -1078,11 +1122,10 @@ imap4_get_folder_info (CamelStore *store, const char *top, guint32 flags, CamelE CAMEL_SERVICE_LOCK (store, connect_lock); - if (engine->state == CAMEL_IMAP4_ENGINE_DISCONNECTED) { - if (!camel_service_connect ((CamelService *) store, ex)) - return NULL; - - engine = ((CamelIMAP4Store *) store)->engine; + if (!camel_session_is_online (session) /* || engine->state == CAMEL_IMAP4_ENGINE_DISCONNECTED */) { + /* FIXME: get cached folder-info's */ + CAMEL_SERVICE_UNLOCK (store, connect_lock); + return NULL; } if (flags & CAMEL_STORE_FOLDER_INFO_SUBSCRIBED) @@ -1180,6 +1223,7 @@ static void imap4_subscribe_folder (CamelStore *store, const char *folder_name, CamelException *ex) { CamelIMAP4Engine *engine = ((CamelIMAP4Store *) store)->engine; + CamelSession *session = ((CamelService *) store)->session; CamelIMAP4Command *ic; CamelFolderInfo *fi; char *utf7_name; @@ -1187,6 +1231,11 @@ imap4_subscribe_folder (CamelStore *store, const char *folder_name, CamelExcepti const char *p; int id; + if (!camel_session_is_online (session)) { + camel_exception_set (ex, CAMEL_EXCEPTION_SYSTEM, _("Cannot subscribe to IMAP folders in offline mode.")); + return; + } + CAMEL_SERVICE_LOCK (store, connect_lock); utf7_name = imap4_folder_utf7_name (store, folder_name, '\0'); @@ -1245,6 +1294,7 @@ static void imap4_unsubscribe_folder (CamelStore *store, const char *folder_name, CamelException *ex) { CamelIMAP4Engine *engine = ((CamelIMAP4Store *) store)->engine; + CamelSession *session = ((CamelService *) store)->session; CamelIMAP4Command *ic; CamelFolderInfo *fi; char *utf7_name; @@ -1252,6 +1302,11 @@ imap4_unsubscribe_folder (CamelStore *store, const char *folder_name, CamelExcep const char *p; int id; + if (!camel_session_is_online (session)) { + camel_exception_set (ex, CAMEL_EXCEPTION_SYSTEM, _("Cannot unsubscribe from IMAP folders in offline mode.")); + return; + } + CAMEL_SERVICE_LOCK (store, connect_lock); utf7_name = imap4_folder_utf7_name (store, folder_name, '\0'); @@ -1310,10 +1365,14 @@ static void imap4_noop (CamelStore *store, CamelException *ex) { CamelIMAP4Engine *engine = ((CamelIMAP4Store *) store)->engine; + CamelSession *session = ((CamelService *) store)->session; CamelFolder *folder = (CamelFolder *) engine->folder; CamelIMAP4Command *ic; int id; + if (!camel_session_is_online (session)) + return; + CAMEL_SERVICE_LOCK (store, connect_lock); if (folder) { |