[evolution-kolab/ek-wip-porting] CamelIMAPXExtdFolder: local implementations for CamelFolder virtual functions



commit afaffcaf69be31f1e4eae8950882a10ec32cb0e9
Author: Christian Hilberg <hilberg kernelconcepts de>
Date:   Wed Jan 11 20:22:26 2012 +0100

    CamelIMAPXExtdFolder: local implementations for CamelFolder virtual functions
    
    * implemented local static functions to bind on
      CamelFolder virtual functions
    * this is to allow for CamelIMAPXExtdFolder type checking
      and for later extension of a number of these functions
      as well as better subclassing (CamelKolabIMAPXFolder)
    * presently, these functions do the type checking and
      then they chain up to the parent's implementation

 .../providers/imapx/camel-imapx-extd-folder.c      |  320 ++++++++++++++++++--
 .../providers/imapx/camel-imapx-extd-folder.h      |   10 +
 2 files changed, 309 insertions(+), 21 deletions(-)
---
diff --git a/src/camel/providers/imapx/camel-imapx-extd-folder.c b/src/camel/providers/imapx/camel-imapx-extd-folder.c
index 1ec0f35..501d5ba 100644
--- a/src/camel/providers/imapx/camel-imapx-extd-folder.c
+++ b/src/camel/providers/imapx/camel-imapx-extd-folder.c
@@ -33,10 +33,14 @@
 
 /*----------------------------------------------------------------------------*/
 
+static CamelFolderClass *parent_folder_class = NULL;
+
+/*----------------------------------------------------------------------------*/
+
 G_DEFINE_TYPE (CamelIMAPXExtdFolder, camel_imapx_extd_folder, CAMEL_TYPE_IMAPX_FOLDER)
 
 /*----------------------------------------------------------------------------*/
-/* object/class init */
+/* object init */
 
 static void
 camel_imapx_extd_folder_init (CamelIMAPXExtdFolder *self)
@@ -60,49 +64,323 @@ camel_imapx_extd_folder_finalize (GObject *object)
 	G_OBJECT_CLASS (camel_imapx_extd_folder_parent_class)->finalize (object);
 }
 
+/*----------------------------------------------------------------------------*/
+/* class functions */
+
+static GPtrArray*
+imapx_extd_folder_search_by_expression (CamelFolder *self,
+                                        const gchar *expression,
+                                        GError **err)
+{
+	GPtrArray *result = NULL;
+
+	g_assert (CAMEL_IS_IMAPX_EXTD_FOLDER (self));
+	g_assert (expression != NULL);
+	g_return_val_if_fail (err == NULL || *err == NULL, NULL);
+
+	result = parent_folder_class->search_by_expression (self,
+	                                                    expression,
+	                                                    err);
+	return result;
+}
+
+static GPtrArray*
+imapx_extd_folder_search_by_uids (CamelFolder *self,
+                                  const gchar *expression,
+                                  GPtrArray *uids,
+                                  GError **err)
+{
+	GPtrArray *result = NULL;
+
+	g_assert (CAMEL_IS_IMAPX_EXTD_FOLDER (self));
+	g_assert (expression != NULL);
+	g_assert (uids != NULL);
+	g_return_val_if_fail (err == NULL || *err == NULL, NULL);
+
+	result = parent_folder_class->search_by_uids (self,
+	                                              expression,
+	                                              uids,
+	                                              err);
+	return result;
+}
+
+static guint32
+imapx_extd_folder_count_by_expression (CamelFolder *self,
+                                       const gchar *expression,
+                                       GError **err)
+{
+	guint32 count = 0;
+
+	g_assert (CAMEL_IS_IMAPX_EXTD_FOLDER (self));
+	g_assert (expression != NULL);
+	g_return_val_if_fail (err == NULL || *err == NULL, 0);
+
+	count = parent_folder_class->count_by_expression (self,
+	                                                  expression,
+	                                                  err);
+	return count;
+}
+
+static void
+imapx_extd_folder_search_free (CamelFolder *self,
+                               GPtrArray *result)
+{
+	g_assert (CAMEL_IS_IMAPX_EXTD_FOLDER (self));
+	g_assert (result != NULL);
+
+	parent_folder_class->search_free (self, result);
+}
+
+static gchar*
+imapx_extd_folder_get_filename (CamelFolder *self,
+                                const gchar *uid,
+                                GError **err)
+{
+	gchar *filename = NULL;
+
+	g_assert (CAMEL_IS_IMAPX_EXTD_FOLDER (self));
+	g_assert (uid != NULL);
+	g_return_val_if_fail (err == NULL || *err == NULL, NULL);
+
+	filename = parent_folder_class->get_filename (self,
+	                                              uid,
+	                                              err);
+	return filename;
+}
+
+static gboolean
+imapx_extd_folder_append_message_sync (CamelFolder *self,
+                                       CamelMimeMessage *message,
+                                       CamelMessageInfo *finfo,
+                                       gchar **appended_uid,
+                                       GCancellable *cancellable,
+                                       GError **err)
+{
+	gboolean ok = FALSE;
+
+	g_assert (CAMEL_IS_IMAPX_EXTD_FOLDER (self));
+	g_assert (CAMEL_IS_MIME_MESSAGE (message));
+	/* info may be NULL */ /* FIXME correct? */
+	g_assert (*appended_uid == NULL);
+	/* cancellable may be NULL */
+	g_return_val_if_fail (err == NULL || *err == NULL, FALSE);
+
+	ok = parent_folder_class->append_message_sync (self,
+	                                               message,
+	                                               finfo,
+	                                               appended_uid,
+	                                               cancellable,
+	                                               err);
+	return ok;
+}
+
+static gboolean
+imapx_extd_folder_expunge_sync (CamelFolder *self,
+                                GCancellable *cancellable,
+                                GError **err)
+{
+	gboolean ok = FALSE;
+
+	g_assert (CAMEL_IS_IMAPX_EXTD_FOLDER (self));
+	/* cancellable may be NULL */
+	g_return_val_if_fail (err == NULL || *err == NULL, FALSE);
+
+	ok = parent_folder_class->expunge_sync (self,
+	                                        cancellable,
+	                                        err);
+	return ok;
+}
+
+static CamelMimeMessage*
+imapx_extd_folder_get_message_sync (CamelFolder *self,
+                                    const gchar *message_uid,
+                                    GCancellable *cancellable,
+                                    GError **err)
+{
+	CamelMimeMessage *msg = NULL;
+
+	g_assert (CAMEL_IS_IMAPX_EXTD_FOLDER (self));
+	g_assert (message_uid != NULL);
+	/* cancellable may be NULL */
+	g_return_val_if_fail (err == NULL || *err == NULL, NULL);
+
+	msg = parent_folder_class->get_message_sync (self,
+	                                             message_uid,
+	                                             cancellable,
+	                                             err);
+	return msg;
+}
+
+static gboolean
+imapx_extd_folder_refresh_info_sync (CamelFolder *self,
+                                     GCancellable *cancellable,
+                                     GError **err)
+{
+	gboolean ok = FALSE;
+
+	g_assert (CAMEL_IS_IMAPX_EXTD_FOLDER (self));
+	/* cancellable may be NULL */
+	g_return_val_if_fail (err == NULL || *err == NULL, FALSE);
+
+	ok = parent_folder_class->refresh_info_sync (self,
+	                                             cancellable,
+	                                             err);
+	return ok;
+}
+
+static gboolean
+imapx_extd_folder_synchronize_sync (CamelFolder *self,
+                                    gboolean expunge,
+                                    GCancellable *cancellable,
+                                    GError **err)
+{
+	gboolean ok = FALSE;
+
+	g_assert (CAMEL_IS_IMAPX_EXTD_FOLDER (self));
+	/* cancellable may be NULL */
+	g_return_val_if_fail (err == NULL || *err == NULL, FALSE);
+
+	ok = parent_folder_class->synchronize_sync (self,
+	                                            expunge,
+	                                            cancellable,
+	                                            err);
+	return ok;
+}
+
+static gboolean
+imapx_extd_folder_synchronize_message_sync (CamelFolder *self,
+                                            const gchar *message_uid,
+                                            GCancellable *cancellable,
+                                            GError **err)
+{
+	gboolean ok = FALSE;
+
+	g_assert (CAMEL_IS_IMAPX_EXTD_FOLDER (self));
+	g_assert (message_uid != NULL);
+	/* cancellable may be NULL */
+	g_return_val_if_fail (err == NULL || *err == NULL, FALSE);
+
+	ok = parent_folder_class->synchronize_message_sync (self,
+	                                                    message_uid,
+	                                                    cancellable,
+	                                                    err);
+	return ok;
+}
+
+static gboolean
+imapx_extd_folder_transfer_messages_to_sync (CamelFolder *source,
+                                             GPtrArray *message_uids,
+                                             CamelFolder *destination,
+                                             gboolean delete_originals,
+                                             GPtrArray **transferred_uids,
+                                             GCancellable *cancellable,
+                                             GError **err)
+{
+	gboolean ok = FALSE;
+
+	g_assert (CAMEL_IS_IMAPX_EXTD_FOLDER (source));
+	g_assert (message_uids != NULL);
+	g_assert (CAMEL_IS_IMAPX_EXTD_FOLDER (destination));
+	g_assert (*transferred_uids == NULL);
+	/* cancellable may be NULL */
+	g_return_val_if_fail (err == NULL || *err == NULL, FALSE);
+
+	ok = parent_folder_class->transfer_messages_to_sync (source,
+	                                                     message_uids,
+	                                                     destination,
+	                                                     delete_originals,
+	                                                     transferred_uids,
+	                                                     cancellable,
+	                                                     err);
+	return ok;
+}
+
+static guint64
+imapx_extd_folder_get_uidvalidity (CamelIMAPXExtdFolder *self,
+                                   GError **err)
+{
+	guint64 uidvalidity = 0;
+
+	g_assert (CAMEL_IS_IMAPX_EXTD_FOLDER (self));
+	g_return_val_if_fail (err == NULL || *err == NULL, 0);
+
+	/* FIXME implement me */
+	g_error ("%s: FIXME implement me", __func__);
+
+	/* TODO read the uidvalidity value from parent object */
+
+	return uidvalidity;
+}
+/*----------------------------------------------------------------------------*/
+/* class init */
+
 static void
 camel_imapx_extd_folder_class_init (CamelIMAPXExtdFolderClass *klass)
 {
 	GObjectClass *object_class = G_OBJECT_CLASS (klass);
 	CamelFolderClass *folder_class = CAMEL_FOLDER_CLASS (klass);
-	CamelFolderClass *parent_folder_class = \
-		CAMEL_FOLDER_CLASS (camel_imapx_extd_folder_parent_class);
+
+	parent_folder_class = CAMEL_FOLDER_CLASS (camel_imapx_extd_folder_parent_class);
 
 	/* g_type_class_add_private (klass, sizeof (CamelIMAPXExtdFolderPrivate)); */
 
 	object_class->dispose = camel_imapx_extd_folder_dispose;
 	object_class->finalize = camel_imapx_extd_folder_finalize;
 
-	folder_class->search_by_expression = parent_folder_class->search_by_expression;
-	folder_class->search_by_uids = parent_folder_class->search_by_uids;
-	folder_class->count_by_expression = parent_folder_class->count_by_expression;
-	folder_class->search_free = parent_folder_class->search_free;
-	folder_class->get_filename = parent_folder_class->get_filename;
-	folder_class->append_message_sync = parent_folder_class->append_message_sync;
-	folder_class->expunge_sync = parent_folder_class->expunge_sync;
-	folder_class->get_message_sync = parent_folder_class->get_message_sync;
-	folder_class->refresh_info_sync = parent_folder_class->refresh_info_sync;
-	folder_class->synchronize_sync = parent_folder_class->synchronize_sync;
-	folder_class->synchronize_message_sync = parent_folder_class->synchronize_message_sync;
-	folder_class->transfer_messages_to_sync = parent_folder_class->transfer_messages_to_sync;
+	folder_class->search_by_expression = imapx_extd_folder_search_by_expression;
+	folder_class->search_by_uids = imapx_extd_folder_search_by_uids;
+	folder_class->count_by_expression = imapx_extd_folder_count_by_expression;
+	folder_class->search_free = imapx_extd_folder_search_free;
+	folder_class->get_filename = imapx_extd_folder_get_filename;
+	folder_class->append_message_sync = imapx_extd_folder_append_message_sync;
+	folder_class->expunge_sync = imapx_extd_folder_expunge_sync;
+	folder_class->get_message_sync = imapx_extd_folder_get_message_sync;
+	folder_class->refresh_info_sync = imapx_extd_folder_refresh_info_sync;
+	folder_class->synchronize_sync = imapx_extd_folder_synchronize_sync;
+	folder_class->synchronize_message_sync = imapx_extd_folder_synchronize_message_sync;
+	folder_class->transfer_messages_to_sync = imapx_extd_folder_transfer_messages_to_sync;
+
+	klass->get_uidvalidity = imapx_extd_folder_get_uidvalidity;
 }
 
 /*----------------------------------------------------------------------------*/
 /* API functions */
 
+CamelIMAPXExtdFolder*
+camel_imapx_extd_folder_new (CamelIMAPXExtdStore *store,
+                             const gchar *folderdir,
+                             const gchar *foldername,
+                             GError **err)
+{
+	CamelIMAPXExtdFolder *folder = NULL;
+
+	g_assert (CAMEL_IS_IMAPX_EXTD_STORE (store));
+	g_assert (folderdir != NULL);
+	g_assert (foldername != 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;
+}
+
 guint64
 camel_imapx_extd_folder_get_uidvalidity (CamelIMAPXExtdFolder *self,
                                          GError **err)
 {
 	guint64 uidvalidity = 0;
+	CamelIMAPXExtdFolderClass *klass = NULL;
 
-	g_assert (CAMEL_IS_IMAPX_EXTD_FOLDER (self));
-	g_return_val_if_fail (err == NULL || *err == NULL, 0);
-
-	/* FIXME implement me */
-	g_error ("%s: FIXME implement me", __func__);
+	g_return_val_if_fail (CAMEL_IS_IMAPX_EXTD_FOLDER (self), 0);
 
-	/* TODO read the uidvalidity value from parent object */
+	klass = CAMEL_IMAPX_EXTD_FOLDER_GET_CLASS (self);
+	uidvalidity = klass->get_uidvalidity (self, err);
 
 	return uidvalidity;
 }
diff --git a/src/camel/providers/imapx/camel-imapx-extd-folder.h b/src/camel/providers/imapx/camel-imapx-extd-folder.h
index 9f9647a..2219e99 100644
--- a/src/camel/providers/imapx/camel-imapx-extd-folder.h
+++ b/src/camel/providers/imapx/camel-imapx-extd-folder.h
@@ -34,6 +34,7 @@
 #include <glib-object.h>
 #include <gio/gio.h>
 
+#include "camel-imapx-extd-store.h"
 #include "camel-imapx-folder.h"
 
 /*----------------------------------------------------------------------------*/
@@ -68,11 +69,20 @@ struct _CamelIMAPXExtdFolder {
 
 struct _CamelIMAPXExtdFolderClass {
 	CamelIMAPXFolderClass parent_class;
+
+	guint64 (*get_uidvalidity) (CamelIMAPXExtdFolder *self,
+	                            GError **err);
 };
 
 GType
 camel_imapx_extd_folder_get_type (void);
 
+CamelIMAPXExtdFolder*
+camel_imapx_extd_folder_new (CamelIMAPXExtdStore *store,
+                             const gchar *folder_dir,
+                             const gchar *foldername,
+                             GError **err);
+
 guint64
 camel_imapx_extd_folder_get_uidvalidity (CamelIMAPXExtdFolder *self,
                                          GError **err);



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