[evolution-kolab/ek-wip-porting] CamelKolabIMAPXStore: reimplanted the folder info based on folder types



commit a5d509947d9764bd1750b1c41bc39d706fdb96a1
Author: Christian Hilberg <hilberg kernelconcepts de>
Date:   Sat Mar 10 20:22:50 2012 +0100

    CamelKolabIMAPXStore: reimplanted the folder info based on folder types
    
    * ported the code for reducing the CamelFolderInfo returned
      by the respective getter so as to only return folder info
      for certain (configurable) Kolab folder types
    * this enables us to hide PIM folders in the email view
      and limit the folders visible for the backends to the
      types they should care for (calendar types / addressbooks)

 src/camel/camel-kolab-imapx-store.c |  156 ++++++++++++++++++++++++++++++++---
 1 files changed, 143 insertions(+), 13 deletions(-)
---
diff --git a/src/camel/camel-kolab-imapx-store.c b/src/camel/camel-kolab-imapx-store.c
index 0cc81a7..b1663fb 100644
--- a/src/camel/camel-kolab-imapx-store.c
+++ b/src/camel/camel-kolab-imapx-store.c
@@ -192,7 +192,7 @@ camel_kolab_imapx_store_finalize (GObject *object)
 		g_free (priv->folder_names_do_care);
 	}
 
-	/* Chain up to parent's dispose() method. */
+	/* Chain up to parent's finalize() method. */
 	G_OBJECT_CLASS (camel_kolab_imapx_store_parent_class)->finalize (object);
 }
 
@@ -259,6 +259,99 @@ imapx_store_get_folder_offline (CamelStore *self,
 	return new_folder;
 }
 
+static CamelFolderInfo*
+imapx_store_folder_info_build_restricted (CamelKolabIMAPXStore *self,
+                                          CamelKolabIMAPXServer *server,
+                                          const CamelFolderInfo *fi,
+                                          GCancellable *cancellable,
+                                          GError **err)
+{
+	CamelKolabIMAPXStorePrivate *priv = NULL;
+	KolabFolderTypeID folder_type = KOLAB_FOLDER_TYPE_INVAL;
+	CamelFolderInfo *self_fi = NULL;
+	CamelFolderInfo *next_fi = NULL;
+	CamelFolderInfo *chld_fi = NULL;
+	GError *tmp_err = NULL;
+
+	g_assert (CAMEL_IS_KOLAB_IMAPX_STORE (self));
+	g_assert (CAMEL_IS_KOLAB_IMAPX_SERVER (server));
+	/* fi may be NULL */
+	/* cancellable may be NULL */
+	g_return_val_if_fail (err == NULL || *err == NULL, NULL);
+
+	priv = CAMEL_KOLAB_IMAPX_STORE_PRIVATE (self);
+
+	if (fi == NULL)
+		return NULL;
+
+	folder_type = camel_kolab_imapx_server_get_foldertype (server,
+	                                                       fi->full_name,
+	                                                       TRUE,
+	                                                       cancellable,
+	                                                       &tmp_err);
+	if (tmp_err != NULL) { /* FIXME Is err set if operation got cancelled? */
+		g_propagate_error (err, tmp_err);
+		return NULL;
+	}
+
+	next_fi = imapx_store_folder_info_build_restricted (self,
+	                                                    server,
+	                                                    fi->next,
+	                                                    cancellable,
+	                                                    &tmp_err);
+	if (tmp_err != NULL) {/* FIXME Is err set if operation got cancelled? */
+		g_propagate_error (err, tmp_err);
+		return NULL;
+	}
+
+	chld_fi = imapx_store_folder_info_build_restricted (self,
+	                                                    server,
+	                                                    fi->child,
+	                                                    cancellable,
+	                                                    &tmp_err);
+	if (tmp_err != NULL) {  /* FIXME Is err set if operation got cancelled? */
+		if (next_fi != NULL)
+			camel_store_free_folder_info (CAMEL_STORE (self), next_fi);
+		g_propagate_error (err, tmp_err);
+		return NULL;
+	}
+
+	if ((chld_fi != NULL) || (priv->folder_types_do_care[folder_type])) {
+
+		/* new CamelFolderInfo */
+		self_fi = camel_folder_info_new ();
+		/* pointers */
+		self_fi->next = next_fi;
+		self_fi->child = chld_fi;
+		if (self_fi->child != NULL)
+			self_fi->child->parent = self_fi;
+		/* payload data */
+		if (fi->full_name)
+			self_fi->full_name = g_strdup (fi->full_name);
+		if (fi->display_name)
+			self_fi->display_name = g_strdup (fi->display_name);
+		self_fi->flags = fi->flags;
+		self_fi->unread = fi->unread;
+		self_fi->total = fi->total;
+		/* visibility tweaks */
+		if (! priv->folder_types_do_care[folder_type]) {
+			self_fi->flags |= CAMEL_FOLDER_NOSELECT;
+			/* TODO more to do here? */
+		}
+
+		/* update local list of folder names to care for */
+		if ((priv->folder_context != KOLAB_FOLDER_CONTEXT_EMAIL) &&
+		    priv->folder_types_do_care[folder_type]) {
+			priv->folder_names_do_care = g_list_prepend (priv->folder_names_do_care,
+			                                             g_strdup (self_fi->full_name));
+		}
+
+		return self_fi;
+	}
+
+	return next_fi;
+}
+
 /*----------------------------------------------------------------------------*/
 /* class functions */
 
@@ -286,11 +379,9 @@ kolab_imapx_store_get_name (CamelService *service,
 	user = camel_network_settings_dup_user (network_settings);
 
 	if (brief)
-		name = g_strdup_printf (
-			_("Kolab server %s"), host);
+		name = g_strdup_printf (_("Kolab server %s"), host);
 	else
-		name = g_strdup_printf (
-			_("Kolab service for %s on %s"), user, host);
+		name = g_strdup_printf (_("Kolab service for %s on %s"), user, host);
 
 	g_free (host);
 	g_free (user);
@@ -441,19 +532,58 @@ kolab_imapx_store_get_folder_info_sync (CamelStore *self,
                                         GCancellable *cancellable,
                                         GError **err)
 {
-	CamelFolderInfo *finfo = NULL;
+	CamelKolabIMAPXStore *myself = NULL;
+	CamelKolabIMAPXStorePrivate *priv = NULL;
+	CamelIMAPXServer *is = NULL;
+	CamelKolabIMAPXServer *ks = NULL;
+	CamelFolderInfo *fi = NULL;
+	CamelFolderInfo *k_fi = NULL;
+	GError *tmp_err = NULL;
 
 	g_assert (CAMEL_IS_KOLAB_IMAPX_STORE (self));
-	/* top may be NULL */ /* FIXME correct? */
+	/* top may be NULL */
 	/* cancellable may be NULL */
 	g_return_val_if_fail (err == NULL || *err == NULL, NULL);
 
-	finfo = parent_store_class->get_folder_info_sync (self,
-	                                                  top,
-	                                                  flags,
-	                                                  cancellable,
-	                                                  err);
-	return finfo;
+	myself = CAMEL_KOLAB_IMAPX_STORE (self);
+	priv = CAMEL_KOLAB_IMAPX_STORE_PRIVATE (myself);
+
+	g_mutex_lock (priv->kolab_finfo_lock);
+
+	fi = parent_store_class->get_folder_info_sync (self,
+	                                               top,
+	                                               flags,
+	                                               cancellable,
+	                                               &tmp_err);
+	if (tmp_err != NULL)
+		goto exit;
+	if (fi == NULL)
+		goto exit;
+
+	is = camel_imapx_store_get_server (CAMEL_IMAPX_STORE (self),
+	                                   fi->full_name,
+	                                   cancellable,
+	                                   &tmp_err);
+	if (tmp_err != NULL)
+		goto exit;
+	ks = CAMEL_KOLAB_IMAPX_SERVER (is);
+
+	k_fi = imapx_store_folder_info_build_restricted (myself,
+	                                                 ks,
+	                                                 fi,
+	                                                 cancellable,
+	                                                 &tmp_err);
+	camel_store_free_folder_info (self, fi);
+
+ exit:
+	g_mutex_unlock (priv->kolab_finfo_lock);
+
+	if (tmp_err != NULL) {
+		g_propagate_error (err, tmp_err);
+		return NULL;
+	}
+
+	return k_fi;
 }
 
 static CamelFolder*



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