diff options
author | Matthew Barnes <mbarnes@redhat.com> | 2012-07-22 23:27:36 -0400 |
---|---|---|
committer | Matthew Barnes <mbarnes@redhat.com> | 2012-08-03 11:39:50 -0400 |
commit | 1acf0eb3202e0518a5998d3998abfe753e4b63f9 (patch) | |
tree | 98e3f77bb80a79e039e7f2cddf18b8756099a5ff /libebackend/e-source-registry-server.c | |
parent | c204ff1cdff9603242dd5faab425be3f4d6f41a4 (diff) | |
download | evolution-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.c | 68 |
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 |