[evolution-kolab/ek-wip-porting] E<Cal|Book>BackendKolab: fixed book/cal view handling



commit 7cc5468ff9ec238084ed18baae7924160caf7a79
Author: Christian Hilberg <hilberg kernelconcepts de>
Date:   Mon Mar 19 19:05:16 2012 +0100

    E<Cal|Book>BackendKolab: fixed book/cal view handling
    
    * manage multiple cal/book views
    * check for multiple stop_view() calls,
      avoid multiple free()ing and subsequent
      crashes

 src/addressbook/e-book-backend-kolab.c |   42 ++++++++++++++++++++++++++++----
 src/calendar/e-cal-backend-kolab.c     |   33 +++++++++++++++++++++++-
 2 files changed, 68 insertions(+), 7 deletions(-)
---
diff --git a/src/addressbook/e-book-backend-kolab.c b/src/addressbook/e-book-backend-kolab.c
index 42a6bb8..f3f91ca 100644
--- a/src/addressbook/e-book-backend-kolab.c
+++ b/src/addressbook/e-book-backend-kolab.c
@@ -62,6 +62,7 @@ struct _EBookBackendKolabPrivate
 	KolabMailAccess *book_koma;
 	gchar *book_uri;
 	GHashTable *koma_table;
+	GHashTable *active_book_views;
 	gboolean auth_received;
 	GError *mode_switch_err;
 };
@@ -145,7 +146,7 @@ book_backend_kolab_signal_online_cb (GObject *object)
 
 static gboolean
 book_backend_kolab_notify_opened (EBookBackendKolab *self,
-                                GError **err)
+                                  GError **err)
 {
 	EBookBackend *bbackend = NULL;
 	EBookBackendKolabPrivate *priv = NULL;
@@ -1029,9 +1030,10 @@ e_book_backend_kolab_start_book_view (EBookBackend *backend,
 	GList *econtact_list = NULL;
 	GList *it = NULL;
 	gchar *query = NULL;
-	gboolean ok = NULL;
+	gboolean ok = FALSE;
 	GError *tmp_err = NULL;
 	GError *notify_err = NULL;
+	EDataBookView *bv = NULL;
 
 	g_return_if_fail (E_IS_BOOK_BACKEND_KOLAB (backend));
 	g_return_if_fail (E_IS_DATA_BOOK_VIEW (book_view));
@@ -1039,6 +1041,18 @@ e_book_backend_kolab_start_book_view (EBookBackend *backend,
 	self = E_BOOK_BACKEND_KOLAB (backend);
 	priv = E_BOOK_BACKEND_KOLAB_PRIVATE (self);
 
+	bv = g_hash_table_lookup (priv->active_book_views, book_view);
+	if (bv != NULL) {
+		g_warning ("%s()[%u] book view already active!",
+		           __func__, __LINE__);
+		goto exit;
+	}
+
+	g_object_ref (book_view);
+	g_hash_table_insert (priv->active_book_views,
+	                     book_view,
+	                     NULL);
+
 	query = e_data_book_view_get_card_query (book_view);
 
 	/* First update the BackendCache to the current situation. */
@@ -1062,16 +1076,18 @@ e_book_backend_kolab_start_book_view (EBookBackend *backend,
 
 	/* Then deliver requests from there. */
 	for (it = econtact_list; it != NULL; it = g_list_next (it)) {
-		EContact *econtact = it->data;
+		EContact *econtact = E_CONTACT (it->data);
 		e_data_book_view_notify_update (book_view, econtact);
+		g_object_unref (econtact);
 	}
 
  exit:
+
 	if (query != NULL)
 		g_free (query);
 
 	if (econtact_list != NULL)
-		g_list_free_full (econtact_list, g_object_unref);
+		g_list_free (econtact_list);
 
 	if (tmp_err != NULL) {
 		kolab_util_contact_err_to_edb_err (&notify_err, tmp_err, __func__, __LINE__);
@@ -1089,6 +1105,7 @@ e_book_backend_kolab_stop_book_view (EBookBackend *backend,
 {
 	EBookBackendKolab *self = NULL;
 	EBookBackendKolabPrivate *priv = NULL;
+	EDataBookView *bv = NULL;
 
 	g_return_if_fail (E_IS_BOOK_BACKEND_KOLAB (backend));
 	g_return_if_fail (E_IS_DATA_BOOK_VIEW (book_view));
@@ -1096,8 +1113,15 @@ e_book_backend_kolab_stop_book_view (EBookBackend *backend,
 	self = E_BOOK_BACKEND_KOLAB (backend);
 	priv = E_BOOK_BACKEND_KOLAB_PRIVATE (self);
 
-	g_warning ("%s: FIXME implement me", __func__);
+	bv = g_hash_table_lookup (priv->active_book_views, book_view);
+	if (bv == NULL) {
+		g_warning ("%s()[%u] book view already stopped!",
+		           __func__, __LINE__);
+		return;
+	}
+
 	e_data_book_view_notify_complete (book_view, NULL);
+	g_hash_table_remove (priv->active_book_views, book_view);
 }
 
 static void
@@ -1137,6 +1161,10 @@ e_book_backend_kolab_init (EBookBackendKolab *backend)
 	priv->book_cache = NULL;
 	priv->book_uri = NULL;
 	priv->book_koma = NULL;
+	priv->active_book_views = g_hash_table_new_full (g_direct_hash,
+	                                                 g_direct_equal,
+	                                                 g_object_unref,
+	                                                 NULL);
 	priv->auth_received = FALSE;
 	priv->mode_switch_err = NULL;
 
@@ -1175,6 +1203,10 @@ e_book_backend_kolab_dispose (GObject *object)
 		g_object_unref (priv->book_cache);
 		priv->book_cache = NULL;
 	}
+	if (priv->active_book_views != NULL) {
+		g_hash_table_destroy (priv->active_book_views);
+		priv->active_book_views = NULL;
+	}
 }
 
 static void
diff --git a/src/calendar/e-cal-backend-kolab.c b/src/calendar/e-cal-backend-kolab.c
index 4d19a10..e14eec6 100644
--- a/src/calendar/e-cal-backend-kolab.c
+++ b/src/calendar/e-cal-backend-kolab.c
@@ -85,6 +85,7 @@ struct _ECalBackendKolabPrivate {
 	CalMode cal_mode;
 	KolabMailAccess *cal_koma;
 	ECalBackendCache *cal_cache;
+	GHashTable *active_cal_views;
 	gchar *user_email;
 	ECalComponent *default_zone;
 	ECalSourceType source_type;
@@ -1728,6 +1729,7 @@ e_cal_backend_kolab_start_view (ECalBackend *backend,
 {
 	ECalBackendKolab *self = NULL;
 	ECalBackendKolabPrivate *priv = NULL;
+	EDataCalView *cv = NULL;
 	GList *uid_list = NULL;
 	GList *it = NULL;
 	GSList *iCal_objects = NULL;
@@ -1743,6 +1745,18 @@ e_cal_backend_kolab_start_view (ECalBackend *backend,
 	self = E_CAL_BACKEND_KOLAB (backend);
 	priv = E_CAL_BACKEND_KOLAB_PRIVATE (self);
 
+	cv = g_hash_table_lookup (priv->active_cal_views, view);
+	if (cv != NULL) {
+		g_warning ("%s()[%u] cal view already active!",
+		           __func__, __LINE__);
+		return;
+	}
+
+	g_object_ref (view);
+	g_hash_table_insert (priv->active_cal_views,
+	                     view,
+	                     NULL);
+
 	query = e_data_cal_view_get_text (view);
 
 	sourcename = kolab_util_backend_get_relative_path_from_uri (priv->cal_uri);
@@ -1805,7 +1819,6 @@ e_cal_backend_kolab_start_view (ECalBackend *backend,
 	}
 
 	e_data_cal_view_notify_complete (view, view_err);
-
 	if (view_err != NULL)
 		g_error_free (view_err);
 }
@@ -1816,6 +1829,7 @@ e_cal_backend_kolab_stop_view (ECalBackend *backend,
 {
 	ECalBackendKolab *self = NULL;
 	ECalBackendKolabPrivate *priv = NULL;
+	EDataCalView *cv = NULL;
 
 	g_return_if_fail (E_IS_CAL_BACKEND_KOLAB (backend));
 	g_return_if_fail (E_IS_DATA_CAL_VIEW (view));
@@ -1823,8 +1837,15 @@ e_cal_backend_kolab_stop_view (ECalBackend *backend,
 	self = E_CAL_BACKEND_KOLAB (backend);
 	priv = E_CAL_BACKEND_KOLAB_PRIVATE (self);
 
-	g_warning ("%s: FIXME implement me", __func__);
+	cv = g_hash_table_lookup (priv->active_cal_views, view);
+	if (cv == NULL) {
+		g_warning ("%s()[%u] cal view already stopped!",
+		           __func__, __LINE__);
+		return;
+	}
+
 	e_data_cal_view_notify_complete (view, NULL);
+	g_hash_table_remove (priv->active_cal_views, view);
 }
 
 static void
@@ -1872,6 +1893,10 @@ e_cal_backend_kolab_init (ECalBackendKolab *backend)
 	priv->already_opened = FALSE;
 	priv->cal_uri = NULL;
 	priv->mode_switch_err = NULL;
+	priv->active_cal_views = g_hash_table_new_full (g_direct_hash,
+	                                                g_direct_equal,
+	                                                g_object_unref,
+	                                                NULL);
 
 	g_signal_connect (E_BACKEND (backend), "notify::online", G_CALLBACK (cal_backend_kolab_signal_online_cb), NULL);
 } /* e_cal_backend_kolab_init () */
@@ -1906,6 +1931,10 @@ e_cal_backend_kolab_dispose (GObject *object)
 		g_object_unref (priv->cal_cache);
 		priv->cal_cache = NULL;
 	}
+	if (priv->active_cal_views != NULL) {
+		g_hash_table_destroy (priv->active_cal_views);
+		priv->active_cal_views = NULL;
+	}
 
 	G_OBJECT_CLASS (e_cal_backend_kolab_parent_class)->dispose (object);
 } /* e_cal_backend_kolab_dispose () */



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