diff options
author | Aleksander Morgado <aleksander@lanedo.com> | 2013-07-15 10:15:23 +0200 |
---|---|---|
committer | Aleksander Morgado <aleksander@lanedo.com> | 2013-07-15 10:24:31 +0200 |
commit | cf62f84382373190c6da29926f45529da9509a30 (patch) | |
tree | f0c4a596e208638dc79477e5533804144d06e533 /build-aux | |
parent | 62832041690852bb7e5eb595e550ad5c8d6ddfa5 (diff) | |
download | external_libqmi-cf62f84382373190c6da29926f45529da9509a30.zip external_libqmi-cf62f84382373190c6da29926f45529da9509a30.tar.gz external_libqmi-cf62f84382373190c6da29926f45529da9509a30.tar.bz2 |
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.
Diffstat (limited to 'build-aux')
-rw-r--r-- | build-aux/qmi-codegen/VariableArray.py | 147 |
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) |