global: add properties

Add properties to global objects to make it easier to select what
nodes and objects to bind too. They can also be used to implement
permissions on the globals based on properties.
Add more error handling in _register.
Make more functions return a result code.
Make a separate pw_module_register, like all other objects.
This commit is contained in:
Wim Taymans 2018-01-19 11:18:17 +01:00
parent 47dd97049c
commit c593d868fb
45 changed files with 295 additions and 149 deletions

View file

@ -226,7 +226,7 @@ static void try_link_port(struct pw_node *node, struct pw_port *port, struct nod
pw_link_add_listener(link, &ld->link_listener, &link_events, ld);
spa_list_append(&info->links, &ld->l);
pw_link_register(link, NULL, pw_module_get_global(impl->module));
pw_link_register(link, NULL, pw_module_get_global(impl->module), NULL);
try_link_controls(impl, port, target);

View file

@ -133,7 +133,7 @@ static int module_init(struct pw_module *module, struct pw_properties *propertie
pw_protocol_native_ext_client_node_init(core);
pw_factory_register(factory, NULL, pw_module_get_global(module));
pw_factory_register(factory, NULL, pw_module_get_global(module), NULL);
pw_module_add_listener(module, &data->module_listener, &module_events, data);

View file

@ -813,7 +813,7 @@ handle_connect_name_ports(struct client *client)
ld->in_port = in_port;
spa_list_append(&impl->link_list, &ld->link_link);
pw_link_add_listener(link, &ld->link_listener, &link_events, ld);
pw_link_register(link, NULL, pw_module_get_global(impl->module));
pw_link_register(link, NULL, pw_module_get_global(impl->module), NULL);
notify_clients(impl, jack_notify_PortConnectCallback, false, "", src_id, dst_id);
@ -1060,7 +1060,7 @@ static struct client *client_new(struct impl *impl, int fd)
pw_client_add_listener(client, &this->client_listener, &client_events, this);
pw_client_register(client, NULL, pw_module_get_global(impl->module));
pw_client_register(client, NULL, pw_module_get_global(impl->module), NULL);
pw_log_debug("module-jack %p: added new client", impl);
@ -1339,7 +1339,7 @@ static int on_global(void *data, struct pw_global *global)
pw_log_debug("module-jack %p: using buffer_size %d", impl,
impl->server.engine_control->buffer_size);
pw_link_register(impl->sink_link, NULL, pw_module_get_global(impl->module));
pw_link_register(impl->sink_link, NULL, pw_module_get_global(impl->module), NULL);
return 1;
}

View file

@ -944,7 +944,7 @@ struct pw_jack_node *pw_jack_node_new(struct pw_core *core,
jack_connection_manager_init_ref_num(conn, ref_num);
jack_graph_manager_next_stop(mgr);
pw_node_register(node, NULL, parent);
pw_node_register(node, NULL, parent, NULL);
pw_node_set_active(node, true);
return this;
@ -1041,7 +1041,7 @@ pw_jack_driver_new(struct pw_core *core,
this->driver_out = alloc_port(this, PW_DIRECTION_OUTPUT, 0);
pw_port_add(this->driver_out->port, node);
}
pw_node_register(node, NULL, parent);
pw_node_register(node, NULL, parent, NULL);
pw_node_set_active(node, true);
return this;

View file

@ -113,7 +113,7 @@ static void *create_object(void *_data,
if (link == NULL)
goto no_mem;
pw_link_register(link, client, pw_client_get_global(client));
pw_link_register(link, client, pw_client_get_global(client), NULL);
res = pw_global_bind(pw_link_get_global(link), client, PW_PERM_RWX, PW_VERSION_LINK, new_id);
if (res < 0)
@ -206,7 +206,7 @@ static int module_init(struct pw_module *module, struct pw_properties *propertie
&impl_factory,
data);
pw_factory_register(factory, NULL, pw_module_get_global(module));
pw_factory_register(factory, NULL, pw_module_get_global(module), NULL);
pw_module_add_listener(module, &data->module_listener, &module_events, data);

View file

@ -175,7 +175,7 @@ static int on_global(void *data, struct pw_global *global)
NULL,
pw_properties_new(PW_LINK_PROP_PASSIVE, "true", NULL),
&error, 0);
pw_link_register(link, NULL, pw_module_get_global(impl->module));
pw_link_register(link, NULL, pw_module_get_global(impl->module), NULL);
return 0;
}

View file

@ -334,7 +334,7 @@ static struct pw_client *client_new(struct server *s, int fd)
spa_list_append(&s->this.client_list, &client->protocol_link);
pw_client_add_listener(client, &this->client_listener, &client_events, this);
pw_client_register(client, NULL, pw_module_get_global(pd->module));
pw_client_register(client, NULL, pw_module_get_global(pd->module), NULL);
pw_global_bind(pw_core_get_global(core), client, PW_PERM_RWX, PW_VERSION_CORE, 0);

View file

@ -488,19 +488,31 @@ static int core_demarshal_update_types_server(void *object, void *data, size_t s
}
static void registry_marshal_global(void *object, uint32_t id, uint32_t parent_id, uint32_t permissions,
uint32_t type, uint32_t version)
uint32_t type, uint32_t version, const struct spa_dict *props)
{
struct pw_resource *resource = object;
struct spa_pod_builder *b;
uint32_t i, n_items;
b = pw_protocol_native_begin_resource(resource, PW_REGISTRY_PROXY_EVENT_GLOBAL);
spa_pod_builder_struct(b,
"i", id,
"i", parent_id,
"i", permissions,
"I", type,
"i", version);
n_items = props ? props->n_items : 0;
spa_pod_builder_add(b,
"[",
"i", id,
"i", parent_id,
"i", permissions,
"I", type,
"i", version,
"i", n_items, NULL);
for (i = 0; i < n_items; i++) {
spa_pod_builder_add(b,
"s", props->items[i].key,
"s", props->items[i].value, NULL);
}
spa_pod_builder_add(b, "]", NULL);
pw_protocol_native_end_resource(resource, b);
}
@ -874,7 +886,8 @@ static int registry_demarshal_global(void *object, void *data, size_t size)
{
struct pw_proxy *proxy = object;
struct spa_pod_parser prs;
uint32_t id, parent_id, permissions, type, version;
uint32_t id, parent_id, permissions, type, version, i;
struct spa_dict props;
spa_pod_parser_init(&prs, data, size, 0);
if (spa_pod_parser_get(&prs,
@ -883,10 +896,21 @@ static int registry_demarshal_global(void *object, void *data, size_t size)
"i", &parent_id,
"i", &permissions,
"I", &type,
"i", &version, NULL) < 0)
"i", &version,
"i", &props.n_items, NULL) < 0)
return -EINVAL;
pw_proxy_notify(proxy, struct pw_registry_proxy_events, global, id, parent_id, permissions, type, version);
props.items = alloca(props.n_items * sizeof(struct spa_dict_item));
for (i = 0; i < props.n_items; i++) {
if (spa_pod_parser_get(&prs,
"s", &props.items[i].key,
"s", &props.items[i].value, NULL) < 0)
return -EINVAL;
}
pw_proxy_notify(proxy, struct pw_registry_proxy_events,
global, id, parent_id, permissions, type, version,
props.n_items > 0 ? &props : NULL);
return 0;
}

View file

@ -176,7 +176,7 @@ static int module_init(struct pw_module *module, struct pw_properties *propertie
pw_log_debug("module %p: new", module);
pw_module_add_listener(module, &data->module_listener, &module_events, data);
pw_factory_register(factory, NULL, pw_module_get_global(module));
pw_factory_register(factory, NULL, pw_module_get_global(module), NULL);
return 0;
}

View file

@ -75,7 +75,7 @@ static void pw_spa_node_destroy(void *data)
static void complete_init(struct impl *impl)
{
struct pw_node *this = impl->this;
pw_node_register(this, impl->owner, impl->parent);
pw_node_register(this, impl->owner, impl->parent, NULL);
if (impl->flags & PW_SPA_NODE_FLAG_ACTIVATE)
pw_node_set_active(this, true);
}