[evolution-kolab/ek-wip-porting] CamelKolabIMAPXStore: reimplanted the folder info based on folder types
- From: Christian Hilberg <chilberg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution-kolab/ek-wip-porting] CamelKolabIMAPXStore: reimplanted the folder info based on folder types
- Date: Sat, 10 Mar 2012 19:26:54 +0000 (UTC)
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]