[evolution-kolab] EBookBackendKolab: assign each book backend its own KolabMailAccess instance



commit 3b6a1e105cfb15048eb168d8dd62eee24b76277b
Author: Christian Hilberg <hilberg kernelconcepts de>
Date:   Fri Sep 7 11:51:23 2012 +0200

    EBookBackendKolab: assign each book backend its own KolabMailAccess instance
    
    * each backend has its own cache directory,
      so we need to write KolabMailAccess cache
      data into these (i.e., configure KolabMailAccess
      accordingly)
    * once each backend instance is given its own
      E-D-S process, we cannot share KolabMailAccess
      instances among backend instances any longer
      anyway

 src/addressbook/e-book-backend-kolab.c |  109 ++++++++------------------------
 1 files changed, 26 insertions(+), 83 deletions(-)
---
diff --git a/src/addressbook/e-book-backend-kolab.c b/src/addressbook/e-book-backend-kolab.c
index b320c31..c948422 100644
--- a/src/addressbook/e-book-backend-kolab.c
+++ b/src/addressbook/e-book-backend-kolab.c
@@ -57,10 +57,7 @@
 	(g_type_class_unref (g_type_class_ref (type)))
 
 /*----------------------------------------------------------------------------*/
-/* table of KolabMailAccess objects */
 
-static GHashTable *koma_objects = NULL;
-static GMutex koma_objects_lock;
 static GMutex active_book_views_lock;
 
 /*----------------------------------------------------------------------------*/
@@ -248,25 +245,20 @@ book_backend_kolab_open (EBookBackendSync *backend,
 	CamelKolabIMAPXSettings *kolab_settings = NULL;
 	CamelNetworkSettings *network_settings = NULL;
 	KolabSettingsHandler *ksettings = NULL;
-	KolabMailAccess *tmp_koma = NULL;
 	KolabSyncStrategyID sync_value = KOLAB_SYNC_STRATEGY_DEFAULT;
 	const gchar *extension_name = NULL;
 	const gchar *foldername = NULL;
 	gchar *servername = NULL;
 	gchar *username = NULL;
-	gchar *user_at_server = NULL;
-	gchar *tmp_key = NULL;
 	gboolean online = FALSE;
 	gboolean ok = FALSE;
 	GError *tmp_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 */
 	(void)only_if_exists; /* FIXME */
-	e_return_data_book_error_if_fail (error == NULL || *error == NULL, E_DATA_BOOK_STATUS_INVALID_ARG);
-
-	g_mutex_lock (&koma_objects_lock);
 
 	self = E_BOOK_BACKEND_KOLAB (backend);
 	priv = E_BOOK_BACKEND_KOLAB_PRIVATE (self);
@@ -290,40 +282,10 @@ book_backend_kolab_open (EBookBackendSync *backend,
 	extension_name = E_SOURCE_EXTENSION_KOLAB_FOLDER;
 	extension = e_source_get_extension (esource, extension_name);
 	sync_value = e_source_kolab_folder_get_sync_strategy (extension);
+	
 	online = e_backend_get_online (E_BACKEND (backend));
-
 	foldername = kolab_util_backend_get_foldername (E_BACKEND (backend));
 
-	/* Check whether we have a KolabMailAccess (KoMA) instance already */
-	user_at_server = g_strdup_printf ("%s %s",
-	                                  username, servername);
-	ok = g_hash_table_lookup_extended (koma_objects,
-	                                   user_at_server,
-	                                   (gpointer *) &tmp_key,
-	                                   (gpointer *) &tmp_koma);
-
-	if (ok) {
-		/* There already is a KoMA instance for user_at_server.
-		 * Use it and return
-		 */
-		g_object_ref (tmp_koma);
-		priv->book_koma = tmp_koma;
-		ksettings = kolab_mail_access_get_settings_handler (priv->book_koma);
-		kolab_util_backend_prepare_settings (ksettings,
-		                                     NULL,
-		                                     NULL,
-		                                     foldername,
-		                                     &sync_value);
-
-		(void) kolab_util_backend_deploy_mode_by_backend (priv->book_koma,
-		                                                  online,
-		                                                  cancellable,
-		                                                  &tmp_err);
-		goto exit;
-	}
-
-	/* Nope, we need to setup a new KoMA instance and a settings handler */
-
 	/* init subsystems (these are no-ops if already called before) */
 	kolab_util_glib_init ();
 	kolab_util_http_init ();
@@ -356,12 +318,6 @@ book_backend_kolab_open (EBookBackendSync *backend,
 
 	/* create new KolabMailAccess instance */
 	priv->book_koma = KOLAB_MAIL_ACCESS (g_object_new (KOLAB_TYPE_MAIL_ACCESS, NULL));
-	g_object_add_toggle_ref (G_OBJECT (priv->book_koma),
-	                         kolab_util_backend_koma_table_cleanup_cb,
-	                         koma_objects);
-	g_hash_table_insert (koma_objects,
-	                     user_at_server,
-	                     priv->book_koma);
 
 	/* configure and bring up KolabMailAccess instance */
 	ok = kolab_mail_access_configure (priv->book_koma,
@@ -385,15 +341,10 @@ book_backend_kolab_open (EBookBackendSync *backend,
 
 	if (ksettings != NULL)
 		g_object_unref (ksettings);
-
-	g_mutex_unlock (&koma_objects_lock);
-
 	if (servername != NULL)
 		g_free (servername);
 	if (username != NULL)
 		g_free (username);
-	if (user_at_server != NULL)
-		g_free (user_at_server);
 
 	/* do we have an error set? if so, propagate and return */
 	if (tmp_err != NULL) {
@@ -418,6 +369,8 @@ book_backend_kolab_remove (EBookBackendSync *backend,
 {
 	EBookBackendKolab *self = NULL;
 	EBookBackendKolabPrivate *priv = NULL;
+	GError *tmp_err = NULL;
+	gboolean ok = FALSE;
 
 	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);
@@ -427,9 +380,18 @@ book_backend_kolab_remove (EBookBackendSync *backend,
 	self = E_BOOK_BACKEND_KOLAB (backend);
 	priv = E_BOOK_BACKEND_KOLAB_PRIVATE (self);
 
-	g_warning ("%s: FIXME implement me", __func__);
-
-	book_backend_kolab_notify_removed (self);
+	if (priv->book_koma != NULL) {
+		ok = kolab_mail_access_shutdown (priv->book_koma,
+		                                 cancellable,
+		                                 &tmp_err);
+		if (ok) {
+			g_object_unref (priv->book_koma);
+			priv->book_koma = NULL;
+			book_backend_kolab_notify_removed (self);
+		} else {
+			g_propagate_error (error, tmp_err);
+		}
+	}
 }
 
 static void
@@ -438,17 +400,18 @@ book_backend_kolab_refresh (EBookBackendSync *backend,
                             GCancellable *cancellable,
                             GError **error)
 {
+#if 0
 	EBookBackendKolab *self = NULL;
 	EBookBackendKolabPrivate *priv = NULL;
-
+#endif
 	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 */
-
+#if 0
 	self = E_BOOK_BACKEND_KOLAB (backend);
 	priv = E_BOOK_BACKEND_KOLAB_PRIVATE (self);
-
+#endif
 	g_warning ("%s: FIXME implement me", __func__);
 }
 
@@ -814,8 +777,8 @@ book_backend_kolab_get_backend_property (EBookBackendSync *backend,
                                          gchar **prop_value,
                                          GError **error)
 {
-	EBookBackendKolab *self = NULL;
-	EBookBackendKolabPrivate *priv = NULL;
+	/* EBookBackendKolab *self = NULL; */
+	/* EBookBackendKolabPrivate *priv = NULL; */
 	gboolean processed = TRUE;
 
 	g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
@@ -825,8 +788,8 @@ book_backend_kolab_get_backend_property (EBookBackendSync *backend,
 	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);
+	/* self = E_BOOK_BACKEND_KOLAB (backend); */
+	/* priv = E_BOOK_BACKEND_KOLAB_PRIVATE (self); */
 
 	if (g_str_equal (prop_name, CLIENT_BACKEND_PROPERTY_CAPABILITIES)) {
 		*prop_value = g_strdup ("net,bulk-removes,contact-lists,do-initial-query");
@@ -1083,8 +1046,6 @@ static void
 book_backend_kolab_stop_book_view (EBookBackend *backend,
                                    EDataBookView *book_view)
 {
-	EDataBookView *bv = NULL;
-
 	g_return_if_fail (E_IS_BOOK_BACKEND_KOLAB (backend));
 	g_return_if_fail (E_IS_DATA_BOOK_VIEW (book_view));
 
@@ -1105,14 +1066,6 @@ e_book_backend_kolab_init (EBookBackendKolab *backend)
 {
 	EBookBackendKolabPrivate *priv = E_BOOK_BACKEND_KOLAB_PRIVATE (backend);
 
-	g_mutex_lock (&koma_objects_lock);
-	if (koma_objects == NULL)
-		koma_objects = g_hash_table_new_full (g_direct_hash,
-		                                      g_direct_equal,
-		                                      g_free,
-		                                      g_object_unref);
-	g_mutex_unlock (&koma_objects_lock);
-
 	g_debug ("%s()[%u] called.", __func__, __LINE__);
 
 	priv->book_koma = NULL;
@@ -1129,22 +1082,12 @@ e_book_backend_kolab_dispose (GObject *object)
 	EBookBackendKolabPrivate *priv = E_BOOK_BACKEND_KOLAB_PRIVATE (self);
 
 	g_debug ("%s()[%u] called.", __func__, __LINE__);
-#if 0 /* FIXME */
-	if (e_book_backend_is_loaded (self)) {
-		e_book_backend_set_is_writable (self, FALSE);
-		e_book_backend_notify_writable (self, FALSE);
-		e_book_backend_notify_connection_status (self, FALSE);
-		e_book_backend_set_is_loaded (self, FALSE);
-	}
-#endif
-
-	g_warning ("%s()[%u] FIXME KolabMailAccess (table) disposal", __func__, __LINE__);
-#if 0 /* FIXME (check g_object_toggle_ref cleanup callback) */
 	if (priv->book_koma != NULL) {
 		g_object_unref (priv->book_koma);
 		priv->book_koma = NULL;
 	}
-#endif
+
+	G_OBJECT_CLASS (e_book_backend_kolab_parent_class)->dispose (object);
 }
 
 static void



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