[evolution-kolab/ek-wip-porting] CamelIMAPXExtdStore: create CamelIMAPXExtdFolder instances
- From: Christian Hilberg <chilberg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution-kolab/ek-wip-porting] CamelIMAPXExtdStore: create CamelIMAPXExtdFolder instances
- Date: Mon, 16 Jan 2012 18:24:06 +0000 (UTC)
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]