summaryrefslogtreecommitdiff
path: root/libebackend/e-source-registry-server.c
diff options
context:
space:
mode:
authorMatthew Barnes <mbarnes@redhat.com>2012-07-22 23:27:36 -0400
committerMatthew Barnes <mbarnes@redhat.com>2012-08-03 11:39:50 -0400
commit1acf0eb3202e0518a5998d3998abfe753e4b63f9 (patch)
tree98e3f77bb80a79e039e7f2cddf18b8756099a5ff /libebackend/e-source-registry-server.c
parentc204ff1cdff9603242dd5faab425be3f4d6f41a4 (diff)
downloadevolution-data-server-1acf0eb3202e0518a5998d3998abfe753e4b63f9.tar.gz
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.
Diffstat (limited to 'libebackend/e-source-registry-server.c')
-rw-r--r--libebackend/e-source-registry-server.c68
1 files changed, 68 insertions, 0 deletions
diff --git a/libebackend/e-source-registry-server.c b/libebackend/e-source-registry-server.c
index 2bf10a0f1..beca758e1 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