[evolution-kolab/ek-wip-porting] CamelIMAPXExtdConnManager: use virtual functions



commit c0aa5709d063d7258ef90121bd616b5856946e5b
Author: Christian Hilberg <hilberg kernelconcepts de>
Date:   Wed Jan 11 17:19:26 2012 +0100

    CamelIMAPXExtdConnManager: use virtual functions
    
    * changed to implement the parent class' API functions
      via GObject virtual functions
    * CamelIMAPXExtdConnManager is now subclassable
      for Kolab use

 .../imapx/camel-imapx-extd-conn-manager.c          |  190 +++++++++++++------
 .../imapx/camel-imapx-extd-conn-manager.h          |   25 ++-
 2 files changed, 148 insertions(+), 67 deletions(-)
---
diff --git a/src/camel/providers/imapx/camel-imapx-extd-conn-manager.c b/src/camel/providers/imapx/camel-imapx-extd-conn-manager.c
index 104971c..07efcf8 100644
--- a/src/camel/providers/imapx/camel-imapx-extd-conn-manager.c
+++ b/src/camel/providers/imapx/camel-imapx-extd-conn-manager.c
@@ -39,20 +39,10 @@ enum {
 	PROP_STORE
 };
 
-#if 0
-/* dupe of _CamelIMAPXConnManagerPrivate */ /* (not) needed? */
-struct _CamelIMAPXExtdConnManagerPrivate {
-	GList *connections;
-	gpointer store;  /* weak pointer */
-	GStaticRecMutex con_man_lock;
-	gboolean clearing_connections;
-};
-#endif
-
 G_DEFINE_TYPE (CamelIMAPXExtdConnManager, camel_imapx_extd_conn_manager, CAMEL_TYPE_IMAPX_CONN_MANAGER)
 
 /*----------------------------------------------------------------------------*/
-/* object/class init */
+/* object init */
 
 static void
 camel_imapx_extd_conn_manager_init (CamelIMAPXExtdConnManager *self)
@@ -76,15 +66,108 @@ camel_imapx_extd_conn_manager_finalize (GObject *object)
 	G_OBJECT_CLASS (camel_imapx_extd_conn_manager_parent_class)->finalize (object);
 }
 
+/*----------------------------------------------------------------------------*/
+/* class functions */
+
+static CamelIMAPXExtdStore*
+imapx_extd_conn_manager_get_store (CamelIMAPXExtdConnManager *self)
+{
+	CamelStore *store = NULL;
+	CamelIMAPXConnManager *con_man = NULL;
+
+	g_return_val_if_fail (CAMEL_IS_IMAPX_EXTD_CONN_MANAGER (self), NULL);
+
+	con_man = CAMEL_IMAPX_CONN_MANAGER (self);
+	store = camel_imapx_conn_manager_get_store (con_man);
+
+	return CAMEL_IMAPX_EXTD_STORE (store);
+}
+
+static CamelIMAPXExtdServer*
+imapx_extd_conn_manager_get_connection (CamelIMAPXExtdConnManager *self,
+                                        const gchar *foldername,
+                                        GCancellable *cancellable,
+                                        GError **err)
+{
+	CamelIMAPXServer *is = NULL;
+	CamelIMAPXConnManager *con_man = NULL;
+	GError *tmp_err = NULL;
+
+	g_assert (CAMEL_IS_IMAPX_EXTD_CONN_MANAGER (self));
+	g_assert (foldername != NULL);
+	/* cancellable may be NULL */
+	g_return_val_if_fail (err == NULL || *err == NULL, NULL);
+
+	con_man = CAMEL_IMAPX_CONN_MANAGER (self);
+	is = camel_imapx_conn_manager_get_connection (con_man,
+	                                              foldername,
+	                                              cancellable,
+	                                              &tmp_err);
+	if (is == NULL) {
+		if (tmp_err != NULL)
+			g_propagate_error (err, tmp_err);
+		return NULL;
+	}
+
+	return CAMEL_IMAPX_EXTD_SERVER (is);
+}
+
+static void
+imapx_extd_conn_manager_close_connections (CamelIMAPXExtdConnManager *self)
+{
+	CamelIMAPXConnManager *con_man = NULL;
+
+	g_assert (CAMEL_IS_IMAPX_EXTD_CONN_MANAGER (self));
+
+	con_man = CAMEL_IMAPX_CONN_MANAGER (self);
+	camel_imapx_conn_manager_close_connections (con_man);
+}
+
+static GList*
+imapx_extd_conn_manager_get_connections (CamelIMAPXExtdConnManager *self)
+{
+	GList *cn = NULL;
+	CamelIMAPXConnManager *con_man = NULL;
+
+	g_assert (CAMEL_IS_IMAPX_EXTD_CONN_MANAGER (self));
+
+	con_man = CAMEL_IMAPX_CONN_MANAGER (self);
+	cn = camel_imapx_conn_manager_get_connections (con_man);
+
+	/* TODO type-check list elements? */
+
+	return cn;
+}
+
+static void
+imapx_extd_conn_manager_update_con_info (CamelIMAPXExtdConnManager *self,
+                                         CamelIMAPXExtdServer *server,
+                                         const gchar *foldername)
+{
+	CamelIMAPXConnManager *con_man = NULL;
+	CamelIMAPXServer *is = NULL;
+
+	g_assert (CAMEL_IS_IMAPX_EXTD_CONN_MANAGER (con_man));
+	g_assert (CAMEL_IS_IMAPX_EXTD_SERVER (server));
+	g_assert (foldername != NULL);
+
+	con_man = CAMEL_IMAPX_CONN_MANAGER (self);
+	is = CAMEL_IMAPX_SERVER (server);
+
+	camel_imapx_conn_manager_update_con_info (con_man,
+	                                          is,
+	                                          foldername);
+}
+
+/*----------------------------------------------------------------------------*/
+/* class init */
+
 static void
 camel_imapx_extd_conn_manager_class_init (CamelIMAPXExtdConnManagerClass *klass)
 {
 	GObjectClass *object_class = G_OBJECT_CLASS (klass);
 	GObjectClass *gobj_p_class = NULL;
 
-	/* (not) needed? */
-	/* g_type_class_add_private (klass, sizeof (CamelIMAPXExtdConnManagerPrivate)); */
-
 	gobj_p_class = G_OBJECT_CLASS (camel_imapx_extd_conn_manager_parent_class);
 	object_class->set_property = gobj_p_class->set_property;
 	object_class->get_property = gobj_p_class->get_property;
@@ -92,6 +175,12 @@ camel_imapx_extd_conn_manager_class_init (CamelIMAPXExtdConnManagerClass *klass)
 	object_class->dispose = camel_imapx_extd_conn_manager_dispose;
 	object_class->finalize = camel_imapx_extd_conn_manager_finalize;
 
+	klass->get_store = imapx_extd_conn_manager_get_store;
+	klass->get_connection = imapx_extd_conn_manager_get_connection;
+	klass->close_connections = imapx_extd_conn_manager_close_connections;
+	klass->get_connections = imapx_extd_conn_manager_get_connections;
+	klass->update_con_info = imapx_extd_conn_manager_update_con_info;
+
 	/* duped from parent */
 	g_object_class_install_property (object_class,
 	                                 PROP_STORE,
@@ -121,18 +210,18 @@ camel_imapx_extd_conn_manager_new (CamelIMAPXExtdStore *store)
 	return self;
 }
 
-CamelStore*
+CamelIMAPXExtdStore*
 camel_imapx_extd_conn_manager_get_store (CamelIMAPXExtdConnManager *self)
 {
-	CamelStore *store = NULL;
-	CamelIMAPXConnManager *con_man = NULL;
+	CamelIMAPXExtdStore *es = NULL;
+	CamelIMAPXExtdConnManagerClass *klass = NULL;
 
 	g_return_val_if_fail (CAMEL_IS_IMAPX_EXTD_CONN_MANAGER (self), NULL);
 
-	con_man = CAMEL_IMAPX_CONN_MANAGER (self);
-	store = camel_imapx_conn_manager_get_store (con_man);
+	klass = CAMEL_IMAPX_EXTD_CONN_MANAGER_GET_CLASS (self);
+	es = klass->get_store (self);
 
-	return store;
+	return es;
 }
 
 CamelIMAPXExtdServer*
@@ -141,52 +230,40 @@ camel_imapx_extd_conn_manager_get_connection (CamelIMAPXExtdConnManager *self,
                                               GCancellable *cancellable,
                                               GError **err)
 {
-	CamelIMAPXServer *is = NULL;
-	CamelIMAPXExtdServer *es = NULL;
-	CamelIMAPXConnManager *con_man = NULL;
-	GError *tmp_err = NULL;
-
-	g_assert (CAMEL_IS_IMAPX_EXTD_CONN_MANAGER (self));
-	g_assert (foldername != NULL);
-	/* cancellable may be NULL */
-	g_return_val_if_fail (err == NULL || *err == NULL, NULL);
+	CamelIMAPXExtdServer *server = NULL;
+	CamelIMAPXExtdConnManagerClass *klass = NULL;
 
-	con_man = CAMEL_IMAPX_CONN_MANAGER (self);
-	is = camel_imapx_conn_manager_get_connection (con_man,
-	                                              foldername,
-	                                              cancellable,
-	                                              &tmp_err);
-	if (is == NULL) {
-		g_propagate_error (err, tmp_err);
-		return NULL;
-	}
-
-	es = CAMEL_IMAPX_EXTD_SERVER (is);
+	g_return_val_if_fail (CAMEL_IS_IMAPX_EXTD_CONN_MANAGER (self), NULL);
 
-	return es;
+	klass = CAMEL_IMAPX_EXTD_CONN_MANAGER_GET_CLASS (self);
+	server = klass->get_connection (self,
+	                                foldername,
+	                                cancellable,
+	                                err);
+	return server;
 }
 
 void
 camel_imapx_extd_conn_manager_close_connections (CamelIMAPXExtdConnManager *self)
 {
-	CamelIMAPXConnManager *con_man = NULL;
+	CamelIMAPXExtdConnManagerClass *klass = NULL;
 
-	g_assert (CAMEL_IS_IMAPX_EXTD_CONN_MANAGER (self));
+	g_return_if_fail (CAMEL_IS_IMAPX_EXTD_CONN_MANAGER (self));
 
-	con_man = CAMEL_IMAPX_CONN_MANAGER (self);
-	camel_imapx_conn_manager_close_connections (con_man);
+	klass = CAMEL_IMAPX_EXTD_CONN_MANAGER_GET_CLASS (self);
+	klass->close_connections (self);
 }
 
 GList*
 camel_imapx_extd_conn_manager_get_connections (CamelIMAPXExtdConnManager *self)
 {
 	GList *cn = NULL;
-	CamelIMAPXConnManager *con_man = NULL;
+	CamelIMAPXExtdConnManagerClass *klass = NULL;
 
-	g_assert (CAMEL_IS_IMAPX_EXTD_CONN_MANAGER (self));
+	g_return_val_if_fail (CAMEL_IS_IMAPX_EXTD_CONN_MANAGER (self), NULL);
 
-	con_man = CAMEL_IMAPX_CONN_MANAGER (self);
-	cn = camel_imapx_conn_manager_get_connections (con_man);
+	klass = CAMEL_IMAPX_EXTD_CONN_MANAGER_GET_CLASS (self);
+	cn = klass->get_connections (self);
 
 	return cn;
 }
@@ -196,19 +273,12 @@ camel_imapx_extd_conn_manager_update_con_info (CamelIMAPXExtdConnManager *self,
                                                CamelIMAPXExtdServer *server,
                                                const gchar *foldername)
 {
-	CamelIMAPXConnManager *con_man = NULL;
-	CamelIMAPXServer *is = NULL;
+	CamelIMAPXExtdConnManagerClass *klass = NULL;
 
-	g_assert (CAMEL_IS_IMAPX_EXTD_CONN_MANAGER (con_man));
-	g_assert (CAMEL_IS_IMAPX_EXTD_SERVER (server));
-	g_assert (foldername != NULL);
-
-	con_man = CAMEL_IMAPX_CONN_MANAGER (self);
-	is = CAMEL_IMAPX_SERVER (server);
+	g_return_if_fail (CAMEL_IS_IMAPX_EXTD_CONN_MANAGER (self));
 
-	camel_imapx_conn_manager_update_con_info (con_man,
-	                                          is,
-	                                          foldername);
+	klass = CAMEL_IMAPX_EXTD_CONN_MANAGER_GET_CLASS (self);
+	klass->update_con_info (self, server, foldername);
 }
 
 /*----------------------------------------------------------------------------*/
diff --git a/src/camel/providers/imapx/camel-imapx-extd-conn-manager.h b/src/camel/providers/imapx/camel-imapx-extd-conn-manager.h
index 89c1ebd..34c8ff5 100644
--- a/src/camel/providers/imapx/camel-imapx-extd-conn-manager.h
+++ b/src/camel/providers/imapx/camel-imapx-extd-conn-manager.h
@@ -64,18 +64,29 @@ G_BEGIN_DECLS
 typedef struct _CamelIMAPXExtdConnManager CamelIMAPXExtdConnManager;
 typedef struct _CamelIMAPXExtdConnManagerClass CamelIMAPXExtdConnManagerClass;
 
-#if 0
-/* (not) needed? */
-typedef struct _CamelIMAPXExtdConnManagerPrivate CamelIMAPXExtdConnManagerPrivate;
-#endif
-
 struct _CamelIMAPXExtdConnManager {
 	CamelIMAPXConnManager parent;
-	/* CamelIMAPXExtdConnManagerPrivate *priv; */ /* (not) needed? */
 };
 
 struct _CamelIMAPXExtdConnManagerClass {
 	CamelIMAPXConnManagerClass parent_class;
+
+	/* public virtual functions */
+
+	CamelIMAPXExtdStore* (*get_store) (CamelIMAPXExtdConnManager *self);
+
+	CamelIMAPXExtdServer* (*get_connection) (CamelIMAPXExtdConnManager *self,
+	                                         const gchar *foldername,
+	                                         GCancellable *cancellable,
+	                                         GError **err);
+
+	void (*close_connections) (CamelIMAPXExtdConnManager *self);
+
+	GList* (*get_connections) (CamelIMAPXExtdConnManager *self);
+
+	void (*update_con_info) (CamelIMAPXExtdConnManager *self,
+	                         CamelIMAPXExtdServer *server,
+	                         const gchar *foldername);
 };
 
 GType
@@ -84,7 +95,7 @@ camel_imapx_extd_conn_manager_get_type (void);
 CamelIMAPXExtdConnManager*
 camel_imapx_extd_conn_manager_new (CamelIMAPXExtdStore *store);
 
-CamelStore*
+CamelIMAPXExtdStore*
 camel_imapx_extd_conn_manager_get_store (CamelIMAPXExtdConnManager *self);
 
 CamelIMAPXExtdServer*



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