[evolution-data-server] [CamelIMAPXServer] Assign tagprefix per account



commit 85e9a2fd7fbdfc1d14676e7436201852b08e4139
Author: Milan Crha <mcrha redhat com>
Date:   Fri Nov 7 08:33:10 2014 +0100

    [CamelIMAPXServer] Assign tagprefix per account
    
    Just to make sure that one account will not use the same tag prefix
    with the same server (even another connection). It also reuses unused
    tag prefixes.

 camel/providers/imapx/camel-imapx-conn-manager.c |   32 ++++++++++++++++++++++
 camel/providers/imapx/camel-imapx-server.c       |   10 +------
 camel/providers/imapx/camel-imapx-server.h       |    2 -
 camel/providers/imapx/camel-imapx-store.c        |    6 +++-
 4 files changed, 38 insertions(+), 12 deletions(-)
---
diff --git a/camel/providers/imapx/camel-imapx-conn-manager.c 
b/camel/providers/imapx/camel-imapx-conn-manager.c
index aaaead1..3471e1b 100644
--- a/camel/providers/imapx/camel-imapx-conn-manager.c
+++ b/camel/providers/imapx/camel-imapx-conn-manager.c
@@ -717,6 +717,37 @@ exit:
        return is;
 }
 
+static gchar
+imapx_conn_manager_get_next_free_tagprefix_unlocked (CamelIMAPXConnManager *con_man)
+{
+       gchar adept;
+       GList *iter;
+
+       /* the 'Z' is dedicated to auth types query */
+       adept = 'A';
+       while (adept < 'Z') {
+               for (iter = con_man->priv->connections; iter; iter = g_list_next (iter)) {
+                       ConnectionInfo *cinfo = iter->data;
+
+                       if (!cinfo || !cinfo->is)
+                               continue;
+
+                       if (cinfo->is->tagprefix == adept)
+                               break;
+               }
+
+               /* Read all current active connections and none has the same tag prefix */
+               if (!iter)
+                       break;
+
+               adept++;
+       }
+
+       g_return_val_if_fail (adept >= 'A' && adept < 'Z', 'Z');
+
+       return adept;
+}
+
 static CamelIMAPXServer *
 imapx_create_new_connection_unlocked (CamelIMAPXConnManager *con_man,
                                       const gchar *folder_name,
@@ -741,6 +772,7 @@ imapx_create_new_connection_unlocked (CamelIMAPXConnManager *con_man,
        imapx_store = CAMEL_IMAPX_STORE (store);
 
        is = camel_imapx_server_new (imapx_store);
+       is->tagprefix = imapx_conn_manager_get_next_free_tagprefix_unlocked (con_man);
 
        /* XXX As part of the connect operation the CamelIMAPXServer will
         *     have to call camel_session_authenticate_sync(), but it has
diff --git a/camel/providers/imapx/camel-imapx-server.c b/camel/providers/imapx/camel-imapx-server.c
index 9ae7c15..8ac435c 100644
--- a/camel/providers/imapx/camel-imapx-server.c
+++ b/camel/providers/imapx/camel-imapx-server.c
@@ -7900,18 +7900,12 @@ static void
 imapx_server_constructed (GObject *object)
 {
        CamelIMAPXServer *server;
-       CamelIMAPXServerClass *class;
 
        /* Chain up to parent's method. */
        G_OBJECT_CLASS (camel_imapx_server_parent_class)->constructed (object);
 
        server = CAMEL_IMAPX_SERVER (object);
-       class = CAMEL_IMAPX_SERVER_GET_CLASS (server);
-
-       server->tagprefix = class->tagprefix;
-       class->tagprefix++;
-       if (class->tagprefix > 'Z')
-               class->tagprefix = 'A';
+       server->tagprefix = 'Z';
 }
 
 static void
@@ -8000,8 +7994,6 @@ camel_imapx_server_class_init (CamelIMAPXServerClass *class)
                NULL, NULL,
                g_cclosure_marshal_VOID__BOXED,
                G_TYPE_NONE, 1, G_TYPE_ERROR);
-
-       class->tagprefix = 'A';
 }
 
 static void
diff --git a/camel/providers/imapx/camel-imapx-server.h b/camel/providers/imapx/camel-imapx-server.h
index ba4b91b..448b813 100644
--- a/camel/providers/imapx/camel-imapx-server.h
+++ b/camel/providers/imapx/camel-imapx-server.h
@@ -130,8 +130,6 @@ struct _CamelIMAPXServer {
 struct _CamelIMAPXServerClass {
        GObjectClass parent_class;
 
-       gchar tagprefix;
-
        /* Signals */
        void            (*mailbox_select)       (CamelIMAPXServer *is,
                                                 CamelIMAPXMailbox *mailbox);
diff --git a/camel/providers/imapx/camel-imapx-store.c b/camel/providers/imapx/camel-imapx-store.c
index 697fcf8..7cd5098 100644
--- a/camel/providers/imapx/camel-imapx-store.c
+++ b/camel/providers/imapx/camel-imapx-store.c
@@ -848,11 +848,15 @@ imapx_query_auth_types_sync (CamelService *service,
                              GError **error)
 {
        CamelServiceAuthType *authtype;
+       CamelIMAPXStore *imapx_store;
        GList *sasl_types = NULL;
        GList *t, *next;
        CamelIMAPXServer *server;
 
-       server = camel_imapx_server_new (CAMEL_IMAPX_STORE (service));
+       imapx_store = CAMEL_IMAPX_STORE (service);
+
+       server = camel_imapx_server_new (imapx_store);
+       server->tagprefix = 'Z';
 
        if (!imapx_connect_to_server (server, cancellable, error))
                goto exit;


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]