mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-10-31 22:25:38 -04:00
move type remap to native protocol
This commit is contained in:
parent
24d80e5c00
commit
81e5708442
3 changed files with 61 additions and 70 deletions
|
|
@ -96,6 +96,65 @@ struct client_data {
|
|||
bool busy;
|
||||
};
|
||||
|
||||
static bool pod_remap_data(uint32_t type, void *body, uint32_t size, struct pw_map *types)
|
||||
{
|
||||
void *t;
|
||||
switch (type) {
|
||||
case SPA_POD_TYPE_ID:
|
||||
if ((t = pw_map_lookup(types, *(int32_t *) body)) == NULL)
|
||||
return false;
|
||||
*(int32_t *) body = PW_MAP_PTR_TO_ID(t);
|
||||
break;
|
||||
|
||||
case SPA_POD_TYPE_PROP:
|
||||
{
|
||||
struct spa_pod_prop_body *b = body;
|
||||
|
||||
if ((t = pw_map_lookup(types, b->key)) == NULL)
|
||||
return false;
|
||||
b->key = PW_MAP_PTR_TO_ID(t);
|
||||
|
||||
if (b->value.type == SPA_POD_TYPE_ID) {
|
||||
void *alt;
|
||||
if (!pod_remap_data
|
||||
(b->value.type, SPA_POD_BODY(&b->value), b->value.size, types))
|
||||
return false;
|
||||
|
||||
SPA_POD_PROP_ALTERNATIVE_FOREACH(b, size, alt)
|
||||
if (!pod_remap_data(b->value.type, alt, b->value.size, types))
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case SPA_POD_TYPE_OBJECT:
|
||||
{
|
||||
struct spa_pod_object_body *b = body;
|
||||
struct spa_pod *p;
|
||||
|
||||
if ((t = pw_map_lookup(types, b->type)) == NULL)
|
||||
return false;
|
||||
b->type = PW_MAP_PTR_TO_ID(t);
|
||||
|
||||
SPA_POD_OBJECT_BODY_FOREACH(b, size, p)
|
||||
if (!pod_remap_data(p->type, SPA_POD_BODY(p), p->size, types))
|
||||
return false;
|
||||
break;
|
||||
}
|
||||
case SPA_POD_TYPE_STRUCT:
|
||||
{
|
||||
struct spa_pod *b = body, *p;
|
||||
|
||||
SPA_POD_FOREACH(b, size, p)
|
||||
if (!pod_remap_data(p->type, SPA_POD_BODY(p), p->size, types))
|
||||
return false;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
static void
|
||||
process_messages(struct client_data *data)
|
||||
{
|
||||
|
|
@ -149,7 +208,7 @@ process_messages(struct client_data *data)
|
|||
}
|
||||
|
||||
if (demarshal[opcode].flags & PW_PROTOCOL_NATIVE_REMAP)
|
||||
if (!pw_pod_remap_data(SPA_POD_TYPE_STRUCT, message, size, &client->types))
|
||||
if (!pod_remap_data(SPA_POD_TYPE_STRUCT, message, size, &client->types))
|
||||
goto invalid_message;
|
||||
|
||||
if (!demarshal[opcode].func (resource, message, size))
|
||||
|
|
@ -513,7 +572,7 @@ on_remote_data(void *data, int fd, enum spa_io mask)
|
|||
}
|
||||
|
||||
if (demarshal[opcode].flags & PW_PROTOCOL_NATIVE_REMAP) {
|
||||
if (!pw_pod_remap_data(SPA_POD_TYPE_STRUCT, message, size, &this->types)) {
|
||||
if (!pod_remap_data(SPA_POD_TYPE_STRUCT, message, size, &this->types)) {
|
||||
pw_log_error
|
||||
("protocol-native %p: invalid message received %u for %u", this,
|
||||
opcode, id);
|
||||
|
|
|
|||
|
|
@ -61,62 +61,3 @@ void pw_type_init(struct pw_type *type)
|
|||
spa_type_param_alloc_meta_enable_map(type->map, &type->param_alloc_meta_enable);
|
||||
spa_type_param_alloc_video_padding_map(type->map, &type->param_alloc_video_padding);
|
||||
}
|
||||
|
||||
bool pw_pod_remap_data(uint32_t type, void *body, uint32_t size, struct pw_map *types)
|
||||
{
|
||||
void *t;
|
||||
switch (type) {
|
||||
case SPA_POD_TYPE_ID:
|
||||
if ((t = pw_map_lookup(types, *(int32_t *) body)) == NULL)
|
||||
return false;
|
||||
*(int32_t *) body = PW_MAP_PTR_TO_ID(t);
|
||||
break;
|
||||
|
||||
case SPA_POD_TYPE_PROP:
|
||||
{
|
||||
struct spa_pod_prop_body *b = body;
|
||||
|
||||
if ((t = pw_map_lookup(types, b->key)) == NULL)
|
||||
return false;
|
||||
b->key = PW_MAP_PTR_TO_ID(t);
|
||||
|
||||
if (b->value.type == SPA_POD_TYPE_ID) {
|
||||
void *alt;
|
||||
if (!pw_pod_remap_data
|
||||
(b->value.type, SPA_POD_BODY(&b->value), b->value.size, types))
|
||||
return false;
|
||||
|
||||
SPA_POD_PROP_ALTERNATIVE_FOREACH(b, size, alt)
|
||||
if (!pw_pod_remap_data(b->value.type, alt, b->value.size, types))
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case SPA_POD_TYPE_OBJECT:
|
||||
{
|
||||
struct spa_pod_object_body *b = body;
|
||||
struct spa_pod *p;
|
||||
|
||||
if ((t = pw_map_lookup(types, b->type)) == NULL)
|
||||
return false;
|
||||
b->type = PW_MAP_PTR_TO_ID(t);
|
||||
|
||||
SPA_POD_OBJECT_BODY_FOREACH(b, size, p)
|
||||
if (!pw_pod_remap_data(p->type, SPA_POD_BODY(p), p->size, types))
|
||||
return false;
|
||||
break;
|
||||
}
|
||||
case SPA_POD_TYPE_STRUCT:
|
||||
{
|
||||
struct spa_pod *b = body, *p;
|
||||
|
||||
SPA_POD_FOREACH(b, size, p)
|
||||
if (!pw_pod_remap_data(p->type, SPA_POD_BODY(p), p->size, types))
|
||||
return false;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -76,15 +76,6 @@ struct pw_type {
|
|||
void
|
||||
pw_type_init(struct pw_type *type);
|
||||
|
||||
bool
|
||||
pw_pod_remap_data(uint32_t type, void *body, uint32_t size, struct pw_map *types);
|
||||
|
||||
static inline bool
|
||||
pw_pod_remap(struct spa_pod *pod, struct pw_map *types)
|
||||
{
|
||||
return pw_pod_remap_data(pod->type, SPA_POD_BODY(pod), pod->size, types);
|
||||
}
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue