[evolution-data-server] Add e_source_registry_server_ref_backend().
- From: Matthew Barnes <mbarnes src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution-data-server] Add e_source_registry_server_ref_backend().
- Date: Fri, 3 Aug 2012 15:40:12 +0000 (UTC)
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]