[evolution-kolab/ek-wip-porting: 8/14] CamelKolabIMAPXStore, CamelKolabIMAPXServer: moved metadata code



commit 801180e651b56e2450fd621ac8f57c69071ef635
Author: Christian Hilberg <hilberg kernelconcepts de>
Date:   Tue Mar 13 17:42:41 2012 +0100

    CamelKolabIMAPXStore, CamelKolabIMAPXServer: moved metadata code
    
    * moved the metadata handling from CamelKolabIMAPXServer
      to CamelKolabIMAPXStore
    * necessary because the connection manager will always
      try to connect (bring online) the server object when
      we request it in the store, but we need to access
      the persistent (stored in SQLite) metadata also in
      offline state
    * hence, we cannot keep the metadata handling inside
      the CamelKolabIMAPXServer

 src/camel/camel-kolab-imapx-conn-manager.c |   10 +-
 src/camel/camel-kolab-imapx-server.c       |  374 +---------
 src/camel/camel-kolab-imapx-server.h       |   36 +-
 src/camel/camel-kolab-imapx-store.c        | 1196 +++++++++++-----------------
 src/camel/camel-kolab-imapx-store.h        |    6 -
 5 files changed, 492 insertions(+), 1130 deletions(-)
---
diff --git a/src/camel/camel-kolab-imapx-conn-manager.c b/src/camel/camel-kolab-imapx-conn-manager.c
index a4e0e58..a8ef745 100644
--- a/src/camel/camel-kolab-imapx-conn-manager.c
+++ b/src/camel/camel-kolab-imapx-conn-manager.c
@@ -107,7 +107,6 @@ kolab_imapx_conn_manager_new_connection_unlocked (CamelIMAPXConnManager *con_man
 	CamelStore *store = con_man->priv->store;
 	CamelService *service = NULL;
 	struct _ConnectionInfo *cinfo = NULL;
-	GError *tmp_err = NULL;
 	gboolean success = FALSE;
 
 	g_assert (CAMEL_IS_KOLAB_IMAPX_CONN_MANAGER (con_man));
@@ -127,14 +126,7 @@ kolab_imapx_conn_manager_new_connection_unlocked (CamelIMAPXConnManager *con_man
 	if (g_cancellable_set_error_if_cancelled (cancellable, error))
 		goto exit;
 
-	ks = camel_kolab_imapx_server_new (CAMEL_KOLAB_IMAPX_STORE (store),
-	                                   &tmp_err);
-	if (ks == NULL) {
-		g_warning ("%s: %s", __func__, tmp_err->message);
-		g_propagate_error (error, tmp_err);
-		goto exit;
-	}
-
+	ks = camel_kolab_imapx_server_new (CAMEL_KOLAB_IMAPX_STORE (store));
 	is = CAMEL_IMAPX_SERVER (ks);
 
 	/* XXX As part of the connect operation the CamelIMAPXServer will
diff --git a/src/camel/camel-kolab-imapx-server.c b/src/camel/camel-kolab-imapx-server.c
index c3bffd1..443c640 100644
--- a/src/camel/camel-kolab-imapx-server.c
+++ b/src/camel/camel-kolab-imapx-server.c
@@ -38,33 +38,17 @@
 
 /*----------------------------------------------------------------------------*/
 
-typedef struct _CamelKolabIMAPXServerPrivate CamelKolabIMAPXServerPrivate;
-struct _CamelKolabIMAPXServerPrivate {
-	CamelKolabImapxMetadata *kmd; /* Kolab metadata (differs from IMAPX metadata!) */
-};
-
 #define CAMEL_KOLAB_IMAPX_SERVER_PRIVATE(obj)  (G_TYPE_INSTANCE_GET_PRIVATE ((obj), CAMEL_TYPE_KOLAB_IMAPX_SERVER, CamelKolabIMAPXServerPrivate))
 
 G_DEFINE_TYPE (CamelKolabIMAPXServer, camel_kolab_imapx_server, CAMEL_TYPE_IMAPX_EXTD_SERVER)
 
 /*----------------------------------------------------------------------------*/
-/* forward declarations */
-
-static gboolean imapx_server_shutdown (CamelKolabIMAPXServer *self, GError **err);
-
-/*----------------------------------------------------------------------------*/
 /* object init */
 
 static void
 camel_kolab_imapx_server_init (CamelKolabIMAPXServer *self)
 {
-	CamelKolabIMAPXServerPrivate *priv = NULL;
-
 	g_assert (CAMEL_IS_KOLAB_IMAPX_SERVER (self));
-	priv = CAMEL_KOLAB_IMAPX_SERVER_PRIVATE (self);
-
-	/* metadata db and lookup table */
-	priv->kmd = camel_kolab_imapx_metadata_new ();
 }
 
 static void
@@ -87,307 +71,17 @@ camel_kolab_imapx_server_dispose (GObject *object)
 static void
 camel_kolab_imapx_server_finalize (GObject *object)
 {
-	CamelKolabIMAPXServer *self = NULL;
-	CamelKolabIMAPXServerPrivate *priv = NULL;
-	GError *tmp_err = NULL;
-	gboolean ok = FALSE;
-
 	g_assert (CAMEL_IS_KOLAB_IMAPX_SERVER (object));
 
-	self = CAMEL_KOLAB_IMAPX_SERVER (object);
-	priv = CAMEL_KOLAB_IMAPX_SERVER_PRIVATE (self);
-
-	ok = imapx_server_shutdown (self, &tmp_err);
-	if (! ok) {
-		/* TODO
-		 * Uninitialization, which can fail,
-		 * should be done in a place where we can
-		 * propagate an error - just, GInitable does
-		 * not provide for uninitialization either...
-		 */
-		g_warning ("%s: %s",
-		           __func__, tmp_err->message);
-		g_error_free (tmp_err);
-	}
-	camel_kolab_imapx_metadata_free (priv->kmd);
-
 	G_OBJECT_CLASS (camel_kolab_imapx_server_parent_class)->finalize (object);
 }
 
 /*----------------------------------------------------------------------------*/
 /* local statics */
 
-static gboolean
-imapx_server_bringup (CamelKolabIMAPXServer *self,
-                      CamelService *service,
-                      GError **err)
-{
-	CamelKolabIMAPXServerPrivate *priv = NULL;
-	const gchar *cachepath = NULL;
-	GError *tmp_err = NULL;
-	gboolean ok = FALSE;
-
-	g_assert (CAMEL_IS_KOLAB_IMAPX_SERVER (self));
-	g_assert (CAMEL_IS_SERVICE (service));
-	g_return_val_if_fail (err == NULL || *err == NULL, FALSE);
-
-	priv = CAMEL_KOLAB_IMAPX_SERVER_PRIVATE (self);
-
-	cachepath = camel_service_get_user_cache_dir (service);
-	if (cachepath == NULL) {
-		/* FIXME mark this as a translatable string */
-		g_set_error (err,
-		             KOLAB_CAMEL_ERROR,
-		             KOLAB_CAMEL_ERROR_GENERIC,
-		             "Could not get user cache directory from Camel service");
-		return FALSE;
-	}
-
-	ok = camel_kolab_imapx_metadata_init (priv->kmd,
-	                                      cachepath,
-	                                      &tmp_err);
-	if (! ok) {
-		g_warning ("%s: %s",
-		           __func__, tmp_err->message);
-		g_propagate_error (err, tmp_err);
-		return FALSE;
-	}
-
-	g_debug ("%s: metadata database initialized", __func__);
-
-	return TRUE;
-}
-
-static gboolean
-imapx_server_shutdown (CamelKolabIMAPXServer *self,
-                       GError **err)
-{
-	CamelKolabIMAPXServerPrivate *priv = NULL;
-	GError *tmp_err = NULL;
-	gboolean ok = FALSE;
-
-	g_assert (CAMEL_IS_KOLAB_IMAPX_SERVER (self));
-	g_return_val_if_fail (err == NULL || *err == NULL, FALSE);
-
-	priv = CAMEL_KOLAB_IMAPX_SERVER_PRIVATE (self);
-
-	ok = camel_kolab_imapx_metadata_shutdown (priv->kmd,
-	                                          &tmp_err);
-	if (! ok) {
-		g_propagate_error (err, tmp_err);
-		return FALSE;
-	}
-
-	return TRUE;
-}
-
-
 /*----------------------------------------------------------------------------*/
 /* class functions */
 
-static KolabFolderTypeID
-kolab_imapx_server_get_foldertype (CamelKolabIMAPXServer *self,
-                                   const gchar *foldername,
-                                   gboolean do_updatedb,
-                                   GCancellable *cancellable,
-                                   GError **err)
-{
-	/* TODO better error reporting */
-	CamelKolabIMAPXServerPrivate *priv = NULL;
-	CamelIMAPXExtdServer *eserver = NULL;
-	CamelOfflineStore *ostore = NULL;
-	CamelImapxMetadata *md = NULL;
-	CamelKolabImapxFolderMetadata *kfmd = NULL;
-	CamelImapxMetadataSpec *spec = NULL;
-	camel_imapx_metadata_proto_t proto = CAMEL_IMAPX_METADATA_PROTO_INVAL;
-	gboolean db_ok = FALSE;
-	GError *tmp_err = NULL;
-
-	g_assert (CAMEL_IS_KOLAB_IMAPX_SERVER (self));
-	g_assert (foldername != NULL);
-	/* cancellable may be NULL */
-	g_return_val_if_fail (err == NULL || *err == NULL, FALSE);
-
-	priv = CAMEL_KOLAB_IMAPX_SERVER_PRIVATE (self);
-
-	/* hash table lookup */
-	kfmd = g_hash_table_lookup (priv->kmd->kolab_metadata,
-	                            foldername);
-	if (kfmd != NULL)
-		return kfmd->folder_type;
-
-	/* if not in hash table: sqlite db lookup */
-	kfmd = camel_kolab_imapx_metadata_db_lookup (priv->kmd->mdb,
-	                                             foldername,
-	                                             &tmp_err);
-	if (tmp_err != NULL) {
-		g_propagate_error (err, tmp_err);
-		return KOLAB_FOLDER_TYPE_INVAL;
-	}
-	if (kfmd != NULL) {
-		g_hash_table_insert (priv->kmd->kolab_metadata,
-		                     g_strdup (foldername),
-		                     kfmd);
-		return kfmd->folder_type;
-	}
-
-	/* check whether we are online */
-	ostore = CAMEL_OFFLINE_STORE (CAMEL_IMAPX_SERVER (self)->store);
-	if (! camel_offline_store_get_online (ostore)) {
-		/* TODO turn this into proper GError */
-		g_warning ("%s: must be online to complete this operation",
-		           __func__);
-		return KOLAB_FOLDER_TYPE_UNKNOWN;
-	}
-
-	/* TODO check whether we're authenticated */
-	g_debug ("%s: implement authenticated check", __func__);
-
-	/* if not in sqlite db: issue IMAP query */
-	eserver = CAMEL_IMAPX_EXTD_SERVER (self);
-	proto = camel_imapx_extd_server_metadata_get_proto (eserver);
-	spec = camel_imapx_metadata_spec_new (proto,
-	                                      foldername,
-	                                      "/vendor/kolab/folder-type",
-	                                      "value",
-	                                      &tmp_err);
-	if (spec == NULL) {
-		g_propagate_error (err, tmp_err);
-		return KOLAB_FOLDER_TYPE_INVAL;
-	}
-
-	/* resect all metadata gathered so far from CamelIMAPXServer */
-	md = camel_imapx_extd_server_get_metadata (eserver,
-	                                           spec,
-	                                           TRUE,
-	                                           cancellable,
-	                                           &tmp_err);
-	camel_imapx_metadata_spec_free (spec);
-
-	if (tmp_err != NULL) {
-		g_propagate_error (err, tmp_err);
-		return KOLAB_FOLDER_TYPE_INVAL;
-	}
-
-	if (md != NULL) {
-		/* create kolab "flat" data structure */
-		camel_kolab_imapx_metadata_update (priv->kmd,
-		                                   md,
-		                                   proto);
-		camel_imapx_metadata_free (md);
-
-		/* stuff folder types into metadata_db */
-		if (do_updatedb) {
-			db_ok = camel_kolab_imapx_metadata_db_update (priv->kmd->mdb,
-			                                              priv->kmd->kolab_metadata,
-			                                              &tmp_err);
-			if (!db_ok) {
-				g_propagate_error (err, tmp_err);
-				return KOLAB_FOLDER_TYPE_INVAL;
-			}
-		}
-	}
-
-	/* final hash table lookup */
-	kfmd = g_hash_table_lookup (priv->kmd->kolab_metadata,
-	                            foldername);
-	if (kfmd == NULL)
-		return KOLAB_FOLDER_TYPE_UNKNOWN;
-
-	return kfmd->folder_type;
-}
-
-static gboolean
-kolab_imapx_server_set_foldertype (CamelKolabIMAPXServer *self,
-                                   const gchar *foldername,
-                                   KolabFolderTypeID foldertype,
-                                   GCancellable *cancellable,
-                                   GError **err)
-{
-	CamelKolabIMAPXServerPrivate *priv = NULL;
-	CamelIMAPXExtdServer *eserver = NULL;
-	CamelOfflineStore *ostore = NULL;
-	CamelImapxMetadata *md = NULL;
-	CamelImapxMetadataAnnotation *man = NULL;
-	CamelImapxMetadataEntry *me = NULL;
-	CamelImapxMetadataAttrib *ma = NULL;
-	const gchar *typestring = NULL;
-	camel_imapx_metadata_access_t acc = CAMEL_IMAPX_METADATA_ACCESS_SHARED;
-	camel_imapx_metadata_proto_t proto = CAMEL_IMAPX_METADATA_PROTO_INVAL;
-	gboolean metadata_ok = FALSE;
-	gboolean db_ok = FALSE;
-	GError *tmp_err = NULL;
-
-	g_assert (CAMEL_IS_KOLAB_IMAPX_SERVER (self));
-	g_assert (foldername != NULL);
-	/* cancellable may be NULL */
-	g_return_val_if_fail (err == NULL || *err == NULL, FALSE);
-
-	priv = CAMEL_KOLAB_IMAPX_SERVER_PRIVATE (self);
-
-	/* check whether we're online */
-	ostore = CAMEL_OFFLINE_STORE (CAMEL_IMAPX_SERVER (self)->store);
-	if (! camel_offline_store_get_online (ostore)) {
-		/* TODO turn this into proper GError */
-		g_warning ("%s: must be online to complete this operation",
-		           __func__);
-		return FALSE;
-	}
-
-	/* TODO check whether we're authenticated */
-	g_debug ("%s: implement authenticated check", __func__);
-
-	eserver = CAMEL_IMAPX_EXTD_SERVER (self);
-
-	/* create local CamelImapxMetadata for setting type */
-	acc = CAMEL_IMAPX_METADATA_ACCESS_SHARED;
-	ma = camel_imapx_metadata_attrib_new ();
-	ma->type[acc] = CAMEL_IMAPX_METADATA_ATTRIB_TYPE_UTF8;
-	typestring = kolab_util_folder_type_get_string (foldertype);
-	ma->data[acc] = g_byte_array_new ();
-	g_byte_array_append (ma->data[acc],
-	                     (guchar *) g_strdup (typestring),
-	                     strlen (typestring));
-	me = camel_imapx_metadata_entry_new ();
-	g_hash_table_insert (me->attributes,
-	                     g_strdup ("value"),
-	                     ma);
-	man = camel_imapx_metadata_annotation_new ();
-	g_hash_table_insert (man->entries,
-	                     g_strdup ("/vendor/kolab/folder-type"),
-	                     me);
-	proto = camel_imapx_extd_server_metadata_get_proto (eserver);
-	md = camel_imapx_metadata_new (proto, FALSE);
-	g_hash_table_insert (md->mboxes,
-	                     g_strdup (foldername),
-	                     man);
-
-	/* set folder type on the server */
-	metadata_ok = camel_imapx_extd_server_set_metadata (eserver,
-	                                                    md,
-	                                                    cancellable,
-	                                                    &tmp_err);
-	if (! metadata_ok) {
-		camel_imapx_metadata_free (md);
-		g_propagate_error (err, tmp_err);
-		return FALSE;
-	}
-
-	/* create kolab "flat" data structure */
-	camel_kolab_imapx_metadata_update (priv->kmd, md, proto);
-
-	/* stuff folder types into metadata_db */
-	db_ok = camel_kolab_imapx_metadata_db_update (priv->kmd->mdb,
-	                                              priv->kmd->kolab_metadata,
-	                                              &tmp_err);
-	if (! db_ok) {
-		g_propagate_error (err, tmp_err);
-		return FALSE;
-	}
-
-	return TRUE;
-}
-
 /*----------------------------------------------------------------------------*/
 /* class init */
 
@@ -396,43 +90,28 @@ camel_kolab_imapx_server_class_init (CamelKolabIMAPXServerClass *klass)
 {
 	GObjectClass *object_class = G_OBJECT_CLASS (klass);
 
-	g_type_class_add_private (klass, sizeof (CamelKolabIMAPXServerPrivate));
-
 	object_class->constructed = camel_kolab_imapx_server_constructed;
 	object_class->dispose = camel_kolab_imapx_server_dispose;
 	object_class->finalize = camel_kolab_imapx_server_finalize;
-
-	klass->get_foldertype = kolab_imapx_server_get_foldertype;
-	klass->set_foldertype = kolab_imapx_server_set_foldertype;
 }
 
 /*----------------------------------------------------------------------------*/
 /* API functions */
 
 CamelKolabIMAPXServer*
-camel_kolab_imapx_server_new (CamelKolabIMAPXStore *store,
-                              GError **err)
+camel_kolab_imapx_server_new (CamelKolabIMAPXStore *store)
 {
 	CamelKolabIMAPXServer *self = NULL;
 	CamelIMAPXServer *is = NULL;
 	CamelService *service = NULL;
 	CamelSession *session = NULL;
-	GError *tmp_err = NULL;
-	gboolean ok = FALSE;
 
 	g_assert (CAMEL_IS_KOLAB_IMAPX_STORE (store));
-	g_return_val_if_fail (err == NULL || *err == NULL, NULL);
 
 	service = CAMEL_SERVICE (store);
 	session = camel_service_get_session (service);
 
 	self = g_object_new (CAMEL_TYPE_KOLAB_IMAPX_SERVER, NULL);
-	ok = imapx_server_bringup (self, service, &tmp_err);
-	if (! ok) {
-		g_object_unref (self);
-		g_propagate_error (err, tmp_err);
-		return NULL;
-	}
 
 	is = CAMEL_IMAPX_SERVER (self);
 
@@ -442,57 +121,19 @@ camel_kolab_imapx_server_new (CamelKolabIMAPXStore *store,
 	return self;
 }
 
-KolabFolderTypeID
-camel_kolab_imapx_server_get_foldertype (CamelKolabIMAPXServer *self,
-                                         const gchar *foldername,
-                                         gboolean do_updatedb,
-                                         GCancellable *cancellable,
-                                         GError **err)
-{
-	CamelKolabIMAPXServerClass *klass = NULL;
-	KolabFolderTypeID foldertype = KOLAB_FOLDER_TYPE_INVAL;
-
-	g_return_val_if_fail (CAMEL_IS_KOLAB_IMAPX_SERVER (self), KOLAB_FOLDER_TYPE_INVAL);
-
-	klass = CAMEL_KOLAB_IMAPX_SERVER_GET_CLASS (self);
-	foldertype = klass->get_foldertype (self,
-	                                    foldername,
-	                                    do_updatedb,
-	                                    cancellable,
-	                                    err);
-	return foldertype;
-}
-
-gboolean
-camel_kolab_imapx_server_set_foldertype (CamelKolabIMAPXServer *self,
-                                         const gchar *foldername,
-                                         KolabFolderTypeID foldertype,
-                                         GCancellable *cancellable,
-                                         GError **err)
-{
-	CamelKolabIMAPXServerClass *klass = NULL;
-	gboolean ok = FALSE;
-
-	g_return_val_if_fail (CAMEL_IS_KOLAB_IMAPX_SERVER (self), FALSE);
-
-	klass = CAMEL_KOLAB_IMAPX_SERVER_GET_CLASS (self);
-	ok = klass->set_foldertype (self,
-	                            foldername,
-	                            foldertype,
-	                            cancellable,
-	                            err);
-	return ok;
-}
-
+#if 0
 /* CAUTION -- TESTING purposes only! The server response may
  *            become too long to properly handle it!
+ *
+ *            The CamelKolabImapxMetadata has been moved to
+ *            CamelKolabIMAPXStore - to resurrect this function,
+ *            it needs to be moved over to CamelKolabIMAPXStore
  */
 gboolean
 camel_kolab_imapx_server_retrieve_all_folder_types (CamelKolabIMAPXServer *self,
                                                     GCancellable *cancellable,
                                                     GError **err)
 {
-	CamelKolabIMAPXServerPrivate *priv = NULL;
 	CamelIMAPXExtdServer *eserver = NULL;
 	CamelOfflineStore *ostore = NULL;
 	CamelImapxMetadataSpec *spec = NULL;
@@ -503,8 +144,6 @@ camel_kolab_imapx_server_retrieve_all_folder_types (CamelKolabIMAPXServer *self,
 	/* cancellable may be NULL */
 	g_return_val_if_fail (err == NULL || *err == NULL, FALSE);
 
-	priv = CAMEL_KOLAB_IMAPX_SERVER_PRIVATE (self);
-
 	/* check whether we're online */
 	ostore = CAMEL_OFFLINE_STORE (CAMEL_IMAPX_SERVER (self)->store);
 	if (! camel_offline_store_get_online (ostore)) {
@@ -546,5 +185,6 @@ camel_kolab_imapx_server_retrieve_all_folder_types (CamelKolabIMAPXServer *self,
 
 	return TRUE;
 }
+#endif
 
 /*----------------------------------------------------------------------------*/
diff --git a/src/camel/camel-kolab-imapx-server.h b/src/camel/camel-kolab-imapx-server.h
index fc208bb..2ab4c41 100644
--- a/src/camel/camel-kolab-imapx-server.h
+++ b/src/camel/camel-kolab-imapx-server.h
@@ -36,8 +36,6 @@
 
 #include <camel/providers/imapx/camel-imapx-extd-server.h>
 
-#include "camel-kolab-imapx-metadata.h"
-
 /*----------------------------------------------------------------------------*/
 
 struct _CamelKolabIMAPXStore;
@@ -74,45 +72,13 @@ struct _CamelKolabIMAPXServer {
 
 struct _CamelKolabIMAPXServerClass {
 	CamelIMAPXExtdServerClass parent_class;
-
-	KolabFolderTypeID (*get_foldertype) (CamelKolabIMAPXServer *self,
-	                                     const gchar *foldername,
-	                                     gboolean do_updatedb,
-	                                     GCancellable *cancellable,
-	                                     GError **err);
-
-	gboolean (*set_foldertype) (CamelKolabIMAPXServer *self,
-	                            const gchar *foldername,
-	                            KolabFolderTypeID foldertype,
-	                            GCancellable *cancellable,
-	                            GError **err);
 };
 
 GType
 camel_kolab_imapx_server_get_type (void);
 
 CamelKolabIMAPXServer*
-camel_kolab_imapx_server_new (struct _CamelKolabIMAPXStore *store,
-                              GError **err);
-
-KolabFolderTypeID
-camel_kolab_imapx_server_get_foldertype (CamelKolabIMAPXServer *self,
-                                         const gchar *foldername,
-                                         gboolean do_updatedb,
-                                         GCancellable *cancellable,
-                                         GError **err);
-
-gboolean
-camel_kolab_imapx_server_set_foldertype (CamelKolabIMAPXServer *self,
-                                         const gchar *foldername,
-                                         KolabFolderTypeID foldertype,
-                                         GCancellable *cancellable,
-                                         GError **err);
-
-gboolean
-camel_kolab_imapx_server_retrieve_all_folder_types (CamelKolabIMAPXServer *self,
-                                                    GCancellable *cancellable,
-                                                    GError **err);
+camel_kolab_imapx_server_new (struct _CamelKolabIMAPXStore *store);
 
 G_END_DECLS
 
diff --git a/src/camel/camel-kolab-imapx-store.c b/src/camel/camel-kolab-imapx-store.c
index b1663fb..4e8d27d 100644
--- a/src/camel/camel-kolab-imapx-store.c
+++ b/src/camel/camel-kolab-imapx-store.c
@@ -40,6 +40,7 @@
 #include <libekolabutil/kolab-util-error.h>
 
 #include "camel-kolab-imapx-conn-manager.h"
+#include "camel-kolab-imapx-metadata.h"
 #include "camel-kolab-imapx-settings.h"
 #include "camel-kolab-imapx-store.h"
 
@@ -53,8 +54,10 @@ static CamelServiceClass *parent_service_class = NULL;
 static CamelStoreClass *parent_store_class = NULL;
 
 /*----------------------------------------------------------------------------*/
-
 /* forward declarations */
+
+static gboolean imapx_store_shutdown (CamelKolabIMAPXStore *self, GError **err);
+
 static void kolab_imapx_store_initable_init (GInitableIface *interface);
 static void kolab_imapx_store_network_service_init (CamelNetworkServiceInterface *interface);
 static void kolab_imapx_store_subscribable_init (CamelSubscribableInterface *interface);
@@ -72,6 +75,9 @@ struct _CamelKolabIMAPXStorePrivate {
 	KolabFolderContextID folder_context;
 	gboolean folder_types_do_care[KOLAB_FOLDER_LAST_TYPE];
 	GList *folder_names_do_care;
+	CamelKolabImapxMetadata *kmd; /* Kolab metadata (differs from IMAPX metadata!) */
+
+	gboolean is_initialized;
 };
 
 #define CAMEL_KOLAB_IMAPX_STORE_PRIVATE(obj)  (G_TYPE_INSTANCE_GET_PRIVATE ((obj), CAMEL_TYPE_KOLAB_IMAPX_STORE, CamelKolabIMAPXStorePrivate))
@@ -139,6 +145,11 @@ camel_kolab_imapx_store_init (CamelKolabIMAPXStore *self)
 	priv->folder_types_do_care[KOLAB_FOLDER_TYPE_EMAIL_JUNKEMAIL] = TRUE;
 
 	priv->folder_names_do_care = NULL;
+
+	/* metadata db and lookup table */
+	priv->kmd = camel_kolab_imapx_metadata_new ();
+
+	priv->is_initialized = FALSE;
 }
 
 static void
@@ -173,12 +184,28 @@ camel_kolab_imapx_store_finalize (GObject *object)
 {
 	CamelKolabIMAPXStore *self = NULL;
 	CamelKolabIMAPXStorePrivate *priv = NULL;
+	GError *tmp_err = NULL;
+	gboolean ok = FALSE;
 
 	g_assert (CAMEL_IS_KOLAB_IMAPX_STORE (object));
 
 	self = CAMEL_KOLAB_IMAPX_STORE (object);
 	priv = CAMEL_KOLAB_IMAPX_STORE_PRIVATE (self);
 
+	ok = imapx_store_shutdown (self, &tmp_err);
+	if (! ok) {
+		/* TODO
+		 * Uninitialization, which can fail,
+		 * should be done in a place where we can
+		 * propagate an error - just, GInitable does
+		 * not provide for uninitialization either...
+		 */
+		g_warning ("%s: %s",
+		           __func__, tmp_err->message);
+		g_error_free (tmp_err);
+	}
+	camel_kolab_imapx_metadata_free (priv->kmd);
+
 	while (! g_mutex_trylock (priv->kolab_finfo_lock));
 	g_mutex_unlock (priv->kolab_finfo_lock);
 	g_mutex_free (priv->kolab_finfo_lock);
@@ -199,6 +226,36 @@ camel_kolab_imapx_store_finalize (GObject *object)
 /*----------------------------------------------------------------------------*/
 /* internal statics */
 
+static gboolean
+imapx_store_shutdown (CamelKolabIMAPXStore *self,
+                      GError **err)
+{
+	CamelKolabIMAPXStorePrivate *priv = NULL;
+	GError *tmp_err = NULL;
+	gboolean ok = FALSE;
+
+	g_assert (CAMEL_IS_KOLAB_IMAPX_STORE (self));
+	g_return_val_if_fail (err == NULL || *err == NULL, FALSE);
+
+	priv = CAMEL_KOLAB_IMAPX_STORE_PRIVATE (self);
+
+	if (priv->is_initialized == FALSE) {
+		return TRUE;
+	}
+
+	ok = camel_kolab_imapx_metadata_shutdown (priv->kmd,
+	                                          &tmp_err);
+
+	if (! ok) {
+		g_propagate_error (err, tmp_err);
+		return FALSE;
+	}
+
+	priv->is_initialized = FALSE;
+
+	return TRUE;
+}
+
 static CamelFolder*
 imapx_store_get_folder_offline (CamelStore *self,
                                 const gchar *folder_name,
@@ -221,6 +278,7 @@ imapx_store_get_folder_offline (CamelStore *self,
 	const gchar *user_cache_dir = NULL;
 
 	g_assert (folder_name != NULL);
+	(void)flags; /* FIXME where do we need this? */
 	g_return_val_if_fail (err == NULL || *err == NULL, NULL);
 
 	user_cache_dir = camel_service_get_user_cache_dir (service);
@@ -259,9 +317,229 @@ imapx_store_get_folder_offline (CamelStore *self,
 	return new_folder;
 }
 
+static KolabFolderTypeID
+imapx_store_get_foldertype (CamelKolabIMAPXStore *self,
+                            const gchar *foldername,
+                            gboolean do_updatedb,
+                            GCancellable *cancellable,
+                            GError **err)
+{
+	/* TODO better error reporting */
+	CamelKolabIMAPXStorePrivate *priv = NULL;
+	CamelIMAPXServer *is = NULL;
+	CamelIMAPXExtdServer *es = NULL;
+	CamelImapxMetadata *md = NULL;
+	CamelKolabImapxFolderMetadata *kfmd = NULL;
+	CamelImapxMetadataSpec *spec = NULL;
+	camel_imapx_metadata_proto_t proto = CAMEL_IMAPX_METADATA_PROTO_INVAL;
+	gboolean db_ok = FALSE;
+	GError *tmp_err = NULL;
+
+	g_assert (CAMEL_IS_KOLAB_IMAPX_STORE (self));
+	g_assert (foldername != NULL);
+	/* cancellable may be NULL */
+	g_return_val_if_fail (err == NULL || *err == NULL, FALSE);
+
+	priv = CAMEL_KOLAB_IMAPX_STORE_PRIVATE (self);
+
+	/* hash table lookup */
+	kfmd = g_hash_table_lookup (priv->kmd->kolab_metadata,
+	                            foldername);
+	if (kfmd != NULL)
+		return kfmd->folder_type;
+
+	/* if not in hash table: sqlite db lookup */
+	kfmd = camel_kolab_imapx_metadata_db_lookup (priv->kmd->mdb,
+	                                             foldername,
+	                                             &tmp_err);
+	if (tmp_err != NULL) {
+		g_propagate_error (err, tmp_err);
+		return KOLAB_FOLDER_TYPE_INVAL;
+	}
+	if (kfmd != NULL) {
+		g_hash_table_insert (priv->kmd->kolab_metadata,
+		                     g_strdup (foldername),
+		                     kfmd);
+		return kfmd->folder_type;
+	}
+
+	/* check whether we are online and get server */
+	if (! camel_offline_store_get_online (CAMEL_OFFLINE_STORE (self))) {
+		/* If we're here, we're trying to get the
+		 * type of the folder in offline mode and
+		 * the folder is not yet in the database -
+		 * means we cannot return a folder type
+		 * other than UNKNOWN
+		 */
+		g_debug ("%s: must be online to complete this operation",
+		           __func__);
+		return KOLAB_FOLDER_TYPE_UNKNOWN;
+	}
+	is = camel_imapx_store_get_server (CAMEL_IMAPX_STORE (self),
+	                                   foldername,
+	                                   cancellable,
+	                                   &tmp_err);
+	if (tmp_err != NULL) {
+		g_propagate_error (err, tmp_err);
+		return KOLAB_FOLDER_TYPE_INVAL;
+	}
+	es = CAMEL_IMAPX_EXTD_SERVER (is);
+
+	/* if not in sqlite db: issue IMAP query */
+	proto = camel_imapx_extd_server_metadata_get_proto (es);
+	spec = camel_imapx_metadata_spec_new (proto,
+	                                      foldername,
+	                                      "/vendor/kolab/folder-type",
+	                                      "value",
+	                                      &tmp_err);
+	if (spec == NULL) {
+		g_propagate_error (err, tmp_err);
+		return KOLAB_FOLDER_TYPE_INVAL;
+	}
+
+	/* resect all metadata gathered so far from CamelIMAPXServer */
+	md = camel_imapx_extd_server_get_metadata (es,
+	                                           spec,
+	                                           TRUE,
+	                                           cancellable,
+	                                           &tmp_err);
+	camel_imapx_metadata_spec_free (spec);
+
+	if (tmp_err != NULL) {
+		g_propagate_error (err, tmp_err);
+		return KOLAB_FOLDER_TYPE_INVAL;
+	}
+
+	if (md != NULL) {
+		/* create kolab "flat" data structure */
+		camel_kolab_imapx_metadata_update (priv->kmd,
+		                                   md,
+		                                   proto);
+		camel_imapx_metadata_free (md);
+
+		/* stuff folder types into metadata_db */
+		if (do_updatedb) {
+			db_ok = camel_kolab_imapx_metadata_db_update (priv->kmd->mdb,
+			                                              priv->kmd->kolab_metadata,
+			                                              &tmp_err);
+			if (!db_ok) {
+				g_propagate_error (err, tmp_err);
+				return KOLAB_FOLDER_TYPE_INVAL;
+			}
+		}
+	}
+
+	/* final hash table lookup */
+	kfmd = g_hash_table_lookup (priv->kmd->kolab_metadata,
+	                            foldername);
+	if (kfmd == NULL)
+		return KOLAB_FOLDER_TYPE_UNKNOWN;
+
+	return kfmd->folder_type;
+}
+
+static gboolean
+imapx_store_set_foldertype (CamelKolabIMAPXStore *self,
+                            const gchar *foldername,
+                            KolabFolderTypeID foldertype,
+                            GCancellable *cancellable,
+                            GError **err)
+{
+	CamelKolabIMAPXStorePrivate *priv = NULL;
+	CamelIMAPXServer *is = NULL;
+	CamelIMAPXExtdServer *es = NULL;
+	CamelImapxMetadata *md = NULL;
+	CamelImapxMetadataAnnotation *man = NULL;
+	CamelImapxMetadataEntry *me = NULL;
+	CamelImapxMetadataAttrib *ma = NULL;
+	const gchar *typestring = NULL;
+	camel_imapx_metadata_access_t acc = CAMEL_IMAPX_METADATA_ACCESS_SHARED;
+	camel_imapx_metadata_proto_t proto = CAMEL_IMAPX_METADATA_PROTO_INVAL;
+	gboolean metadata_ok = FALSE;
+	gboolean db_ok = FALSE;
+	GError *tmp_err = NULL;
+
+	g_assert (CAMEL_IS_KOLAB_IMAPX_SERVER (self));
+	g_assert (foldername != NULL);
+	/* cancellable may be NULL */
+	g_return_val_if_fail (err == NULL || *err == NULL, FALSE);
+
+	priv = CAMEL_KOLAB_IMAPX_STORE_PRIVATE (self);
+
+	/* check whether we are online and get server */
+	if (! camel_offline_store_get_online (CAMEL_OFFLINE_STORE (self))) {
+		/* If we're here, we're trying to set the
+		 * type of the folder in offline mode -
+		 * to be sure the folder type can be set,
+		 * we must be online
+		 */
+		g_set_error (err,
+		             KOLAB_CAMEL_KOLAB_ERROR,
+		             KOLAB_CAMEL_KOLAB_ERROR_SERVER,
+		             "Must be online to complete this operation");
+		return FALSE;
+	}
+	is = camel_imapx_store_get_server (CAMEL_IMAPX_STORE (self),
+	                                   foldername,
+	                                   cancellable,
+	                                   &tmp_err);
+	if (tmp_err != NULL) {
+		g_propagate_error (err, tmp_err);
+		return KOLAB_FOLDER_TYPE_INVAL;
+	}
+	es = CAMEL_IMAPX_EXTD_SERVER (is);
+
+	/* create local CamelImapxMetadata for setting type */
+	acc = CAMEL_IMAPX_METADATA_ACCESS_SHARED;
+	ma = camel_imapx_metadata_attrib_new ();
+	ma->type[acc] = CAMEL_IMAPX_METADATA_ATTRIB_TYPE_UTF8;
+	typestring = kolab_util_folder_type_get_string (foldertype);
+	ma->data[acc] = g_byte_array_new ();
+	g_byte_array_append (ma->data[acc],
+	                     (guchar *) g_strdup (typestring),
+	                     strlen (typestring));
+	me = camel_imapx_metadata_entry_new ();
+	g_hash_table_insert (me->attributes,
+	                     g_strdup ("value"),
+	                     ma);
+	man = camel_imapx_metadata_annotation_new ();
+	g_hash_table_insert (man->entries,
+	                     g_strdup ("/vendor/kolab/folder-type"),
+	                     me);
+	proto = camel_imapx_extd_server_metadata_get_proto (es);
+	md = camel_imapx_metadata_new (proto, FALSE);
+	g_hash_table_insert (md->mboxes,
+	                     g_strdup (foldername),
+	                     man);
+
+	/* set folder type on the server */
+	metadata_ok = camel_imapx_extd_server_set_metadata (es,
+	                                                    md,
+	                                                    cancellable,
+	                                                    &tmp_err);
+	if (! metadata_ok) {
+		camel_imapx_metadata_free (md);
+		g_propagate_error (err, tmp_err);
+		return FALSE;
+	}
+
+	/* create kolab "flat" data structure */
+	camel_kolab_imapx_metadata_update (priv->kmd, md, proto);
+
+	/* stuff folder types into metadata_db */
+	db_ok = camel_kolab_imapx_metadata_db_update (priv->kmd->mdb,
+	                                              priv->kmd->kolab_metadata,
+	                                              &tmp_err);
+	if (! db_ok) {
+		g_propagate_error (err, tmp_err);
+		return FALSE;
+	}
+
+	return TRUE;
+}
+
 static CamelFolderInfo*
 imapx_store_folder_info_build_restricted (CamelKolabIMAPXStore *self,
-                                          CamelKolabIMAPXServer *server,
                                           const CamelFolderInfo *fi,
                                           GCancellable *cancellable,
                                           GError **err)
@@ -274,7 +552,6 @@ imapx_store_folder_info_build_restricted (CamelKolabIMAPXStore *self,
 	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);
@@ -284,18 +561,17 @@ imapx_store_folder_info_build_restricted (CamelKolabIMAPXStore *self,
 	if (fi == NULL)
 		return NULL;
 
-	folder_type = camel_kolab_imapx_server_get_foldertype (server,
-	                                                       fi->full_name,
-	                                                       TRUE,
-	                                                       cancellable,
-	                                                       &tmp_err);
+	folder_type = imapx_store_get_foldertype (self,
+	                                          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);
@@ -305,7 +581,6 @@ imapx_store_folder_info_build_restricted (CamelKolabIMAPXStore *self,
 	}
 
 	chld_fi = imapx_store_folder_info_build_restricted (self,
-	                                                    server,
 	                                                    fi->child,
 	                                                    cancellable,
 	                                                    &tmp_err);
@@ -534,8 +809,6 @@ kolab_imapx_store_get_folder_info_sync (CamelStore *self,
 {
 	CamelKolabIMAPXStore *myself = NULL;
 	CamelKolabIMAPXStorePrivate *priv = NULL;
-	CamelIMAPXServer *is = NULL;
-	CamelKolabIMAPXServer *ks = NULL;
 	CamelFolderInfo *fi = NULL;
 	CamelFolderInfo *k_fi = NULL;
 	GError *tmp_err = NULL;
@@ -560,22 +833,14 @@ kolab_imapx_store_get_folder_info_sync (CamelStore *self,
 	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:
+	if (fi != NULL)
+		camel_store_free_folder_info (self, fi);
+
 	g_mutex_unlock (priv->kolab_finfo_lock);
 
 	if (tmp_err != NULL) {
@@ -646,7 +911,13 @@ kolab_imapx_store_create_folder_sync (CamelStore *self,
                                       GCancellable *cancellable,
                                       GError **err)
 {
-	CamelFolderInfo *finfo = NULL;
+	CamelKolabIMAPXStore *myself = NULL;
+	CamelKolabIMAPXStorePrivate *priv = NULL;
+	CamelFolderInfo *k_fi = NULL;
+	CamelFolderInfo *fi = NULL;
+	gchar *fullname = NULL;
+	GError *tmp_err = NULL;
+	gboolean ok = FALSE;
 
 	g_assert (CAMEL_IS_KOLAB_IMAPX_STORE (self));
 	/* parentname may be NULL */ /* FIXME correct? */
@@ -654,12 +925,50 @@ kolab_imapx_store_create_folder_sync (CamelStore *self,
 	/* cancellable may be NULL */
 	g_return_val_if_fail (err == NULL || *err == NULL, NULL);
 
-	finfo = parent_store_class->create_folder_sync (self,
-	                                                parentname,
-	                                                foldername,
-	                                                cancellable,
-	                                                err);
-	return finfo;
+	myself = CAMEL_KOLAB_IMAPX_STORE (self);
+	priv = CAMEL_KOLAB_IMAPX_STORE_PRIVATE (myself);
+
+	fi = parent_store_class->create_folder_sync (self,
+	                                             parentname,
+	                                             foldername,
+	                                             cancellable,
+	                                             &tmp_err);
+	if (tmp_err != NULL) {
+		if (fi != NULL)
+			/* should not happen */
+			camel_store_free_folder_info (self, fi);
+		g_propagate_error (err, tmp_err);
+		return NULL;
+	}
+
+	/* FIXME use Camel function(s) to create full_name */
+	fullname = g_strdup_printf ("%s/%s", parentname, foldername);
+	ok = imapx_store_set_foldertype (myself,
+	                                 fullname,
+	                                 priv->folder_create_type,
+	                                 cancellable,
+	                                 &tmp_err);
+	g_free (fullname);
+	if (! ok) {
+		g_warning ("%s: setting type [%i] for [%s] on server failed.",
+		           __func__, priv->folder_create_type, fullname);
+		camel_store_free_folder_info (self, fi);
+		g_propagate_error (err, tmp_err);
+		return NULL;
+	}
+
+	k_fi = imapx_store_folder_info_build_restricted (myself,
+	                                                 fi,
+	                                                 cancellable,
+	                                                 &tmp_err);
+	camel_store_free_folder_info (self, fi);
+
+	if (tmp_err != NULL) {
+		g_propagate_error (err, tmp_err);
+		return NULL;
+	}
+
+	return k_fi;
 }
 
 static gboolean
@@ -668,6 +977,7 @@ kolab_imapx_store_delete_folder_sync (CamelStore *self,
                                       GCancellable *cancellable,
                                       GError **err)
 {
+	GError *tmp_err = NULL;
 	gboolean ok = FALSE;
 
 	g_assert (CAMEL_IS_KOLAB_IMAPX_STORE (self));
@@ -679,8 +989,15 @@ kolab_imapx_store_delete_folder_sync (CamelStore *self,
 	ok = parent_store_class->delete_folder_sync (self,
 	                                             foldername,
 	                                             cancellable,
-	                                             err);
-	return ok;
+	                                             &tmp_err);
+	if (! ok) {
+		g_propagate_error (err, tmp_err);
+		return FALSE;
+	}
+
+	/* FIXME remove metadata of deleted folder from CamelKolabIMAPXServer */
+
+	return TRUE;
 }
 
 static gboolean
@@ -703,6 +1020,9 @@ kolab_imapx_store_rename_folder_sync (CamelStore *self,
 	                                             foldername_new,
 	                                             cancellable,
 	                                             err);
+
+	/* FIXME update metadata of deleted folder on CamelKolabIMAPXServer */
+
 	return ok;
 }
 
@@ -727,28 +1047,70 @@ static gboolean
 kolab_imapx_store_set_folder_creation_type (CamelKolabIMAPXStore *self,
                                             KolabFolderTypeID type_id)
 {
+	CamelKolabIMAPXStorePrivate *priv = NULL;
+
 	g_assert (CAMEL_IS_KOLAB_IMAPX_STORE (self));
 	g_assert ((type_id > KOLAB_FOLDER_TYPE_UNKNOWN) &&
 	          (type_id < KOLAB_FOLDER_LAST_TYPE));
 
-	/* FIXME implement me */
-	g_error ("%s: FIXME implement me", __func__);
+	priv = CAMEL_KOLAB_IMAPX_STORE_PRIVATE (self);
+
+	/* check that the given folder type id lies within the configured folder context */
+	if (! kolab_util_folder_type_match_with_context_id (type_id, priv->folder_context))
+		return FALSE;
+
+	priv->folder_create_type = type_id;
 
-	return FALSE;
+	return TRUE;
 }
 
 static gboolean
 kolab_imapx_store_set_folder_context (CamelKolabIMAPXStore *self,
                                       KolabFolderContextID context)
 {
+	CamelKolabIMAPXStorePrivate *priv = NULL;
+	gint ii = 0;
+
 	g_assert (CAMEL_IS_KOLAB_IMAPX_STORE (self));
 	g_assert ((context > KOLAB_FOLDER_CONTEXT_INVAL) &&
 	          (context < KOLAB_FOLDER_LAST_CONTEXT));
 
-	/* FIXME implement me */
-	g_error ("%s: FIXME implement me", __func__);
+	priv = CAMEL_KOLAB_IMAPX_STORE_PRIVATE (self);
+
+	for (ii = 0; ii < KOLAB_FOLDER_LAST_TYPE; ii++)
+		priv->folder_types_do_care[ii] = FALSE;
+
+	priv->folder_context = context;
+
+	switch (context) {
+	case KOLAB_FOLDER_CONTEXT_EMAIL:
+		priv->folder_types_do_care[KOLAB_FOLDER_TYPE_UNKNOWN]		= TRUE;
+		priv->folder_types_do_care[KOLAB_FOLDER_TYPE_EMAIL]		= TRUE;
+		priv->folder_types_do_care[KOLAB_FOLDER_TYPE_EMAIL_INBOX]	= TRUE;
+		priv->folder_types_do_care[KOLAB_FOLDER_TYPE_EMAIL_DRAFTS]	= TRUE;
+		priv->folder_types_do_care[KOLAB_FOLDER_TYPE_EMAIL_SENTITEMS]	= TRUE;
+		priv->folder_types_do_care[KOLAB_FOLDER_TYPE_EMAIL_JUNKEMAIL]	= TRUE;
+		break;
+	case KOLAB_FOLDER_CONTEXT_CALENDAR:
+		priv->folder_types_do_care[KOLAB_FOLDER_TYPE_EVENT]		= TRUE;
+		priv->folder_types_do_care[KOLAB_FOLDER_TYPE_EVENT_DEFAULT]	= TRUE;
+		priv->folder_types_do_care[KOLAB_FOLDER_TYPE_JOURNAL]		= TRUE;
+		priv->folder_types_do_care[KOLAB_FOLDER_TYPE_JOURNAL_DEFAULT]	= TRUE;
+		priv->folder_types_do_care[KOLAB_FOLDER_TYPE_TASK]		= TRUE;
+		priv->folder_types_do_care[KOLAB_FOLDER_TYPE_TASK_DEFAULT]	= TRUE;
+		priv->folder_types_do_care[KOLAB_FOLDER_TYPE_NOTE]		= TRUE;
+		priv->folder_types_do_care[KOLAB_FOLDER_TYPE_NOTE_DEFAULT]	= TRUE;
+		break;
+	case KOLAB_FOLDER_CONTEXT_CONTACT:
+		priv->folder_types_do_care[KOLAB_FOLDER_TYPE_CONTACT]		= TRUE;
+		priv->folder_types_do_care[KOLAB_FOLDER_TYPE_CONTACT_DEFAULT]	= TRUE;
+		break;
+	default:
+		/* can't happen */
+		g_assert_not_reached ();
+	}
 
-	return FALSE;
+	return TRUE;
 }
 
 static KolabFolderTypeID
@@ -757,26 +1119,45 @@ kolab_imapx_store_get_folder_type (CamelKolabIMAPXStore *self,
                                    GCancellable *cancellable,
                                    GError **err)
 {
+	KolabFolderTypeID folder_type = KOLAB_FOLDER_TYPE_INVAL;
+	GError *tmp_err = NULL;
+
 	g_assert (CAMEL_IS_KOLAB_IMAPX_STORE (self));
-	(void)foldername; /* FIXME */
-	(void)cancellable; /* FIXME */ /* cancellable may be NULL */
+	g_assert (foldername != NULL);
+	/* cancellable may be NULL */
 	g_return_val_if_fail (err == NULL || *err == NULL, KOLAB_FOLDER_TYPE_INVAL);
 
-	/* FIXME implement me */
-	g_error ("%s: FIXME implement me", __func__);
+	folder_type = imapx_store_get_foldertype (self,
+	                                          foldername,
+	                                          TRUE,
+	                                          cancellable,
+	                                          &tmp_err);
+	if (tmp_err != NULL) {
+		g_propagate_error (err, tmp_err);
+		return KOLAB_FOLDER_TYPE_INVAL;
+	}
 
-	return KOLAB_FOLDER_TYPE_INVAL;
+	return folder_type;
 }
 
 static GList*
 kolab_imapx_store_resect_folder_list (CamelKolabIMAPXStore *self)
 {
+	CamelKolabIMAPXStorePrivate *priv = NULL;
+	GList *folder_list = NULL;
+
 	g_assert (CAMEL_IS_KOLAB_IMAPX_STORE (self));
 
-	/* FIXME remove me */
-	g_error ("%s: FIXME implement me", __func__);
+	priv = CAMEL_KOLAB_IMAPX_STORE_PRIVATE (self);
+
+	g_mutex_lock (priv->kolab_finfo_lock);
+
+	folder_list = priv->folder_names_do_care;
+	priv->folder_names_do_care = NULL;
+
+	g_mutex_unlock (priv->kolab_finfo_lock);
 
-	return NULL;
+	return folder_list;
 }
 
 /*----------------------------------------------------------------------------*/
@@ -787,29 +1168,74 @@ kolab_imapx_store_initable_initialize (GInitable *initable,
                                        GCancellable *cancellable,
                                        GError **err)
 {
+	CamelKolabIMAPXStore *self = NULL;
+	CamelKolabIMAPXStorePrivate *priv = NULL;
+	CamelService *service = NULL;
+	const gchar *cachepath = NULL;
+	GError *tmp_err = NULL;
 	gboolean ok = FALSE;
 
 	g_assert (G_IS_INITABLE (initable));
 	/* cancellable may be NULL */
 	g_return_val_if_fail (err == NULL || *err == NULL, FALSE);
 
+	self = CAMEL_KOLAB_IMAPX_STORE (initable);
+	priv = CAMEL_KOLAB_IMAPX_STORE_PRIVATE (self);
+
+	if (priv->is_initialized == TRUE) {
+		return TRUE;
+	}
+
 	/* chain up to parent interface's init() method. */
 	ok = parent_initable_iface->init (initable,
 	                                  cancellable,
-	                                  err);
-	return ok;
-}
+	                                  &tmp_err);
+	if (! ok)
+		goto exit;
 
-static const gchar*
-kolab_imapx_store_get_service_name (CamelNetworkService *service,
-                                    CamelNetworkSecurityMethod method)
-{
-	const gchar *sn = NULL;
+	/* initialize metadata (db) */
+	service = CAMEL_SERVICE (self);
+	cachepath = camel_service_get_user_cache_dir (service);
+	if (cachepath == NULL) {
+		/* FIXME mark this as a translatable string */
+		g_set_error (&tmp_err,
+		             KOLAB_CAMEL_ERROR,
+		             KOLAB_CAMEL_ERROR_GENERIC,
+		             "Could not get user cache directory from Camel service");
+		goto exit;
+	}
 
-	g_assert (CAMEL_IS_NETWORK_SERVICE (service));
+	ok = camel_kolab_imapx_metadata_init (priv->kmd,
+	                                      cachepath,
+	                                      &tmp_err);
+	if (! ok) {
+		g_warning ("%s: %s",
+		           __func__, tmp_err->message);
+		goto exit;
+	}
 
-	/* use parent function for now */
-	sn = parent_service_iface->get_service_name (service,
+	priv->is_initialized = TRUE;
+	g_debug ("%s: metadata database initialized", __func__);
+
+ exit:
+	if (! ok) {
+		g_propagate_error (err, tmp_err);
+		return FALSE;
+	}
+
+	return TRUE;
+}
+
+static const gchar*
+kolab_imapx_store_get_service_name (CamelNetworkService *service,
+                                    CamelNetworkSecurityMethod method)
+{
+	const gchar *sn = NULL;
+
+	g_assert (CAMEL_IS_NETWORK_SERVICE (service));
+
+	/* use parent function for now */
+	sn = parent_service_iface->get_service_name (service,
 	                                             method);
 
 	return sn;
@@ -1029,661 +1455,5 @@ camel_kolab_imapx_store_resect_folder_list (CamelKolabIMAPXStore *self)
 	return list;
 }
 
-gboolean
-camel_kolab_imapx_store_logout_sync (CamelKolabIMAPXStore *self,
-                                     GCancellable *cancellable,
-                                     GError **err)
-{
-	/* TODO check whether this function is still needed */
-
-	g_assert (CAMEL_IS_KOLAB_IMAPX_STORE (self));
-	(void)cancellable; /* FIXME */ /* cancellable may be NULL */
-	g_return_val_if_fail (err == NULL || *err == NULL, FALSE);
-
-	/* FIXME implement me */
-	g_error ("%s: FIXME implement me", __func__);
-
-	return FALSE;
-}
-
 /*----------------------------------------------------------------------------*/
 /*----------------------------------------------------------------------------*/
-
-
-
-#if 0
-
-static void
-kolab_imapx_construct (CamelService *service,
-                       CamelSession *session,
-                       CamelProvider *provider,
-                       CamelURL *url,
-                       GError **err)
-{
-	CamelKolabIMAPXStore *store = NULL;
-	gboolean metadata_ok = FALSE;
-	GError *tmp_err = NULL;
-
-	g_assert (CAMEL_IS_SERVICE (service));
-	g_assert (CAMEL_IS_SESSION (session));
-	g_assert (provider != NULL);
-	g_assert (url != NULL);
-	g_return_if_fail (err == NULL || *err == NULL);
-
-	(CAMEL_SERVICE_CLASS (parent_class))->construct (service,
-	                                                 session,
-	                                                 provider,
-	                                                 url,
-	                                                 tmp_err);
-	if (tmp_err != NULL) {
-		g_propagate_error (err, tmp_err);
-		return;
-	}
-
-	/*------- metadata db -------*/
-
-	store = CAMEL_KOLAB_IMAPX_STORE (service);
-
-	metadata_ok = kolab_imapx_meta_data_init (store->kmd,
-	                                          service,
-	                                          session,
-	                                          &tmp_err);
-	if (!metadata_ok) {
-		kolab_camelexception_propagate_from_gerror (ex, tmp_err);
-		return;
-	}
-
-	camel_exception_free (tmp_ex);
-
-	/* default folder type to create (for use in Evo) */
-	store->folder_create_type = KOLAB_FOLDER_TYPE_EMAIL;
-
-	/* default folder context (for use in Evo) */
-	store->folder_context = KOLAB_FOLDER_CONTEXT_EMAIL;
-
-	g_debug ("%s: metadata db initialized", __func__);
-}
-
-static gboolean
-kolab_imapx_connect (CamelService *service,
-                     CamelException *ex)
-{
-	CamelException *tmp_ex = NULL;
-
-	g_assert (CAMEL_IS_SERVICE (service));
-	g_assert (ex != NULL);
-
-	tmp_ex = camel_exception_new ();
-
-	(CAMEL_SERVICE_CLASS (parent_class))->connect (service, tmp_ex);
-	if (camel_exception_is_set (tmp_ex)) {
-		g_warning ("%s: %s",
-		           __func__,
-		           camel_exception_get_description (tmp_ex));
-		camel_exception_xfer (ex, tmp_ex);
-		return FALSE;
-	}
-
-	camel_exception_free (tmp_ex);
-	return TRUE;
-}
-
-static gboolean
-kolab_imapx_disconnect (CamelService *service,
-                        gboolean clean,
-                        CamelException *ex)
-{
-	CamelException *tmp_ex = NULL;
-	gboolean parent_ok = FALSE;
-
-	g_assert (CAMEL_IS_SERVICE (service));
-	/* *ex may be NULL */
-
-	tmp_ex = camel_exception_new ();
-	parent_ok = (CAMEL_SERVICE_CLASS (parent_class))->disconnect (service,
-	                                                              clean,
-	                                                              tmp_ex);
-	if (camel_exception_is_set (tmp_ex)) {
-		g_warning ("%s: %s",
-		           __func__,
-		           camel_exception_get_description (tmp_ex));
-		if (ex != NULL)
-			camel_exception_xfer (ex, tmp_ex);
-	}
-
-	camel_exception_free (tmp_ex);
-	return parent_ok;
-}
-
-static KolabFolderTypeID
-kolab_imapx_folder_get_foldertype (CamelService *service,
-                                   const CamelFolderInfo *fi,
-                                   CamelKolabIMAPXMetaData *kmd)
-{
-	KolabFolderTypeID folder_type = KOLAB_FOLDER_TYPE_INVAL;
-	GError *tmp_err = NULL;
-
-	g_assert (CAMEL_IS_SERVICE (service));
-	g_assert (fi != NULL);
-	g_assert (kmd != NULL);
-
-	folder_type = kolab_imapx_meta_data_get_foldertype (kmd,
-	                                                    service,
-	                                                    fi->full_name,
-	                                                    TRUE,
-	                                                    &tmp_err);
-	if (tmp_err != NULL) {
-		g_warning ("%s: error getting folder type: %s",
-		           __func__,
-		           tmp_err->message);
-		g_error_free (tmp_err);
-		return KOLAB_FOLDER_TYPE_INVAL;
-	}
-	return folder_type;
-}
-
-static CamelFolderInfo*
-kolab_imapx_folder_info_build_restricted (CamelService *service,
-                                          const CamelFolderInfo *fi,
-                                          CamelKolabIMAPXMetaData *kmd,
-                                          const gboolean do_care[])
-{
-	CamelKolabIMAPXStore *self = NULL;
-	KolabFolderTypeID folder_type = KOLAB_FOLDER_TYPE_INVAL;
-	CamelFolderInfo *self_fi = NULL;
-	CamelFolderInfo *next_fi = NULL;
-	CamelFolderInfo *chld_fi = NULL;
-
-	g_assert (CAMEL_IS_SERVICE (service));
-	self = (CamelKolabIMAPXStore *)service;
-
-	if (fi == NULL)
-		return NULL;
-
-	next_fi = kolab_imapx_folder_info_build_restricted (service,
-	                                                    fi->next,
-	                                                    kmd,
-	                                                    do_care);
-
-	chld_fi = kolab_imapx_folder_info_build_restricted (service,
-	                                                    fi->child,
-	                                                    kmd,
-	                                                    do_care);
-
-	folder_type = kolab_imapx_folder_get_foldertype (service, fi, kmd);
-
-	if ((chld_fi != NULL) || (do_care[folder_type])) {
-		self_fi = camel_folder_info_new ();
-		if (fi->uri)
-			self_fi->uri = g_strdup (fi->uri);
-		if (fi->name)
-			self_fi->name = g_strdup (fi->name);
-		if (fi->full_name)
-			self_fi->full_name = g_strdup (fi->full_name);
-		self_fi->flags = fi->flags;
-		self_fi->unread = fi->unread;
-		self_fi->total = fi->total;
-		self_fi->next = next_fi;
-		self_fi->child = chld_fi;
-		if (self_fi->child != NULL)
-			self_fi->child->parent = self_fi;
-		if ((self->folder_context != KOLAB_FOLDER_CONTEXT_EMAIL) &&
-		    do_care[folder_type]) {
-			self->folder_names_do_care = g_list_prepend (self->folder_names_do_care,
-			                                             g_strdup (self_fi->full_name));
-		}
-		if (!do_care[folder_type]) {
-			self_fi->flags |= CAMEL_FOLDER_NOSELECT;
-			/* TODO check whether we need to (re)set more
-			 *	(e.g. unread=0, total=0, ...)
-			 */
-		}
-		return self_fi;
-	}
-
-	return next_fi;
-}
-
-static CamelFolderInfo*
-kolab_imapx_get_folder_info (CamelStore *store,
-                             const gchar *top,
-                             guint32 flags,
-                             CamelException *ex)
-{
-	CamelFolderInfo *fi = NULL;
-	CamelFolderInfo *k_fi = NULL;
-	CamelKolabIMAPXStore *ikstore = CAMEL_KOLAB_IMAPX_STORE (store);
-	CamelService *service = CAMEL_SERVICE (store);
-	CamelException *tmp_ex = NULL;
-
-	g_assert (CAMEL_IS_STORE (store));
-	/* 'top' may be NULL */
-	g_assert (ex != NULL);
-
-	tmp_ex = camel_exception_new ();
-
-	g_mutex_lock (ikstore->kolab_finfo_lock);
-
-	fi = (CAMEL_STORE_CLASS (parent_class))->get_folder_info (store,
-	                                                          top,
-	                                                          flags,
-	                                                          tmp_ex);
-	if (fi == NULL) {
-		g_warning ("%s: aborted.", __func__);
-		if (camel_exception_is_set (tmp_ex))
-			camel_exception_xfer (ex, tmp_ex);
-		else
-			camel_exception_free (tmp_ex);
-		g_mutex_unlock (ikstore->kolab_finfo_lock);
-		return NULL;
-	}
-
-	k_fi = kolab_imapx_folder_info_build_restricted (service,
-	                                                 fi,
-	                                                 ikstore->kmd,
-	                                                 ikstore->folder_types_do_care);
-	camel_store_free_folder_info (store, fi);
-
-	g_mutex_unlock (ikstore->kolab_finfo_lock);
-
-	camel_exception_free (tmp_ex);
-
-	return k_fi;
-}
-
-static CamelFolderInfo*
-kolab_imapx_create_folder (CamelStore *store,
-                           const gchar *parent_name,
-                           const gchar *folder_name,
-                           CamelException *ex)
-{
-	CamelFolderInfo *fi = NULL;
-	CamelFolderInfo *k_fi = NULL;
-	CamelKolabIMAPXStore *ikstore = CAMEL_KOLAB_IMAPX_STORE (store);
-	CamelService *service = CAMEL_SERVICE (store);
-	GError *tmp_err = NULL;
-	CamelException *tmp_ex = NULL;
-	gboolean metadata_ok = FALSE;
-	gchar *full_name = NULL;
-
-	g_assert (CAMEL_IS_STORE (store));
-	/* 'parent_name' may be NULL */
-	g_assert (folder_name != NULL);
-	g_assert (ex != NULL);
-
-	tmp_ex = camel_exception_new ();
-
-	fi = (CAMEL_STORE_CLASS (parent_class))->create_folder (store,
-	                                                        parent_name,
-	                                                        folder_name,
-	                                                        tmp_ex);
-	if (fi == NULL) {
-		g_warning ("%s: create [%s/%s] on server failed.",
-		           __func__, parent_name, folder_name);
-		if (camel_exception_is_set (tmp_ex))
-			camel_exception_xfer (ex, tmp_ex);
-		return NULL;
-	}
-
-	camel_exception_free (tmp_ex);
-
-	/* FIXME use Camel function(s) to create full_name */
-	full_name = g_strdup_printf ("%s/%s", parent_name, folder_name);
-	metadata_ok = kolab_imapx_meta_data_set_foldertype (ikstore->kmd,
-	                                                    service,
-	                                                    full_name,
-	                                                    ikstore->folder_create_type,
-	                                                    &tmp_err);
-	g_free (full_name);
-
-	if (!metadata_ok) {
-		g_warning ("%s: setting type [%i] for [%s] on server failed.",
-		           __func__, ikstore->folder_create_type, full_name);
-		camel_store_free_folder_info (store, fi);
-		kolab_camelexception_propagate_from_gerror (ex, tmp_err);
-		return NULL;
-	}
-
-	k_fi = kolab_imapx_folder_info_build_restricted (service,
-	                                                 fi,
-	                                                 ikstore->kmd,
-	                                                 ikstore->folder_types_do_care);
-	camel_store_free_folder_info (store, fi);
-	return k_fi;
-}
-
-static void
-kolab_imapx_delete_folder (CamelStore *store,
-                           const gchar *folder_name,
-                           CamelException *ex)
-{
-	CamelKolabIMAPXStore *ikstore = CAMEL_KOLAB_IMAPX_STORE (store);
-	CamelException *tmp_ex = NULL;
-	GError *tmp_err = NULL;
-	gboolean metadata_ok = FALSE;
-
-	g_assert (CAMEL_IS_STORE (store));
-	g_assert (folder_name != NULL);
-	g_assert (ex != NULL);
-
-	tmp_ex = camel_exception_new ();
-
-	(CAMEL_STORE_CLASS (parent_class))->delete_folder (store,
-	                                                   folder_name,
-	                                                   tmp_ex);
-	if (camel_exception_is_set (tmp_ex)) {
-		camel_exception_xfer (ex, tmp_ex);
-		return;
-	}
-	camel_exception_free (tmp_ex);
-
-	metadata_ok = kolab_imapx_meta_data_remove (ikstore->kmd,
-	                                            folder_name,
-	                                            &tmp_err);
-	if (!metadata_ok) {
-		kolab_camelexception_propagate_from_gerror (ex, tmp_err);
-		return;
-	}
-}
-
-/*----------------------------------------------------------------------------*/
-/* CamelObject initialization and shutdown */
-
-static void
-camel_kolab_imapx_store_class_init (CamelKolabIMAPXStoreClass *klass)
-{
-	CamelServiceClass *camel_service_class = NULL;
-	CamelServiceClass *parent_service_class = NULL;
-	CamelStoreClass *camel_store_class = NULL;
-	CamelStoreClass *parent_store_class = NULL;
-
-	g_assert (klass != NULL);
-
-	camel_service_class = CAMEL_SERVICE_CLASS (klass);
-	camel_store_class = CAMEL_STORE_CLASS (klass);
-
-	parent_class = CAMEL_IMAPX_STORE_CLASS (camel_type_get_global_classfuncs (__KOLAB_camel_imapx_store_get_type ()));
-	parent_service_class = CAMEL_SERVICE_CLASS (parent_class);
-	parent_store_class = CAMEL_STORE_CLASS (parent_class);
-
-	/* camel_service_class->construct = parent_service_class->construct; */
-	camel_service_class->construct = kolab_imapx_construct;
-
-	camel_service_class->query_auth_types = parent_service_class->query_auth_types;
-	camel_service_class->get_name = parent_service_class->get_name;
-
-	/* camel_service_class->connect = parent_service_class->connect; */
-	camel_service_class->connect = kolab_imapx_connect;
-
-	/* camel_service_class->disconnect = parent_service_class->disconnect; */
-	camel_service_class->disconnect = kolab_imapx_disconnect;
-
-	camel_store_class->get_trash = parent_store_class->get_trash;
-	camel_store_class->get_junk = parent_store_class->get_junk;
-	camel_store_class->noop = parent_store_class->noop;
-	camel_store_class->get_folder = parent_store_class->get_folder;
-	camel_store_class->get_inbox = parent_store_class->get_inbox;
-	camel_store_class->hash_folder_name = parent_store_class->hash_folder_name;
-	camel_store_class->compare_folder_name = parent_store_class->compare_folder_name;
-
-	/* camel_store_class->get_folder_info = parent_store_class->get_folder_info; */
-	camel_store_class->get_folder_info = kolab_imapx_get_folder_info;
-
-	camel_store_class->can_refresh_folder = parent_store_class->can_refresh_folder;
-
-	/* camel_store_class->create_folder = parent_store_class->create_folder; */
-	camel_store_class->create_folder = kolab_imapx_create_folder;
-
-	camel_store_class->rename_folder = parent_store_class->rename_folder;
-
-	/* camel_store_class->delete_folder = parent_store_class->delete_folder; */
-	camel_store_class->delete_folder = kolab_imapx_delete_folder;
-
-	camel_store_class->subscribe_folder = parent_store_class->subscribe_folder;
-	camel_store_class->unsubscribe_folder = parent_store_class->unsubscribe_folder;
-	camel_store_class->folder_subscribed = parent_store_class->folder_subscribed;
-	camel_store_class->free_folder_info = camel_store_free_folder_info_full;
-
-	camel_store_class->hash_folder_name = parent_store_class->hash_folder_name;
-	camel_store_class->compare_folder_name = parent_store_class->compare_folder_name;
-}
-
-static void
-camel_kolab_imapx_store_init (gpointer object,
-                              gpointer klass)
-{
-	CamelKolabIMAPXStore *ikstore = NULL;
-	gint ii = 0;
-
-	g_assert (klass != NULL);
-
-	ikstore = CAMEL_KOLAB_IMAPX_STORE (object);
-	ikstore->kmd = kolab_imapx_meta_data_new ();
-
-	ikstore->kolab_finfo_lock = g_mutex_new ();
-
-	/* folder types to care for with this kolab_imapx instance
-	 * Default: Email and unknown (so no need to reconfigure
-	 * this instance for use in Evo). Needs to be reconfigured
-	 * when used in ECal/EBook backends
-	 */
-	for (ii = 0; ii < KOLAB_FOLDER_LAST_TYPE; ii++)
-		ikstore->folder_types_do_care[ii] = FALSE;
-	ikstore->folder_types_do_care[KOLAB_FOLDER_TYPE_UNKNOWN] 	 = TRUE;
-	ikstore->folder_types_do_care[KOLAB_FOLDER_TYPE_EMAIL] 		 = TRUE;
-	ikstore->folder_types_do_care[KOLAB_FOLDER_TYPE_EMAIL_INBOX] 	 = TRUE;
-	ikstore->folder_types_do_care[KOLAB_FOLDER_TYPE_EMAIL_DRAFTS] 	 = TRUE;
-	ikstore->folder_types_do_care[KOLAB_FOLDER_TYPE_EMAIL_SENTITEMS] = TRUE;
-	ikstore->folder_types_do_care[KOLAB_FOLDER_TYPE_EMAIL_JUNKEMAIL] = TRUE;
-
-	ikstore->folder_names_do_care = NULL;
-
-	g_debug ("%s: done", __func__);
-}
-
-static void
-camel_kolab_imapx_store_finalize (CamelObject* object)
-{
-	CamelKolabIMAPXStore *store = NULL;
-	GError *tmp_err = NULL;
-	gboolean ok = FALSE;
-
-	store = CAMEL_KOLAB_IMAPX_STORE (object);
-
-	/* finalize parent */
-
-	/* finalize instance */
-	while (! g_mutex_trylock (store->kolab_finfo_lock));
-	g_mutex_unlock (store->kolab_finfo_lock);
-	g_mutex_free (store->kolab_finfo_lock);
-
-	/* TODO rework - there should not be I/O in finalize() */
-
-	/*------- metadata db -------*/
-	ok = kolab_imapx_meta_data_uninit (store->kmd, &tmp_err);
-	if (!ok) {
-		g_warning ("%s: metadata uninit error: %s",
-		           __func__,
-		           tmp_err->message);
-		g_error_free (tmp_err);
-		return;
-	}
-	kolab_imapx_meta_data_free (store->kmd);
-	g_debug ("%s: metadata uninitialized",
-	         __func__);
-
-	if (store->folder_names_do_care != NULL) {
-		GList *list_ptr = store->folder_names_do_care;
-		while (list_ptr != NULL) {
-			g_free (list_ptr);
-			list_ptr = g_list_next (list_ptr);
-		}
-		g_free (store->folder_names_do_care);
-	}
-
-	g_debug ("%s: done", __func__);
-}
-
-CamelType
-camel_kolab_imapx_store_get_type (void)
-{
-	static CamelType camel_kolab_imapx_store_type = CAMEL_INVALID_TYPE;
-
-	if (camel_kolab_imapx_store_type == CAMEL_INVALID_TYPE) {
-		camel_kolab_imapx_store_type = camel_type_register(__KOLAB_camel_imapx_store_get_type (),
-		                                                   "CamelKolabIMAPXStore",
-		                                                   sizeof (CamelKolabIMAPXStore),
-		                                                   sizeof (CamelKolabIMAPXStoreClass),
-		                                                   (CamelObjectClassInitFunc)camel_kolab_imapx_store_class_init,
-		                                                   NULL,
-		                                                   (CamelObjectInitFunc)camel_kolab_imapx_store_init,
-		                                                   camel_kolab_imapx_store_finalize);
-	}
-
-	g_assert (camel_kolab_imapx_store_type != CAMEL_INVALID_TYPE);
-	return camel_kolab_imapx_store_type;
-}
-
-gboolean
-kolab_imapx_store_set_folder_creation_type (CamelKolabIMAPXStore *store,
-                                            KolabFolderTypeID type_id)
-{
-	g_assert (CAMEL_IS_KOLAB_IMAPX_STORE (store));
-
-	/* TODO error reporting */
-
-	/* check that the given folder type id lies within the configured folder context */
-	if (! kolab_util_folder_type_match_with_context_id (type_id, store->folder_context))
-		return FALSE;
-
-	store->folder_create_type = type_id;
-
-	return TRUE;
-}
-
-gboolean
-kolab_imapx_store_set_folder_context (CamelKolabIMAPXStore *store,
-                                      KolabFolderContextID context)
-{
-	gint ii = 0;
-
-	g_assert (CAMEL_IS_KOLAB_IMAPX_STORE (store));
-	g_assert ((context > KOLAB_FOLDER_CONTEXT_INVAL) &&
-	          (context < KOLAB_FOLDER_LAST_CONTEXT));
-
-	for (ii = 0; ii < KOLAB_FOLDER_LAST_TYPE; ii++)
-		store->folder_types_do_care[ii] = FALSE;
-
-	store->folder_context = context;
-
-	switch (context) {
-	case KOLAB_FOLDER_CONTEXT_EMAIL:
-		store->folder_types_do_care[KOLAB_FOLDER_TYPE_UNKNOWN]		= TRUE;
-		store->folder_types_do_care[KOLAB_FOLDER_TYPE_EMAIL]		= TRUE;
-		store->folder_types_do_care[KOLAB_FOLDER_TYPE_EMAIL_INBOX]	= TRUE;
-		store->folder_types_do_care[KOLAB_FOLDER_TYPE_EMAIL_DRAFTS]	= TRUE;
-		store->folder_types_do_care[KOLAB_FOLDER_TYPE_EMAIL_SENTITEMS]	= TRUE;
-		store->folder_types_do_care[KOLAB_FOLDER_TYPE_EMAIL_JUNKEMAIL]	= TRUE;
-		break;
-	case KOLAB_FOLDER_CONTEXT_CALENDAR:
-		store->folder_types_do_care[KOLAB_FOLDER_TYPE_EVENT]		= TRUE;
-		store->folder_types_do_care[KOLAB_FOLDER_TYPE_EVENT_DEFAULT]	= TRUE;
-		store->folder_types_do_care[KOLAB_FOLDER_TYPE_JOURNAL]		= TRUE;
-		store->folder_types_do_care[KOLAB_FOLDER_TYPE_JOURNAL_DEFAULT]	= TRUE;
-		store->folder_types_do_care[KOLAB_FOLDER_TYPE_TASK]		= TRUE;
-		store->folder_types_do_care[KOLAB_FOLDER_TYPE_TASK_DEFAULT]	= TRUE;
-		store->folder_types_do_care[KOLAB_FOLDER_TYPE_NOTE]		= TRUE;
-		store->folder_types_do_care[KOLAB_FOLDER_TYPE_NOTE_DEFAULT]	= TRUE;
-		break;
-	case KOLAB_FOLDER_CONTEXT_CONTACT:
-		store->folder_types_do_care[KOLAB_FOLDER_TYPE_CONTACT]		= TRUE;
-		store->folder_types_do_care[KOLAB_FOLDER_TYPE_CONTACT_DEFAULT]	= TRUE;
-		break;
-	default:
-		/* can't happen */
-		g_assert_not_reached ();
-	}
-
-	return TRUE;
-}
-
-KolabFolderTypeID
-kolab_imapx_store_get_folder_type (CamelKolabIMAPXStore *store,
-                                   const gchar *foldername,
-                                   GError **err)
-{
-	/* TODO merge this with kolab_imapx_folder_get_foldertype() */
-
-	KolabFolderTypeID folder_type = KOLAB_FOLDER_TYPE_INVAL;
-	GError *tmp_err = NULL;
-
-	g_assert (CAMEL_IS_KOLAB_IMAPX_STORE (store));
-	g_assert (foldername != NULL);
-	g_return_val_if_fail (err == NULL || *err == NULL, FALSE);
-
-	folder_type = kolab_imapx_meta_data_get_foldertype (store->kmd,
-	                                                    CAMEL_SERVICE (store),
-	                                                    foldername,
-	                                                    TRUE,
-	                                                    &tmp_err);
-	if (tmp_err != NULL) {
-		g_propagate_error (err, tmp_err);
-		return KOLAB_FOLDER_TYPE_INVAL;
-	}
-
-	return folder_type;
-}
-
-void
-kolab_imapx_store_logout_sync (CamelKolabIMAPXStore *store)
-{
-	CamelIMAPXServer *iserver = NULL;
-	gboolean ok = FALSE;
-	CamelException *tmp_ex = NULL;
-
-	g_assert (CAMEL_IS_KOLAB_IMAPX_STORE (store));
-
-	tmp_ex = camel_exception_new ();
-	iserver = __KOLAB_camel_imapx_store_get_server (CAMEL_IMAPX_STORE (store),
-	                                                tmp_ex);
-	if (camel_exception_is_set (tmp_ex)) {
-		g_warning ("%s: could not get server: %s",
-		           __func__,
-		           camel_exception_get_description (tmp_ex));
-		camel_exception_free (tmp_ex);
-		if (iserver != NULL)
-			camel_object_unref (iserver);
-		return;
-	}
-
-	g_assert (CAMEL_IS_IMAPX_SERVER (iserver));
-
-	ok = __KOLAB_imapx_server_logout_sync (iserver, tmp_ex);
-
-	camel_object_unref (iserver);
-	if (! ok) {
-		g_debug ("%s: %s",
-		         __func__,
-		         camel_exception_get_description (tmp_ex));
-	}
-	camel_exception_free (tmp_ex);
-}
-
-GList*
-kolab_imapx_store_resect_folder_list (CamelKolabIMAPXStore *store)
-{
-	GList *folder_list = NULL;
-
-	g_assert (CAMEL_IS_KOLAB_IMAPX_STORE (store));
-
-	g_mutex_lock (store->kolab_finfo_lock);
-
-	folder_list = store->folder_names_do_care;
-	store->folder_names_do_care = NULL;
-
-	g_mutex_unlock (store->kolab_finfo_lock);
-
-	return folder_list;
-}
-
-#endif
diff --git a/src/camel/camel-kolab-imapx-store.h b/src/camel/camel-kolab-imapx-store.h
index e2d2ed2..e761c27 100644
--- a/src/camel/camel-kolab-imapx-store.h
+++ b/src/camel/camel-kolab-imapx-store.h
@@ -115,12 +115,6 @@ camel_kolab_imapx_store_get_folder_type (CamelKolabIMAPXStore *self,
 GList*
 camel_kolab_imapx_store_resect_folder_list (CamelKolabIMAPXStore *self);
 
-/* send a LOGOUT to the server (still neeed??) */
-gboolean
-camel_kolab_imapx_store_logout_sync (CamelKolabIMAPXStore *self,
-                                     GCancellable *cancellable,
-                                     GError **err);
-
 G_END_DECLS
 
 /*----------------------------------------------------------------------------*/



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