[evolution-kolab/ek-wip-porting] CamelIMAPXExtdFolder: implemented new() API function



commit 4cc133d8aec3629dd49db2b41337eb74d558e5a0
Author: Christian Hilberg <hilberg kernelconcepts de>
Date:   Wed Jan 18 15:41:33 2012 +0100

    CamelIMAPXExtdFolder: implemented new() API function
    
    * implemented camel_imapx_extd_folder_new()
    * it is a modified dupe of camel_imapx_folder_new(),
      since we cannot change a CamelFolder's type once
      it has been created

 .../providers/imapx/camel-imapx-extd-folder.c      |  108 +++++++++++++++++---
 .../providers/imapx/camel-imapx-extd-folder.h      |    2 +-
 2 files changed, 95 insertions(+), 15 deletions(-)
---
diff --git a/src/camel/providers/imapx/camel-imapx-extd-folder.c b/src/camel/providers/imapx/camel-imapx-extd-folder.c
index 4c351ec..4ad6dcf 100644
--- a/src/camel/providers/imapx/camel-imapx-extd-folder.c
+++ b/src/camel/providers/imapx/camel-imapx-extd-folder.c
@@ -29,6 +29,10 @@
 #include <config.h>
 #endif
 
+#include <string.h>
+#include <glib/gi18n-lib.h>
+
+#include "camel-imapx-summary.h"
 #include "camel-imapx-extd-folder.h"
 
 /*----------------------------------------------------------------------------*/
@@ -354,26 +358,102 @@ camel_imapx_extd_folder_class_init (CamelIMAPXExtdFolderClass *klass)
 
 CamelIMAPXExtdFolder*
 camel_imapx_extd_folder_new (CamelIMAPXExtdStore *store,
-                             const gchar *folderdir,
-                             const gchar *foldername,
+                             const gchar *folder_dir,
+                             const gchar *folder_name,
                              GError **err)
 {
-	CamelIMAPXExtdFolder *folder = NULL;
+	/* This function is a modified dupe of camel_imapx_folder_new() in
+	 * CamelIMAPXFolder.
+	 * We need to dupe it in order to return a CamelIMAPXExtdFolder
+	 * Upstream fixes need to be applied here, too.
+	 */
+
+	CamelFolder *folder = NULL;
+	CamelIMAPXFolder *ifolder = NULL;
+	CamelIMAPXExtdFolder *efolder = NULL;
+	CamelService *service = NULL;
+	CamelSettings *settings = NULL;
+	const gchar *short_name = NULL;
+	gchar *state_file = NULL;
+	gboolean filter_inbox = FALSE;
+	gboolean filter_junk = FALSE;
+	gboolean filter_junk_inbox = FALSE;
 
 	g_assert (CAMEL_IS_IMAPX_EXTD_STORE (store));
-	g_assert (folderdir != NULL);
-	g_assert (foldername != NULL);
+	g_assert (folder_dir != NULL);
+	g_assert (folder_name != NULL);
 	g_return_val_if_fail (err == NULL || *err == NULL, NULL);
 
-	/* FIXME implement me
-	 *
-	 * We'll need to dupe camel_imapx_folder_new() here
-	 * and create our extd types
-	 *
-	 */
-	g_error ("%s: FIXME implement me", __func__);
-
-	return folder;
+	g_debug ("%s: opening imap folder '%s'\n",
+	         __func__, folder_dir);
+
+	service = CAMEL_SERVICE (store);
+	settings = camel_service_get_settings (service);
+
+	g_object_get (settings,
+	              "filter-inbox", &filter_inbox,
+	              "filter-junk", &filter_junk,
+	              "filter-junk-inbox", &filter_junk_inbox,
+	              NULL);
+
+	short_name = strrchr (folder_name, '/');
+	if (short_name)
+		short_name++;
+	else
+		short_name = folder_name;
+
+	efolder = g_object_new (CAMEL_TYPE_IMAPX_EXTD_FOLDER,
+	                        "display-name", short_name,
+	                        "full_name", folder_name,
+	                        "parent-store", store, NULL);
+	ifolder = CAMEL_IMAPX_FOLDER (efolder);
+	folder  = CAMEL_FOLDER (efolder);
+
+	ifolder->raw_name = g_strdup (folder_name);
+
+	folder->summary = camel_imapx_summary_new (folder);
+	if (!folder->summary) {
+		g_set_error (err,
+		             CAMEL_ERROR, CAMEL_ERROR_GENERIC,
+		             _("Could not create folder summary for %s"),
+		             short_name);
+		return NULL;
+	}
+
+	ifolder->cache = camel_data_cache_new (folder_dir, err);
+	if (!ifolder->cache) {
+		g_prefix_error (err,
+		                _("Could not create cache for %s: "),
+		                short_name);
+		return NULL;
+	}
+
+	state_file = g_build_filename (folder_dir, "cmeta", NULL);
+	camel_object_set_state_filename (CAMEL_OBJECT (folder), state_file);
+	g_free (state_file);
+	camel_object_state_read (CAMEL_OBJECT (folder));
+
+	ifolder->search = camel_folder_search_new ();
+	ifolder->search_lock = g_mutex_new ();
+	ifolder->stream_lock = g_mutex_new ();
+	ifolder->ignore_recent = g_hash_table_new_full (g_str_hash, g_str_equal, (GDestroyNotify) g_free, NULL);
+	ifolder->exists_on_server = 0;
+	ifolder->unread_on_server = 0;
+	ifolder->modseq_on_server = 0;
+	ifolder->uidnext_on_server = 0;
+
+	if (!g_ascii_strcasecmp (folder_name, "INBOX")) {
+		if (filter_inbox)
+			folder->folder_flags |= CAMEL_FOLDER_FILTER_RECENT;
+		if (filter_junk)
+			folder->folder_flags |= CAMEL_FOLDER_FILTER_JUNK;
+	} else if (filter_junk && !filter_junk_inbox)
+		folder->folder_flags |= CAMEL_FOLDER_FILTER_JUNK;
+
+	camel_store_summary_connect_folder_summary (CAMEL_STORE_SUMMARY (CAMEL_IMAPX_STORE (store)->summary),
+	                                            folder_name, folder->summary);
+
+	return efolder;
 }
 
 guint64
diff --git a/src/camel/providers/imapx/camel-imapx-extd-folder.h b/src/camel/providers/imapx/camel-imapx-extd-folder.h
index 2219e99..3703076 100644
--- a/src/camel/providers/imapx/camel-imapx-extd-folder.h
+++ b/src/camel/providers/imapx/camel-imapx-extd-folder.h
@@ -80,7 +80,7 @@ camel_imapx_extd_folder_get_type (void);
 CamelIMAPXExtdFolder*
 camel_imapx_extd_folder_new (CamelIMAPXExtdStore *store,
                              const gchar *folder_dir,
-                             const gchar *foldername,
+                             const gchar *folder_name,
                              GError **err);
 
 guint64



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