[evolution-data-server] Add e_source_registry_server_ref_backend().



commit 1acf0eb3202e0518a5998d3998abfe753e4b63f9
Author: Matthew Barnes <mbarnes redhat com>
Date:   Sun Jul 22 23:27:36 2012 -0400

    Add e_source_registry_server_ref_backend().
    
    Returns the ECollectionBackend for a given ESource, if one exists.
    
    This works for any collection member: the "collection" ESource itself
    as well as any of its hierarchical descendants.

 .../reference/libebackend/libebackend-sections.txt |    1 +
 libebackend/e-source-registry-server.c             |   68 ++++++++++++++++++++
 libebackend/e-source-registry-server.h             |    5 ++
 3 files changed, 74 insertions(+), 0 deletions(-)
---
diff --git a/docs/reference/libebackend/libebackend-sections.txt b/docs/reference/libebackend/libebackend-sections.txt
index c4c03cb..50b0b12 100644
--- a/docs/reference/libebackend/libebackend-sections.txt
+++ b/docs/reference/libebackend/libebackend-sections.txt
@@ -371,6 +371,7 @@ e_source_registry_server_load_file
 e_source_registry_server_load_error
 e_source_registry_server_ref_source
 e_source_registry_server_list_sources
+e_source_registry_server_ref_backend
 e_source_registry_server_ref_backend_factory
 e_source_registry_server_authenticate_sync
 e_source_registry_server_authenticate
diff --git a/libebackend/e-source-registry-server.c b/libebackend/e-source-registry-server.c
index 2bf10a0..beca758 100644
--- a/libebackend/e-source-registry-server.c
+++ b/libebackend/e-source-registry-server.c
@@ -1867,6 +1867,74 @@ e_source_registry_server_list_sources (ESourceRegistryServer *server,
 }
 
 /**
+ * e_source_registry_server_ref_backend:
+ * @server: an #ESourceRegistryServer
+ * @source: an #ESource
+ *
+ * Returns the #ECollectionBackend associated with @source, or %NULL if
+ * there is no #ECollectionBackend associated with @source.
+ *
+ * An #ESource is associated with an #ECollectionBackend if the #ESource has
+ * an #ESourceCollection extension, or if it is a hierarchical descendant of
+ * another #ESource which has an #ESourceCollection extension.
+ *
+ * The returned #ECollectionBackend is referenced for thread-safety.
+ * Unreference the #ECollectionBackend with g_object_unref() when finished
+ * with it.
+ *
+ * Returns: the #ECollectionBackend for @source, or %NULL
+ *
+ * Since: 3.6
+ **/
+ECollectionBackend *
+e_source_registry_server_ref_backend (ESourceRegistryServer *server,
+                                      ESource *source)
+{
+	ECollectionBackend *backend = NULL;
+	const gchar *extension_name;
+
+	g_return_val_if_fail (E_IS_SOURCE_REGISTRY_SERVER (server), NULL);
+	g_return_val_if_fail (E_IS_SOURCE (source), NULL);
+
+	/* XXX If ESourceRegistryServer ever grows a function similar to
+	 *     e_source_registry_find_extension() then we could just use
+	 *     that, but despite this use case I think the need for such
+	 *     a function is not sufficiently strong yet. */
+
+	extension_name = E_SOURCE_EXTENSION_COLLECTION;
+
+	g_object_ref (source);
+
+	while (!e_source_has_extension (source, extension_name)) {
+		gchar *uid;
+
+		uid = e_source_dup_parent (source);
+
+		g_object_unref (source);
+		source = NULL;
+
+		if (uid != NULL) {
+			source = e_source_registry_server_ref_source (
+				server, uid);
+			g_free (uid);
+		}
+
+		if (source == NULL)
+			break;
+	}
+
+	if (source != NULL) {
+		backend = g_object_get_data (
+			G_OBJECT (source), BACKEND_DATA_KEY);
+		if (backend != NULL)
+			g_object_ref (backend);
+		g_object_unref (source);
+	}
+
+	return backend;
+}
+
+/**
  * e_source_registry_server_ref_backend_factory:
  * @server: an #ESourceRegistryServer
  * @source: an #ESource
diff --git a/libebackend/e-source-registry-server.h b/libebackend/e-source-registry-server.h
index 5b78ceb..e4007cb 100644
--- a/libebackend/e-source-registry-server.h
+++ b/libebackend/e-source-registry-server.h
@@ -28,6 +28,7 @@
 #include <libebackend/e-authentication-session.h>
 #include <libebackend/e-backend-enums.h>
 #include <libebackend/e-data-factory.h>
+#include <libebackend/e-collection-backend.h>
 #include <libebackend/e-collection-backend-factory.h>
 
 /* Standard GObject macros */
@@ -124,6 +125,10 @@ ESource *	e_source_registry_server_ref_source
 GList *		e_source_registry_server_list_sources
 						(ESourceRegistryServer *server,
 						 const gchar *extension_name);
+ECollectionBackend *
+		e_source_registry_server_ref_backend
+						(ESourceRegistryServer *server,
+						 ESource *source);
 ECollectionBackendFactory *
 		e_source_registry_server_ref_backend_factory
 						(ESourceRegistryServer *server,



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