[evolution-data-server/account-mgmt: 9/33] Adapt libedata-book to the new ESource API.



commit 3088078bb02d37dc99526c154ad94e7271443874
Author: Matthew Barnes <mbarnes redhat com>
Date:   Fri Nov 12 16:48:26 2010 -0500

    Adapt libedata-book to the new ESource API.

 addressbook/libedata-book/e-book-backend.c      |   10 +-
 addressbook/libedata-book/e-data-book-factory.c |  169 +++++++++++++++--------
 2 files changed, 112 insertions(+), 67 deletions(-)
---
diff --git a/addressbook/libedata-book/e-book-backend.c b/addressbook/libedata-book/e-book-backend.c
index f014849..f1f43c9 100644
--- a/addressbook/libedata-book/e-book-backend.c
+++ b/addressbook/libedata-book/e-book-backend.c
@@ -53,21 +53,19 @@ book_backend_set_default_cache_dir (EBookBackend *backend)
 {
 	ESource *source;
 	const gchar *user_cache_dir;
-	gchar *mangled_uri;
+	const gchar *uid;
 	gchar *filename;
 
 	user_cache_dir = e_get_user_cache_dir ();
 	source = e_book_backend_get_source (backend);
 
-	/* Mangle the URI to not contain invalid characters. */
-	mangled_uri = g_strdelimit (e_source_get_uri (source), ":/", '_');
+	uid = e_source_get_uid (source);
+	g_return_if_fail (uid != NULL);
 
 	filename = g_build_filename (
-		user_cache_dir, "addressbook", mangled_uri, NULL);
+		user_cache_dir, "addressbook", uid, NULL);
 	e_book_backend_set_cache_dir (backend, filename);
 	g_free (filename);
-
-	g_free (mangled_uri);
 }
 
 static void
diff --git a/addressbook/libedata-book/e-data-book-factory.c b/addressbook/libedata-book/e-data-book-factory.c
index 4063929..3f14bf3 100644
--- a/addressbook/libedata-book/e-data-book-factory.c
+++ b/addressbook/libedata-book/e-data-book-factory.c
@@ -45,8 +45,10 @@
 #define GOA_KEY "goa-account-id"
 #endif
 
+#include <libedataserver/e-source-registry.h>
 #include <libebackend/e-data-server-module.h>
 #include <libebackend/e-offline-listener.h>
+#include <libebook/e-source-address-book.h>
 #include "e-book-backend-factory.h"
 #include "e-data-book-factory.h"
 #include "e-data-book.h"
@@ -92,11 +94,11 @@ G_DEFINE_TYPE (EDataBookFactory, e_data_book_factory, G_TYPE_OBJECT);
 struct _EDataBookFactoryPrivate {
 	EGdbusBookFactory *gdbus_object;
 
-	/* 'protocol' -> EBookBackendFactory hash table */
+	/* 'backend name' -> EBookBackendFactory hash table */
 	GHashTable *factories;
 
 	GMutex *backends_lock;
-	/* 'uri' -> EBookBackend */
+	/* 'UID' -> EBookBackend */
 	GHashTable *backends;
 
 	GMutex *books_lock;
@@ -219,42 +221,6 @@ e_data_book_factory_set_backend_online (EDataBookFactory *factory,
 	g_mutex_unlock (factory->priv->backends_lock);
 }
 
-/* TODO: write dispose to kill hash */
-static gchar *
-e_data_book_factory_extract_proto_from_uri (const gchar *uri)
-{
-	gchar *proto, *p;
-	p = strchr (uri, ':');
-	if (p == NULL)
-		return NULL;
-	proto = g_malloc0 (p - uri + 1);
-	strncpy (proto, uri, p - uri);
-	return proto;
-}
-
-static EBookBackendFactory *
-e_data_book_factory_lookup_backend_factory (EDataBookFactory *factory,
-                                            const gchar *uri)
-{
-	EBookBackendFactory *backend_factory;
-	gchar *proto;
-
-	g_return_val_if_fail (E_IS_DATA_BOOK_FACTORY (factory), NULL);
-	g_return_val_if_fail (uri != NULL, NULL);
-
-	proto = e_data_book_factory_extract_proto_from_uri (uri);
-	if (proto == NULL) {
-		g_warning ("Cannot extract protocol from URI %s", uri);
-		return NULL;
-	}
-
-	backend_factory = g_hash_table_lookup (factory->priv->factories, proto);
-
-	g_free (proto);
-
-	return backend_factory;
-}
-
 static gchar *
 construct_book_factory_path (void)
 {
@@ -339,16 +305,17 @@ last_client_gone_cb (EBookBackend *backend,
 static gboolean
 impl_BookFactory_get_book (EGdbusBookFactory *object,
                            GDBusMethodInvocation *invocation,
-                           const gchar *in_source,
+                           const gchar *uid,
                            EDataBookFactory *factory)
 {
 	EDataBook *book;
 	EBookBackend *backend;
 	EDataBookFactoryPrivate *priv = factory->priv;
 	GDBusConnection *connection;
+	ESourceRegistry *registry;
 	ESource *source;
 	gchar *path;
-	gchar *uri;
+	const gchar *backend_name;
 	const gchar *sender;
 	GList *list;
 	GError *error = NULL;
@@ -356,11 +323,11 @@ impl_BookFactory_get_book (EGdbusBookFactory *object,
 	sender = g_dbus_method_invocation_get_sender (invocation);
 	connection = g_dbus_method_invocation_get_connection (invocation);
 
-	if (in_source == NULL || in_source[0] == '\0') {
-		error = g_error_new (
+	if (uid == NULL || *uid == '\0') {
+		error = g_error_new_literal (
 			E_DATA_BOOK_ERROR,
 			E_DATA_BOOK_STATUS_NO_SUCH_BOOK,
-			_("Empty URI"));
+			_("Missing source UID"));
 		g_dbus_method_invocation_return_gerror (invocation, error);
 		g_error_free (error);
 
@@ -369,31 +336,30 @@ impl_BookFactory_get_book (EGdbusBookFactory *object,
 
 	g_mutex_lock (priv->backends_lock);
 
-	source = e_source_new_from_standalone_xml (in_source);
-	if (!source) {
+	registry = e_source_registry_get_default ();
+	source = e_source_registry_lookup_by_uid (registry, uid);
+
+	if (source == NULL) {
 		g_mutex_unlock (priv->backends_lock);
 
 		error = g_error_new (
 			E_DATA_BOOK_ERROR,
 			E_DATA_BOOK_STATUS_NO_SUCH_BOOK,
-			_("Invalid source"));
+			_("No such source for UID '%s'"), uid);
 		g_dbus_method_invocation_return_gerror (invocation, error);
 		g_error_free (error);
 
 		return TRUE;
 	}
 
-	uri = e_source_get_uri (source);
-
-	if (!uri || !*uri) {
+	backend_name = e_source_get_backend_name (source);
+	if (backend_name == NULL || *backend_name == '\0') {
 		g_mutex_unlock (priv->backends_lock);
-		g_object_unref (source);
-		g_free (uri);
 
 		error = g_error_new (
 			E_DATA_BOOK_ERROR,
 			E_DATA_BOOK_STATUS_NO_SUCH_BOOK,
-			_("Empty URI"));
+			_("No backend specified in source UID '%s'"), uid);
 		g_dbus_method_invocation_return_gerror (invocation, error);
 		g_error_free (error);
 
@@ -401,19 +367,19 @@ impl_BookFactory_get_book (EGdbusBookFactory *object,
 	}
 
 	g_mutex_lock (priv->books_lock);
-	backend = g_hash_table_lookup (priv->backends, uri);
+	backend = g_hash_table_lookup (priv->backends, uid);
 
 	if (backend == NULL) {
 		EBookBackendFactory *backend_factory;
 
-		backend_factory =
-			e_data_book_factory_lookup_backend_factory (factory, uri);
+		backend_factory = g_hash_table_lookup (
+			factory->priv->factories, backend_name);
 		if (backend_factory != NULL)
 			backend = e_book_backend_factory_new_backend (backend_factory);
 
 		if (backend != NULL) {
 			g_hash_table_insert (
-				priv->backends, g_strdup (uri), backend);
+				priv->backends, g_strdup (uid), backend);
 			g_object_weak_ref (
 				G_OBJECT (backend), (GWeakNotify)
 				backend_gone_cb, factory);
@@ -425,16 +391,13 @@ impl_BookFactory_get_book (EGdbusBookFactory *object,
 	}
 
 	if (backend == NULL) {
-		g_free (uri);
-		g_object_unref (source);
-
 		g_mutex_unlock (priv->books_lock);
 		g_mutex_unlock (priv->backends_lock);
 
 		error = g_error_new (
 			E_DATA_BOOK_ERROR,
 			E_DATA_BOOK_STATUS_NO_SUCH_BOOK,
-			_("Invalid source"));
+			_("No such book: %s"), uid);
 		g_dbus_method_invocation_return_gerror (invocation, error);
 		g_error_free (error);
 
@@ -488,7 +451,6 @@ impl_BookFactory_get_book (EGdbusBookFactory *object,
 	g_mutex_unlock (priv->backends_lock);
 
 	g_object_unref (source);
-	g_free (uri);
 
 	e_gdbus_book_factory_complete_get_book (
 		object, invocation, path, error);
@@ -766,6 +728,68 @@ handle_term_signal (gpointer data)
 #endif
 #endif
 
+static void
+source_load_error (ESourceRegistry *registry,
+                   GFile *file,
+                   const GError *error)
+{
+	gchar *basename;
+
+	basename = g_file_get_basename (file);
+	g_critical ("Failed to load source '%s': %s", basename, error->message);
+	g_free (basename);
+}
+
+static void
+source_added (ESourceRegistry *registry,
+              ESource *source,
+              EDataBookFactory *factory)
+{
+	const gchar *display_name;
+	const gchar *uid;
+
+	uid = e_source_get_uid (source);
+	display_name = e_source_get_display_name (source);
+
+	g_message ("Source '%s' added (uid:%s)", display_name, uid);
+}
+
+static void
+source_removed (ESourceRegistry *registry,
+                ESource *source,
+                EDataBookFactory *factory)
+{
+	EBookBackend *backend;
+	const gchar *display_name;
+	const gchar *uid;
+#if 0  /* ACCOUNT_MGMT */
+	GError *error = NULL;
+#endif /* ACCOUNT_MGMT */
+
+	uid = e_source_get_uid (source);
+	display_name = e_source_get_display_name (source);
+
+	g_message ("Source '%s' removed (uid:%s)", display_name, uid);
+
+	backend = g_hash_table_lookup (factory->priv->backends, uid);
+
+	if (backend == NULL) {
+		g_message ("No corresponding backend found");
+		return;
+	}
+
+	g_message ("Notifying backend of removal");
+
+#if 0  /* ACCOUNT_MGMT */
+	if (e_book_backend_remove (backend, &error))
+		g_message ("Backend cleanup was successful");
+	else {
+		g_message ("Backend cleanup failed: %s", error->message);
+		g_error_free (error);
+	}
+#endif /* ACCOUNT_MGMT */
+}
+
 static GOptionEntry entries[] = {
 
 	/* FIXME Have the description translated for 3.2, but this
@@ -783,6 +807,7 @@ main (gint argc,
 	EOfflineListener *eol;
 	GOptionContext *context;
 	EDataBookFactory *factory;
+	ESourceRegistry *registry;
 	guint owner_id;
 	GError *error = NULL;
 
@@ -827,8 +852,30 @@ main (gint argc,
 		exit (EXIT_FAILURE);
 	}
 
+	/* Register ESource extensions we'll need. */
+	E_TYPE_SOURCE_ADDRESS_BOOK;
+
+	registry = e_source_registry_get_default ();
 	factory = g_object_new (E_TYPE_DATA_BOOK_FACTORY, NULL);
 
+	g_signal_connect (
+		registry, "load-error",
+		G_CALLBACK (source_load_error), NULL);
+
+	g_signal_connect (
+		registry, "source-added",
+		G_CALLBACK (source_added), factory);
+
+	g_signal_connect (
+		registry, "source-removed",
+		G_CALLBACK (source_removed), factory);
+
+	/* Failure here is fatal.  Don't even try to keep going. */
+	if (!e_source_registry_load_sources (registry, &error)) {
+		g_error ("%s", error->message);
+		g_assert_not_reached ();
+	}
+
 	loop = g_main_loop_new (NULL, FALSE);
 
 	eol = e_offline_listener_new ();



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