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



commit b0a21cd668fb6ee473a8eda890ea1c132644c732
Author: Christian Hilberg <hilberg kernelconcepts de>
Date:   Wed Jan 18 15:43:26 2012 +0100

    CamelKolabIMAPXFolder: implemented new() API function
    
    * implemented camel_kolab_imapx_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

 src/camel/camel-kolab-imapx-folder.c |  109 +++++++++++++++++++++++++++++----
 src/camel/camel-kolab-imapx-folder.h |    2 +-
 2 files changed, 96 insertions(+), 15 deletions(-)
---
diff --git a/src/camel/camel-kolab-imapx-folder.c b/src/camel/camel-kolab-imapx-folder.c
index 6c84b4d..cd66e11 100644
--- a/src/camel/camel-kolab-imapx-folder.c
+++ b/src/camel/camel-kolab-imapx-folder.c
@@ -29,6 +29,11 @@
 #include <config.h>
 #endif
 
+#include <string.h>
+#include <glib/gi18n-lib.h>
+
+#include <camel/providers/imapx/camel-imapx-summary.h>
+
 #include "camel-kolab-imapx-store.h"
 #include "camel-kolab-imapx-folder.h"
 
@@ -111,26 +116,102 @@ camel_kolab_imapx_folder_class_init (CamelKolabIMAPXFolderClass *klass)
 
 CamelKolabIMAPXFolder*
 camel_kolab_imapx_folder_new (CamelKolabIMAPXStore *store,
-                             const gchar *folderdir,
-                             const gchar *foldername,
+                             const gchar *folder_dir,
+                             const gchar *folder_name,
                              GError **err)
 {
-	CamelKolabIMAPXFolder *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;
+	CamelKolabIMAPXFolder *kfolder = 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_KOLAB_IMAPX_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;
+
+	kfolder = g_object_new (CAMEL_TYPE_IMAPX_EXTD_FOLDER,
+	                        "display-name", short_name,
+	                        "full_name", folder_name,
+	                        "parent-store", store, NULL);
+	ifolder = CAMEL_IMAPX_FOLDER (kfolder);
+	folder  = CAMEL_FOLDER (kfolder);
+
+	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 kfolder;
 }
 
 guint64
diff --git a/src/camel/camel-kolab-imapx-folder.h b/src/camel/camel-kolab-imapx-folder.h
index d212650..4c7303e 100644
--- a/src/camel/camel-kolab-imapx-folder.h
+++ b/src/camel/camel-kolab-imapx-folder.h
@@ -99,7 +99,7 @@ camel_kolab_imapx_folder_get_type (void);
 CamelKolabIMAPXFolder*
 camel_kolab_imapx_folder_new (struct _CamelKolabIMAPXStore *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]