aboutsummaryrefslogtreecommitdiffstats
path: root/build-aux/qmi-codegen/VariableInteger.py
diff options
context:
space:
mode:
authorAleksander Morgado <aleksander@lanedo.com>2012-10-30 15:08:02 +0100
committerAleksander Morgado <aleksander@lanedo.com>2012-10-30 20:42:59 +0100
commit4c98ff41cca3c83498c8f8b6f502fa56e4e31653 (patch)
tree7935c2d8132809eeb74c7cd655d9f87b560f8db3 /build-aux/qmi-codegen/VariableInteger.py
parent7cce18820ef2142781c334d20e162d814695a409 (diff)
qmi-codegen: validate TLV before really reading it
Try to handle buggy firmware, or just make the library more robust, by validating the read TLV before really reading it. If a TLV is not considered valid, we just skip it for now. E.g.: the "Detailed Service Status" TLV (0x21) in the "NAS Get Serving System" message is supposed to be a sequence of 5 bytes, but some models (e.g. ZTE MF683) end up sending only the first 4 bytes.
Diffstat (limited to 'build-aux/qmi-codegen/VariableInteger.py')
-rw-r--r--build-aux/qmi-codegen/VariableInteger.py26
1 files changed, 26 insertions, 0 deletions
diff --git a/build-aux/qmi-codegen/VariableInteger.py b/build-aux/qmi-codegen/VariableInteger.py
index b891283..63d1d02 100644
--- a/build-aux/qmi-codegen/VariableInteger.py
+++ b/build-aux/qmi-codegen/VariableInteger.py
@@ -101,6 +101,32 @@ class VariableInteger(Variable):
"""
+ Emits the code involved in computing the size of the variable.
+ """
+ def emit_size_read(self, f, line_prefix, variable_name, buffer_name, buffer_len):
+ translations = { 'lp' : line_prefix,
+ 'len' : self.guint_sized_size,
+ 'variable_name' : variable_name }
+ template = ''
+ if self.format == 'guint-sized':
+ template += (
+ '${lp}${variable_name} += ${len};\n')
+ elif self.private_format == 'guint8' or self.private_format == 'gint8':
+ template += (
+ '${lp}${variable_name} += 1;\n')
+ elif self.private_format == 'guint16' or self.private_format == 'gint16':
+ template += (
+ '${lp}${variable_name} += 2;\n')
+ elif self.private_format == 'guint32' or self.private_format == 'gint32':
+ template += (
+ '${lp}${variable_name} += 4;\n')
+ elif self.private_format == 'guint64' or self.private_format == 'gint64':
+ template += (
+ '${lp}${variable_name} += 8;\n')
+ f.write(string.Template(template).substitute(translations))
+
+
+ """
Write a single integer to the raw byte buffer
"""
def emit_buffer_write(self, f, line_prefix, variable_name, buffer_name, buffer_len):