[evolution-data-server] libedata-book: Use new base classes in libebackend.



commit 050bff3a71c3ff7554b053cc4ee25969b8982022
Author: Matthew Barnes <mbarnes redhat com>
Date:   Fri Sep 9 13:20:43 2011 -0400

    libedata-book: Use new base classes in libebackend.

 addressbook/libedata-book/e-book-backend-factory.c |   69 ++--
 addressbook/libedata-book/e-book-backend-factory.h |  118 ++----
 addressbook/libedata-book/e-book-backend.c         |   93 +----
 addressbook/libedata-book/e-book-backend.h         |   10 +-
 addressbook/libedata-book/e-data-book-factory.c    |  476 +++++---------------
 addressbook/libedata-book/e-data-book-factory.h    |   59 ++--
 addressbook/libedata-book/e-data-book.c            |  228 +++++++---
 addressbook/libedata-book/e-data-book.h            |    3 +-
 .../libedata-book/libedata-book-sections.txt       |   11 -
 .../libedata-book/tmpl/e-book-backend-factory.sgml |   28 --
 .../libedata-book/tmpl/e-book-backend.sgml         |   35 --
 .../libedata-book/tmpl/e-data-book-factory.sgml    |   23 -
 .../libedata-book/tmpl/e-data-book.sgml            |   15 +-
 .../libedata-book/tmpl/libedata-book-unused.sgml   |   85 ++++
 14 files changed, 470 insertions(+), 783 deletions(-)
---
diff --git a/addressbook/libedata-book/e-book-backend-factory.c b/addressbook/libedata-book/e-book-backend-factory.c
index 5747948..a2e1341 100644
--- a/addressbook/libedata-book/e-book-backend-factory.c
+++ b/addressbook/libedata-book/e-book-backend-factory.c
@@ -7,54 +7,55 @@
  * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
  */
 
-#ifdef HAVE_CONFIG_H
 #include <config.h>
-#endif
-
-#include <string.h>
 
+#include "e-book-backend.h"
 #include "e-book-backend-factory.h"
 
-G_DEFINE_TYPE (EBookBackendFactory, e_book_backend_factory, G_TYPE_OBJECT)
+G_DEFINE_ABSTRACT_TYPE (
+	EBookBackendFactory,
+	e_book_backend_factory,
+	E_TYPE_BACKEND_FACTORY)
 
-static void
-e_book_backend_factory_init (EBookBackendFactory *factory)
+static const gchar *
+book_backend_factory_get_hash_key (EBackendFactory *factory)
 {
+	EBookBackendFactoryClass *class;
+
+	class = E_BOOK_BACKEND_FACTORY_GET_CLASS (factory);
+	g_return_val_if_fail (class->factory_name != NULL, NULL);
+
+	/* For address book backends the factory hash key is simply
+	 * the factory name.  See ECalBackendFactory for a slightly
+	 * more complex scheme. */
+
+	return class->factory_name;
 }
 
-static void
-e_book_backend_factory_class_init (EBookBackendFactoryClass *klass)
+static EBackend *
+book_backend_factory_new_backend (EBackendFactory *factory,
+                                  ESource *source)
 {
+	EBookBackendFactoryClass *class;
+
+	class = E_BOOK_BACKEND_FACTORY_GET_CLASS (factory);
+	g_return_val_if_fail (g_type_is_a (
+		class->backend_type, E_TYPE_BOOK_BACKEND), NULL);
+
+	return g_object_new (class->backend_type, "source", source, NULL);
 }
 
-/**
- * e_book_backend_factory_get_protocol:
- * @factory: an #EBookBackendFactory
- *
- * Gets the protocol that @factory creates backends for.
- *
- * Returns: A string representing a protocol.
- **/
-const gchar *
-e_book_backend_factory_get_protocol (EBookBackendFactory *factory)
+static void
+e_book_backend_factory_class_init (EBookBackendFactoryClass *class)
 {
-	g_return_val_if_fail (E_IS_BOOK_BACKEND_FACTORY (factory), NULL);
+	EBackendFactoryClass *factory_class;
 
-	return E_BOOK_BACKEND_FACTORY_GET_CLASS (factory)->get_protocol (factory);
+	factory_class = E_BACKEND_FACTORY_CLASS (class);
+	factory_class->get_hash_key = book_backend_factory_get_hash_key;
+	factory_class->new_backend = book_backend_factory_new_backend;
 }
 
-/**
- * e_book_backend_factory_new_backend:
- * @factory: an #EBookBackendFactory
- *
- * Creates a new #EBookBackend with @factory's protocol.
- *
- * Returns: A new #EBookBackend.
- **/
-EBookBackend *
-e_book_backend_factory_new_backend (EBookBackendFactory *factory)
+static void
+e_book_backend_factory_init (EBookBackendFactory *factory)
 {
-	g_return_val_if_fail (E_IS_BOOK_BACKEND_FACTORY (factory), NULL);
-
-	return E_BOOK_BACKEND_FACTORY_GET_CLASS (factory)->new_backend (factory);
 }
diff --git a/addressbook/libedata-book/e-book-backend-factory.h b/addressbook/libedata-book/e-book-backend-factory.h
index 736b4c5..9d5b4b4 100644
--- a/addressbook/libedata-book/e-book-backend-factory.h
+++ b/addressbook/libedata-book/e-book-backend-factory.h
@@ -20,97 +20,51 @@
  * Author: Chris Toshok <toshok ximian com>
  */
 
-#ifndef _E_BOOK_BACKEND_FACTORY_H_
-#define _E_BOOK_BACKEND_FACTORY_H_
+#ifndef E_BOOK_BACKEND_FACTORY_H
+#define E_BOOK_BACKEND_FACTORY_H
 
-#include "e-book-backend.h"
+#include <libebackend/e-backend-factory.h>
 
-G_BEGIN_DECLS
+/* Standard GObject macros */
+#define E_TYPE_BOOK_BACKEND_FACTORY \
+	(e_book_backend_factory_get_type ())
+#define E_BOOK_BACKEND_FACTORY(obj) \
+	(G_TYPE_CHECK_INSTANCE_CAST \
+	((obj), E_TYPE_BOOK_BACKEND_FACTORY, EBookBackendFactory))
+#define E_BOOK_BACKEND_FACTORY_CLASS(cls) \
+	(G_TYPE_CHECK_CLASS_CAST \
+	((cls), E_TYPE_BOOK_BACKEND_FACTORY, EBookBackendFactoryClass))
+#define E_IS_BOOK_BACKEND_FACTORY(obj) \
+	(G_TYPE_CHECK_INSTANCE_TYPE \
+	((obj), E_TYPE_BOOK_BACKEND_FACTORY))
+#define E_IS_BOOK_BACKEND_FACTORY_CLASS(cls) \
+	(G_TYPE_CHECK_CLASS_TYPE \
+	((cls), E_TYPE_BOOK_BACKEND_FACTORY))
+#define E_BOOK_BACKEND_FACTORY_GET_CLASS(obj) \
+	(G_TYPE_INSTANCE_GET_CLASS \
+	((obj), E_TYPE_BOOK_BACKEND_FACTORY, EBookBackendFactoryClass))
 
-#define E_TYPE_BOOK_BACKEND_FACTORY        (e_book_backend_factory_get_type ())
-#define E_BOOK_BACKEND_FACTORY(o)          (G_TYPE_CHECK_INSTANCE_CAST ((o), E_TYPE_BOOK_BACKEND_FACTORY, EBookBackendFactory))
-#define E_BOOK_BACKEND_FACTORY_CLASS(k)    (G_TYPE_CHECK_CLASS_CAST((k), E_TYPE_BOOK_BACKEND_FACTORY, EBookBackendFactoryClass))
-#define E_IS_BOOK_BACKEND_FACTORY(o)       (G_TYPE_CHECK_INSTANCE_TYPE ((o), E_TYPE_BOOK_BACKEND_FACTORY))
-#define E_IS_BOOK_BACKEND_FACTORY_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), E_TYPE_BOOK_BACKEND_FACTORY))
-#define E_BOOK_BACKEND_FACTORY_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), E_TYPE_BOOK_BACKEND_FACTORY, EBookBackendFactoryClass))
+G_BEGIN_DECLS
 
+typedef struct _EBookBackendFactory EBookBackendFactory;
+typedef struct _EBookBackendFactoryClass EBookBackendFactoryClass;
 typedef struct _EBookBackendFactoryPrivate EBookBackendFactoryPrivate;
 
-typedef struct {
-	GObject            parent_object;
-} EBookBackendFactory;
-
-typedef struct {
-	GObjectClass parent_class;
-
-	const gchar *   (*get_protocol) (EBookBackendFactory *factory);
-	EBookBackend * (*new_backend)  (EBookBackendFactory *factory);
-} EBookBackendFactoryClass;
+struct _EBookBackendFactory {
+	EBackendFactory parent;
+};
 
-GType                e_book_backend_factory_get_type             (void);
+struct _EBookBackendFactoryClass {
+	EBackendFactoryClass parent_class;
 
-const gchar *          e_book_backend_factory_get_protocol         (EBookBackendFactory *factory);
-EBookBackend *        e_book_backend_factory_new_backend          (EBookBackendFactory *factory);
+	/* Subclasses just need to set these
+	 * class members, we handle the rest. */
+	const gchar *factory_name;
+	GType backend_type;
+};
 
-/* use this macro for simple, 1 factory modules */
-#define E_BOOK_BACKEND_FACTORY_SIMPLE(p,t,f) \
-typedef struct { \
-	EBookBackendFactory      parent_object; \
-} EBookBackend##t##Factory; \
-\
-typedef struct { \
-	EBookBackendFactoryClass parent_class; \
-} EBookBackend##t##FactoryClass; \
-\
-static void \
-_ ## p ##_factory_instance_init (EBookBackend## t ##Factory *factory) \
-{ \
-} \
-\
-static const gchar * \
-_ ## p ##_get_protocol (EBookBackendFactory *factory) \
-{ \
-	return #p; \
-} \
-\
-static EBookBackend * \
-_ ## p ##_new_backend (EBookBackendFactory *factory) \
-{ \
-	return (f) (); \
-} \
-\
-static void \
-_ ## p ##_factory_class_init (EBookBackend## t ##FactoryClass *klass) \
-{ \
-	E_BOOK_BACKEND_FACTORY_CLASS (klass)->get_protocol = _ ## p ##_get_protocol; \
-	E_BOOK_BACKEND_FACTORY_CLASS (klass)->new_backend = _ ## p ##_new_backend; \
-} \
-\
-static GType \
-_ ## p ##_factory_get_type (GTypeModule *module) \
-{ \
-	GType type; \
-\
-	const GTypeInfo info = { \
-		sizeof (EBookBackend##t##FactoryClass), \
-		NULL, /* base_class_init */ \
-		NULL, /* base_class_finalize */ \
-		(GClassInitFunc)  _ ## p ##_factory_class_init, \
-		NULL, /* class_finalize */ \
-		NULL, /* class_data */ \
-		sizeof (EBookBackend##t##Factory), \
-		0,    /* n_preallocs */ \
-		(GInstanceInitFunc) _ ## p ##_factory_instance_init \
-	}; \
-\
-	type = g_type_module_register_type (module, \
-					    E_TYPE_BOOK_BACKEND_FACTORY, \
-					    "EBookBackend" #t "Factory", \
-					    &info, 0); \
-\
-	return type; \
-}
+GType		e_book_backend_factory_get_type		(void) G_GNUC_CONST;
 
 G_END_DECLS
 
-#endif /* _E_BOOK_BACKEND_FACTORY_H_ */
+#endif /* E_BOOK_BACKEND_FACTORY_H */
diff --git a/addressbook/libedata-book/e-book-backend.c b/addressbook/libedata-book/e-book-backend.c
index f014849..cb68604 100644
--- a/addressbook/libedata-book/e-book-backend.c
+++ b/addressbook/libedata-book/e-book-backend.c
@@ -23,7 +23,6 @@ struct _EBookBackendPrivate {
 	GMutex *clients_mutex;
 	GSList *clients;
 
-	ESource *source;
 	gboolean opening, opened, readonly, removed, online;
 
 	GMutex *views_mutex;
@@ -38,15 +37,7 @@ enum {
 	PROP_CACHE_DIR
 };
 
-/* Signal IDs */
-enum {
-	LAST_CLIENT_GONE,
-	LAST_SIGNAL
-};
-
-static guint signals[LAST_SIGNAL];
-
-G_DEFINE_TYPE (EBookBackend, e_book_backend, G_TYPE_OBJECT)
+G_DEFINE_TYPE (EBookBackend, e_book_backend, E_TYPE_BACKEND)
 
 static void
 book_backend_set_default_cache_dir (EBookBackend *backend)
@@ -57,7 +48,7 @@ book_backend_set_default_cache_dir (EBookBackend *backend)
 	gchar *filename;
 
 	user_cache_dir = e_get_user_cache_dir ();
-	source = e_book_backend_get_source (backend);
+	source = e_backend_get_source (E_BACKEND (backend));
 
 	/* Mangle the URI to not contain invalid characters. */
 	mangled_uri = g_strdelimit (e_source_get_uri (source), ":/", '_');
@@ -87,7 +78,7 @@ book_backend_get_backend_property (EBookBackend *backend,
 	} else if (g_str_equal (prop_name, CLIENT_BACKEND_PROPERTY_OPENING)) {
 		e_data_book_respond_get_backend_property (book, opid, NULL, e_book_backend_is_opening (backend) ? "TRUE" : "FALSE");
 	} else if (g_str_equal (prop_name, CLIENT_BACKEND_PROPERTY_ONLINE)) {
-		e_data_book_respond_get_backend_property (book, opid, NULL, e_book_backend_is_online (backend) ? "TRUE" : "FALSE");
+		e_data_book_respond_get_backend_property (book, opid, NULL, e_backend_get_online (E_BACKEND (backend)) ? "TRUE" : "FALSE");
 	} else if (g_str_equal (prop_name, CLIENT_BACKEND_PROPERTY_READONLY)) {
 		e_data_book_respond_get_backend_property (book, opid, NULL, e_book_backend_is_readonly (backend) ? "TRUE" : "FALSE");
 	} else if (g_str_equal (prop_name, CLIENT_BACKEND_PROPERTY_CACHE_DIR)) {
@@ -159,11 +150,6 @@ book_backend_dispose (GObject *object)
 		priv->views = NULL;
 	}
 
-	if (priv->source != NULL) {
-		g_object_unref (priv->source);
-		priv->source = NULL;
-	}
-
 	/* Chain up to parent's dispose() method. */
 	G_OBJECT_CLASS (e_book_backend_parent_class)->dispose (object);
 }
@@ -228,15 +214,6 @@ e_book_backend_class_init (EBookBackendClass *klass)
 			NULL,
 			NULL,
 			G_PARAM_READWRITE));
-
-	signals[LAST_CLIENT_GONE] = g_signal_new (
-		"last-client-gone",
-		G_OBJECT_CLASS_TYPE (object_class),
-		G_SIGNAL_RUN_FIRST,
-		G_STRUCT_OFFSET (EBookBackendClass, last_client_gone),
-		NULL, NULL,
-		g_cclosure_marshal_VOID__VOID,
-		G_TYPE_NONE, 0);
 }
 
 static void
@@ -297,22 +274,6 @@ e_book_backend_set_cache_dir (EBookBackend *backend,
 }
 
 /**
- * e_book_backend_get_source:
- * @backend: An addressbook backend.
- *
- * Queries the source that an addressbook backend is serving.
- *
- * Returns: ESource for the backend.
- **/
-ESource *
-e_book_backend_get_source (EBookBackend *backend)
-{
-	g_return_val_if_fail (E_IS_BOOK_BACKEND (backend), NULL);
-
-	return backend->priv->source;
-}
-
-/**
  * e_book_backend_open:
  * @backend: an #EBookBackend
  * @book: an #EDataBook
@@ -391,17 +352,12 @@ e_book_backend_open (EBookBackend *backend,
 
 		e_data_book_respond_open (book, opid, EDB_OPENING_ERROR);
 	} else {
-		ESource *source = e_data_book_get_source (book);
-
 		backend->priv->opening = TRUE;
 		g_mutex_unlock (backend->priv->clients_mutex);
 
-		g_return_if_fail (source != NULL);
-
 		/* Subclasses may need to call e_book_backend_get_cache_dir() in
 		 * their open() methods, so get the "cache-dir" property
 		 * initialized before we call the method. */
-		backend->priv->source = g_object_ref (source);
 		book_backend_set_default_cache_dir (backend);
 
 		g_return_if_fail (E_BOOK_BACKEND_GET_CLASS (backend)->open != NULL);
@@ -735,12 +691,6 @@ e_book_backend_authenticate_user (EBookBackend *backend,
 	(* E_BOOK_BACKEND_GET_CLASS (backend)->authenticate_user) (backend, cancellable, credentials);
 }
 
-static void
-last_client_gone (EBookBackend *backend)
-{
-	g_signal_emit (backend, signals[LAST_CLIENT_GONE], 0);
-}
-
 /**
  * e_book_backend_add_book_view:
  * @backend: an #EBookBackend
@@ -832,7 +782,7 @@ e_book_backend_remove_client (EBookBackend *backend,
 	 */
 	if (!backend->priv->clients) {
 		backend->priv->opening = FALSE;
-		last_client_gone (backend);
+		e_backend_last_client_gone (E_BACKEND (backend));
 	}
 
 	g_mutex_unlock (backend->priv->clients_mutex);
@@ -942,24 +892,6 @@ e_book_backend_set_backend_property (EBookBackend *backend,
 }
 
 /**
- * e_book_backend_is_online:
- * @backend: an #EBookBackend
- *
- * Checks if @backend's storage is online.
- *
- * Returns: %TRUE if online, %FALSE otherwise.
- *
- * Since: 3.2
- **/
-gboolean
-e_book_backend_is_online (EBookBackend *backend)
-{
-	g_return_val_if_fail (E_IS_BOOK_BACKEND (backend), FALSE);
-
-	return backend->priv->online;
-}
-
-/**
  * e_book_backend_is_opened:
  * @backend: an #EBookBackend
  *
@@ -1055,23 +987,6 @@ e_book_backend_set_is_removed (EBookBackend *backend,
 }
 
 /**
- * e_book_backend_set_online:
- * @backend: an #EBookbackend
- * @is_online: a mode indicating the online/offline status of the backend
- *
- * Sets @backend's online/offline mode to @is_online.
- **/
-void
-e_book_backend_set_online (EBookBackend *backend,
-                           gboolean is_online)
-{
-	g_return_if_fail (E_IS_BOOK_BACKEND (backend));
-	g_return_if_fail (E_BOOK_BACKEND_GET_CLASS (backend)->set_online);
-
-	(* E_BOOK_BACKEND_GET_CLASS (backend)->set_online) (backend,  is_online);
-}
-
-/**
  * e_book_backend_sync:
  * @backend: an #EBookbackend
  *
diff --git a/addressbook/libedata-book/e-book-backend.h b/addressbook/libedata-book/e-book-backend.h
index b301830..fd209f1 100644
--- a/addressbook/libedata-book/e-book-backend.h
+++ b/addressbook/libedata-book/e-book-backend.h
@@ -25,6 +25,7 @@
 #include <gio/gio.h>
 
 #include <libebook/e-contact.h>
+#include <libebackend/e-backend.h>
 #include <libedata-book/e-data-book-types.h>
 #include <libedata-book/e-data-book.h>
 #include <libedataserver/e-source.h>
@@ -123,12 +124,12 @@ G_BEGIN_DECLS
 typedef struct _EBookBackendPrivate EBookBackendPrivate;
 
 struct _EBookBackend {
-	GObject parent_object;
+	EBackend parent;
 	EBookBackendPrivate *priv;
 };
 
 struct _EBookBackendClass {
-	GObjectClass parent_class;
+	EBackendClass parent_class;
 
 	/* Virtual methods */
         void	(* get_backend_property)	(EBookBackend *backend, EDataBook *book, guint32 opid, GCancellable *cancellable, const gchar *prop_name);
@@ -136,7 +137,6 @@ struct _EBookBackendClass {
 
 	void	(* open)			(EBookBackend *backend, EDataBook *book, guint32 opid, GCancellable *cancellable, gboolean only_if_exists);
 	void	(* remove)			(EBookBackend *backend, EDataBook *book, guint32 opid, GCancellable *cancellable);
-	void	(* set_online)			(EBookBackend *backend, gboolean is_online);
 	void	(* authenticate_user)		(EBookBackend *backend, GCancellable *cancellable, ECredentials *credentials);
 
 	void	(* refresh)			(EBookBackend *backend, EDataBook *book, guint32 opid, GCancellable *cancellable);
@@ -162,17 +162,13 @@ GType		e_book_backend_get_type		(void);
 const gchar *	e_book_backend_get_cache_dir	(EBookBackend *backend);
 void		e_book_backend_set_cache_dir	(EBookBackend *backend, const gchar *cache_dir);
 
-ESource *	e_book_backend_get_source	(EBookBackend *backend);
-
 gboolean	e_book_backend_add_client	(EBookBackend *backend, EDataBook *book);
 void		e_book_backend_remove_client	(EBookBackend *backend, EDataBook *book);
 
-gboolean	e_book_backend_is_online	(EBookBackend *backend);
 gboolean	e_book_backend_is_opened	(EBookBackend *backend);
 gboolean	e_book_backend_is_opening	(EBookBackend *backend);
 gboolean	e_book_backend_is_readonly	(EBookBackend *backend);
 gboolean	e_book_backend_is_removed	(EBookBackend *backend);
-void		e_book_backend_set_online	(EBookBackend *backend, gboolean is_online);
 void		e_book_backend_authenticate_user (EBookBackend *backend, GCancellable *cancellable, ECredentials *credentials);
 
 void		e_book_backend_get_backend_property (EBookBackend *backend, EDataBook *book, guint32 opid, GCancellable *cancellable, const gchar *prop_name);
diff --git a/addressbook/libedata-book/e-data-book-factory.c b/addressbook/libedata-book/e-data-book-factory.c
index dca4255..6d6798f 100644
--- a/addressbook/libedata-book/e-data-book-factory.c
+++ b/addressbook/libedata-book/e-data-book-factory.c
@@ -45,8 +45,6 @@
 #define GOA_KEY "goa-account-id"
 #endif
 
-#include <libebackend/e-data-server-module.h>
-#include <libebackend/e-offline-listener.h>
 #include "e-book-backend-factory.h"
 #include "e-data-book-factory.h"
 #include "e-data-book.h"
@@ -71,8 +69,6 @@
 	(G_TYPE_INSTANCE_GET_PRIVATE \
 	((obj), E_TYPE_DATA_BOOK_FACTORY, EDataBookFactoryPrivate))
 
-static GMainLoop *loop;
-
 /* Keep running after the last client is closed. */
 static gboolean opt_keep_running = FALSE;
 
@@ -87,18 +83,11 @@ static gboolean opt_keep_running = FALSE;
 	}								\
 	} G_STMT_END
 
-G_DEFINE_TYPE (EDataBookFactory, e_data_book_factory, G_TYPE_OBJECT);
+G_DEFINE_TYPE (EDataBookFactory, e_data_book_factory, E_TYPE_DATA_FACTORY);
 
 struct _EDataBookFactoryPrivate {
 	EGdbusBookFactory *gdbus_object;
 
-	/* 'protocol' -> EBookBackendFactory hash table */
-	GHashTable *factories;
-
-	GMutex *backends_lock;
-	/* 'uri' -> EBookBackend */
-	GHashTable *backends;
-
 	GMutex *books_lock;
 	/* A hash of object paths for book URIs to EDataBooks */
 	GHashTable *books;
@@ -109,9 +98,6 @@ struct _EDataBookFactoryPrivate {
 
 	guint exit_timeout;
 
-	/* whether should be online */
-	gboolean is_online;
-
 #ifdef HAVE_GOA
 	GoaClient *goa_client;
 	GHashTable *goa_accounts;
@@ -121,138 +107,41 @@ struct _EDataBookFactoryPrivate {
 /* Forward Declarations */
 void e_data_book_migrate_basedir (void);
 
-/* Create the EDataBookFactory error quark */
-GQuark
-e_data_book_factory_error_quark (void)
-{
-	static GQuark quark = 0;
-	if (!quark)
-		quark = g_quark_from_static_string ("e_data_book_factory_error");
-	return quark;
-}
-
-/**
- * e_data_book_factory_register_backend_factory:
- * @factory: an #EDataBookFactory
- * @backend_factory: an #EBookBackendFactory
- *
- * Registers @backend_factory with @factory.
- **/
-static void
-e_data_book_factory_register_backend (EDataBookFactory *book_factory,
-                                      EBookBackendFactory *backend_factory)
-{
-	EBookBackendFactoryClass *class;
-	const gchar *proto;
-
-	g_return_if_fail (E_IS_DATA_BOOK_FACTORY (book_factory));
-	g_return_if_fail (E_IS_BOOK_BACKEND_FACTORY (backend_factory));
-
-	class = E_BOOK_BACKEND_FACTORY_GET_CLASS (backend_factory);
-
-	proto = class->get_protocol (backend_factory);
-
-	if (g_hash_table_lookup (book_factory->priv->factories, proto) != NULL) {
-		g_warning ("%s: Proto \"%s\" already registered!\n", G_STRFUNC, proto);
-	}
-
-	g_hash_table_insert (
-		book_factory->priv->factories,
-		g_strdup (proto), backend_factory);
-}
-
-/**
- * e_data_book_factory_register_backends:
- * @book_factory: an #EDataBookFactory
- *
- * Register the backends supported by the Evolution Data Server,
- * with @book_factory.
- **/
-static void
-e_data_book_factory_register_backends (EDataBookFactory *book_factory)
-{
-	GType type;
-	GList *factories;
-	GList *iter;
-
-	type = E_TYPE_BOOK_BACKEND_FACTORY;
-	factories = e_data_server_get_extensions_for_type (type);
-
-	for (iter = factories; iter != NULL; iter = g_list_next (iter)) {
-		EBookBackendFactory *backend_factory = iter->data;
-
-		e_data_book_factory_register_backend (
-			book_factory, g_object_ref (backend_factory));
-	}
-
-	e_data_server_extension_list_free (factories);
-	e_data_server_module_remove_unused ();
-}
-
-/**
- * e_data_book_factory_set_backend_online:
- * @factory: A bookendar factory.
- * @is_online: Online mode to set.
- *
- * Sets the online mode for all backends created by the given factory.
- *
- * Since: 3.2
- */
-void
-e_data_book_factory_set_backend_online (EDataBookFactory *factory,
-                                        gboolean is_online)
-{
-	GHashTableIter iter;
-	gpointer value;
-
-	g_return_if_fail (E_IS_DATA_BOOK_FACTORY (factory));
-
-	factory->priv->is_online = is_online;
-	g_mutex_lock (factory->priv->backends_lock);
-
-	g_hash_table_iter_init (&iter, factory->priv->backends);
-	while (g_hash_table_iter_next (&iter, NULL, &value))
-		e_book_backend_set_online (
-			E_BOOK_BACKEND (value),
-			factory->priv->is_online);
-
-	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)
+	gchar *proto, *cp;
+
+	cp = strchr (uri, ':');
+	if (cp == NULL)
 		return NULL;
-	proto = g_malloc0 (p - uri + 1);
-	strncpy (proto, uri, p - uri);
+
+	proto = g_malloc0 (cp - uri + 1);
+	strncpy (proto, uri, cp - uri);
+
 	return proto;
 }
 
-static EBookBackendFactory *
-e_data_book_factory_lookup_backend_factory (EDataBookFactory *factory,
-                                            const gchar *uri)
+static EBackend *
+e_data_book_factory_get_backend (EDataBookFactory *factory,
+                                 ESource *source,
+                                 const gchar *uri)
 {
-	EBookBackendFactory *backend_factory;
-	gchar *proto;
+	EBackend *backend;
+	gchar *hash_key;
 
-	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) {
+	hash_key = e_data_book_factory_extract_proto_from_uri (uri);
+	if (hash_key == NULL) {
 		g_warning ("Cannot extract protocol from URI %s", uri);
 		return NULL;
 	}
 
-	backend_factory = g_hash_table_lookup (factory->priv->factories, proto);
+	backend = e_data_factory_get_backend (
+		E_DATA_FACTORY (factory), hash_key, source);
 
-	g_free (proto);
+	g_free (hash_key);
 
-	return backend_factory;
+	return backend;
 }
 
 static gchar *
@@ -311,29 +200,7 @@ book_freed_cb (EDataBookFactory *factory,
 	/* If there are no open books, start a timer to quit */
 	if (!opt_keep_running && priv->exit_timeout == 0)
 		priv->exit_timeout = g_timeout_add_seconds (
-			10, (GSourceFunc) g_main_loop_quit, loop);
-}
-
-static void
-backend_gone_cb (EDataBookFactory *factory,
-                 GObject *dead)
-{
-	EDataBookFactoryPrivate *priv = factory->priv;
-
-	g_mutex_lock (priv->backends_lock);
-	g_hash_table_foreach_remove (
-		priv->backends, remove_dead_pointer_cb, dead);
-	g_mutex_unlock (priv->backends_lock);
-}
-
-static void
-last_client_gone_cb (EBookBackend *backend,
-                     EDataBookFactory *factory)
-{
-	backend_gone_cb (factory, (GObject *) backend);
-	g_object_weak_unref (
-		G_OBJECT (backend), (GWeakNotify) backend_gone_cb, factory);
-	g_object_unref (backend);
+			10, (GSourceFunc) e_dbus_server_quit, factory);
 }
 
 static gboolean
@@ -343,7 +210,7 @@ impl_BookFactory_get_book (EGdbusBookFactory *object,
                            EDataBookFactory *factory)
 {
 	EDataBook *book;
-	EBookBackend *backend;
+	EBackend *backend;
 	EDataBookFactoryPrivate *priv = factory->priv;
 	GDBusConnection *connection;
 	ESource *source;
@@ -367,12 +234,8 @@ impl_BookFactory_get_book (EGdbusBookFactory *object,
 		return TRUE;
 	}
 
-	g_mutex_lock (priv->backends_lock);
-
 	source = e_source_new_from_standalone_xml (in_source);
 	if (!source) {
-		g_mutex_unlock (priv->backends_lock);
-
 		error = g_error_new (
 			E_DATA_BOOK_ERROR,
 			E_DATA_BOOK_STATUS_NO_SUCH_BOOK,
@@ -385,8 +248,7 @@ impl_BookFactory_get_book (EGdbusBookFactory *object,
 
 	uri = e_source_get_uri (source);
 
-	if (!uri || !*uri) {
-		g_mutex_unlock (priv->backends_lock);
+	if (uri == NULL || *uri == '\0') {
 		g_object_unref (source);
 		g_free (uri);
 
@@ -400,37 +262,12 @@ impl_BookFactory_get_book (EGdbusBookFactory *object,
 		return TRUE;
 	}
 
-	g_mutex_lock (priv->books_lock);
-	backend = g_hash_table_lookup (priv->backends, uri);
-
-	if (backend == NULL) {
-		EBookBackendFactory *backend_factory;
-
-		backend_factory =
-			e_data_book_factory_lookup_backend_factory (factory, uri);
-		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);
-			g_object_weak_ref (
-				G_OBJECT (backend), (GWeakNotify)
-				backend_gone_cb, factory);
-			g_signal_connect (
-				backend, "last-client-gone",
-				G_CALLBACK (last_client_gone_cb), factory);
-			e_book_backend_set_online (backend, priv->is_online);
-		}
-	}
+	backend = e_data_book_factory_get_backend (factory, source, uri);
 
 	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,
@@ -441,6 +278,8 @@ impl_BookFactory_get_book (EGdbusBookFactory *object,
 		return TRUE;
 	}
 
+	g_mutex_lock (priv->books_lock);
+
 	/* Remove a pending exit */
 	if (priv->exit_timeout) {
 		g_source_remove (priv->exit_timeout);
@@ -469,15 +308,15 @@ impl_BookFactory_get_book (EGdbusBookFactory *object,
 #endif
 
 	path = construct_book_factory_path ();
-	book = e_data_book_new (backend, source);
+	book = e_data_book_new (E_BOOK_BACKEND (backend));
 	g_hash_table_insert (priv->books, g_strdup (path), book);
-	e_book_backend_add_client (backend, book);
+	e_book_backend_add_client (E_BOOK_BACKEND (backend), book);
 	e_data_book_register_gdbus_object (book, connection, path, &error);
 	g_object_weak_ref (
 		G_OBJECT (book), (GWeakNotify)
 		book_freed_cb, factory);
 
-	/* Update the hash of open connections */
+	/* Update the hash of open connections. */
 	g_mutex_lock (priv->connections_lock);
 	list = g_hash_table_lookup (priv->connections, sender);
 	list = g_list_prepend (list, book);
@@ -485,7 +324,6 @@ impl_BookFactory_get_book (EGdbusBookFactory *object,
 	g_mutex_unlock (priv->connections_lock);
 
 	g_mutex_unlock (priv->books_lock);
-	g_mutex_unlock (priv->backends_lock);
 
 	g_object_unref (source);
 	g_free (uri);
@@ -502,13 +340,10 @@ impl_BookFactory_get_book (EGdbusBookFactory *object,
 }
 
 static void
-remove_data_book_cb (gpointer data_bk,
-                     gpointer user_data)
+remove_data_book_cb (EDataBook *data_book)
 {
-	EDataBook *data_book;
 	EBookBackend *backend;
 
-	data_book = E_DATA_BOOK (data_bk);
 	g_return_if_fail (data_book != NULL);
 
 	backend = e_data_book_get_backend (data_book);
@@ -549,12 +384,9 @@ e_data_book_factory_finalize (GObject *object)
 
 	priv = E_DATA_BOOK_FACTORY_GET_PRIVATE (object);
 
-	g_hash_table_destroy (priv->factories);
-	g_hash_table_destroy (priv->backends);
 	g_hash_table_destroy (priv->books);
 	g_hash_table_destroy (priv->connections);
 
-	g_mutex_free (priv->backends_lock);
 	g_mutex_free (priv->books_lock);
 	g_mutex_free (priv->connections_lock);
 
@@ -567,15 +399,86 @@ e_data_book_factory_finalize (GObject *object)
 }
 
 static void
+data_book_factory_bus_acquired (EDBusServer *server,
+                                GDBusConnection *connection)
+{
+	EDataBookFactoryPrivate *priv;
+	guint registration_id;
+	GError *error = NULL;
+
+	priv = E_DATA_BOOK_FACTORY_GET_PRIVATE (server);
+
+	registration_id = e_gdbus_book_factory_register_object (
+		priv->gdbus_object,
+		connection,
+		"/org/gnome/evolution/dataserver/AddressBookFactory",
+		&error);
+
+	if (error != NULL) {
+		g_error (
+			"Failed to register a BookFactory object: %s",
+			error->message);
+		g_assert_not_reached ();
+	}
+
+	g_assert (registration_id > 0);
+
+	/* Chain up to parent's bus_acquired() method. */
+	E_DBUS_SERVER_CLASS (e_data_book_factory_parent_class)->
+		bus_acquired (server, connection);
+}
+
+static void
+data_book_factory_bus_name_lost (EDBusServer *server,
+                                 GDBusConnection *connection)
+{
+	EDataBookFactoryPrivate *priv;
+	GList *list = NULL;
+	gchar *key;
+
+	priv = E_DATA_BOOK_FACTORY_GET_PRIVATE (server);
+
+	g_mutex_lock (priv->connections_lock);
+
+	while (g_hash_table_lookup_extended (
+		priv->connections,
+		ADDRESS_BOOK_DBUS_SERVICE_NAME,
+		(gpointer) &key, (gpointer) &list)) {
+		GList *copy;
+
+		/* this should trigger the book's weak ref notify
+		 * function, which will remove it from the list before
+		 * it's freed, and will remove the connection from
+		 * priv->connections once they're all gone */
+		copy = g_list_copy (list);
+		g_list_foreach (copy, (GFunc) remove_data_book_cb, NULL);
+		g_list_free (copy);
+	}
+
+	g_mutex_unlock (priv->connections_lock);
+
+	/* Chain up to parent's bus_name_lost() method. */
+	E_DBUS_SERVER_CLASS (e_data_book_factory_parent_class)->
+		bus_name_lost (server, connection);
+}
+
+static void
 e_data_book_factory_class_init (EDataBookFactoryClass *class)
 {
 	GObjectClass *object_class;
+	EDBusServerClass *dbus_server_class;
 
 	g_type_class_add_private (class, sizeof (EDataBookFactoryPrivate));
 
 	object_class = G_OBJECT_CLASS (class);
 	object_class->dispose = e_data_book_factory_dispose;
 	object_class->finalize = e_data_book_factory_finalize;
+
+	dbus_server_class = E_DBUS_SERVER_CLASS (class);
+	dbus_server_class->bus_name = ADDRESS_BOOK_DBUS_SERVICE_NAME;
+	dbus_server_class->module_directory = BACKENDDIR;
+	dbus_server_class->bus_acquired = data_book_factory_bus_acquired;
+	dbus_server_class->bus_name_lost = data_book_factory_bus_name_lost;
 }
 
 #ifdef HAVE_GOA
@@ -619,8 +522,6 @@ e_data_book_factory_accounts_changed_cb (GoaClient *client, GDBusObject *object,
 static void
 e_data_book_factory_init (EDataBookFactory *factory)
 {
-	GError *error = NULL;
-
 	factory->priv = E_DATA_BOOK_FACTORY_GET_PRIVATE (factory);
 
 	factory->priv->gdbus_object = e_gdbus_book_factory_stub_new ();
@@ -628,17 +529,6 @@ e_data_book_factory_init (EDataBookFactory *factory)
 		factory->priv->gdbus_object, "handle-get-book",
 		G_CALLBACK (impl_BookFactory_get_book), factory);
 
-	factory->priv->factories = g_hash_table_new_full (
-		g_str_hash, g_str_equal,
-		(GDestroyNotify) g_free,
-		(GDestroyNotify) NULL);
-
-	factory->priv->backends_lock = g_mutex_new ();
-	factory->priv->backends = g_hash_table_new_full (
-		g_str_hash, g_str_equal,
-		(GDestroyNotify) g_free,
-		(GDestroyNotify) NULL);
-
 	factory->priv->books_lock = g_mutex_new ();
 	factory->priv->books = g_hash_table_new_full (
 		g_str_hash, g_str_equal,
@@ -651,11 +541,6 @@ e_data_book_factory_init (EDataBookFactory *factory)
 		(GDestroyNotify) g_free,
 		(GDestroyNotify) NULL);
 
-	if (!e_data_server_module_init (BACKENDDIR, &error))
-		g_error ("%s", error->message);
-
-	e_data_book_factory_register_backends (factory);
-
 #ifdef HAVE_GOA
 	factory->priv->goa_accounts = g_hash_table_new_full (
 		(GHashFunc) g_str_hash,
@@ -682,115 +567,6 @@ e_data_book_factory_init (EDataBookFactory *factory)
 #endif
 }
 
-static guint
-e_data_book_factory_register_gdbus_object (EDataBookFactory *factory,
-                                           GDBusConnection *connection,
-                                           const gchar *object_path,
-                                           GError **error)
-{
-	g_return_val_if_fail (E_IS_DATA_BOOK_FACTORY (factory), 0);
-	g_return_val_if_fail (connection != NULL, 0);
-	g_return_val_if_fail (object_path != NULL, 0);
-
-	return e_gdbus_book_factory_register_object (
-		factory->priv->gdbus_object, connection, object_path, error);
-}
-
-/* Convenience function to print an error and exit */
-G_GNUC_NORETURN static void
-die (const gchar *prefix,
-     GError *error)
-{
-	g_error ("%s: %s", prefix, error->message);
-	g_error_free (error);
-	exit (1);
-}
-
-static void
-offline_state_changed_cb (EOfflineListener *eol,
-                          EDataBookFactory *factory)
-{
-	switch (e_offline_listener_get_state (eol)) {
-		case EOL_STATE_OFFLINE:
-			e_data_book_factory_set_backend_online (factory, FALSE);
-			break;
-		case EOL_STATE_ONLINE:
-			e_data_book_factory_set_backend_online (factory, TRUE);
-			break;
-		default:
-			g_warn_if_reached ();
-	}
-}
-
-static void
-on_bus_acquired (GDBusConnection *connection,
-                 const gchar *name,
-                 gpointer user_data)
-{
-	EDataBookFactory *factory = user_data;
-	guint registration_id;
-	GError *error = NULL;
-
-	registration_id = e_data_book_factory_register_gdbus_object (
-		factory,
-		connection,
-		"/org/gnome/evolution/dataserver/AddressBookFactory",
-		&error);
-
-	if (error)
-		die ("Failed to register a BookFactory object", error);
-
-	g_assert (registration_id > 0);
-}
-
-static void
-on_name_acquired (GDBusConnection *connection,
-                  const gchar *name,
-                  gpointer user_data)
-{
-}
-
-static void
-on_name_lost (GDBusConnection *connection,
-              const gchar *name,
-              gpointer user_data)
-{
-	GList *list = NULL;
-	gchar *key;
-	EDataBookFactory *factory = user_data;
-
-	g_mutex_lock (factory->priv->connections_lock);
-	while (g_hash_table_lookup_extended (
-		factory->priv->connections, name,
-		(gpointer) &key, (gpointer) &list)) {
-		GList *copy = g_list_copy (list);
-
-		/* this should trigger the book's weak ref notify
-		 * function, which will remove it from the list before
-		 * it's freed, and will remove the connection from
-		 * priv->connections once they're all gone */
-		g_list_foreach (copy, remove_data_book_cb, NULL);
-		g_list_free (copy);
-	}
-
-	g_mutex_unlock (factory->priv->connections_lock);
-	g_print ("Superseded...\n");
-	g_main_loop_quit (loop);
-}
-
-#ifdef G_OS_UNIX
-#if GLIB_CHECK_VERSION(2,29,5)
-static gboolean
-handle_term_signal (gpointer data)
-{
-	g_print ("Received terminate signal...\n");
-	g_main_loop_quit (loop);
-
-	return FALSE;
-}
-#endif
-#endif
-
 static GOptionEntry entries[] = {
 
 	/* FIXME Have the description translated for 3.2, but this
@@ -805,10 +581,8 @@ gint
 main (gint argc,
       gchar **argv)
 {
-	EOfflineListener *eol;
 	GOptionContext *context;
-	EDataBookFactory *factory;
-	guint owner_id;
+	EDBusServer *server;
 	GError *error = NULL;
 
 #ifdef G_OS_WIN32
@@ -852,48 +626,22 @@ main (gint argc,
 		exit (EXIT_FAILURE);
 	}
 
-	factory = g_object_new (E_TYPE_DATA_BOOK_FACTORY, NULL);
-
-	loop = g_main_loop_new (NULL, FALSE);
-
-	eol = e_offline_listener_new ();
-	offline_state_changed_cb (eol, factory);
-	g_signal_connect (
-		eol, "changed",
-		G_CALLBACK (offline_state_changed_cb), factory);
-
-	owner_id = g_bus_own_name (
-		G_BUS_TYPE_SESSION,
-		ADDRESS_BOOK_DBUS_SERVICE_NAME,
-		G_BUS_NAME_OWNER_FLAGS_REPLACE | G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT,
-		on_bus_acquired,
-		on_name_acquired,
-		on_name_lost,
-		factory,
-		NULL);
-
 	/* Migrate user data from ~/.evolution to XDG base directories. */
 	e_data_book_migrate_basedir ();
 
-#ifdef G_OS_UNIX
-#if GLIB_CHECK_VERSION(2,29,19)
-	g_unix_signal_add_full (
-		G_PRIORITY_DEFAULT, SIGTERM,
-		handle_term_signal, NULL, NULL);
-#elif GLIB_CHECK_VERSION(2,29,5)
-	g_unix_signal_add_watch_full (
-		SIGTERM, G_PRIORITY_DEFAULT,
-		handle_term_signal, NULL, NULL);
-#endif
-#endif
+	server = g_initable_new (
+		E_TYPE_DATA_BOOK_FACTORY, NULL, &error, NULL);
+
+	if (error != NULL) {
+		g_printerr ("%s\n", error->message);
+		exit (EXIT_FAILURE);
+	}
 
 	g_print ("Server is up and running...\n");
 
-	g_main_loop_run (loop);
+	e_dbus_server_run (server);
 
-	g_bus_unown_name (owner_id);
-	g_object_unref (eol);
-	g_object_unref (factory);
+	g_object_unref (server);
 
 	g_print ("Bye.\n");
 
diff --git a/addressbook/libedata-book/e-data-book-factory.h b/addressbook/libedata-book/e-data-book-factory.h
index 90c68c6..d0a977d 100644
--- a/addressbook/libedata-book/e-data-book-factory.h
+++ b/addressbook/libedata-book/e-data-book-factory.h
@@ -18,42 +18,47 @@
  * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
-#ifndef __E_DATA_BOOK_FACTORY_H__
-#define __E_DATA_BOOK_FACTORY_H__
+#ifndef E_DATA_BOOK_FACTORY_H
+#define E_DATA_BOOK_FACTORY_H
 
-#include <glib-object.h>
+#include <libebackend/e-data-factory.h>
 
-G_BEGIN_DECLS
+/* Standard GObject macros */
+#define E_TYPE_DATA_BOOK_FACTORY \
+	(e_data_book_factory_get_type ())
+#define E_DATA_BOOK_FACTORY(obj) \
+	(G_TYPE_CHECK_INSTANCE_CAST \
+	((obj), E_TYPE_DATA_BOOK_FACTORY, EDataBookFactory))
+#define E_DATA_BOOK_FACTORY_CLASS(cls) \
+	(G_TYPE_CHECK_CLASS_CAST \
+	((cls), E_TYPE_DATA_BOOK_FACTORY, EDataBookFactoryClass))
+#define E_IS_DATA_BOOK_FACTORY(obj) \
+	(G_TYPE_CHECK_INSTANCE_TYPE \
+	((obj), E_TYPE_DATA_BOOK_FACTORY))
+#define E_IS_DATA_BOOK_FACTORY_CLASS(cls) \
+	(G_TYPE_CHECK_CLASS_TYPE \
+	((cls), E_TYPE_DATA_BOOK_FACTORY))
+#define E_DATA_BOOK_FACTORY_GET_CLASS(cls) \
+	(G_TYPE_INSTANCE_GET_CLASS \
+	((obj), E_TYPE_DATA_BOOK_FACTORY, EDataBookFactoryClass))
 
-#define E_TYPE_DATA_BOOK_FACTORY        (e_data_book_factory_get_type ())
-#define E_DATA_BOOK_FACTORY(o)          (G_TYPE_CHECK_INSTANCE_CAST ((o), E_TYPE_DATA_BOOK_FACTORY, EDataBookFactory))
-#define E_DATA_BOOK_FACTORY_CLASS(k)    (G_TYPE_CHECK_CLASS_CAST((k), E_TYPE_DATA_BOOK_FACTORY, EDataBookFactoryClass))
-#define E_IS_DATA_BOOK_FACTORY(o)       (G_TYPE_CHECK_INSTANCE_TYPE ((o), E_TYPE_DATA_BOOK_FACTORY))
-#define E_IS_DATA_BOOK_FACTORY_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), E_TYPE_DATA_BOOK_FACTORY))
-#define E_DATA_BOOK_FACTORY_GET_CLASS(k) (G_TYPE_INSTANCE_GET_CLASS ((obj), E_TYPE_DATA_BOOK_FACTORY, EDataBookFactoryClass))
+G_BEGIN_DECLS
 
+typedef struct _EDataBookFactory EDataBookFactory;
+typedef struct _EDataBookFactoryClass EDataBookFactoryClass;
 typedef struct _EDataBookFactoryPrivate EDataBookFactoryPrivate;
 
-typedef struct {
-	GObject parent;
+struct _EDataBookFactory {
+	EDataFactory parent;
 	EDataBookFactoryPrivate *priv;
-} EDataBookFactory;
-
-typedef struct {
-	GObjectClass parent;
-} EDataBookFactoryClass;
-
-typedef enum {
-	E_DATA_BOOK_FACTORY_ERROR_GENERIC
-} EDataBookFactoryError;
-
-GQuark e_data_book_factory_error_quark (void);
-#define E_DATA_BOOK_FACTORY_ERROR e_data_book_factory_error_quark ()
+};
 
-GType e_data_book_factory_get_type (void);
+struct _EDataBookFactoryClass {
+	EDataFactoryClass parent_class;
+};
 
-void e_data_book_factory_set_backend_online (EDataBookFactory *factory, gboolean is_online);
+GType		e_data_book_factory_get_type	(void) G_GNUC_CONST;
 
 G_END_DECLS
 
-#endif /* __E_DATA_BOOK_FACTORY_H__ */
+#endif /* E_DATA_BOOK_FACTORY_H */
diff --git a/addressbook/libedata-book/e-data-book.c b/addressbook/libedata-book/e-data-book.c
index 89689ab..35c8420 100644
--- a/addressbook/libedata-book/e-data-book.c
+++ b/addressbook/libedata-book/e-data-book.c
@@ -37,19 +37,25 @@
 
 #include "e-gdbus-book.h"
 
-G_DEFINE_TYPE (EDataBook, e_data_book, G_TYPE_OBJECT)
+#define E_DATA_BOOK_GET_PRIVATE(obj) \
+	(G_TYPE_INSTANCE_GET_PRIVATE \
+	((obj), E_TYPE_DATA_BOOK, EDataBookPrivate))
 
 struct _EDataBookPrivate
 {
 	EGdbusBook *gdbus_object;
 
 	EBookBackend *backend;
-	ESource *source;
 
 	GStaticRecMutex pending_ops_lock;
 	GHashTable *pending_ops; /* opid to GCancellable for still running operations */
 };
 
+enum {
+	PROP_0,
+	PROP_BACKEND
+};
+
 static EOperationPool *ops_pool = NULL;
 
 typedef enum {
@@ -110,6 +116,8 @@ typedef struct {
 	} d;
 } OperationData;
 
+G_DEFINE_TYPE (EDataBook, e_data_book, G_TYPE_OBJECT)
+
 static gchar *
 construct_bookview_path (void)
 {
@@ -423,24 +431,6 @@ e_data_book_create_error_fmt (EDataBookStatus status,
 	return error;
 }
 
-ESource *
-e_data_book_get_source (EDataBook *book)
-{
-	g_return_val_if_fail (book != NULL, NULL);
-	g_return_val_if_fail (E_IS_DATA_BOOK (book), NULL);
-
-	return book->priv->source;
-}
-
-EBookBackend *
-e_data_book_get_backend (EDataBook *book)
-{
-	g_return_val_if_fail (book != NULL, NULL);
-	g_return_val_if_fail (E_IS_DATA_BOOK (book), NULL);
-
-	return book->priv->backend;
-}
-
 static void
 data_book_return_error (GDBusMethodInvocation *invocation,
                         const GError *perror,
@@ -1238,99 +1228,195 @@ e_data_book_register_gdbus_object (EDataBook *book,
 	return e_gdbus_book_register_object (book->priv->gdbus_object, connection, object_path, error);
 }
 
-/* Instance init */
 static void
-e_data_book_init (EDataBook *ebook)
+data_book_set_backend (EDataBook *book,
+                       EBookBackend *backend)
 {
-	EGdbusBook *gdbus_object;
+	g_return_if_fail (E_IS_BOOK_BACKEND (backend));
+	g_return_if_fail (book->priv->backend == NULL);
 
-	ebook->priv = G_TYPE_INSTANCE_GET_PRIVATE (
-		ebook, E_TYPE_DATA_BOOK, EDataBookPrivate);
+	book->priv->backend = g_object_ref (backend);
+}
 
-	ebook->priv->gdbus_object = e_gdbus_book_stub_new ();
-	ebook->priv->pending_ops = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, g_object_unref);
-	g_static_rec_mutex_init (&ebook->priv->pending_ops_lock);
+static void
+data_book_set_property (GObject *object,
+                        guint property_id,
+                        const GValue *value,
+                        GParamSpec *pspec)
+{
+	switch (property_id) {
+		case PROP_BACKEND:
+			data_book_set_backend (
+				E_DATA_BOOK (object),
+				g_value_get_object (value));
+			return;
+	}
 
-	gdbus_object = ebook->priv->gdbus_object;
-	g_signal_connect (gdbus_object, "handle-open", G_CALLBACK (impl_Book_open), ebook);
-	g_signal_connect (gdbus_object, "handle-remove", G_CALLBACK (impl_Book_remove), ebook);
-	g_signal_connect (gdbus_object, "handle-refresh", G_CALLBACK (impl_Book_refresh), ebook);
-	g_signal_connect (gdbus_object, "handle-get-contact", G_CALLBACK (impl_Book_get_contact), ebook);
-	g_signal_connect (gdbus_object, "handle-get-contact-list", G_CALLBACK (impl_Book_get_contact_list), ebook);
-	g_signal_connect (gdbus_object, "handle-get-contact-list-uids", G_CALLBACK (impl_Book_get_contact_list_uids), ebook);
-	g_signal_connect (gdbus_object, "handle-authenticate-user", G_CALLBACK (impl_Book_authenticate_user), ebook);
-	g_signal_connect (gdbus_object, "handle-add-contact", G_CALLBACK (impl_Book_add_contact), ebook);
-	g_signal_connect (gdbus_object, "handle-remove-contacts", G_CALLBACK (impl_Book_remove_contacts), ebook);
-	g_signal_connect (gdbus_object, "handle-modify-contact", G_CALLBACK (impl_Book_modify_contact), ebook);
-	g_signal_connect (gdbus_object, "handle-get-backend-property", G_CALLBACK (impl_Book_get_backend_property), ebook);
-	g_signal_connect (gdbus_object, "handle-set-backend-property", G_CALLBACK (impl_Book_set_backend_property), ebook);
-	g_signal_connect (gdbus_object, "handle-get-view", G_CALLBACK (impl_Book_get_view), ebook);
-	g_signal_connect (gdbus_object, "handle-cancel-operation", G_CALLBACK (impl_Book_cancel_operation), ebook);
-	g_signal_connect (gdbus_object, "handle-cancel-all", G_CALLBACK (impl_Book_cancel_all), ebook);
-	g_signal_connect (gdbus_object, "handle-close", G_CALLBACK (impl_Book_close), ebook);
+	G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+}
+
+static void
+data_book_get_property (GObject *object,
+                        guint property_id,
+                        GValue *value,
+                        GParamSpec *pspec)
+{
+	switch (property_id) {
+		case PROP_BACKEND:
+			g_value_set_object (
+				value,
+				e_data_book_get_backend (
+				E_DATA_BOOK (object)));
+			return;
+	}
+
+	G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
 }
 
 static void
 data_book_dispose (GObject *object)
 {
-	EDataBook *book = E_DATA_BOOK (object);
+	EDataBookPrivate *priv;
 
-	if (book->priv->backend) {
-		g_object_unref (book->priv->backend);
-		book->priv->backend = NULL;
-	}
+	priv = E_DATA_BOOK_GET_PRIVATE (object);
 
-	if (book->priv->source) {
-		g_object_unref (book->priv->source);
-		book->priv->source = NULL;
+	if (priv->backend) {
+		g_object_unref (priv->backend);
+		priv->backend = NULL;
 	}
 
+	/* Chain up to parent's dispose() metnod. */
 	G_OBJECT_CLASS (e_data_book_parent_class)->dispose (object);
 }
 
 static void
 data_book_finalize (GObject *object)
 {
-	EDataBook *book = E_DATA_BOOK (object);
+	EDataBookPrivate *priv;
 
-	if (book->priv->pending_ops) {
-		g_hash_table_destroy (book->priv->pending_ops);
-		book->priv->pending_ops = NULL;
+	priv = E_DATA_BOOK_GET_PRIVATE (object);
+
+	if (priv->pending_ops) {
+		g_hash_table_destroy (priv->pending_ops);
+		priv->pending_ops = NULL;
 	}
 
-	g_static_rec_mutex_free (&book->priv->pending_ops_lock);
+	g_static_rec_mutex_free (&priv->pending_ops_lock);
 
-	if (book->priv->gdbus_object) {
-		g_object_unref (book->priv->gdbus_object);
-		book->priv->gdbus_object = NULL;
+	if (priv->gdbus_object) {
+		g_object_unref (priv->gdbus_object);
+		priv->gdbus_object = NULL;
 	}
 
+	/* Chain up to parent's finalize() method. */
 	G_OBJECT_CLASS (e_data_book_parent_class)->finalize (object);
 }
 
 static void
-e_data_book_class_init (EDataBookClass *klass)
+e_data_book_class_init (EDataBookClass *class)
 {
-	GObjectClass *object_class = G_OBJECT_CLASS (klass);
+	GObjectClass *object_class;
 
-	g_type_class_add_private (klass, sizeof (EDataBookPrivate));
+	g_type_class_add_private (class, sizeof (EDataBookPrivate));
 
+	object_class = G_OBJECT_CLASS (class);
+	object_class->set_property = data_book_set_property;
+	object_class->get_property = data_book_get_property;
 	object_class->dispose = data_book_dispose;
 	object_class->finalize = data_book_finalize;
 
+	g_object_class_install_property (
+		object_class,
+		PROP_BACKEND,
+		g_param_spec_object (
+			"backend",
+			"Backend",
+			"The backend driving this connection",
+			E_TYPE_BOOK_BACKEND,
+			G_PARAM_READWRITE |
+			G_PARAM_CONSTRUCT_ONLY |
+			G_PARAM_STATIC_STRINGS));
+
 	if (!ops_pool)
 		ops_pool = e_operation_pool_new (10, operation_thread, NULL);
 }
 
+static void
+e_data_book_init (EDataBook *ebook)
+{
+	EGdbusBook *gdbus_object;
+
+	ebook->priv = E_DATA_BOOK_GET_PRIVATE (ebook);
+
+	ebook->priv->gdbus_object = e_gdbus_book_stub_new ();
+	ebook->priv->pending_ops = g_hash_table_new_full (
+		g_direct_hash, g_direct_equal, NULL, g_object_unref);
+	g_static_rec_mutex_init (&ebook->priv->pending_ops_lock);
+
+	gdbus_object = ebook->priv->gdbus_object;
+	g_signal_connect (
+		gdbus_object, "handle-open",
+		G_CALLBACK (impl_Book_open), ebook);
+	g_signal_connect (
+		gdbus_object, "handle-remove",
+		G_CALLBACK (impl_Book_remove), ebook);
+	g_signal_connect (
+		gdbus_object, "handle-refresh",
+		G_CALLBACK (impl_Book_refresh), ebook);
+	g_signal_connect (
+		gdbus_object, "handle-get-contact",
+		G_CALLBACK (impl_Book_get_contact), ebook);
+	g_signal_connect (
+		gdbus_object, "handle-get-contact-list",
+		G_CALLBACK (impl_Book_get_contact_list), ebook);
+	g_signal_connect (
+		gdbus_object, "handle-get-contact-list-uids",
+		G_CALLBACK (impl_Book_get_contact_list_uids), ebook);
+	g_signal_connect (
+		gdbus_object, "handle-authenticate-user",
+		G_CALLBACK (impl_Book_authenticate_user), ebook);
+	g_signal_connect (
+		gdbus_object, "handle-add-contact",
+		G_CALLBACK (impl_Book_add_contact), ebook);
+	g_signal_connect (
+		gdbus_object, "handle-remove-contacts",
+		G_CALLBACK (impl_Book_remove_contacts), ebook);
+	g_signal_connect (
+		gdbus_object, "handle-modify-contact",
+		G_CALLBACK (impl_Book_modify_contact), ebook);
+	g_signal_connect (
+		gdbus_object, "handle-get-backend-property",
+		G_CALLBACK (impl_Book_get_backend_property), ebook);
+	g_signal_connect (
+		gdbus_object, "handle-set-backend-property",
+		G_CALLBACK (impl_Book_set_backend_property), ebook);
+	g_signal_connect (
+		gdbus_object, "handle-get-view",
+		G_CALLBACK (impl_Book_get_view), ebook);
+	g_signal_connect (
+		gdbus_object, "handle-cancel-operation",
+		G_CALLBACK (impl_Book_cancel_operation), ebook);
+	g_signal_connect (
+		gdbus_object, "handle-cancel-all",
+		G_CALLBACK (impl_Book_cancel_all), ebook);
+	g_signal_connect (
+		gdbus_object, "handle-close",
+		G_CALLBACK (impl_Book_close), ebook);
+}
+
 EDataBook *
-e_data_book_new (EBookBackend *backend,
-                 ESource *source)
+e_data_book_new (EBookBackend *backend)
 {
-	EDataBook *book;
+	g_return_val_if_fail (E_IS_BOOK_BACKEND (backend), NULL);
 
-	book = g_object_new (E_TYPE_DATA_BOOK, NULL);
-	book->priv->backend = g_object_ref (backend);
-	book->priv->source = g_object_ref (source);
+	return g_object_new (E_TYPE_DATA_BOOK, "backend", backend, NULL);
+}
 
-	return book;
+EBookBackend *
+e_data_book_get_backend (EDataBook *book)
+{
+	g_return_val_if_fail (E_IS_DATA_BOOK (book), NULL);
+
+	return book->priv->backend;
 }
+
diff --git a/addressbook/libedata-book/e-data-book.h b/addressbook/libedata-book/e-data-book.h
index f875d5c..001f797 100644
--- a/addressbook/libedata-book/e-data-book.h
+++ b/addressbook/libedata-book/e-data-book.h
@@ -126,9 +126,8 @@ const gchar *e_data_book_status_to_string (EDataBookStatus status);
 	} G_STMT_END
 
 GType		e_data_book_get_type				(void);
-EDataBook *	e_data_book_new					(EBookBackend *backend, ESource *source);
+EDataBook *	e_data_book_new					(EBookBackend *backend);
 EBookBackend *	e_data_book_get_backend				(EDataBook *book);
-ESource *	e_data_book_get_source				(EDataBook *book);
 
 guint		e_data_book_register_gdbus_object		(EDataBook *cal, GDBusConnection *connection, const gchar *object_path, GError **error);
 
diff --git a/docs/reference/addressbook/libedata-book/libedata-book-sections.txt b/docs/reference/addressbook/libedata-book/libedata-book-sections.txt
index 0e04b19..4a1b1cb 100644
--- a/docs/reference/addressbook/libedata-book/libedata-book-sections.txt
+++ b/docs/reference/addressbook/libedata-book/libedata-book-sections.txt
@@ -13,15 +13,12 @@ BOOK_BACKEND_PROPERTY_SUPPORTED_FIELDS
 BOOK_BACKEND_PROPERTY_SUPPORTED_AUTH_METHODS
 e_book_backend_get_cache_dir
 e_book_backend_set_cache_dir
-e_book_backend_get_source
 e_book_backend_add_client
 e_book_backend_remove_client
-e_book_backend_is_online
 e_book_backend_is_opened
 e_book_backend_is_opening
 e_book_backend_is_readonly
 e_book_backend_is_removed
-e_book_backend_set_online
 e_book_backend_authenticate_user
 e_book_backend_get_backend_property
 e_book_backend_set_backend_property
@@ -115,9 +112,6 @@ e_book_backend_db_cache_get_time
 <FILE>e-book-backend-factory</FILE>
 <TITLE>EBookBackendFactory</TITLE>
 EBookBackendFactory
-e_book_backend_factory_get_protocol
-e_book_backend_factory_new_backend
-E_BOOK_BACKEND_FACTORY_SIMPLE
 <SUBSECTION Standard>
 E_BOOK_BACKEND_FACTORY
 E_IS_BOOK_BACKEND_FACTORY
@@ -265,7 +259,6 @@ e_return_data_book_error_if_fail
 e_return_data_book_error_val_if_fail
 e_data_book_new
 e_data_book_get_backend
-e_data_book_get_source
 e_data_book_register_gdbus_object
 e_data_book_respond_open
 e_data_book_respond_remove
@@ -308,10 +301,7 @@ e_data_book_status_get_type
 <SECTION>
 <FILE>e-data-book-factory</FILE>
 <TITLE>EDataBookFactory</TITLE>
-E_DATA_BOOK_FACTORY_ERROR
-EDataBookFactoryError
 EDataBookFactory
-e_data_book_factory_set_backend_online
 <SUBSECTION Standard>
 E_DATA_BOOK_FACTORY
 E_IS_DATA_BOOK_FACTORY
@@ -323,7 +313,6 @@ EDataBookFactoryClass
 <SUBSECTION Private>
 EDataBookFactoryPrivate
 e_data_book_factory_get_type
-e_data_book_factory_error_quark
 </SECTION>
 
 <SECTION>
diff --git a/docs/reference/addressbook/libedata-book/tmpl/e-book-backend-factory.sgml b/docs/reference/addressbook/libedata-book/tmpl/e-book-backend-factory.sgml
index 01cdfef..b5942e9 100644
--- a/docs/reference/addressbook/libedata-book/tmpl/e-book-backend-factory.sgml
+++ b/docs/reference/addressbook/libedata-book/tmpl/e-book-backend-factory.sgml
@@ -26,31 +26,3 @@ EBookBackendFactory
 </para>
 
 
-<!-- ##### FUNCTION e_book_backend_factory_get_protocol ##### -->
-<para>
-
-</para>
-
- factory: 
- Returns: 
-
-
-<!-- ##### FUNCTION e_book_backend_factory_new_backend ##### -->
-<para>
-
-</para>
-
- factory: 
- Returns: 
-
-
-<!-- ##### MACRO E_BOOK_BACKEND_FACTORY_SIMPLE ##### -->
-<para>
-
-</para>
-
- p: 
- t: 
- f: 
-
-
diff --git a/docs/reference/addressbook/libedata-book/tmpl/e-book-backend.sgml b/docs/reference/addressbook/libedata-book/tmpl/e-book-backend.sgml
index 829ba3d..4e60208 100644
--- a/docs/reference/addressbook/libedata-book/tmpl/e-book-backend.sgml
+++ b/docs/reference/addressbook/libedata-book/tmpl/e-book-backend.sgml
@@ -26,13 +26,6 @@ EBookBackend
 </para>
 
 
-<!-- ##### SIGNAL EBookBackend::last-client-gone ##### -->
-<para>
-
-</para>
-
- ebookbackend: the object which received the signal.
-
 <!-- ##### ARG EBookBackend:cache-dir ##### -->
 <para>
 
@@ -119,15 +112,6 @@ EBookBackend
 @cache_dir: 
 
 
-<!-- ##### FUNCTION e_book_backend_get_source ##### -->
-<para>
-
-</para>
-
- backend: 
- Returns: 
-
-
 <!-- ##### FUNCTION e_book_backend_add_client ##### -->
 <para>
 
@@ -147,15 +131,6 @@ EBookBackend
 @book: 
 
 
-<!-- ##### FUNCTION e_book_backend_is_online ##### -->
-<para>
-
-</para>
-
- backend: 
- Returns: 
-
-
 <!-- ##### FUNCTION e_book_backend_is_opened ##### -->
 <para>
 
@@ -192,15 +167,6 @@ EBookBackend
 @Returns: 
 
 
-<!-- ##### FUNCTION e_book_backend_set_online ##### -->
-<para>
-
-</para>
-
- backend: 
- is_online: 
-
-
 <!-- ##### FUNCTION e_book_backend_authenticate_user ##### -->
 <para>
 
@@ -526,7 +492,6 @@ EBookBackend
 @set_backend_property: 
 @open: 
 @remove: 
- set_online: 
 @authenticate_user: 
 @refresh: 
 @create_contact: 
diff --git a/docs/reference/addressbook/libedata-book/tmpl/e-data-book-factory.sgml b/docs/reference/addressbook/libedata-book/tmpl/e-data-book-factory.sgml
index f490ab3..05ca591 100644
--- a/docs/reference/addressbook/libedata-book/tmpl/e-data-book-factory.sgml
+++ b/docs/reference/addressbook/libedata-book/tmpl/e-data-book-factory.sgml
@@ -20,20 +20,6 @@ EDataBookFactory
 <!-- ##### SECTION Image ##### -->
 
 
-<!-- ##### MACRO E_DATA_BOOK_FACTORY_ERROR ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### ENUM EDataBookFactoryError ##### -->
-<para>
-
-</para>
-
- E_DATA_BOOK_FACTORY_ERROR_GENERIC: 
-
 <!-- ##### STRUCT EDataBookFactory ##### -->
 <para>
 
@@ -42,12 +28,3 @@ EDataBookFactory
 @parent: 
 @priv: 
 
-<!-- ##### FUNCTION e_data_book_factory_set_backend_online ##### -->
-<para>
-
-</para>
-
- factory: 
- is_online: 
-
-
diff --git a/docs/reference/addressbook/libedata-book/tmpl/e-data-book.sgml b/docs/reference/addressbook/libedata-book/tmpl/e-data-book.sgml
index 95731c3..7d5576e 100644
--- a/docs/reference/addressbook/libedata-book/tmpl/e-data-book.sgml
+++ b/docs/reference/addressbook/libedata-book/tmpl/e-data-book.sgml
@@ -26,6 +26,11 @@ EDataBook
 </para>
 
 
+<!-- ##### ARG EDataBook:backend ##### -->
+<para>
+
+</para>
+
 <!-- ##### MACRO E_DATA_BOOK_ERROR ##### -->
 <para>
 
@@ -87,7 +92,6 @@ EDataBook
 </para>
 
 @backend: 
- source: 
 @Returns: 
 
 
@@ -100,15 +104,6 @@ EDataBook
 @Returns: 
 
 
-<!-- ##### FUNCTION e_data_book_get_source ##### -->
-<para>
-
-</para>
-
- book: 
- Returns: 
-
-
 <!-- ##### FUNCTION e_data_book_register_gdbus_object ##### -->
 <para>
 
diff --git a/docs/reference/addressbook/libedata-book/tmpl/libedata-book-unused.sgml b/docs/reference/addressbook/libedata-book/tmpl/libedata-book-unused.sgml
index 394dec3..fb408c8 100644
--- a/docs/reference/addressbook/libedata-book/tmpl/libedata-book-unused.sgml
+++ b/docs/reference/addressbook/libedata-book/tmpl/libedata-book-unused.sgml
@@ -46,6 +46,13 @@ e-data-book-marshal
 e-data-book-types
 
 
+<!-- ##### SIGNAL EBookBackend::last-client-gone ##### -->
+<para>
+
+</para>
+
+ ebookbackend: the object which received the signal.
+
 <!-- ##### ARG EBookBackendCache:uri ##### -->
 <para>
 
@@ -167,6 +174,13 @@ e-data-book-types
 @_pas_reserved3: 
 @_pas_reserved4: 
 
+<!-- ##### ENUM EDataBookFactoryError ##### -->
+<para>
+
+</para>
+
+ E_DATA_BOOK_FACTORY_ERROR_GENERIC: 
+
 <!-- ##### STRUCT EDataBookFactoryPrivate ##### -->
 <para>
 
@@ -234,6 +248,21 @@ e-data-book-types
 </para>
 
 
+<!-- ##### MACRO E_BOOK_BACKEND_FACTORY_SIMPLE ##### -->
+<para>
+
+</para>
+
+ p: 
+ t: 
+ f: 
+
+<!-- ##### MACRO E_DATA_BOOK_FACTORY_ERROR ##### -->
+<para>
+
+</para>
+
+
 <!-- ##### FUNCTION e_book_backend_cache_exists ##### -->
 <para>
 
@@ -283,6 +312,22 @@ e-data-book-types
 @backend: 
 @Returns: 
 
+<!-- ##### FUNCTION e_book_backend_factory_get_protocol ##### -->
+<para>
+
+</para>
+
+ factory: 
+ Returns: 
+
+<!-- ##### FUNCTION e_book_backend_factory_new_backend ##### -->
+<para>
+
+</para>
+
+ factory: 
+ Returns: 
+
 <!-- ##### FUNCTION e_book_backend_get_book_views ##### -->
 <para>
 
@@ -310,6 +355,14 @@ e-data-book-types
 @book: 
 @opid: 
 
+<!-- ##### FUNCTION e_book_backend_get_source ##### -->
+<para>
+
+</para>
+
+ backend: 
+ Returns: 
+
 <!-- ##### FUNCTION e_book_backend_get_static_capabilities ##### -->
 <para>
 
@@ -352,6 +405,14 @@ e-data-book-types
 @backend: 
 @Returns: 
 
+<!-- ##### FUNCTION e_book_backend_is_online ##### -->
+<para>
+
+</para>
+
+ backend: 
+ Returns: 
+
 <!-- ##### FUNCTION e_book_backend_is_writable ##### -->
 <para>
 
@@ -410,6 +471,14 @@ e-data-book-types
 @backend: 
 @mode: 
 
+<!-- ##### FUNCTION e_book_backend_set_online ##### -->
+<para>
+
+</para>
+
+ backend: 
+ is_online: 
+
 <!-- ##### FUNCTION e_book_backend_sync_get_changes ##### -->
 <para>
 
@@ -509,6 +578,14 @@ e-data-book-types
 @factory: 
 @mode: 
 
+<!-- ##### FUNCTION e_data_book_factory_set_backend_online ##### -->
+<para>
+
+</para>
+
+ factory: 
+ is_online: 
+
 <!-- ##### FUNCTION e_data_book_get_listener ##### -->
 <para>
 
@@ -517,6 +594,14 @@ e-data-book-types
 @book: 
 @Returns: 
 
+<!-- ##### FUNCTION e_data_book_get_source ##### -->
+<para>
+
+</para>
+
+ book: 
+ Returns: 
+
 <!-- ##### MACRO e_data_book_marshal_NONE__NONE ##### -->
 <para>
 



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