mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-04 13:30:12 -05:00
modules: refactor permissions parsing
This commit is contained in:
parent
98aa2a04c7
commit
36d78c41a0
2 changed files with 31 additions and 24 deletions
|
|
@ -79,6 +79,7 @@ do { \
|
||||||
if (spa_pod_parser_get(prs, \
|
if (spa_pod_parser_get(prs, \
|
||||||
SPA_POD_Int(&(d)->n_items), NULL) < 0) \
|
SPA_POD_Int(&(d)->n_items), NULL) < 0) \
|
||||||
return -EINVAL; \
|
return -EINVAL; \
|
||||||
|
(d)->items = NULL; \
|
||||||
if ((d)->n_items > 0) { \
|
if ((d)->n_items > 0) { \
|
||||||
(d)->items = alloca((d)->n_items * sizeof(struct spa_dict_item)); \
|
(d)->items = alloca((d)->n_items * sizeof(struct spa_dict_item)); \
|
||||||
for (i = 0; i < (d)->n_items; i++) { \
|
for (i = 0; i < (d)->n_items; i++) { \
|
||||||
|
|
@ -102,6 +103,7 @@ do { \
|
||||||
if (spa_pod_parser_get(prs, \
|
if (spa_pod_parser_get(prs, \
|
||||||
SPA_POD_Int(&n_params), NULL) < 0) \
|
SPA_POD_Int(&n_params), NULL) < 0) \
|
||||||
return -EINVAL; \
|
return -EINVAL; \
|
||||||
|
params = NULL; \
|
||||||
if (n_params > 0) { \
|
if (n_params > 0) { \
|
||||||
params = alloca(n_params * sizeof(struct spa_pos *)); \
|
params = alloca(n_params * sizeof(struct spa_pos *)); \
|
||||||
for (i = 0; i < n_params; i++) { \
|
for (i = 0; i < n_params; i++) { \
|
||||||
|
|
@ -118,6 +120,7 @@ do { \
|
||||||
if (spa_pod_parser_get(prs, \
|
if (spa_pod_parser_get(prs, \
|
||||||
SPA_POD_Int(&(n_params)), NULL) < 0) \
|
SPA_POD_Int(&(n_params)), NULL) < 0) \
|
||||||
return -EINVAL; \
|
return -EINVAL; \
|
||||||
|
params = NULL; \
|
||||||
if (n_params > 0) { \
|
if (n_params > 0) { \
|
||||||
params = alloca(n_params * sizeof(struct spa_param_info)); \
|
params = alloca(n_params * sizeof(struct spa_param_info)); \
|
||||||
for (i = 0; i < n_params; i++) { \
|
for (i = 0; i < n_params; i++) { \
|
||||||
|
|
|
||||||
|
|
@ -172,6 +172,7 @@ do { \
|
||||||
if (spa_pod_parser_get(prs, \
|
if (spa_pod_parser_get(prs, \
|
||||||
SPA_POD_Int(&(d)->n_items), NULL) < 0) \
|
SPA_POD_Int(&(d)->n_items), NULL) < 0) \
|
||||||
return -EINVAL; \
|
return -EINVAL; \
|
||||||
|
(d)->items = NULL; \
|
||||||
if ((d)->n_items > 0) { \
|
if ((d)->n_items > 0) { \
|
||||||
uint32_t i; \
|
uint32_t i; \
|
||||||
(d)->items = alloca((d)->n_items * sizeof(struct spa_dict_item)); \
|
(d)->items = alloca((d)->n_items * sizeof(struct spa_dict_item)); \
|
||||||
|
|
@ -212,6 +213,7 @@ do { \
|
||||||
spa_pod_parser_get(prs, \
|
spa_pod_parser_get(prs, \
|
||||||
SPA_POD_Int(&(n_params)), NULL) < 0) \
|
SPA_POD_Int(&(n_params)), NULL) < 0) \
|
||||||
return -EINVAL; \
|
return -EINVAL; \
|
||||||
|
params = NULL; \
|
||||||
if (n_params > 0) { \
|
if (n_params > 0) { \
|
||||||
uint32_t i; \
|
uint32_t i; \
|
||||||
params = alloca(n_params * sizeof(struct spa_param_info)); \
|
params = alloca(n_params * sizeof(struct spa_param_info)); \
|
||||||
|
|
@ -222,9 +224,30 @@ do { \
|
||||||
return -EINVAL; \
|
return -EINVAL; \
|
||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
|
spa_pod_parser_pop(prs, f); \
|
||||||
} while(0)
|
} while(0)
|
||||||
|
|
||||||
|
|
||||||
|
#define parse_permissions_struct(prs,f,n_permissions,permissions) \
|
||||||
|
do { \
|
||||||
|
if (spa_pod_parser_push_struct(prs, f) < 0 || \
|
||||||
|
spa_pod_parser_get(prs, \
|
||||||
|
SPA_POD_Int(&n_permissions), NULL) < 0) \
|
||||||
|
return -EINVAL; \
|
||||||
|
permissions = NULL; \
|
||||||
|
if (n_permissions > 0) { \
|
||||||
|
uint32_t i; \
|
||||||
|
permissions = alloca(n_permissions * sizeof(struct pw_permission)); \
|
||||||
|
for (i = 0; i < n_permissions; i++) { \
|
||||||
|
if (spa_pod_parser_get(prs, \
|
||||||
|
SPA_POD_Int(&permissions[i].id), \
|
||||||
|
SPA_POD_Int(&permissions[i].permissions), NULL) < 0) \
|
||||||
|
return -EINVAL; \
|
||||||
|
} \
|
||||||
|
} \
|
||||||
|
spa_pod_parser_pop(prs, f); \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
static void *
|
static void *
|
||||||
core_method_marshal_create_object(void *object,
|
core_method_marshal_create_object(void *object,
|
||||||
const char *factory_name,
|
const char *factory_name,
|
||||||
|
|
@ -1534,7 +1557,7 @@ static int client_demarshal_permissions(void *object, const struct pw_protocol_n
|
||||||
struct pw_permission *permissions;
|
struct pw_permission *permissions;
|
||||||
struct spa_pod_parser prs;
|
struct spa_pod_parser prs;
|
||||||
struct spa_pod_frame f[2];
|
struct spa_pod_frame f[2];
|
||||||
uint32_t i, index, n_permissions;
|
uint32_t index, n_permissions;
|
||||||
|
|
||||||
spa_pod_parser_init(&prs, msg->data, msg->size);
|
spa_pod_parser_init(&prs, msg->data, msg->size);
|
||||||
if (spa_pod_parser_push_struct(&prs, &f[0]) < 0 ||
|
if (spa_pod_parser_push_struct(&prs, &f[0]) < 0 ||
|
||||||
|
|
@ -1542,18 +1565,8 @@ static int client_demarshal_permissions(void *object, const struct pw_protocol_n
|
||||||
SPA_POD_Int(&index), NULL) < 0)
|
SPA_POD_Int(&index), NULL) < 0)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
if (spa_pod_parser_push_struct(&prs, &f[1]) < 0 ||
|
parse_permissions_struct(&prs, &f[1], n_permissions, permissions);
|
||||||
spa_pod_parser_get(&prs,
|
|
||||||
SPA_POD_Int(&n_permissions), NULL) < 0)
|
|
||||||
return -EINVAL;
|
|
||||||
|
|
||||||
permissions = alloca(n_permissions * sizeof(struct pw_permission));
|
|
||||||
for (i = 0; i < n_permissions; i++) {
|
|
||||||
if (spa_pod_parser_get(&prs,
|
|
||||||
SPA_POD_Int(&permissions[i].id),
|
|
||||||
SPA_POD_Int(&permissions[i].permissions), NULL) < 0)
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
return pw_proxy_notify(proxy, struct pw_client_events, permissions, 0, index, n_permissions, permissions);
|
return pw_proxy_notify(proxy, struct pw_client_events, permissions, 0, index, n_permissions, permissions);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1675,21 +1688,12 @@ static int client_demarshal_update_permissions(void *object, const struct pw_pro
|
||||||
struct pw_permission *permissions;
|
struct pw_permission *permissions;
|
||||||
struct spa_pod_parser prs;
|
struct spa_pod_parser prs;
|
||||||
struct spa_pod_frame f[1];
|
struct spa_pod_frame f[1];
|
||||||
uint32_t i, n_permissions;
|
uint32_t n_permissions;
|
||||||
|
|
||||||
spa_pod_parser_init(&prs, msg->data, msg->size);
|
spa_pod_parser_init(&prs, msg->data, msg->size);
|
||||||
if (spa_pod_parser_push_struct(&prs, &f[0]) < 0 ||
|
|
||||||
spa_pod_parser_get(&prs,
|
|
||||||
SPA_POD_Int(&n_permissions), NULL) < 0)
|
|
||||||
return -EINVAL;
|
|
||||||
|
|
||||||
permissions = alloca(n_permissions * sizeof(struct pw_permission));
|
parse_permissions_struct(&prs, &f[0], n_permissions, permissions);
|
||||||
for (i = 0; i < n_permissions; i++) {
|
|
||||||
if (spa_pod_parser_get(&prs,
|
|
||||||
SPA_POD_Int(&permissions[i].id),
|
|
||||||
SPA_POD_Int(&permissions[i].permissions), NULL) < 0)
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
return pw_resource_notify(resource, struct pw_client_methods, update_permissions, 0,
|
return pw_resource_notify(resource, struct pw_client_methods, update_permissions, 0,
|
||||||
n_permissions, permissions);
|
n_permissions, permissions);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue