[evolution-kolab/ek-wip-porting] CamelIMAPXExtdStore: use virtual functions
- From: Christian Hilberg <chilberg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution-kolab/ek-wip-porting] CamelIMAPXExtdStore: use virtual functions
- Date: Wed, 11 Jan 2012 19:26:47 +0000 (UTC)
commit c998803bd5146da5165ef2a7200152c726100f2d
Author: Christian Hilberg <hilberg kernelconcepts de>
Date: Wed Jan 11 17:22:10 2012 +0100
CamelIMAPXExtdStore: use virtual functions
* changed to implement the parent class' API functions
via GObject virtual functions
* CamelIMAPXExtdStore is now subclassable
for Kolab use
src/camel/providers/imapx/camel-imapx-extd-store.c | 424 ++++++++++++++++----
src/camel/providers/imapx/camel-imapx-extd-store.h | 9 +
2 files changed, 344 insertions(+), 89 deletions(-)
---
diff --git a/src/camel/providers/imapx/camel-imapx-extd-store.c b/src/camel/providers/imapx/camel-imapx-extd-store.c
index f135352..4a0e803 100644
--- a/src/camel/providers/imapx/camel-imapx-extd-store.c
+++ b/src/camel/providers/imapx/camel-imapx-extd-store.c
@@ -33,6 +33,7 @@
#include "camel-imapx-settings.h"
#include "camel-imapx-extd-conn-manager.h"
+#include "camel-imapx-extd-folder.h"
#include "camel-imapx-extd-store.h"
/*----------------------------------------------------------------------------*/
@@ -41,29 +42,28 @@ static GInitableIface *parent_initable_iface = NULL;
static CamelNetworkServiceInterface *parent_service_iface = NULL;
static CamelSubscribableInterface *parent_subscribable_iface = NULL;
+static CamelServiceClass *parent_service_class = NULL;
+static CamelStoreClass *parent_store_class = NULL;
+
/*----------------------------------------------------------------------------*/
/* forward declarations */
-static void camel_imapx_extd_store_initable_init (GInitableIface *interface);
-static void camel_imapx_extd_store_network_service_init (CamelNetworkServiceInterface *interface);
-static void camel_imapx_extd_store_subscribable_init (CamelSubscribableInterface *interface);
+static void imapx_extd_store_initable_init (GInitableIface *interface);
+static void imapx_extd_store_network_service_init (CamelNetworkServiceInterface *interface);
+static void imapx_extd_store_subscribable_init (CamelSubscribableInterface *interface);
-G_DEFINE_TYPE_WITH_CODE (
- CamelIMAPXExtdStore,
+G_DEFINE_TYPE_WITH_CODE (CamelIMAPXExtdStore,
camel_imapx_extd_store,
CAMEL_TYPE_IMAPX_STORE,
- G_IMPLEMENT_INTERFACE (
- G_TYPE_INITABLE,
- camel_imapx_extd_store_initable_init)
- G_IMPLEMENT_INTERFACE (
- CAMEL_TYPE_NETWORK_SERVICE,
- camel_imapx_extd_store_network_service_init)
- G_IMPLEMENT_INTERFACE (
- CAMEL_TYPE_SUBSCRIBABLE,
- camel_imapx_extd_store_subscribable_init))
+ G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE,
+ imapx_extd_store_initable_init)
+ G_IMPLEMENT_INTERFACE (CAMEL_TYPE_NETWORK_SERVICE,
+ imapx_extd_store_network_service_init)
+ G_IMPLEMENT_INTERFACE (CAMEL_TYPE_SUBSCRIBABLE,
+ imapx_extd_store_subscribable_init))
/*----------------------------------------------------------------------------*/
-/* object/class init */
+/* object init */
static void
camel_imapx_extd_store_init (CamelIMAPXExtdStore *self)
@@ -73,14 +73,13 @@ camel_imapx_extd_store_init (CamelIMAPXExtdStore *self)
g_assert (CAMEL_IS_IMAPX_EXTD_STORE (self));
- istore = CAMEL_IMAPX_STORE (self);
-
/* replace existing connection manager with
* our own extended version. in case we need
* to explicitly reference the *extended*
* version of the connection manager, we will need
* to override the respective parent class functions
*/
+ istore = CAMEL_IMAPX_STORE (self);
if (istore->con_man != NULL)
g_object_unref (istore->con_man);
cm = camel_imapx_extd_conn_manager_new (self);
@@ -97,8 +96,9 @@ camel_imapx_extd_store_dispose (GObject *object)
* see imapx_store_dispose() in camel-imapx-store.c
*/
if (istore->con_man != NULL) {
- camel_service_disconnect_sync (
- CAMEL_SERVICE (self), TRUE, NULL);
+ camel_service_disconnect_sync (CAMEL_SERVICE (self),
+ TRUE,
+ NULL);
g_object_unref (istore->con_man);
istore->con_man = NULL;
/* this part will now be skipped
@@ -120,14 +120,275 @@ camel_imapx_extd_store_finalize (GObject *object)
/*----------------------------------------------------------------------------*/
/* class functions */
+static gboolean
+imapx_extd_store_can_refresh_folder (CamelStore *store,
+ CamelFolderInfo *info,
+ GError **err)
+{
+ gboolean can = FALSE;
+
+ g_assert (CAMEL_IS_IMAPX_EXTD_STORE (store));
+ g_return_val_if_fail (err == NULL || *err == NULL, FALSE);
+
+ can = parent_store_class->can_refresh_folder (store,
+ info,
+ err);
+ return can;
+}
+
+static void
+imapx_extd_store_free_folder_info (CamelStore *store,
+ CamelFolderInfo *fi)
+{
+ g_assert (CAMEL_IS_IMAPX_EXTD_STORE (store));
+ parent_store_class->free_folder_info (store, fi);
+}
+
+static CamelFolder*
+imapx_extd_store_get_folder_sync (CamelStore *store,
+ const gchar *foldername,
+ CamelStoreGetFolderFlags flags,
+ GCancellable *cancellable,
+ GError **err)
+{
+ CamelFolder *folder = NULL;
+
+ g_assert (CAMEL_IS_IMAPX_EXTD_STORE (store));
+ /* cancellable may be NULL */
+ 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));
+
+ return folder;
+}
+
+static CamelFolderInfo*
+imapx_extd_store_get_folder_info_sync (CamelStore *store,
+ const gchar *top,
+ CamelStoreGetFolderInfoFlags flags,
+ GCancellable *cancellable,
+ GError **err)
+{
+ CamelFolderInfo *fi = NULL;
+
+ g_assert (CAMEL_IS_IMAPX_EXTD_STORE (store));
+ /* top may be NULL */
+ /* cancellable may be NULL */
+ g_return_val_if_fail (err == NULL || *err == NULL, NULL);
+
+ fi = parent_store_class->get_folder_info_sync (store,
+ top,
+ flags,
+ cancellable,
+ err);
+ return fi;
+}
+
+static CamelFolder*
+imapx_extd_store_get_junk_folder_sync (CamelStore *store,
+ GCancellable *cancellable,
+ GError **err)
+{
+ CamelFolder *folder = NULL;
+
+ g_assert (CAMEL_IS_IMAPX_EXTD_STORE (store));
+ /* cancellable may be NULL */
+ g_return_val_if_fail (err == NULL || *err == NULL, NULL);
+
+ folder = parent_store_class->get_junk_folder_sync (store,
+ cancellable,
+ err);
+ if (folder != NULL)
+ g_assert (CAMEL_IS_IMAPX_EXTD_FOLDER (folder));
+
+ return folder;
+}
+
+static CamelFolder*
+imapx_extd_store_get_trash_folder_sync (CamelStore *store,
+ GCancellable *cancellable,
+ GError **err)
+{
+ CamelFolder *folder = NULL;
+
+ g_assert (CAMEL_IS_IMAPX_EXTD_STORE (store));
+ /* cancellable may be NULL */
+ g_return_val_if_fail (err == NULL || *err == NULL, NULL);
+
+ folder = parent_store_class->get_trash_folder_sync (store,
+ cancellable,
+ err);
+ if (folder != NULL)
+ g_assert (CAMEL_IS_IMAPX_EXTD_FOLDER (folder));
+
+ return folder;
+}
+
+static CamelFolderInfo*
+imapx_extd_store_create_folder_sync (CamelStore *store,
+ const gchar *parentname,
+ const gchar *foldername,
+ GCancellable *cancellable,
+ GError **err)
+{
+ CamelFolderInfo *fi = NULL;
+
+ g_assert (CAMEL_IS_IMAPX_EXTD_STORE (store));
+ /* parentname may be NULL */
+ 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,
+ parentname,
+ foldername,
+ cancellable,
+ err);
+ return fi;
+}
+
+static gboolean
+imapx_extd_store_delete_folder_sync (CamelStore *store,
+ const gchar *foldername,
+ GCancellable *cancellable,
+ GError **err)
+{
+ gboolean ok = FALSE;
+
+ g_assert (CAMEL_IS_IMAPX_EXTD_STORE (store));
+ 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,
+ foldername,
+ cancellable,
+ err);
+ return ok;
+}
+
+static gboolean
+imapx_extd_store_rename_folder_sync (CamelStore *store,
+ const gchar *oldname,
+ const gchar *newname,
+ GCancellable *cancellable,
+ GError **err)
+{
+ gboolean ok = FALSE;
+
+ g_assert (CAMEL_IS_IMAPX_EXTD_STORE (store));
+ 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,
+ oldname,
+ newname,
+ cancellable,
+ err);
+ return ok;
+}
+
+static gboolean
+imapx_extd_store_synchronize_sync (CamelStore *store,
+ gboolean expunge,
+ GCancellable *cancellable,
+ GError **err)
+{
+ gboolean ok = FALSE;
+
+ g_assert (CAMEL_IS_IMAPX_EXTD_STORE (store));
+ /* cancellable may be NULL */
+ g_return_val_if_fail (err == NULL || *err == NULL, FALSE);
+
+ ok = parent_store_class->synchronize_sync (store,
+ expunge,
+ cancellable,
+ err);
+ return ok;
+}
+
+static gboolean
+imapx_extd_store_noop_sync (CamelStore *store,
+ GCancellable *cancellable,
+ GError **err)
+{
+ gboolean ok = FALSE;
+
+ g_assert (CAMEL_IS_IMAPX_EXTD_STORE (store));
+ /* cancellable may be NULL */
+ g_return_val_if_fail (err == NULL || *err == NULL, FALSE);
+
+ ok = parent_store_class->noop_sync (store,
+ cancellable,
+ err);
+ return ok;
+}
+
+static CamelIMAPXExtdServer*
+imapx_extd_store_get_server (CamelIMAPXExtdStore *self,
+ const gchar *foldername,
+ GCancellable *cancellable,
+ GError **err)
+{
+ CamelIMAPXServer *is = NULL;
+ CamelIMAPXExtdServer *es = NULL;
+ CamelIMAPXStore *istore = NULL;
+ GError *tmp_err = NULL;
+
+ g_assert (CAMEL_IS_IMAPX_EXTD_STORE (self));
+ /* foldername may be NULL */
+ /* cancellable may be NULL */
+ g_return_val_if_fail (err == NULL || *err == NULL, NULL);
+
+ istore = CAMEL_IMAPX_STORE (self);
+ is = camel_imapx_store_get_server (istore,
+ foldername,
+ cancellable,
+ &tmp_err);
+ if (is == NULL) {
+ g_propagate_error (err, tmp_err);
+ return NULL;
+ }
+
+ es = CAMEL_IMAPX_EXTD_SERVER (is);
+ return es;
+}
+
+static void
+imapx_extd_store_op_done (CamelIMAPXExtdStore *self,
+ CamelIMAPXExtdServer *server,
+ const gchar *foldername)
+{
+ CamelIMAPXServer *is = NULL;
+ CamelIMAPXStore *istore = NULL;
+
+ g_assert (CAMEL_IS_IMAPX_EXTD_STORE (self));
+ g_assert (CAMEL_IS_IMAPX_EXTD_SERVER (server));
+ g_assert (foldername != NULL);
+
+ istore = CAMEL_IMAPX_STORE (self);
+ is = CAMEL_IMAPX_SERVER (server);
+
+ camel_imapx_store_op_done (istore,
+ is,
+ foldername);
+}
/*----------------------------------------------------------------------------*/
/* interface functions */
static gboolean
-camel_imapx_extd_store_initable_initialize (GInitable *initable,
- GCancellable *cancellable,
- GError **err)
+imapx_extd_store_initable_initialize (GInitable *initable,
+ GCancellable *cancellable,
+ GError **err)
{
gboolean ok = FALSE;
@@ -143,8 +404,8 @@ camel_imapx_extd_store_initable_initialize (GInitable *initable,
}
static const gchar*
-camel_imapx_extd_store_get_service_name (CamelNetworkService *service,
- CamelNetworkSecurityMethod method)
+imapx_extd_store_get_service_name (CamelNetworkService *service,
+ CamelNetworkSecurityMethod method)
{
const gchar *sn = NULL;
@@ -158,8 +419,8 @@ camel_imapx_extd_store_get_service_name (CamelNetworkService *service,
}
static guint16
-camel_imapx_extd_store_get_default_port (CamelNetworkService *service,
- CamelNetworkSecurityMethod method)
+imapx_extd_store_get_default_port (CamelNetworkService *service,
+ CamelNetworkSecurityMethod method)
{
guint16 port = 0;
@@ -173,8 +434,8 @@ camel_imapx_extd_store_get_default_port (CamelNetworkService *service,
}
static gboolean
-camel_imapx_extd_store_folder_is_subscribed (CamelSubscribable *subscribable,
- const gchar *foldername)
+imapx_extd_store_folder_is_subscribed (CamelSubscribable *subscribable,
+ const gchar *foldername)
{
gboolean subscribed = FALSE;
@@ -189,10 +450,10 @@ camel_imapx_extd_store_folder_is_subscribed (CamelSubscribable *subscribable,
}
static gboolean
-camel_imapx_extd_store_subscribe_folder_sync (CamelSubscribable *subscribable,
- const gchar *foldername,
- GCancellable *cancellable,
- GError **err)
+imapx_extd_store_subscribe_folder_sync (CamelSubscribable *subscribable,
+ const gchar *foldername,
+ GCancellable *cancellable,
+ GError **err)
{
gboolean ok = FALSE;
@@ -210,10 +471,10 @@ camel_imapx_extd_store_subscribe_folder_sync (CamelSubscribable *subscribable,
}
static gboolean
-camel_imapx_extd_store_unsubscribe_folder_sync (CamelSubscribable *subscribable,
- const gchar *foldername,
- GCancellable *cancellable,
- GError **err)
+imapx_extd_store_unsubscribe_folder_sync (CamelSubscribable *subscribable,
+ const gchar *foldername,
+ GCancellable *cancellable,
+ GError **err)
{
gboolean ok = FALSE;
@@ -231,35 +492,35 @@ camel_imapx_extd_store_unsubscribe_folder_sync (CamelSubscribable *subscribable,
}
static void
-camel_imapx_extd_store_initable_init (GInitableIface *interface)
+imapx_extd_store_initable_init (GInitableIface *interface)
{
parent_initable_iface = g_type_interface_peek_parent (interface);
- interface->init = camel_imapx_extd_store_initable_initialize;
+ interface->init = imapx_extd_store_initable_initialize;
}
static void
-camel_imapx_extd_store_network_service_init (CamelNetworkServiceInterface *interface)
+imapx_extd_store_network_service_init (CamelNetworkServiceInterface *interface)
{
g_assert (CAMEL_IS_NETWORK_SERVICE_INTERFACE (interface));
parent_service_iface = g_type_interface_peek_parent (interface);
- interface->get_service_name = camel_imapx_extd_store_get_service_name;
- interface->get_default_port = camel_imapx_extd_store_get_default_port;
+ interface->get_service_name = imapx_extd_store_get_service_name;
+ interface->get_default_port = imapx_extd_store_get_default_port;
}
static void
-camel_imapx_extd_store_subscribable_init (CamelSubscribableInterface *interface)
+imapx_extd_store_subscribable_init (CamelSubscribableInterface *interface)
{
g_assert (CAMEL_IS_SUBSCRIBABLE_INTERFACE (interface));
parent_subscribable_iface = g_type_interface_peek_parent (interface);
- interface->folder_is_subscribed = camel_imapx_extd_store_folder_is_subscribed;
- interface->subscribe_folder_sync = camel_imapx_extd_store_subscribe_folder_sync;
- interface->unsubscribe_folder_sync = camel_imapx_extd_store_unsubscribe_folder_sync;
+ interface->folder_is_subscribed = imapx_extd_store_folder_is_subscribed;
+ interface->subscribe_folder_sync = imapx_extd_store_subscribe_folder_sync;
+ interface->unsubscribe_folder_sync = imapx_extd_store_unsubscribe_folder_sync;
}
/*----------------------------------------------------------------------------*/
-/* class initialization */
+/* class init */
static void
camel_imapx_extd_store_class_init (CamelIMAPXExtdStoreClass *klass)
@@ -267,10 +528,9 @@ camel_imapx_extd_store_class_init (CamelIMAPXExtdStoreClass *klass)
GObjectClass *object_class = G_OBJECT_CLASS (klass);
CamelServiceClass *service_class = CAMEL_SERVICE_CLASS (klass);
CamelStoreClass *store_class = CAMEL_STORE_CLASS (klass);
- CamelServiceClass *parent_service_class = \
- CAMEL_SERVICE_CLASS (camel_imapx_extd_store_parent_class);
- CamelStoreClass *parent_store_class = \
- CAMEL_STORE_CLASS (camel_imapx_extd_store_parent_class);
+
+ parent_service_class = CAMEL_SERVICE_CLASS (camel_imapx_extd_store_parent_class);
+ parent_store_class = CAMEL_STORE_CLASS (camel_imapx_extd_store_parent_class);
/* g_type_class_add_private (klass, sizeof (CamelIMAPXExtdStorePrivate)); */
@@ -286,16 +546,20 @@ camel_imapx_extd_store_class_init (CamelIMAPXExtdStoreClass *klass)
store_class->hash_folder_name = parent_store_class->hash_folder_name;
store_class->compare_folder_name = parent_store_class->compare_folder_name;
- store_class->can_refresh_folder = parent_store_class->can_refresh_folder;
- store_class->free_folder_info = parent_store_class->free_folder_info;
- store_class->get_folder_sync = parent_store_class->get_folder_sync;
- store_class->get_folder_info_sync = parent_store_class->get_folder_info_sync;
- store_class->get_junk_folder_sync = parent_store_class->get_junk_folder_sync;
- store_class->get_trash_folder_sync = parent_store_class->get_trash_folder_sync;
- store_class->create_folder_sync = parent_store_class->create_folder_sync;
- store_class->delete_folder_sync = parent_store_class->delete_folder_sync;
- store_class->rename_folder_sync = parent_store_class->rename_folder_sync;
- store_class->noop_sync = parent_store_class->noop_sync;
+ store_class->can_refresh_folder = imapx_extd_store_can_refresh_folder;
+ store_class->free_folder_info = imapx_extd_store_free_folder_info;
+ store_class->get_folder_sync = imapx_extd_store_get_folder_sync;
+ store_class->get_folder_info_sync = imapx_extd_store_get_folder_info_sync;
+ store_class->get_junk_folder_sync = imapx_extd_store_get_junk_folder_sync;
+ store_class->get_trash_folder_sync = imapx_extd_store_get_trash_folder_sync;
+ store_class->create_folder_sync = imapx_extd_store_create_folder_sync;
+ store_class->delete_folder_sync = imapx_extd_store_delete_folder_sync;
+ store_class->rename_folder_sync = imapx_extd_store_rename_folder_sync;
+ store_class->synchronize_sync = imapx_extd_store_synchronize_sync;
+ store_class->noop_sync = imapx_extd_store_noop_sync;
+
+ klass->get_server = imapx_extd_store_get_server;
+ klass->op_done = imapx_extd_store_op_done;
}
/*----------------------------------------------------------------------------*/
@@ -307,27 +571,16 @@ camel_imapx_extd_store_get_server (CamelIMAPXExtdStore *self,
GCancellable *cancellable,
GError **err)
{
- CamelIMAPXServer *is = NULL;
CamelIMAPXExtdServer *es = NULL;
- CamelIMAPXStore *istore = NULL;
- GError *tmp_err = NULL;
-
- g_assert (CAMEL_IS_IMAPX_EXTD_STORE (self));
- /* foldername may be NULL */
- /* cancellable may be NULL */
- g_return_val_if_fail (err == NULL || *err == NULL, NULL);
+ CamelIMAPXExtdStoreClass *klass = NULL;
- istore = CAMEL_IMAPX_STORE (self);
- is = camel_imapx_store_get_server (istore,
- foldername,
- cancellable,
- &tmp_err);
- if (is == NULL) {
- g_propagate_error (err, tmp_err);
- return NULL;
- }
+ g_return_val_if_fail (CAMEL_IS_IMAPX_EXTD_STORE (self), NULL);
- es = CAMEL_IMAPX_EXTD_SERVER (is);
+ klass = CAMEL_IMAPX_EXTD_STORE_GET_CLASS (self);
+ es = klass->get_server (self,
+ foldername,
+ cancellable,
+ err);
return es;
}
@@ -336,19 +589,12 @@ camel_imapx_extd_store_op_done (CamelIMAPXExtdStore *self,
CamelIMAPXExtdServer *server,
const gchar *foldername)
{
- CamelIMAPXServer *is = NULL;
- CamelIMAPXStore *istore = NULL;
-
- g_assert (CAMEL_IS_IMAPX_EXTD_STORE (self));
- g_assert (CAMEL_IS_IMAPX_EXTD_SERVER (server));
- g_assert (foldername != NULL);
+ CamelIMAPXExtdStoreClass *klass = NULL;
- istore = CAMEL_IMAPX_STORE (self);
- is = CAMEL_IMAPX_SERVER (server);
+ g_return_if_fail (CAMEL_IS_IMAPX_EXTD_STORE (self));
- camel_imapx_store_op_done (istore,
- is,
- foldername);
+ klass = CAMEL_IMAPX_EXTD_STORE_GET_CLASS (self);
+ klass->op_done (self, server, foldername);
}
/*----------------------------------------------------------------------------*/
diff --git a/src/camel/providers/imapx/camel-imapx-extd-store.h b/src/camel/providers/imapx/camel-imapx-extd-store.h
index 0289b4a..4031fb5 100644
--- a/src/camel/providers/imapx/camel-imapx-extd-store.h
+++ b/src/camel/providers/imapx/camel-imapx-extd-store.h
@@ -69,6 +69,15 @@ struct _CamelIMAPXExtdStore {
struct _CamelIMAPXExtdStoreClass {
CamelIMAPXStoreClass parent_class;
+
+ CamelIMAPXExtdServer* (*get_server) (CamelIMAPXExtdStore *self,
+ const gchar *foldername,
+ GCancellable *cancellable,
+ GError **err);
+
+ void (*op_done) (CamelIMAPXExtdStore *self,
+ CamelIMAPXExtdServer *server,
+ const gchar *foldername);
};
GType
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]