From bbf718cc9803a43b58f4062853eec756e0d91915 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Sat, 27 Oct 2018 17:26:17 +0100 Subject: [PATCH] global: add revoke and grant methods Add methods to grant or revoke access to a global for a client. --- src/pipewire/global.c | 45 +++++++++++++++++++++++++++++++++++++++++++ src/pipewire/global.h | 8 ++++++++ 2 files changed, 53 insertions(+) diff --git a/src/pipewire/global.c b/src/pipewire/global.c index 2c2765968..11f509f1c 100644 --- a/src/pipewire/global.c +++ b/src/pipewire/global.c @@ -249,6 +249,51 @@ pw_global_bind(struct pw_global *global, struct pw_client *client, uint32_t perm return res; } +int pw_global_grant(struct pw_global *global, struct pw_client *client) +{ + struct pw_resource *registry; + struct pw_core *core = global->core; + + spa_list_for_each(registry, &core->registry_resource_list, link) { + uint32_t permissions; + + if (registry->client != client) + continue; + + permissions = pw_global_get_permissions(global, client); + + pw_log_debug("registry %p: global %d %08x", registry, global->id, permissions); + if (PW_PERM_IS_R(permissions)) + pw_registry_resource_global(registry, + global->id, + global->parent->id, + permissions, + global->type, + global->version, + global->properties ? + &global->properties->dict : NULL); + } + return 0; +} + +int pw_global_revoke(struct pw_global *global, struct pw_client *client) +{ + struct pw_resource *registry, *resource, *t; + struct pw_core *core = global->core; + + spa_list_for_each(registry, &core->registry_resource_list, link) { + if (registry->client != client) + continue; + pw_registry_resource_global_remove(registry, global->id); + } + spa_list_for_each_safe(resource, t, &global->resource_list, link) { + if (resource->client != client) + continue; + pw_resource_destroy(resource); + } + return 0; +} + /** Destroy a global * * \param global a global to destroy diff --git a/src/pipewire/global.h b/src/pipewire/global.h index bfcb9cc7d..dcd831278 100644 --- a/src/pipewire/global.h +++ b/src/pipewire/global.h @@ -128,6 +128,14 @@ int pw_global_bind(struct pw_global *global, uint32_t version, uint32_t id); +/** Revoke access to global for client, the global will be removed from + * the client registry and all the bound resources for the client will be + * destroyed */ +int pw_global_revoke(struct pw_global *global, struct pw_client *client); +/** Grant access to a global for client. The client registry will be + * notified of a new global */ +int pw_global_grant(struct pw_global *global, struct pw_client *client); + /** Destroy a global */ void pw_global_destroy(struct pw_global *global);