[evolution-data-server/account-mgmt: 9/33] Adapt libedata-book to the new ESource API.
- From: Matthew Barnes <mbarnes src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution-data-server/account-mgmt: 9/33] Adapt libedata-book to the new ESource API.
- Date: Wed, 7 Sep 2011 16:07:51 +0000 (UTC)
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]