pod: add support for maybe-NULL types

This commit is contained in:
Wim Taymans 2017-03-23 16:57:33 +01:00
parent 3dba9f0fd4
commit f613240b66
3 changed files with 36 additions and 23 deletions

View file

@ -484,13 +484,13 @@ client_node_marshal_port_update (void *object,
PinosProxy *proxy = object; PinosProxy *proxy = object;
PinosConnection *connection = proxy->context->protocol_private; PinosConnection *connection = proxy->context->protocol_private;
Builder b = { { NULL, 0, 0, NULL, write_pod }, connection }; Builder b = { { NULL, 0, 0, NULL, write_pod }, connection };
SpaPODFrame f; SpaPODFrame f[2];
int i, n_items; int i, n_items;
core_update_map (proxy->context); core_update_map (proxy->context);
spa_pod_builder_add (&b.b, spa_pod_builder_add (&b.b,
SPA_POD_TYPE_STRUCT, &f, SPA_POD_TYPE_STRUCT, &f[0],
SPA_POD_TYPE_INT, direction, SPA_POD_TYPE_INT, direction,
SPA_POD_TYPE_INT, port_id, SPA_POD_TYPE_INT, port_id,
SPA_POD_TYPE_INT, change_mask, SPA_POD_TYPE_INT, change_mask,
@ -505,9 +505,9 @@ client_node_marshal_port_update (void *object,
SPA_POD_TYPE_POD, props, SPA_POD_TYPE_POD, props,
0); 0);
spa_pod_builder_add (&b.b, SPA_POD_TYPE_INT, info ? 1 : 0, 0);
if (info) { if (info) {
spa_pod_builder_add (&b.b, spa_pod_builder_add (&b.b,
SPA_POD_TYPE_STRUCT, &f[1],
SPA_POD_TYPE_INT, info->flags, SPA_POD_TYPE_INT, info->flags,
SPA_POD_TYPE_LONG, info->maxbuffering, SPA_POD_TYPE_LONG, info->maxbuffering,
SPA_POD_TYPE_LONG, info->latency, SPA_POD_TYPE_LONG, info->latency,
@ -526,8 +526,11 @@ client_node_marshal_port_update (void *object,
SPA_POD_TYPE_STRING, info->extra->items[i].value, SPA_POD_TYPE_STRING, info->extra->items[i].value,
0); 0);
} }
spa_pod_builder_add (&b.b, -SPA_POD_TYPE_STRUCT, &f[1], 0);
} else {
spa_pod_builder_add (&b.b, SPA_POD_TYPE_POD, NULL, 0);
} }
spa_pod_builder_add (&b.b, -SPA_POD_TYPE_STRUCT, &f, 0); spa_pod_builder_add (&b.b, -SPA_POD_TYPE_STRUCT, &f[0], 0);
pinos_connection_end_write (connection, proxy->id, 1, b.b.offset); pinos_connection_end_write (connection, proxy->id, 1, b.b.offset);
} }
@ -680,7 +683,7 @@ client_node_demarshal_set_format (void *object,
SPA_POD_TYPE_INT, &direction, SPA_POD_TYPE_INT, &direction,
SPA_POD_TYPE_INT, &port_id, SPA_POD_TYPE_INT, &port_id,
SPA_POD_TYPE_INT, &flags, SPA_POD_TYPE_INT, &flags,
SPA_POD_TYPE_OBJECT, &format, -SPA_POD_TYPE_OBJECT, &format,
0)) 0))
return false; return false;

View file

@ -811,7 +811,7 @@ client_node_demarshal_update (void *object,
SPA_POD_TYPE_INT, &change_mask, SPA_POD_TYPE_INT, &change_mask,
SPA_POD_TYPE_INT, &max_input_ports, SPA_POD_TYPE_INT, &max_input_ports,
SPA_POD_TYPE_INT, &max_output_ports, SPA_POD_TYPE_INT, &max_output_ports,
SPA_POD_TYPE_OBJECT, &props, -SPA_POD_TYPE_OBJECT, &props,
0)) 0))
return false; return false;
@ -826,10 +826,11 @@ client_node_demarshal_port_update (void *object,
{ {
PinosResource *resource = object; PinosResource *resource = object;
SpaPODIter it; SpaPODIter it;
uint32_t i, t, direction, port_id, change_mask, n_possible_formats; uint32_t i, direction, port_id, change_mask, n_possible_formats;
const SpaProps *props = NULL; const SpaProps *props = NULL;
const SpaFormat **possible_formats = NULL, *format = NULL; const SpaFormat **possible_formats = NULL, *format = NULL;
SpaPortInfo info, *infop = NULL; SpaPortInfo info, *infop = NULL;
SpaPOD *ipod;
if (!spa_pod_iter_struct (&it, data, size) || if (!spa_pod_iter_struct (&it, data, size) ||
!spa_pod_iter_get (&it, !spa_pod_iter_get (&it,
@ -842,23 +843,23 @@ client_node_demarshal_port_update (void *object,
possible_formats = alloca (n_possible_formats * sizeof (SpaFormat*)); possible_formats = alloca (n_possible_formats * sizeof (SpaFormat*));
for (i = 0; i < n_possible_formats; i++) for (i = 0; i < n_possible_formats; i++)
if (!spa_pod_iter_get (&it,SPA_POD_TYPE_OBJECT, &possible_formats[i], 0)) if (!spa_pod_iter_get (&it, SPA_POD_TYPE_OBJECT, &possible_formats[i], 0))
return false; return false;
if (!spa_pod_iter_get (&it, if (!spa_pod_iter_get (&it,
SPA_POD_TYPE_OBJECT, &format, -SPA_POD_TYPE_OBJECT, &format,
SPA_POD_TYPE_OBJECT, &props, -SPA_POD_TYPE_OBJECT, &props,
-SPA_POD_TYPE_STRUCT, &ipod,
0)) 0))
return false; return false;
if (!spa_pod_iter_get (&it, SPA_POD_TYPE_INT, &t, 0)) if (ipod) {
return false;
if (t) {
SpaDict dict; SpaDict dict;
SpaPODIter it2;
infop = &info; infop = &info;
if (!spa_pod_iter_get (&it, if (!spa_pod_iter_pod (&it2, ipod) ||
!spa_pod_iter_get (&it2,
SPA_POD_TYPE_INT, &info.flags, SPA_POD_TYPE_INT, &info.flags,
SPA_POD_TYPE_LONG, &info.maxbuffering, SPA_POD_TYPE_LONG, &info.maxbuffering,
SPA_POD_TYPE_LONG, &info.latency, SPA_POD_TYPE_LONG, &info.latency,
@ -868,16 +869,16 @@ client_node_demarshal_port_update (void *object,
info.params = alloca (info.n_params * sizeof (SpaAllocParam *)); info.params = alloca (info.n_params * sizeof (SpaAllocParam *));
for (i = 0; i < info.n_params; i++) for (i = 0; i < info.n_params; i++)
if (!spa_pod_iter_get (&it, SPA_POD_TYPE_OBJECT, &info.params[i], 0)) if (!spa_pod_iter_get (&it2, SPA_POD_TYPE_OBJECT, &info.params[i], 0))
return false; return false;
if (!spa_pod_iter_get (&it, SPA_POD_TYPE_INT, &dict.n_items, 0)) if (!spa_pod_iter_get (&it2, SPA_POD_TYPE_INT, &dict.n_items, 0))
return false; return false;
info.extra = &dict; info.extra = &dict;
dict.items = alloca (dict.n_items * sizeof (SpaDictItem)); dict.items = alloca (dict.n_items * sizeof (SpaDictItem));
for (i = 0; i < dict.n_items; i++) { for (i = 0; i < dict.n_items; i++) {
if (!spa_pod_iter_get (&it, if (!spa_pod_iter_get (&it2,
SPA_POD_TYPE_STRING, &dict.items[i].key, SPA_POD_TYPE_STRING, &dict.items[i].key,
SPA_POD_TYPE_STRING, &dict.items[i].value, SPA_POD_TYPE_STRING, &dict.items[i].value,
0)) 0))

View file

@ -97,16 +97,16 @@ spa_pod_object_find_prop (const SpaPODObject *obj, uint32_t key)
*(va_arg (args, SpaPOD **)) = pod; \ *(va_arg (args, SpaPOD **)) = pod; \
} else if ((pod)->type == SPA_POD_TYPE_NONE) { \ } else if ((pod)->type == SPA_POD_TYPE_NONE) { \
switch (type) { \ switch (type) { \
case SPA_POD_TYPE_ARRAY: \ case -SPA_POD_TYPE_ARRAY: \
case SPA_POD_TYPE_STRUCT: \ case -SPA_POD_TYPE_STRUCT: \
case SPA_POD_TYPE_OBJECT: \ case -SPA_POD_TYPE_OBJECT: \
case SPA_POD_TYPE_PROP: \ case -SPA_POD_TYPE_PROP: \
*(va_arg (args, SpaPOD **)) = NULL; \ *(va_arg (args, SpaPOD **)) = NULL; \
break; \ break; \
default: \ default: \
goto error; \ goto error; \
} \ } \
} else if ((pod)->type == type) { \ } else if ((pod)->type == type || (pod)->type == -type) { \
switch (type) { \ switch (type) { \
case SPA_POD_TYPE_BOOL: \ case SPA_POD_TYPE_BOOL: \
case SPA_POD_TYPE_URI: \ case SPA_POD_TYPE_URI: \
@ -155,6 +155,10 @@ spa_pod_object_find_prop (const SpaPODObject *obj, uint32_t key)
case SPA_POD_TYPE_STRUCT: \ case SPA_POD_TYPE_STRUCT: \
case SPA_POD_TYPE_OBJECT: \ case SPA_POD_TYPE_OBJECT: \
case SPA_POD_TYPE_PROP: \ case SPA_POD_TYPE_PROP: \
case -SPA_POD_TYPE_ARRAY: \
case -SPA_POD_TYPE_STRUCT: \
case -SPA_POD_TYPE_OBJECT: \
case -SPA_POD_TYPE_PROP: \
*(va_arg (args, SpaPOD **)) = pod; \ *(va_arg (args, SpaPOD **)) = pod; \
break; \ break; \
default: \ default: \
@ -177,6 +181,7 @@ spa_pod_object_find_prop (const SpaPODObject *obj, uint32_t key)
case SPA_POD_TYPE_FLOAT: \ case SPA_POD_TYPE_FLOAT: \
case SPA_POD_TYPE_DOUBLE: \ case SPA_POD_TYPE_DOUBLE: \
case SPA_POD_TYPE_STRING: \ case SPA_POD_TYPE_STRING: \
case -SPA_POD_TYPE_STRING: \
case SPA_POD_TYPE_RECTANGLE: \ case SPA_POD_TYPE_RECTANGLE: \
case SPA_POD_TYPE_FRACTION: \ case SPA_POD_TYPE_FRACTION: \
case SPA_POD_TYPE_BITMASK: \ case SPA_POD_TYPE_BITMASK: \
@ -185,6 +190,10 @@ spa_pod_object_find_prop (const SpaPODObject *obj, uint32_t key)
case SPA_POD_TYPE_OBJECT: \ case SPA_POD_TYPE_OBJECT: \
case SPA_POD_TYPE_PROP: \ case SPA_POD_TYPE_PROP: \
case SPA_POD_TYPE_POD: \ case SPA_POD_TYPE_POD: \
case -SPA_POD_TYPE_ARRAY: \
case -SPA_POD_TYPE_STRUCT: \
case -SPA_POD_TYPE_OBJECT: \
case -SPA_POD_TYPE_PROP: \
va_arg (args, void*); \ va_arg (args, void*); \
default: \ default: \
break; \ break; \