[evolution-kolab/ek-wip-porting] CamelIMAPXExtdStore: create CamelIMAPXExtdFolder instances



commit b905c7c1fb5a8bb337d4de5f7b842a688ef7a1bd
Author: Christian Hilberg <hilberg kernelconcepts de>
Date:   Mon Jan 16 18:59:00 2012 +0100

    CamelIMAPXExtdStore: create CamelIMAPXExtdFolder instances
    
    * return CamelIMAPXExtdFolder instances when queried for
      a folder (instead of CamelIMAPXFolder)
    * requires some code dupe from CamelIMAPXStore so we
      can allocate our own type
    * minor internal cleanup (function param renaming)

 src/camel/providers/imapx/camel-imapx-extd-store.c |  140 ++++++++++++++------
 1 files changed, 99 insertions(+), 41 deletions(-)
---
diff --git a/src/camel/providers/imapx/camel-imapx-extd-store.c b/src/camel/providers/imapx/camel-imapx-extd-store.c
index ce7be3f..0f1ad26 100644
--- a/src/camel/providers/imapx/camel-imapx-extd-store.c
+++ b/src/camel/providers/imapx/camel-imapx-extd-store.c
@@ -29,9 +29,12 @@
 #include <config.h>
 #endif
 
+#include <glib/gi18n-lib.h>
+
 #include <libekolabutil/camel-system-headers.h>
 
 #include "camel-imapx-settings.h"
+#include "camel-imapx-utils.h"
 #include "camel-imapx-extd-conn-manager.h"
 #include "camel-imapx-extd-folder.h"
 #include "camel-imapx-extd-store.h"
@@ -118,34 +121,92 @@ camel_imapx_extd_store_finalize (GObject *object)
 }
 
 /*----------------------------------------------------------------------------*/
+/* internal statics */
+
+static CamelFolder*
+extd_store_get_folder_offline (CamelStore *self,
+                               const gchar *folder_name,
+                               guint32 flags,
+                               GError **err)
+{
+	/* This function is a dupe of get_folder_offline() in CamelIMAPXStore.
+	 * We need to dupe it in order to return a CamelIMAPXExtdFolder
+	 * (disguised as a CamelFolder). Upstream fixes need to be applied
+	 * here, too.
+	 */
+
+	CamelIMAPXExtdStore *myself = CAMEL_IMAPX_EXTD_STORE (self);
+	CamelIMAPXStore *imapx_store = CAMEL_IMAPX_STORE (self);
+	CamelService *service = CAMEL_SERVICE (self);
+	CamelFolder *new_folder = NULL;
+	CamelStoreInfo *si = NULL;
+	const gchar *user_cache_dir = NULL;
+
+	user_cache_dir = camel_service_get_user_cache_dir (service);
+
+	si = camel_store_summary_path (CAMEL_STORE_SUMMARY (imapx_store->summary), folder_name);
+	if (si) {
+		gchar *folder_dir, *storage_path;
+
+		/* Note: Although the INBOX is defined to be case-insensitive in the IMAP RFC
+		 * it is still up to the server how to acutally name it in a LIST response. Since
+		 * we stored the name as the server provided it us in the summary we take that name
+		 * to look up the folder.
+		 * But for the on-disk cache we do always capitalize the Inbox no matter what the
+		 * server provided.
+		 */
+		if (!g_ascii_strcasecmp (folder_name, "INBOX"))
+			folder_name = "INBOX";
+
+		storage_path = g_build_filename (user_cache_dir, "folders", NULL);
+		folder_dir = imapx_path_to_physical (storage_path, folder_name);
+		g_free (storage_path);
+		/* FIXME (create CamelIMAPXExtdFolder) */
+		new_folder = CAMEL_FOLDER (camel_imapx_extd_folder_new (myself,
+		                                                        folder_dir,
+		                                                        folder_name,
+		                                                        err));
+		g_free (folder_dir);
+		camel_store_summary_info_free (CAMEL_STORE_SUMMARY (imapx_store->summary), si);
+	} else {
+		g_set_error (err,
+		             CAMEL_STORE_ERROR,
+		             CAMEL_STORE_ERROR_NO_FOLDER,
+		             _("No such folder %s"), folder_name);
+	}
+
+	return new_folder;
+}
+
+/*----------------------------------------------------------------------------*/
 /* class functions */
 
 static gboolean
-imapx_extd_store_can_refresh_folder (CamelStore *store,
+imapx_extd_store_can_refresh_folder (CamelStore *self,
                                      CamelFolderInfo *info,
                                      GError **err)
 {
 	gboolean can = FALSE;
 
-	g_assert (CAMEL_IS_IMAPX_EXTD_STORE (store));
+	g_assert (CAMEL_IS_IMAPX_EXTD_STORE (self));
 	g_return_val_if_fail (err == NULL || *err == NULL, FALSE);
 
-	can = parent_store_class->can_refresh_folder (store,
+	can = parent_store_class->can_refresh_folder (self,
 	                                              info,
 	                                              err);
 	return can;
 }
 
 static void
-imapx_extd_store_free_folder_info (CamelStore *store,
+imapx_extd_store_free_folder_info (CamelStore *self,
                                    CamelFolderInfo *fi)
 {
-	g_assert (CAMEL_IS_IMAPX_EXTD_STORE (store));
-	parent_store_class->free_folder_info (store, fi);
+	g_assert (CAMEL_IS_IMAPX_EXTD_STORE (self));
+	parent_store_class->free_folder_info (self, fi);
 }
 
 static CamelFolder*
-imapx_extd_store_get_folder_sync (CamelStore *store,
+imapx_extd_store_get_folder_sync (CamelStore *self,
                                   const gchar *foldername,
                                   CamelStoreGetFolderFlags flags,
                                   GCancellable *cancellable,
@@ -153,23 +214,20 @@ imapx_extd_store_get_folder_sync (CamelStore *store,
 {
 	CamelFolder *folder = NULL;
 
-	g_assert (CAMEL_IS_IMAPX_EXTD_STORE (store));
-	/* cancellable may be NULL */
+	g_assert (CAMEL_IS_IMAPX_EXTD_STORE (self));
+	g_assert (foldername != NULL);
+	(void)cancellable;
 	g_return_val_if_fail (err == NULL || *err == NULL, NULL);
 
-	folder = parent_store_class->get_folder_sync (store,
-	                                              foldername,
-	                                              flags,
-	                                              cancellable,
-	                                              err);
-	if (folder != NULL)
-		g_assert (CAMEL_IS_IMAPX_EXTD_FOLDER (folder));
-
+	folder = extd_store_get_folder_offline (self,
+	                                        foldername,
+	                                        flags,
+	                                        err);
 	return folder;
 }
 
 static CamelFolderInfo*
-imapx_extd_store_get_folder_info_sync (CamelStore *store,
+imapx_extd_store_get_folder_info_sync (CamelStore *self,
                                        const gchar *top,
                                        CamelStoreGetFolderInfoFlags flags,
                                        GCancellable *cancellable,
@@ -177,12 +235,12 @@ imapx_extd_store_get_folder_info_sync (CamelStore *store,
 {
 	CamelFolderInfo *fi = NULL;
 
-	g_assert (CAMEL_IS_IMAPX_EXTD_STORE (store));
+	g_assert (CAMEL_IS_IMAPX_EXTD_STORE (self));
 	/* top may be NULL */ /* FIXME correct? */
 	/* cancellable may be NULL */
 	g_return_val_if_fail (err == NULL || *err == NULL, NULL);
 
-	fi = parent_store_class->get_folder_info_sync (store,
+	fi = parent_store_class->get_folder_info_sync (self,
 	                                               top,
 	                                               flags,
 	                                               cancellable,
@@ -191,17 +249,17 @@ imapx_extd_store_get_folder_info_sync (CamelStore *store,
 }
 
 static CamelFolder*
-imapx_extd_store_get_junk_folder_sync (CamelStore *store,
+imapx_extd_store_get_junk_folder_sync (CamelStore *self,
                                        GCancellable *cancellable,
                                        GError **err)
 {
 	CamelFolder *folder = NULL;
 
-	g_assert (CAMEL_IS_IMAPX_EXTD_STORE (store));
+	g_assert (CAMEL_IS_IMAPX_EXTD_STORE (self));
 	/* cancellable may be NULL */
 	g_return_val_if_fail (err == NULL || *err == NULL, NULL);
 
-	folder = parent_store_class->get_junk_folder_sync (store,
+	folder = parent_store_class->get_junk_folder_sync (self,
 	                                                   cancellable,
 	                                                   err);
 	if (folder != NULL)
@@ -211,17 +269,17 @@ imapx_extd_store_get_junk_folder_sync (CamelStore *store,
 }
 
 static CamelFolder*
-imapx_extd_store_get_trash_folder_sync (CamelStore *store,
+imapx_extd_store_get_trash_folder_sync (CamelStore *self,
                                         GCancellable *cancellable,
                                         GError **err)
 {
 	CamelFolder *folder = NULL;
 
-	g_assert (CAMEL_IS_IMAPX_EXTD_STORE (store));
+	g_assert (CAMEL_IS_IMAPX_EXTD_STORE (self));
 	/* cancellable may be NULL */
 	g_return_val_if_fail (err == NULL || *err == NULL, NULL);
 
-	folder = parent_store_class->get_trash_folder_sync (store,
+	folder = parent_store_class->get_trash_folder_sync (self,
 	                                                    cancellable,
 	                                                    err);
 	if (folder != NULL)
@@ -231,7 +289,7 @@ imapx_extd_store_get_trash_folder_sync (CamelStore *store,
 }
 
 static CamelFolderInfo*
-imapx_extd_store_create_folder_sync (CamelStore *store,
+imapx_extd_store_create_folder_sync (CamelStore *self,
                                      const gchar *parentname,
                                      const gchar *foldername,
                                      GCancellable *cancellable,
@@ -239,13 +297,13 @@ imapx_extd_store_create_folder_sync (CamelStore *store,
 {
 	CamelFolderInfo *fi = NULL;
 
-	g_assert (CAMEL_IS_IMAPX_EXTD_STORE (store));
+	g_assert (CAMEL_IS_IMAPX_EXTD_STORE (self));
 	/* parentname may be NULL */ /* FIXME correct? */
 	g_assert (foldername != NULL);
 	/* cancellable may be NULL */
 	g_return_val_if_fail (err == NULL || *err == NULL, NULL);
 
-	fi = parent_store_class->create_folder_sync (store,
+	fi = parent_store_class->create_folder_sync (self,
 	                                             parentname,
 	                                             foldername,
 	                                             cancellable,
@@ -254,19 +312,19 @@ imapx_extd_store_create_folder_sync (CamelStore *store,
 }
 
 static gboolean
-imapx_extd_store_delete_folder_sync (CamelStore *store,
+imapx_extd_store_delete_folder_sync (CamelStore *self,
                                      const gchar *foldername,
                                      GCancellable *cancellable,
                                      GError **err)
 {
 	gboolean ok = FALSE;
 
-	g_assert (CAMEL_IS_IMAPX_EXTD_STORE (store));
+	g_assert (CAMEL_IS_IMAPX_EXTD_STORE (self));
 	g_assert (foldername != NULL);
 	/* cancellable may be NULL */
 	g_return_val_if_fail (err == NULL || *err == NULL, FALSE);
 
-	ok = parent_store_class->delete_folder_sync (store,
+	ok = parent_store_class->delete_folder_sync (self,
 	                                             foldername,
 	                                             cancellable,
 	                                             err);
@@ -274,7 +332,7 @@ imapx_extd_store_delete_folder_sync (CamelStore *store,
 }
 
 static gboolean
-imapx_extd_store_rename_folder_sync (CamelStore *store,
+imapx_extd_store_rename_folder_sync (CamelStore *self,
                                      const gchar *oldname,
                                      const gchar *newname,
                                      GCancellable *cancellable,
@@ -282,13 +340,13 @@ imapx_extd_store_rename_folder_sync (CamelStore *store,
 {
 	gboolean ok = FALSE;
 
-	g_assert (CAMEL_IS_IMAPX_EXTD_STORE (store));
+	g_assert (CAMEL_IS_IMAPX_EXTD_STORE (self));
 	g_assert (oldname != NULL);
 	g_assert (newname != NULL);
 	/* cancellable may be NULL */
 	g_return_val_if_fail (err == NULL || *err == NULL, FALSE);
 
-	ok = parent_store_class->rename_folder_sync (store,
+	ok = parent_store_class->rename_folder_sync (self,
 	                                             oldname,
 	                                             newname,
 	                                             cancellable,
@@ -297,18 +355,18 @@ imapx_extd_store_rename_folder_sync (CamelStore *store,
 }
 
 static gboolean
-imapx_extd_store_synchronize_sync (CamelStore *store,
+imapx_extd_store_synchronize_sync (CamelStore *self,
                                    gboolean expunge,
                                    GCancellable *cancellable,
                                    GError **err)
 {
 	gboolean ok = FALSE;
 
-	g_assert (CAMEL_IS_IMAPX_EXTD_STORE (store));
+	g_assert (CAMEL_IS_IMAPX_EXTD_STORE (self));
 	/* cancellable may be NULL */
 	g_return_val_if_fail (err == NULL || *err == NULL, FALSE);
 
-	ok = parent_store_class->synchronize_sync (store,
+	ok = parent_store_class->synchronize_sync (self,
 	                                           expunge,
 	                                           cancellable,
 	                                           err);
@@ -316,17 +374,17 @@ imapx_extd_store_synchronize_sync (CamelStore *store,
 }
 
 static gboolean
-imapx_extd_store_noop_sync (CamelStore *store,
+imapx_extd_store_noop_sync (CamelStore *self,
                             GCancellable *cancellable,
                             GError **err)
 {
 	gboolean ok = FALSE;
 
-	g_assert (CAMEL_IS_IMAPX_EXTD_STORE (store));
+	g_assert (CAMEL_IS_IMAPX_EXTD_STORE (self));
 	/* cancellable may be NULL */
 	g_return_val_if_fail (err == NULL || *err == NULL, FALSE);
 
-	ok = parent_store_class->noop_sync (store,
+	ok = parent_store_class->noop_sync (self,
 	                                    cancellable,
 	                                    err);
 	return ok;



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