[evolution-kolab/ek-wip-porting: 7/8] addressbook: get the book loading again, various fixups



commit de8d569a05e407303e06308048a91afa6ce82578
Author: Christian Hilberg <hilberg kernelconcepts de>
Date:   Thu Mar 15 23:53:16 2012 +0100

    addressbook: get the book loading again, various fixups
    
    * addressbook can be open()ed again
    * properly creates its backend databases
      under the new directory scheme (and uses
      ESource UIDs for that)
    * completed initialization of KolabSettingsHandler
      and KolabMailAccess
    * error handling fixes

 src/addressbook/e-book-backend-kolab-factory.c |    5 +-
 src/addressbook/e-book-backend-kolab.c         |  475 ++++++++++++++----------
 src/addressbook/kolab-util-contact.c           |   70 ++++-
 src/addressbook/kolab-util-contact.h           |    6 +
 4 files changed, 347 insertions(+), 209 deletions(-)
---
diff --git a/src/addressbook/e-book-backend-kolab-factory.c b/src/addressbook/e-book-backend-kolab-factory.c
index a263fd3..cee899c 100644
--- a/src/addressbook/e-book-backend-kolab-factory.c
+++ b/src/addressbook/e-book-backend-kolab-factory.c
@@ -30,6 +30,9 @@
 #include <config.h>
 #endif
 
+#include <glib.h>
+#include <glib-object.h>
+
 #include <libedata-book/e-book-backend-factory.h>
 #include <libekolabutil/kolab-util-camel.h>
 
@@ -37,7 +40,7 @@
 
 /*----------------------------------------------------------------------------*/
 
-#define FACTORY_NAME "kolab2"
+#define FACTORY_NAME KOLAB_CAMEL_PROVIDER_PROTOCOL
 
 /*----------------------------------------------------------------------------*/
 
diff --git a/src/addressbook/e-book-backend-kolab.c b/src/addressbook/e-book-backend-kolab.c
index e689419..743085b 100644
--- a/src/addressbook/e-book-backend-kolab.c
+++ b/src/addressbook/e-book-backend-kolab.c
@@ -50,7 +50,7 @@
 /*----------------------------------------------------------------------------*/
 /* table of KolabMailAccess objects */
 
-/* static GHashTable *koma_objects = NULL; */
+static GHashTable *koma_objects = NULL;
 
 /*----------------------------------------------------------------------------*/
 
@@ -78,22 +78,35 @@ e_book_backend_kolab_open (EBookBackendSync *backend,
                            EDataBook *book,
                            GCancellable *cancellable,
                            gboolean only_if_exists,
-                           GError **err)
+                           GError **error)
 {
-	EBookBackendKolab *self = E_BOOK_BACKEND_KOLAB (backend);
-	EBookBackendKolabPrivate *priv = E_BOOK_BACKEND_KOLAB_PRIVATE (self);
-
-	g_assert (E_IS_DATA_BOOK (book));
-	(void)cancellable; /* FIXME */ /* cancellable may be NULL */
+	EBookBackend *bbackend = NULL;
+	EBookBackendKolab *self = NULL;
+	EBookBackendKolabPrivate *priv = NULL;
+	ESource *source = NULL;
+        CamelURL *c_url = NULL;
+        KolabSettingsHandler *ksettings = NULL;
+        KolabMailAccess *tmp_koma = NULL;
+        KolabSyncStrategyID sync_value = KOLAB_SYNC_STRATEGY_DEFAULT;
+        KolabMailAccessOpmodeID tmp_mode = KOLAB_MAIL_ACCESS_OPMODE_INVAL;
+        gchar *sourcename = NULL;
+        gchar *servername = NULL;
+        gchar *username = NULL;
+        gchar *user_at_server = NULL;
+        gchar *tmp_key = NULL;
+        const gchar *sync_prop = NULL;
+	GError *tmp_err = NULL;
+	gboolean ok = FALSE;
+
+	e_return_data_book_error_if_fail (E_IS_BOOK_BACKEND_KOLAB (backend), E_DATA_BOOK_STATUS_INVALID_ARG);
+	e_return_data_book_error_if_fail (E_IS_DATA_BOOK (book), E_DATA_BOOK_STATUS_INVALID_ARG);
+	/* cancellable may be NULL */
 	(void)only_if_exists; /* FIXME */
-	g_return_if_fail (err == NULL || *err == NULL);
-
-	(void)self;
-	(void)priv;
-	g_error ("%s: FIXME implement me", __func__);
+	e_return_data_book_error_if_fail (error == NULL || *error == NULL, E_DATA_BOOK_STATUS_INVALID_ARG);
 
-#if 0 /* FIXME old*/
-	g_debug ("%s()[%u] called.", __func__, __LINE__);
+	self = E_BOOK_BACKEND_KOLAB (backend);
+	priv = E_BOOK_BACKEND_KOLAB_PRIVATE (self);
+	bbackend = E_BOOK_BACKEND (backend);
 
 	kolab_util_glib_init ();
 	kolab_util_http_init ();
@@ -102,26 +115,32 @@ e_book_backend_kolab_open (EBookBackendSync *backend,
 	 * but as far as SSL goes, we want Camel to rule here
 	 * TODO check whether Camel session needs to be initialized before or after libcurl.
 	 */
-	ok = kolab_util_camel_init (&error);
+	ok = kolab_util_camel_init (&tmp_err);
 	if (! ok) {
-		status = kolab_util_contact_map_error (error);
-		g_warning ("%s()[%u]: %s",
-		           __func__, __LINE__, error->message);
-		g_error_free (error);
-		error = NULL;
+		kolab_util_contact_err_to_edb_err (error, tmp_err, __func__, __LINE__);
+		g_error_free (tmp_err);
+		return;
+	}
+
+	source = e_backend_get_source (E_BACKEND (backend));
+	if (! E_IS_SOURCE (source)) {
+		/* FIXME is this E_DATA_BOOK_STATUS_NO_SUCH_BOOK ? */
+		/* FIXME mark this as a translatable string */
+		tmp_err = e_data_book_create_error (E_DATA_BOOK_STATUS_OTHER_ERROR,
+		                                    "Could not get ESource for backend");
+		g_propagate_error (error, tmp_err);
+		return;
 	}
 
-	priv->book_uri = e_source_get_uri(source);
+	priv->book_uri = e_source_get_uri (source);
 	g_debug ("%s()[%u] uri = %s",
 	         __func__, __LINE__, priv->book_uri);
 
-	cex = camel_exception_new ();
-	c_url = camel_url_new (priv->book_uri, cex);
+	c_url = camel_url_new (priv->book_uri, &tmp_err);
 	if (c_url == NULL) {
-		g_warning ("%s()[%u]: %s",
-		           __func__, __LINE__, camel_exception_get_description (cex));
-		camel_exception_free (cex);
-		status = GNOME_Evolution_Addressbook_OtherError;
+		kolab_util_contact_err_to_edb_err (error, tmp_err, __func__, __LINE__);
+		g_error_free (tmp_err);
+		return;
 	}
 	servername = g_strdup (c_url->host);
 	username = g_strdup (c_url->user);
@@ -168,27 +187,35 @@ e_book_backend_kolab_open (EBookBackendSync *backend,
 		                                     &sync_value);
 		goto notifications;
 	}
-	/* Otherwise we need to setup a new KoMA instance and a settings handler */
+
+	/* Nope, we need to setup a new KoMA instance and a settings handler */
 
 	/* Configure settings handler */
 	ksettings = KOLAB_SETTINGS_HANDLER (g_object_new (KOLAB_TYPE_SETTINGS_HANDLER, NULL));
-	(void) kolab_settings_handler_configure (ksettings,
-	                                         KOLAB_FOLDER_CONTEXT_CONTACT,
-	                                         &error);
-	if (error != NULL) {
-		g_warning ("%s()[%u]: %s",
-		           __func__, __LINE__, error->message);
-		g_error_free (error);
-		error = NULL;
+	ok = kolab_settings_handler_configure (ksettings,
+	                                       KOLAB_FOLDER_CONTEXT_CONTACT,
+	                                       &tmp_err);
+	if (! ok) {
+		g_free (servername);
+		g_free (username);
+		g_free (user_at_server);
+		g_object_unref (ksettings);
+		kolab_util_contact_err_to_edb_err (error, tmp_err, __func__, __LINE__);
+		g_error_free (tmp_err);
+		return;
 	}
-	(void) kolab_settings_handler_bringup (ksettings,
-	                                       &error);
-	if (error != NULL) {
-		g_warning ("%s()[%u]: %s",
-		           __func__, __LINE__, error->message);
-		g_error_free (error);
-		error = NULL;
+
+	ok = kolab_settings_handler_bringup (ksettings, &tmp_err);
+	if (! ok) {
+		g_free (servername);
+		g_free (username);
+		g_free (user_at_server);
+		g_object_unref (ksettings);
+		kolab_util_contact_err_to_edb_err (error, tmp_err, __func__, __LINE__);
+		g_error_free (tmp_err);
+		return;
 	}
+
 	kolab_util_backend_prepare_settings (ksettings,
 	                                     source,
 	                                     servername,
@@ -209,63 +236,61 @@ e_book_backend_kolab_open (EBookBackendSync *backend,
 	                     user_at_server,
 	                     priv->book_koma);
 
-	kolab_mail_access_configure (priv->book_koma,
-	                             ksettings,
-	                             &error);
+	ok = kolab_mail_access_configure (priv->book_koma,
+	                                  ksettings,
+	                                  &tmp_err);
 	g_object_unref (ksettings);
-	if (error != NULL) {
-		status = kolab_util_contact_map_error (error);
-		g_warning ("%s()[%u]: %s",
-		           __func__, __LINE__, error->message);
-		g_error_free (error);
-		return status;
+	if (! ok) {
+		kolab_util_contact_err_to_edb_err (error, tmp_err, __func__, __LINE__);
+		g_error_free (tmp_err);
+		return;
 	}
-	kolab_mail_access_bringup (priv->book_koma,
-	                           &error);
-	if (error != NULL) {
-		status = kolab_util_contact_map_error (error);
-		g_warning ("%s()[%u]: %s",
-		           __func__, __LINE__, error->message);
-		g_error_free (error);
-		return status;
+
+	ok = kolab_mail_access_bringup (priv->book_koma,
+	                                cancellable,
+	                                &tmp_err);
+	if (! ok) {
+		kolab_util_contact_err_to_edb_err (error, tmp_err, __func__, __LINE__);
+		g_error_free (tmp_err);
+		return;
 	}
 
  notifications:
 	/* e_book_backend_kolab_set_mode (backend, priv->book_mode); */
-	tmp_mode = kolab_mail_access_get_opmode (priv->book_koma, &error);
-	if (error != NULL) {
-		g_warning ("%s()[%u]: %s",
-		           __func__, __LINE__, error->message);
-		g_error_free (error);
-		error = NULL;
+	tmp_mode = kolab_mail_access_get_opmode (priv->book_koma, &tmp_err);
+	if (tmp_err != NULL) {
+		kolab_util_contact_err_to_edb_err (error, tmp_err, __func__, __LINE__);
+		g_error_free (tmp_err);
+		return;
 	}
 
-	e_book_backend_notify_auth_required (backend);
-	e_book_backend_set_is_loaded (backend, TRUE);
-	e_book_backend_notify_connection_status (backend,
+#if 0 /* FIXME */
+	e_book_backend_notify_auth_required (bbackend, TRUE, NULL);
+	e_book_backend_set_is_loaded (bbackend, TRUE);
+	e_book_backend_notify_connection_status (bbackend,
 	                                         tmp_mode = KOLAB_MAIL_ACCESS_OPMODE_ONLINE ? TRUE : FALSE);
-	e_book_backend_set_is_writable (backend, TRUE);
-	e_book_backend_notify_writable (backend, TRUE);
-
-	return GNOME_Evolution_Addressbook_Success;
-#endif /* FIXME */
+	e_book_backend_set_is_writable (bbackend, TRUE);
+	e_book_backend_notify_writable (bbackend, TRUE);
+#endif
 }
 
 static void
 e_book_backend_kolab_remove (EBookBackendSync *backend,
                              EDataBook *book,
                              GCancellable *cancellable,
-                             GError **err)
+                             GError **error)
 {
-	EBookBackendKolab *self = E_BOOK_BACKEND_KOLAB (backend);
-	EBookBackendKolabPrivate *priv = E_BOOK_BACKEND_KOLAB_PRIVATE (self);
+	EBookBackendKolab *self = NULL;
+	EBookBackendKolabPrivate *priv = NULL;
 
-	g_assert (E_IS_DATA_BOOK (book));
-	(void)cancellable; /* FIXME */ /* cancellable may be NULL */
-	g_return_if_fail (err == NULL || *err == NULL);
+	g_return_if_fail (error == NULL || *error == NULL);
+	e_return_data_book_error_if_fail (E_IS_BOOK_BACKEND_KOLAB (backend), E_DATA_BOOK_STATUS_INVALID_ARG);
+	e_return_data_book_error_if_fail (E_IS_DATA_BOOK (book), E_DATA_BOOK_STATUS_INVALID_ARG);
+	/* cancellable may be NULL */
+
+	self = E_BOOK_BACKEND_KOLAB (backend);
+	priv = E_BOOK_BACKEND_KOLAB_PRIVATE (self);
 
-	(void)self;
-	(void)priv;
 	g_error ("%s: FIXME implement me", __func__);
 
 #if 0 /* FIXME old */
@@ -296,17 +321,19 @@ static void
 e_book_backend_kolab_refresh (EBookBackendSync *backend,
                               EDataBook *book,
                               GCancellable *cancellable,
-                              GError **err)
+                              GError **error)
 {
-	EBookBackendKolab *self = E_BOOK_BACKEND_KOLAB (backend);
-	EBookBackendKolabPrivate *priv = E_BOOK_BACKEND_KOLAB_PRIVATE (self);
+	EBookBackendKolab *self = NULL;
+	EBookBackendKolabPrivate *priv = NULL;
 
-	g_assert (E_IS_DATA_BOOK (book));
-	(void)cancellable; /* FIXME */ /* cancellable may be NULL */
-	g_return_if_fail (err == NULL || *err == NULL);
+	g_return_if_fail (error == NULL || *error == NULL);
+	e_return_data_book_error_if_fail (E_IS_BOOK_BACKEND_KOLAB (backend), E_DATA_BOOK_STATUS_INVALID_ARG);
+	e_return_data_book_error_if_fail (E_IS_DATA_BOOK (book), E_DATA_BOOK_STATUS_INVALID_ARG);
+	/* cancellable may be NULL */
+
+	self = E_BOOK_BACKEND_KOLAB (backend);
+	priv = E_BOOK_BACKEND_KOLAB_PRIVATE (self);
 
-	(void)self;
-	(void)priv;
 	g_error ("%s: FIXME implement me", __func__);
 }
 
@@ -316,20 +343,24 @@ e_book_backend_kolab_get_backend_property (EBookBackendSync *backend,
                                            GCancellable *cancellable,
                                            const gchar *prop_name,
                                            gchar **prop_value,
-                                           GError **err)
+                                           GError **error)
 {
-	EBookBackendKolab *self = E_BOOK_BACKEND_KOLAB (backend);
-	EBookBackendKolabPrivate *priv = E_BOOK_BACKEND_KOLAB_PRIVATE (self);
+	EBookBackendKolab *self = NULL;
+	EBookBackendKolabPrivate *priv = NULL;
 
-	g_assert (E_IS_DATA_BOOK (book));
-	(void)cancellable; /* FIXME */ /* cancellable may be NULL */
-	(void)prop_name; /* FIXME */
-	(void)prop_value; /* FIXME */
-	g_return_val_if_fail (err == NULL || *err == NULL, FALSE);
+	g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
+	e_return_data_book_error_val_if_fail (E_IS_BOOK_BACKEND_KOLAB (backend), E_DATA_BOOK_STATUS_INVALID_ARG);
+	e_return_data_book_error_val_if_fail (E_IS_DATA_BOOK (book), E_DATA_BOOK_STATUS_INVALID_ARG);
+	/* cancellable may be NULL */
+	e_return_data_book_error_val_if_fail (prop_name != NULL, E_DATA_BOOK_STATUS_INVALID_ARG);
+	e_return_data_book_error_val_if_fail (prop_value != NULL && *prop_value == NULL, E_DATA_BOOK_STATUS_INVALID_ARG);
+
+	self = E_BOOK_BACKEND_KOLAB (backend);
+	priv = E_BOOK_BACKEND_KOLAB_PRIVATE (self);
 
-	(void)self;
-	(void)priv;
 	g_error ("%s: FIXME implement me", __func__);
+
+	return TRUE;
 }
 
 static gboolean
@@ -338,19 +369,21 @@ e_book_backend_kolab_set_backend_property (EBookBackendSync *backend,
                                            GCancellable *cancellable,
                                            const gchar *prop_name,
                                            const gchar *prop_value,
-                                           GError **err)
+                                           GError **error)
 {
-	EBookBackendKolab *self = E_BOOK_BACKEND_KOLAB (backend);
-	EBookBackendKolabPrivate *priv = E_BOOK_BACKEND_KOLAB_PRIVATE (self);
+	EBookBackendKolab *self = NULL;
+	EBookBackendKolabPrivate *priv = NULL;
+
+	g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
+	e_return_data_book_error_val_if_fail (E_IS_BOOK_BACKEND_KOLAB (backend), E_DATA_BOOK_STATUS_INVALID_ARG);
+	e_return_data_book_error_val_if_fail (E_IS_DATA_BOOK (book), E_DATA_BOOK_STATUS_INVALID_ARG);
+	/* cancellable may be NULL */
+	e_return_data_book_error_val_if_fail (prop_name != NULL, E_DATA_BOOK_STATUS_INVALID_ARG);
+	e_return_data_book_error_val_if_fail (prop_value != NULL, E_DATA_BOOK_STATUS_INVALID_ARG);
 
-	g_assert (E_IS_DATA_BOOK (book));
-	(void)cancellable; /* FIXME */ /* cancellable may be NULL */
-	(void)prop_name; /* FIXME */
-	(void)prop_value; /* FIXME */
-	g_return_val_if_fail (err == NULL || *err == NULL, FALSE);
+	self = E_BOOK_BACKEND_KOLAB (backend);
+	priv = E_BOOK_BACKEND_KOLAB_PRIVATE (self);
 
-	(void)self;
-	(void)priv;
 	g_error ("%s: FIXME implement me", __func__);
 }
 
@@ -360,19 +393,21 @@ e_book_backend_kolab_create_contacts (EBookBackendSync *backend,
                                       GCancellable *cancellable,
                                       const GSList *vcards,
                                       GSList **added_contacts,
-                                      GError **err)
+                                      GError **error)
 {
-	EBookBackendKolab *self = E_BOOK_BACKEND_KOLAB (backend);
-	EBookBackendKolabPrivate *priv = E_BOOK_BACKEND_KOLAB_PRIVATE (self);
+	EBookBackendKolab *self = NULL;
+	EBookBackendKolabPrivate *priv = NULL;
+
+	g_return_if_fail (error == NULL || *error == NULL);
+	e_return_data_book_error_if_fail (E_IS_BOOK_BACKEND_KOLAB (backend), E_DATA_BOOK_STATUS_INVALID_ARG);
+	e_return_data_book_error_if_fail (E_IS_DATA_BOOK (book), E_DATA_BOOK_STATUS_INVALID_ARG);
+	/* cancellable may be NULL */
+	e_return_data_book_error_if_fail (vcards != NULL, E_DATA_BOOK_STATUS_INVALID_ARG);
+	e_return_data_book_error_if_fail (added_contacts != NULL && *added_contacts == NULL, E_DATA_BOOK_STATUS_INVALID_ARG);
 
-	g_assert (E_IS_DATA_BOOK (book));
-	(void)cancellable; /* FIXME */ /* cancellable may be NULL */
-	(void)vcards; /* FIXME */
-	(void)added_contacts; /* FIXME */
-	g_return_if_fail (err == NULL || *err == NULL);
+	self = E_BOOK_BACKEND_KOLAB (backend);
+	priv = E_BOOK_BACKEND_KOLAB_PRIVATE (self);
 
-	(void)self;
-	(void)priv;
 	g_error ("%s: FIXME implement me", __func__);
 
 #if 0 /* FIXME old */
@@ -425,19 +460,21 @@ e_book_backend_kolab_remove_contacts (EBookBackendSync *backend,
                                       GCancellable *cancellable,
                                       const GSList *id_list,
                                       GSList **removed_ids,
-                                      GError **err)
+                                      GError **error)
 {
-	EBookBackendKolab *self = E_BOOK_BACKEND_KOLAB (backend);
-	EBookBackendKolabPrivate *priv = E_BOOK_BACKEND_KOLAB_PRIVATE (self);
+	EBookBackendKolab *self = NULL;
+	EBookBackendKolabPrivate *priv = NULL;
+
+	g_return_if_fail (error == NULL || *error == NULL);
+	e_return_data_book_error_if_fail (E_IS_BOOK_BACKEND_KOLAB (backend), E_DATA_BOOK_STATUS_INVALID_ARG);
+	e_return_data_book_error_if_fail (E_IS_DATA_BOOK (book), E_DATA_BOOK_STATUS_INVALID_ARG);
+	/* cancellable may be NULL */
+	e_return_data_book_error_if_fail (id_list != NULL, E_DATA_BOOK_STATUS_INVALID_ARG);
+	e_return_data_book_error_if_fail (removed_ids != NULL && *removed_ids == NULL, E_DATA_BOOK_STATUS_INVALID_ARG);
 
-	g_assert (E_IS_DATA_BOOK (book));
-	(void)cancellable; /* FIXME */ /* cancellable may be NULL */
-	(void)id_list; /* FIXME */
-	(void)removed_ids; /* FIXME */
-	g_return_if_fail (err == NULL || *err == NULL);
+	self = E_BOOK_BACKEND_KOLAB (backend);
+	priv = E_BOOK_BACKEND_KOLAB_PRIVATE (self);
 
-	(void)self;
-	(void)priv;
 	g_error ("%s: FIXME implement me", __func__);
 
 #if 0 /* FIXME old */
@@ -466,19 +503,21 @@ e_book_backend_kolab_modify_contacts (EBookBackendSync *backend,
                                       GCancellable *cancellable,
                                       const GSList *vcards,
                                       GSList **modified_contacts,
-                                      GError **err)
+                                      GError **error)
 {
-	EBookBackendKolab *self = E_BOOK_BACKEND_KOLAB (backend);
-	EBookBackendKolabPrivate *priv = E_BOOK_BACKEND_KOLAB_PRIVATE (self);
+	EBookBackendKolab *self = NULL;
+	EBookBackendKolabPrivate *priv = NULL;
+
+	g_return_if_fail (error == NULL || *error == NULL);
+	e_return_data_book_error_if_fail (E_IS_BOOK_BACKEND_KOLAB (backend), E_DATA_BOOK_STATUS_INVALID_ARG);
+	e_return_data_book_error_if_fail (E_IS_DATA_BOOK (book), E_DATA_BOOK_STATUS_INVALID_ARG);
+	/* cancellable may be NULL */
+	e_return_data_book_error_if_fail (vcards != NULL, E_DATA_BOOK_STATUS_INVALID_ARG);
+	e_return_data_book_error_if_fail (modified_contacts != NULL && *modified_contacts == NULL, E_DATA_BOOK_STATUS_INVALID_ARG);
 
-	g_assert (E_IS_DATA_BOOK (book));
-	(void)cancellable; /* FIXME */ /* cancellable may be NULL */
-	(void)vcards; /* FIXME */
-	(void)modified_contacts; /* FIXME */
-	g_return_if_fail (err == NULL || *err == NULL);
+	self = E_BOOK_BACKEND_KOLAB (backend);
+	priv = E_BOOK_BACKEND_KOLAB_PRIVATE (self);
 
-	(void)self;
-	(void)priv;
 	g_error ("%s: FIXME implement me", __func__);
 
 #if 0 /* FIXME old */
@@ -510,19 +549,21 @@ e_book_backend_kolab_get_contact (EBookBackendSync *backend,
                                   GCancellable *cancellable,
                                   const gchar *id,
                                   gchar **vcard,
-                                  GError **err)
+                                  GError **error)
 {
-	EBookBackendKolab *self = E_BOOK_BACKEND_KOLAB (backend);
-	EBookBackendKolabPrivate *priv = E_BOOK_BACKEND_KOLAB_PRIVATE (self);
+	EBookBackendKolab *self = NULL;
+	EBookBackendKolabPrivate *priv = NULL;
+
+	g_return_if_fail (error == NULL || *error == NULL);
+	e_return_data_book_error_if_fail (E_IS_BOOK_BACKEND_KOLAB (backend), E_DATA_BOOK_STATUS_INVALID_ARG);
+	e_return_data_book_error_if_fail (E_IS_DATA_BOOK (book), E_DATA_BOOK_STATUS_INVALID_ARG);
+	/* cancellable may be NULL */
+	e_return_data_book_error_if_fail (id != NULL, E_DATA_BOOK_STATUS_INVALID_ARG);
+	e_return_data_book_error_if_fail (vcard != NULL && *vcard == NULL, E_DATA_BOOK_STATUS_INVALID_ARG);
 
-	g_assert (E_IS_DATA_BOOK (book));
-	(void)cancellable; /* FIXME */ /* cancellable may be NULL */
-	(void)id; /* FIXME */
-	(void)vcard; /* FIXME */
-	g_return_if_fail (err == NULL || *err == NULL);
+	self = E_BOOK_BACKEND_KOLAB (backend);
+	priv = E_BOOK_BACKEND_KOLAB_PRIVATE (self);
 
-	(void)self;
-	(void)priv;
 	g_error ("%s: FIXME implement me", __func__);
 
 #if 0 /* FIXME old */
@@ -556,19 +597,21 @@ e_book_backend_kolab_get_contact_list (EBookBackendSync *backend,
                                        GCancellable *cancellable,
                                        const gchar *query,
                                        GSList **contacts,
-                                       GError **err)
+                                       GError **error)
 {
-	EBookBackendKolab *self = E_BOOK_BACKEND_KOLAB (backend);
-	EBookBackendKolabPrivate *priv = E_BOOK_BACKEND_KOLAB_PRIVATE (self);
+	EBookBackendKolab *self = NULL;
+	EBookBackendKolabPrivate *priv = NULL;
+
+	g_return_if_fail (error == NULL || *error == NULL);
+	e_return_data_book_error_if_fail (E_IS_BOOK_BACKEND_KOLAB (backend), E_DATA_BOOK_STATUS_INVALID_ARG);
+	e_return_data_book_error_if_fail (E_IS_DATA_BOOK (book), E_DATA_BOOK_STATUS_INVALID_ARG);
+	/* cancellable may be NULL */
+	e_return_data_book_error_if_fail (query != NULL, E_DATA_BOOK_STATUS_INVALID_ARG);
+	e_return_data_book_error_if_fail (contacts != NULL && *contacts == NULL, E_DATA_BOOK_STATUS_INVALID_ARG);
 
-	g_assert (E_IS_DATA_BOOK (book));
-	(void)cancellable; /* FIXME */ /* cancellable may be NULL */
-	(void)query; /* FIXME */
-	(void)contacts; /* FIXME */
-	g_return_if_fail (err == NULL || *err == NULL);
+	self = E_BOOK_BACKEND_KOLAB (backend);
+	priv = E_BOOK_BACKEND_KOLAB_PRIVATE (self);
 
-	(void)self;
-	(void)priv;
 	g_error ("%s: FIXME implement me", __func__);
 
 #if 0 /* FIXME old */
@@ -614,19 +657,21 @@ e_book_backend_kolab_get_contact_list_uids (EBookBackendSync *backend,
                                             GCancellable *cancellable,
                                             const gchar *query,
                                             GSList **contacts_uids,
-                                            GError **err)
+                                            GError **error)
 {
-	EBookBackendKolab *self = E_BOOK_BACKEND_KOLAB (backend);
-	EBookBackendKolabPrivate *priv = E_BOOK_BACKEND_KOLAB_PRIVATE (self);
+	EBookBackendKolab *self = NULL;
+	EBookBackendKolabPrivate *priv = NULL;
+
+	g_return_if_fail (error == NULL || *error == NULL);
+	e_return_data_book_error_if_fail (E_IS_BOOK_BACKEND_KOLAB (backend), E_DATA_BOOK_STATUS_INVALID_ARG);
+	e_return_data_book_error_if_fail (E_IS_DATA_BOOK (book), E_DATA_BOOK_STATUS_INVALID_ARG);
+	/* cancellable may be NULL */
+	e_return_data_book_error_if_fail (query != NULL, E_DATA_BOOK_STATUS_INVALID_ARG);
+	e_return_data_book_error_if_fail (contacts_uids != NULL && *contacts_uids == NULL, E_DATA_BOOK_STATUS_INVALID_ARG);
 
-	g_assert (E_IS_DATA_BOOK (book));
-	(void)cancellable; /* FIXME */ /* cancellable may be NULL */
-	(void)query; /* FIXME */
-	(void)contacts_uids; /* FIXME */
-	g_return_if_fail (err == NULL || *err == NULL);
+	self = E_BOOK_BACKEND_KOLAB (backend);
+	priv = E_BOOK_BACKEND_KOLAB_PRIVATE (self);
 
-	(void)self;
-	(void)priv;
 	g_error ("%s: FIXME implement me", __func__);
 }
 
@@ -634,17 +679,19 @@ static void
 e_book_backend_kolab_authenticate_user (EBookBackendSync *backend,
                                         GCancellable *cancellable,
                                         ECredentials *credentials,
-                                        GError **err)
+                                        GError **error)
 {
-	EBookBackendKolab *self = E_BOOK_BACKEND_KOLAB (backend);
-	EBookBackendKolabPrivate *priv = E_BOOK_BACKEND_KOLAB_PRIVATE (self);
+	EBookBackendKolab *self = NULL;
+	EBookBackendKolabPrivate *priv = NULL;
+
+	g_return_if_fail (error == NULL || *error == NULL);
+	e_return_data_book_error_if_fail (E_IS_BOOK_BACKEND_KOLAB (backend), E_DATA_BOOK_STATUS_INVALID_ARG);
+	/* cancellable may be NULL */
+	e_return_data_book_error_if_fail (credentials != NULL, E_DATA_BOOK_STATUS_INVALID_ARG);
 
-	(void)cancellable; /* FIXME */ /* cancellable may be NULL */
-	(void)credentials; /* FIXME */
-	g_return_if_fail (err == NULL || *err == NULL);
+	self = E_BOOK_BACKEND_KOLAB (backend);
+	priv = E_BOOK_BACKEND_KOLAB_PRIVATE (self);
 
-	(void)self;
-	(void)priv;
 	g_error ("%s: FIXME implement me", __func__);
 
 #if 0 /* FIXME old */
@@ -698,13 +745,15 @@ static void
 e_book_backend_kolab_start_book_view (EBookBackend *backend,
                                       EDataBookView *book_view)
 {
-	EBookBackendKolab *self = E_BOOK_BACKEND_KOLAB (backend);
-	EBookBackendKolabPrivate *priv = E_BOOK_BACKEND_KOLAB_PRIVATE (self);
+	EBookBackendKolab *self = NULL;
+	EBookBackendKolabPrivate *priv = NULL;
+
+	g_return_if_fail (E_IS_BOOK_BACKEND_KOLAB (backend));
+	g_return_if_fail (E_IS_DATA_BOOK_VIEW (book_view));
 
-	g_assert (E_IS_DATA_BOOK_VIEW (book_view));
+	self = E_BOOK_BACKEND_KOLAB (backend);
+	priv = E_BOOK_BACKEND_KOLAB_PRIVATE (self);
 
-	(void)self;
-	(void)priv;
 	g_error ("%s: FIXME implement me", __func__);
 
 #if 0 /* FIXME old */
@@ -770,28 +819,31 @@ static void
 e_book_backend_kolab_stop_book_view (EBookBackend *backend,
                                      EDataBookView *book_view)
 {
-	EBookBackendKolab *self = E_BOOK_BACKEND_KOLAB (backend);
-	EBookBackendKolabPrivate *priv = E_BOOK_BACKEND_KOLAB_PRIVATE (self);
+	EBookBackendKolab *self = NULL;
+	EBookBackendKolabPrivate *priv = NULL;
 
-	g_assert (E_IS_DATA_BOOK_VIEW (book_view));
+	g_return_if_fail (E_IS_BOOK_BACKEND_KOLAB (backend));
+	g_return_if_fail (E_IS_DATA_BOOK_VIEW (book_view));
 
-	(void)self;
-	(void)priv;
-	g_error ("%s: FIXME implement me", __func__);
+	self = E_BOOK_BACKEND_KOLAB (backend);
+	priv = E_BOOK_BACKEND_KOLAB_PRIVATE (self);
 
+	g_error ("%s: FIXME implement me", __func__);
 }
 
 static void
 e_book_backend_kolab_notify_update (EBookBackend *backend,
                                     const EContact *contact)
 {
-	EBookBackendKolab *self = E_BOOK_BACKEND_KOLAB (backend);
-	EBookBackendKolabPrivate *priv = E_BOOK_BACKEND_KOLAB_PRIVATE (self);
+	EBookBackendKolab *self = NULL;
+	EBookBackendKolabPrivate *priv = NULL;
+
+	g_return_if_fail (E_IS_BOOK_BACKEND_KOLAB (backend));
+	g_return_if_fail (E_IS_CONTACT (contact));
 
-	g_assert (E_IS_CONTACT (contact));
+	self = E_BOOK_BACKEND_KOLAB (backend);
+	priv = E_BOOK_BACKEND_KOLAB_PRIVATE (self);
 
-	(void)self;
-	(void)priv;
 	g_error ("%s: FIXME implement me", __func__);
 }
 
@@ -805,10 +857,16 @@ e_book_backend_kolab_init (EBookBackendKolab *backend)
 
 	g_debug ("%s()[%u] called.", __func__, __LINE__);
 
+	if (koma_objects == NULL)
+		koma_objects = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
+	else
+		g_hash_table_ref (koma_objects);
+
+	priv->koma_table = koma_objects;
+
 	/* priv->book_mode = E_DATA_BOOK_MODE_LOCAL; */ /* Start in local mode for now. */
 	priv->book_cache = NULL;
 	priv->book_uri = NULL;
-	priv->koma_table = NULL;
 	priv->book_koma = NULL;
 	priv->auth_received = FALSE;
 } /* e_book_backend_kolab_init () */
@@ -826,10 +884,19 @@ e_book_backend_kolab_dispose (GObject *object)
 		e_book_backend_notify_writable (self, FALSE);
 		e_book_backend_notify_connection_status (self, FALSE);
 		e_book_backend_set_is_loaded (self, FALSE);
+	}
+#endif
+
+	if (priv->book_koma != NULL) {
 		g_object_unref (priv->book_koma);
 		priv->book_koma = NULL;
 	}
-#endif
+
+	if (priv->koma_table != NULL) {
+		g_hash_table_unref (koma_objects);
+		priv->koma_table = NULL;
+	}
+
 	if (priv->book_cache != NULL) {
 		(void) e_file_cache_remove (E_FILE_CACHE (priv->book_cache));
 		g_object_unref (priv->book_cache);
@@ -861,6 +928,14 @@ e_book_backend_kolab_class_init (EBookBackendKolabClass *klass)
 
 	g_type_class_add_private (klass, sizeof (EBookBackendKolabPrivate));
 
+	object_class->dispose = e_book_backend_kolab_dispose;
+	object_class->finalize = e_book_backend_kolab_finalize;
+
+	/* Backend parent class methods methods not covered in the sync backend part */
+	backend_class->start_book_view = e_book_backend_kolab_start_book_view;
+	backend_class->stop_book_view = e_book_backend_kolab_stop_book_view;
+	backend_class->notify_update = e_book_backend_kolab_notify_update;
+
 	/* Sync backend class functions */
 	sync_class->open_sync = e_book_backend_kolab_open;
 	sync_class->remove_sync = e_book_backend_kolab_remove;
@@ -874,14 +949,6 @@ e_book_backend_kolab_class_init (EBookBackendKolabClass *klass)
 	sync_class->get_contact_list_sync = e_book_backend_kolab_get_contact_list;
 	sync_class->get_contact_list_uids_sync = e_book_backend_kolab_get_contact_list_uids;
 	sync_class->authenticate_user_sync = e_book_backend_kolab_authenticate_user;
-
-	/* Backend parent class methods methods not covered in the sync backend part */
-	backend_class->start_book_view = e_book_backend_kolab_start_book_view;
-	backend_class->stop_book_view = e_book_backend_kolab_stop_book_view;
-	backend_class->notify_update = e_book_backend_kolab_notify_update;
-
-	object_class->dispose = e_book_backend_kolab_dispose;
-	object_class->finalize = e_book_backend_kolab_finalize;
 } /* e_book_backend_kolab_class_init () */
 
 
diff --git a/src/addressbook/kolab-util-contact.c b/src/addressbook/kolab-util-contact.c
index 7aa935d..b83b369 100644
--- a/src/addressbook/kolab-util-contact.c
+++ b/src/addressbook/kolab-util-contact.c
@@ -35,7 +35,7 @@
 /*----------------------------------------------------------------------------*/
 
 gboolean
-kolab_util_contact_has_id (EContact *contact) 
+kolab_util_contact_has_id (EContact *contact)
 {
 	gchar *uid = NULL;
 
@@ -110,7 +110,7 @@ kolab_util_contact_deploy_mode_by_koma (KolabMailAccess *koma,
 
 #if 0
 gboolean
-kolab_util_contact_deploy_mode_by_backend (KolabMailAccess *koma, 
+kolab_util_contact_deploy_mode_by_backend (KolabMailAccess *koma,
                                            GNOME_Evolution_Addressbook_BookMode backend_mode)
 {
 	KolabMailAccessOpmodeID koma_mode;
@@ -161,7 +161,7 @@ kolab_util_contact_store (EContact *econtact,
 		g_propagate_error (error, tmp_error);
 		return FALSE;
 	}
-	
+
 	return TRUE;
 } /* kolab_util_contact_store () */
 
@@ -173,7 +173,7 @@ kolab_util_contact_map_error (GError *error)
 
 	if (error == NULL)
 		return GNOME_Evolution_Addressbook_Success;
-	
+
 	switch (error->code) {
 	case KOLAB_BACKEND_ERROR_SYNC_NOTSTORED:
 		status = GNOME_Evolution_Addressbook_Success;
@@ -194,4 +194,66 @@ kolab_util_contact_map_error (GError *error)
 }
 #endif
 
+void
+kolab_util_contact_err_to_edb_err (GError **e_err,
+                                   const GError *k_err,
+                                   const gchar *func,
+                                   guint line)
+{
+	EDataBookStatus status = E_DATA_BOOK_STATUS_OTHER_ERROR;
+	GError *tmp_err = NULL;
+
+	g_return_if_fail (e_err == NULL || *e_err == NULL);
+	g_return_if_fail (k_err != NULL);
+
+	g_warning ("%s()[%u]: '%s', Code %i, Domain '%s'",
+	           func, line, k_err->message, k_err->code,
+	           g_quark_to_string (k_err->domain));
+
+	if (!e_err)
+		return;
+
+	if (g_error_matches (k_err, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
+		g_propagate_error (e_err, g_error_copy (k_err));
+		return;
+	}
+
+	/* TODO
+	 *
+	 * Need to implement a more elaborated error mapping here.
+	 * This function maps Kolab engine errors only. Errors can
+	 * originate from the camel/ as well as from the libekolab/
+	 * libs. These yield errors in various domains. The following
+	 * E_DATA_BOOK_STATUS_* (other than OTHER_ERROR) are candidates
+	 * for being populated from certain k_err's:
+	 *
+	 * E_DATA_BOOK_STATUS_REPOSITORY_OFFLINE,
+	 * E_DATA_BOOK_STATUS_PERMISSION_DENIED,
+	 * E_DATA_BOOK_STATUS_CONTACT_NOT_FOUND,
+	 * E_DATA_BOOK_STATUS_CONTACTID_ALREADY_EXISTS,
+	 * E_DATA_BOOK_STATUS_AUTHENTICATION_FAILED,
+	 * E_DATA_BOOK_STATUS_AUTHENTICATION_REQUIRED,
+	 * E_DATA_BOOK_STATUS_NO_SUCH_BOOK,
+	 * E_DATA_BOOK_STATUS_BOOK_REMOVED,
+	 * E_DATA_BOOK_STATUS_SEARCH_SIZE_LIMIT_EXCEEDED,
+	 * E_DATA_BOOK_STATUS_SEARCH_TIME_LIMIT_EXCEEDED,
+	 * E_DATA_BOOK_STATUS_INVALID_QUERY,
+	 * E_DATA_BOOK_STATUS_QUERY_REFUSED,
+	 * E_DATA_BOOK_STATUS_COULD_NOT_CANCEL,
+	 * E_DATA_BOOK_STATUS_INVALID_SERVER_VERSION,
+	 * E_DATA_BOOK_STATUS_NO_SPACE,
+	 * E_DATA_BOOK_STATUS_NOT_SUPPORTED,
+	 *
+	 * Depending on k_err->domain and k_err->code, we can map
+	 * to a fitting E_DATA_BOOK_STATUS. More than one combination
+	 * of k_err->domain and k_err->code may map to one specific
+	 * E_DATA_BOOK_STATUS.
+	 */
+
+	tmp_err = e_data_book_create_error (status,
+	                                    k_err->message);
+	g_propagate_error (e_err, tmp_err);
+}
+
+
 /*----------------------------------------------------------------------------*/
diff --git a/src/addressbook/kolab-util-contact.h b/src/addressbook/kolab-util-contact.h
index 8cce1b6..33d68fa 100644
--- a/src/addressbook/kolab-util-contact.h
+++ b/src/addressbook/kolab-util-contact.h
@@ -68,6 +68,12 @@ gboolean kolab_util_contact_deploy_mode_by_backend (KolabMailAccess *koma, GNOME
 EBookBackendSyncStatus kolab_util_contact_map_error (GError *error);
 #endif
 
+void
+kolab_util_contact_err_to_edb_err (GError **e_err,
+                                   const GError *k_err,
+                                   const gchar *func,
+                                   guint line);
+
 G_END_DECLS
 
 /*----------------------------------------------------------------------------*/



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