mbim: Support variable struct signatures in arrays

DEVICE_SUBSCRIBE_LIST uses an array of structures.  The structure
contains the UUID of the service and then a variable number of CIDs that
are enabled.
This commit is contained in:
Denis Kenzior 2017-11-08 13:26:12 -06:00
parent 2bb8feab07
commit bd0ba8bf3b
1 changed files with 24 additions and 1 deletions

View File

@ -38,6 +38,7 @@
static const char CONTAINER_TYPE_ARRAY = 'a';
static const char CONTAINER_TYPE_STRUCT = 'r';
static const char CONTAINER_TYPE_DATABUF = 'd';
static const char CONTAINER_TYPE_VARIANT = 'v';
static const char *simple_types = "syqu";
struct mbim_message {
@ -98,6 +99,8 @@ static int get_alignment(const char type)
return 4;
case 'a':
return 4;
case 'v':
return 4;
default:
return 0;
}
@ -120,7 +123,7 @@ static int get_basic_size(const char type)
static bool is_fixed_size(const char *sig_start, const char *sig_end)
{
while (sig_start <= sig_end) {
if (*sig_start == 'a' || *sig_start == 's')
if (*sig_start == 'a' || *sig_start == 's' || *sig_start == 'v')
return false;
sig_start++;
@ -1452,6 +1455,26 @@ static bool append_arguments(struct mbim_message *message,
break;
}
case 'v': /* Structure with variable signature */
{
if (stack_index == MAX_NESTING)
goto error;
str = va_arg(args, const char *);
if (!str)
goto error;
if (!mbim_message_builder_enter_struct(builder, str))
goto error;
stack_index += 1;
stack[stack_index].sig_start = str;
stack[stack_index].sig_end = str + strlen(str);
stack[stack_index].n_items = 0;
stack[stack_index].type = CONTAINER_TYPE_STRUCT;
break;
}
case 'd':
{
if (stack_index == MAX_NESTING)