[evolution-data-server/evolution-data-server-3-12] [CamelIMAPXServer] Assign tagprefix per account



commit 1cb18d94d31e86117a4a61e0b8fbcd73cd05a47e
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 b64c7b8..5b42485 100644
--- a/camel/providers/imapx/camel-imapx-server.c
+++ b/camel/providers/imapx/camel-imapx-server.c
@@ -7923,18 +7923,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
@@ -8023,8 +8017,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 a8bdbd7..095953f 100644
--- a/camel/providers/imapx/camel-imapx-server.h
+++ b/camel/providers/imapx/camel-imapx-server.h
@@ -129,8 +129,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 642d21a..302e68f 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]