aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAleksander Morgado <aleksander@lanedo.com>2013-07-15 10:15:23 +0200
committerAleksander Morgado <aleksander@lanedo.com>2013-07-15 10:24:31 +0200
commitcf62f84382373190c6da29926f45529da9509a30 (patch)
treef0c4a596e208638dc79477e5533804144d06e533
parent62832041690852bb7e5eb595e550ad5c8d6ddfa5 (diff)
qmi-codegen: allow handling built-in sequence numbers in arrays
TLVs are really limited in size, so if you want to have truly long data passed between host and modem, you may end up needing multiple QMI messages where the long TLV is split in segments. Currently support this by handling a built-in sequence number expected to be found between the array size prefix and the array itself (see e.g. TLV 0x13 (PRL) in 'DMS Activate Manual'). This sequence number can be enabled with the new 'sequence-prefix-format' keyword in the array definition.
-rw-r--r--build-aux/qmi-codegen/VariableArray.py147
1 files changed, 125 insertions, 22 deletions
diff --git a/build-aux/qmi-codegen/VariableArray.py b/build-aux/qmi-codegen/VariableArray.py
index c5aadf9..c402da1 100644
--- a/build-aux/qmi-codegen/VariableArray.py
+++ b/build-aux/qmi-codegen/VariableArray.py
@@ -72,6 +72,13 @@ class VariableArray(Variable):
default_array_size = { 'format' : 'guint8' }
self.array_size_element = VariableFactory.create_variable(default_array_size, '', self.container_type)
+ # Load variable type for the sequence prefix
+ if 'sequence-prefix-format' in dictionary:
+ sequence = { 'format' : dictionary['sequence-prefix-format'] }
+ self.array_sequence_element = VariableFactory.create_variable(sequence, '', self.container_type)
+ else:
+ self.array_sequence_element = ''
+
"""
Emit the type for the array element
@@ -150,15 +157,33 @@ class VariableArray(Variable):
f.write(string.Template(template).substitute(translations))
else:
translations['array_size_element_format'] = self.array_size_element.public_format
-
template = (
- '${lp} ${array_size_element_format} ${common_var_prefix}_n_items;\n'
+ '${lp} ${array_size_element_format} ${common_var_prefix}_n_items;\n')
+
+ if self.array_sequence_element != '':
+ translations['array_sequence_element_format'] = self.array_sequence_element.public_format
+ template += (
+ '${lp} ${array_sequence_element_format} ${common_var_prefix}_sequence;\n')
+
+ template += (
'\n'
'${lp} /* Read number of items in the array */\n')
f.write(string.Template(template).substitute(translations))
-
self.array_size_element.emit_buffer_read(f, line_prefix + ' ', common_var_prefix + '_n_items', buffer_name, buffer_len)
+ if self.array_sequence_element != '':
+ template = (
+ '\n'
+ '${lp} /* Read sequence in the array */\n')
+ f.write(string.Template(template).substitute(translations))
+ self.array_size_element.emit_buffer_read(f, line_prefix + ' ', common_var_prefix + '_sequence', buffer_name, buffer_len)
+
+ template = (
+ '\n'
+ '${lp} ${variable_name}_sequence = ${common_var_prefix}_sequence;\n')
+ f.write(string.Template(template).substitute(translations))
+
+
template = (
'\n'
'${lp} ${variable_name} = g_array_sized_new (\n'
@@ -202,15 +227,15 @@ class VariableArray(Variable):
template = (
'${lp}{\n'
- '${lp} guint ${common_var_prefix}_i;\n')
+ '${lp} guint ${common_var_prefix}_i;\n'
+ '\n')
f.write(string.Template(template).substitute(translations))
if self.fixed_size:
translations['fixed_size'] = self.fixed_size
template = (
- '${lp} guint16 ${common_var_prefix}_n_items = ${fixed_size};\n'
- '\n')
+ '${lp} guint16 ${common_var_prefix}_n_items = ${fixed_size};\n')
f.write(string.Template(template).substitute(translations))
else:
translations['array_size_element_format'] = self.array_size_element.public_format
@@ -228,13 +253,27 @@ class VariableArray(Variable):
'${lp} const guint8 *${common_var_prefix}_aux_buffer = &${buffer_name}[${variable_name}];\n'
'${lp} guint16 ${common_var_prefix}_aux_buffer_len = ${buffer_len} - ${variable_name};\n'
'\n'
- '${lp} ${variable_name} += ${array_size_element_size};\n'
- '\n')
+ '${lp} ${variable_name} += ${array_size_element_size};\n')
+
+ if self.array_sequence_element != '':
+ if self.array_sequence_element.public_format == 'guint8':
+ translations['array_sequence_element_size'] = '1'
+ elif self.array_sequence_element.public_format == 'guint16':
+ translations['array_sequence_element_size'] = '2'
+ elif self.array_sequence_element.public_format == 'guint32':
+ translations['array_sequence_element_size'] = '4'
+ else:
+ translations['array_sequence_element_size'] = '0'
+ template += (
+ '\n'
+ '${lp} ${variable_name} += ${array_sequence_element_size};\n')
+
f.write(string.Template(template).substitute(translations))
self.array_size_element.emit_buffer_read(f, line_prefix + ' ', common_var_prefix + '_n_items', common_var_prefix + '_aux_buffer', common_var_prefix + '_aux_buffer_len')
template = (
+ '\n'
'${lp} for (${common_var_prefix}_i = 0; ${common_var_prefix}_i < ${common_var_prefix}_n_items; ${common_var_prefix}_i++) {\n'
'\n')
f.write(string.Template(template).substitute(translations))
@@ -275,6 +314,10 @@ class VariableArray(Variable):
self.array_size_element.emit_buffer_write(f, line_prefix + ' ', common_var_prefix + '_n_items', buffer_name, buffer_len)
+ if self.array_sequence_element != '':
+ self.array_sequence_element.emit_buffer_write(f, line_prefix + ' ', variable_name + '_sequence', buffer_name, buffer_len)
+
+
template = (
'\n'
'${lp} for (${common_var_prefix}_i = 0; ${common_var_prefix}_i < ${variable_name}->len; ${common_var_prefix}_i++) {\n')
@@ -314,15 +357,31 @@ class VariableArray(Variable):
f.write(string.Template(template).substitute(translations))
else:
translations['array_size_element_format'] = self.array_size_element.public_format
-
template = (
- '${lp} ${array_size_element_format} ${common_var_prefix}_n_items;\n'
+ '${lp} ${array_size_element_format} ${common_var_prefix}_n_items;\n')
+
+ if self.array_sequence_element != '':
+ translations['array_sequence_element_format'] = self.array_sequence_element.public_format
+ template += (
+ '${lp} ${array_sequence_element_format} ${common_var_prefix}_sequence;\n')
+
+ template += (
'\n'
'${lp} /* Read number of items in the array */\n')
f.write(string.Template(template).substitute(translations))
-
self.array_size_element.emit_buffer_read(f, line_prefix + ' ', common_var_prefix + '_n_items', buffer_name, buffer_len)
+ if self.array_sequence_element != '':
+ template = (
+ '\n'
+ '${lp} /* Read sequence */\n')
+ f.write(string.Template(template).substitute(translations))
+ self.array_sequence_element.emit_buffer_read(f, line_prefix + ' ', common_var_prefix + '_sequence', buffer_name, buffer_len)
+ template = (
+ '\n'
+ '${lp} g_string_append_printf (${printable}, "[[Seq:%u]] ", ${common_var_prefix}_sequence);\n')
+ f.write(string.Template(template).substitute(translations))
+
template = (
'\n'
'${lp} g_string_append (${printable}, "{");\n'
@@ -349,7 +408,13 @@ class VariableArray(Variable):
translations = { 'lp' : line_prefix,
'name' : variable_name }
- template = (
+ template = ''
+ if self.array_sequence_element != '':
+ translations['array_sequence_element_format'] = self.array_sequence_element.public_format
+ template += (
+ '${lp}${array_sequence_element_format} ${name}_sequence;\n')
+
+ template += (
'${lp}GArray *${name};\n')
return string.Template(template).substitute(translations)
@@ -361,7 +426,13 @@ class VariableArray(Variable):
translations = { 'lp' : line_prefix,
'name' : variable_name }
- template = (
+ template = ''
+ if self.array_sequence_element != '':
+ translations['array_sequence_element_format'] = self.array_sequence_element.public_format
+ template += (
+ '${lp}${array_sequence_element_format} *${name}_sequence,\n')
+
+ template += (
'${lp}GArray **${name},\n')
return string.Template(template).substitute(translations)
@@ -374,7 +445,12 @@ class VariableArray(Variable):
'public_array_element_format' : self.array_element.public_format,
'name' : variable_name }
- template = (
+ template = ''
+ if self.array_sequence_element != '':
+ template += (
+ '${lp}@${name}_sequence: a placeholder for the output sequence number, or %NULL if not required.\n')
+
+ template += (
'${lp}@${name}: a placeholder for the output #GArray of #${public_array_element_format} elements, or %NULL if not required. Do not free it, it is owned by @self.\n')
return string.Template(template).substitute(translations)
@@ -387,15 +463,21 @@ class VariableArray(Variable):
'from' : variable_name_from,
'to' : variable_name_to }
+ template = ''
+ if self.array_sequence_element != '':
+ template += (
+ '${lp}if (${to}_sequence)\n'
+ '${lp} *${to}_sequence = ${from}_sequence;\n')
+
if to_is_reference:
- template = (
+ template += (
'${lp}if (${to})\n'
'${lp} *${to} = ${from};\n')
- return string.Template(template).substitute(translations)
else:
- template = (
+ template += (
'${lp}${to} = ${from};\n')
- return string.Template(template).substitute(translations)
+
+ return string.Template(template).substitute(translations)
"""
@@ -405,7 +487,13 @@ class VariableArray(Variable):
translations = { 'lp' : line_prefix,
'name' : variable_name }
- template = (
+ template = ''
+ if self.array_sequence_element != '':
+ translations['array_sequence_element_format'] = self.array_sequence_element.public_format
+ template += (
+ '${lp}${array_sequence_element_format} ${name}_sequence,\n')
+
+ template += (
'${lp}GArray *${name},\n')
return string.Template(template).substitute(translations)
@@ -418,7 +506,12 @@ class VariableArray(Variable):
'public_array_element_format' : self.array_element.public_format,
'name' : variable_name }
- template = (
+ template = ''
+ if self.array_sequence_element != '':
+ template += (
+ '${lp}@${name}_sequence: the sequence number.\n')
+
+ template += (
'${lp}@${name}: a #GArray of #${public_array_element_format} elements. A new reference to @${name} will be taken.\n')
return string.Template(template).substitute(translations)
@@ -431,7 +524,12 @@ class VariableArray(Variable):
'from' : variable_name_from,
'to' : variable_name_to }
- template = (
+ template = ''
+ if self.array_sequence_element != '':
+ template += (
+ '${lp}${to}_sequence = ${from}_sequence;\n')
+
+ template += (
'${lp}if (${to})\n'
'${lp} g_array_unref (${to});\n'
'${lp}${to} = g_array_ref (${from});\n')
@@ -446,7 +544,12 @@ class VariableArray(Variable):
'public_array_element_format' : self.array_element.public_format,
'name' : variable_name }
- template = (
+ template = ''
+ if self.array_sequence_element != '':
+ template += (
+ '${lp}@${name}_sequence: the sequence number.\n')
+
+ template += (
'${lp}@${name}: a #GArray of #${public_array_element_format} elements.\n')
return string.Template(template).substitute(translations)