aboutsummaryrefslogtreecommitdiffstats
path: root/camel/providers/imap
diff options
context:
space:
mode:
Diffstat (limited to 'camel/providers/imap')
-rw-r--r--camel/providers/imap/camel-imap-command.c4
-rw-r--r--camel/providers/imap/camel-imap-store.c13
-rw-r--r--camel/providers/imap/camel-imap-store.h20
3 files changed, 19 insertions, 18 deletions
diff --git a/camel/providers/imap/camel-imap-command.c b/camel/providers/imap/camel-imap-command.c
index 3c36dbfb03..4102d47cc5 100644
--- a/camel/providers/imap/camel-imap-command.c
+++ b/camel/providers/imap/camel-imap-command.c
@@ -128,8 +128,8 @@ camel_imap_command (CamelImapStore *store, CamelFolder *folder,
va_end (ap);
camel_remote_store_send_string (CAMEL_REMOTE_STORE (store), ex,
- "A%.5d %s\r\n", store->command++,
- cmdbuf);
+ "%c%.5d %s\r\n", store->tag_prefix,
+ store->command++, cmdbuf);
g_free (cmdbuf);
if (camel_exception_is_set (ex)) {
CAMEL_IMAP_STORE_UNLOCK (store, command_lock);
diff --git a/camel/providers/imap/camel-imap-store.c b/camel/providers/imap/camel-imap-store.c
index 8511b3e9f7..42c2f12cde 100644
--- a/camel/providers/imap/camel-imap-store.c
+++ b/camel/providers/imap/camel-imap-store.c
@@ -54,12 +54,11 @@
#include "camel-imap-private.h"
#include "camel-private.h"
-#define d(x) x
-
/* Specified in RFC 2060 */
#define IMAP_PORT 143
static CamelRemoteStoreClass *remote_store_class = NULL;
+static char imap_tag_prefix = 'A';
static void construct (CamelService *service, CamelSession *session,
CamelProvider *provider, CamelURL *url,
@@ -169,10 +168,13 @@ camel_imap_store_init (gpointer object, gpointer klass)
imap_store->dir_sep = '\0';
imap_store->current_folder = NULL;
-
imap_store->connected = FALSE;
imap_store->subscribed_folders = NULL;
+ imap_store->tag_prefix = imap_tag_prefix++;
+ if (imap_tag_prefix > 'Z')
+ imap_tag_prefix = 'A';
+
imap_store->priv = g_malloc0 (sizeof (*imap_store->priv));
#ifdef ENABLE_THREADS
imap_store->priv->command_lock = e_mutex_new(E_MUTEX_REC);
@@ -653,7 +655,7 @@ imap_store_setup_online (CamelImapStore *store, CamelException *ex)
if (!imap_parse_list_response (result, &flags, NULL, &name))
continue;
if (flags & (IMAP_LIST_FLAG_MARKED | IMAP_LIST_FLAG_UNMARKED))
- store->useful_lsub = TRUE;
+ store->capabilities |= IMAP_CAPABILITY_useful_lsub;
if (flags & IMAP_LIST_FLAG_NOSELECT) {
g_free (name);
continue;
@@ -1161,7 +1163,8 @@ get_folder_info (CamelStore *store, const char *top, gboolean fast,
* use get_subscribed_folders_by_hand. In all other
* cases, use a single LIST or LSUB command.
*/
- if (subscribed_only && !imap_store->useful_lsub &&
+ if (subscribed_only &&
+ !(imap_store->capabilities & IMAP_CAPABILITY_useful_lsub) &&
(imap_store->parameters & IMAP_PARAM_CHECK_ALL)) {
get_subscribed_folders_by_hand (imap_store, name,
folders, ex);
diff --git a/camel/providers/imap/camel-imap-store.h b/camel/providers/imap/camel-imap-store.h
index fb4be047c2..b05e525845 100644
--- a/camel/providers/imap/camel-imap-store.h
+++ b/camel/providers/imap/camel-imap-store.h
@@ -52,6 +52,7 @@ typedef enum {
#define IMAP_CAPABILITY_NAMESPACE (1 << 3)
#define IMAP_CAPABILITY_UIDPLUS (1 << 4)
#define IMAP_CAPABILITY_LITERALPLUS (1 << 5)
+#define IMAP_CAPABILITY_useful_lsub (1 << 6)
#define IMAP_PARAM_OVERRIDE_NAMESPACE (1 << 0)
#define IMAP_PARAM_CHECK_ALL (1 << 1)
@@ -61,20 +62,17 @@ struct _CamelImapStore {
CamelRemoteStore parent_object;
struct _CamelImapStorePrivate *priv;
- CamelFolder *current_folder;
-
+ /* Information about the command channel / connection status */
+ gboolean connected;
+ char tag_prefix;
guint32 command;
-
+ CamelFolder *current_folder;
+
+ /* Information about the server */
CamelImapServerLevel server_level;
guint32 capabilities, parameters;
- GHashTable *authtypes;
-
- char *namespace, dir_sep, *storage_path, *base_url;
-
- gboolean connected;
-
- GHashTable *subscribed_folders;
- gboolean useful_lsub;
+ char *namespace, dir_sep, *base_url, *storage_path;
+ GHashTable *authtypes, *subscribed_folders;
};