diff options
author | Aleksander Morgado <aleksander@aleksander.es> | 2014-10-10 14:07:56 +0200 |
---|---|---|
committer | Aleksander Morgado <aleksander@aleksander.es> | 2014-11-09 20:15:56 +0100 |
commit | b143b7f6ba38dd4e8b6405f479c2b8ccb90afc4e (patch) | |
tree | f08fcf105df9d5a77b10d332ab47819c9a504f46 /build-aux | |
parent | 6af6f9d1cdcf765586b1ccaf569c7f6ed9b3138c (diff) |
qmi-codegen: use the new TLV reader API
Diffstat (limited to 'build-aux')
-rw-r--r-- | build-aux/qmi-codegen/Field.py | 123 | ||||
-rw-r--r-- | build-aux/qmi-codegen/Variable.py | 11 | ||||
-rw-r--r-- | build-aux/qmi-codegen/VariableArray.py | 122 | ||||
-rw-r--r-- | build-aux/qmi-codegen/VariableInteger.py | 114 | ||||
-rw-r--r-- | build-aux/qmi-codegen/VariableSequence.py | 27 | ||||
-rw-r--r-- | build-aux/qmi-codegen/VariableString.py | 119 | ||||
-rw-r--r-- | build-aux/qmi-codegen/VariableStruct.py | 27 |
7 files changed, 134 insertions, 409 deletions
diff --git a/build-aux/qmi-codegen/Field.py b/build-aux/qmi-codegen/Field.py index c4b395a..7d51b93 100644 --- a/build-aux/qmi-codegen/Field.py +++ b/build-aux/qmi-codegen/Field.py @@ -41,7 +41,7 @@ class Field: # The specific TLV ID self.id = dictionary['id'] # Whether the field is to be considered mandatory in the message - self.mandatory = dictionary['mandatory'] + self.mandatory = True if dictionary['mandatory'] == 'yes' else False # The type, which must always be "TLV" self.type = dictionary['type'] # The container type, which must be either "Input" or "Output" @@ -267,49 +267,53 @@ class Field: Emit the code responsible for retrieving the TLV from the QMI message """ def emit_output_tlv_get(self, f, line_prefix): + tlv_out = utils.build_underscore_name (self.fullname) + '_out' + error = 'error' if self.mandatory else 'NULL' translations = { 'name' : self.name, 'container_underscore' : utils.build_underscore_name (self.prefix), - 'underscore' : utils.build_underscore_name (self.fullname), + 'tlv_out' : tlv_out, 'tlv_id' : self.id_enum_name, 'variable_name' : self.variable_name, 'lp' : line_prefix, - 'error' : 'error' if self.mandatory == 'yes' else 'NULL'} + 'error' : error } template = ( - '${lp}const guint8 *buffer;\n' - '${lp}guint16 buffer_len;\n' + '${lp}gsize offset = 0;\n' + '${lp}gsize init_offset;\n' + '${lp}gboolean tlv_error = FALSE;\n' '\n' - '${lp}buffer = qmi_message_get_raw_tlv (message,\n' - '${lp} ${tlv_id},\n' - '${lp} &buffer_len);\n' - '${lp}if (buffer && ${underscore}_validate (buffer, buffer_len)) {\n' - '${lp} self->${variable_name}_set = TRUE;\n' - '\n') + '${lp}init_offset = qmi_message_tlv_read_init (message, ${tlv_id}, NULL, ${error});\n') + if self.mandatory: + template += ( + '\n' + '${lp}if (init_offset == 0) {\n' + '${lp} g_prefix_error (${error}, "Couldn\'t get the mandatory ${name} TLV: ");\n' + '${lp} ${container_underscore}_unref (self);\n' + '${lp} return NULL;\n' + '${lp}}\n') + + f.write(string.Template(template).substitute(translations)) # Now, read the contents of the buffer into the variable - self.variable.emit_buffer_read(f, line_prefix + ' ', 'self->' + self.variable_name, 'buffer', 'buffer_len') + self.variable.emit_buffer_read(f, line_prefix + ' ', tlv_out, error, 'self->' + self.variable_name) template = ( '\n' - '${lp} /* The remaining size of the buffer needs to be 0 if we successfully read the TLV */\n' - '${lp} if (buffer_len > 0) {\n' - '${lp} g_warning ("Left \'%u\' bytes unread when getting the \'${name}\' TLV", buffer_len);\n' - '${lp} }\n') - - if self.mandatory == 'yes': + '${lp}/* The remaining size of the buffer needs to be 0 if we successfully read the TLV */\n' + '${lp}if ((offset = __qmi_message_tlv_read_remaining_size (message, init_offset, offset)) > 0) {\n' + '${lp} g_warning ("Left \'%" G_GSIZE_FORMAT "\' bytes unread when getting the \'${name}\' TLV", offset);\n' + '${lp}}\n' + '\n' + '${tlv_out}:\n' + '${lp}if (!tlv_error)\n' + '${lp} self->${variable_name}_set = TRUE;\n') + if self.mandatory: template += ( - '${lp}} else {\n' - '${lp} g_set_error (error,\n' - '${lp} QMI_CORE_ERROR,\n' - '${lp} QMI_CORE_ERROR_TLV_NOT_FOUND,\n' - '${lp} \"Couldn\'t get the ${name} TLV: Not found\");\n' + '${lp}else {\n' '${lp} ${container_underscore}_unref (self);\n' '${lp} return NULL;\n' '${lp}}\n') - else: - template += ( - '${lp}}\n') f.write(string.Template(template).substitute(translations)) @@ -328,73 +332,34 @@ class Field: template = ( '\n' - 'static gboolean\n' - '${underscore}_validate (\n' - ' const guint8 *buffer,\n' - ' guint16 buffer_len)\n' - '{\n' - ' guint32 expected_len = 0;\n' - '\n') - f.write(string.Template(template).substitute(translations)) - - # Now, read the size of the expected TLV. - # - # Note: the emit_size_read() implementation is allowed to return FALSE - # to indicate an error at any time. - self.variable.emit_size_read(f, ' ', 'expected_len', 'buffer', 'buffer_len') - - template = ( - '\n' - ' if (buffer_len < expected_len) {\n' - ' g_warning ("Cannot read the \'${name}\' TLV: expected \'%u\' bytes, but only got \'%u\' bytes",\n' - ' expected_len, buffer_len);\n' - ' return FALSE;\n' - ' }\n' - '\n' - ' if (buffer_len > expected_len) {\n' - ' g_debug ("Reading the \'${name}\' TLV: expected \'%u\' bytes, but got \'%u\' bytes",\n' - ' expected_len, buffer_len);\n' - ' return TRUE;\n' - ' }\n' - '\n' - ' return TRUE;\n' - '}\n' - '\n') - f.write(string.Template(template).substitute(translations)) - - template = ( - '\n' 'static gchar *\n' '${underscore}_get_printable (\n' ' QmiMessage *message,\n' ' const gchar *line_prefix)\n' '{\n' - ' const guint8 *buffer;\n' - ' guint16 buffer_len;\n' + ' gsize offset = 0;\n' + ' gsize init_offset;\n' + ' GString *printable;\n' + ' GError *error = NULL;\n' '\n' - ' buffer = qmi_message_get_raw_tlv (message,\n' - ' ${tlv_id},\n' - ' &buffer_len);\n' - ' if (buffer && ${underscore}_validate (buffer, buffer_len)) {\n' - ' GString *printable;\n' + ' if ((init_offset = qmi_message_tlv_read_init (message, ${tlv_id}, NULL, NULL)) == 0)\n' + ' return NULL;\n' '\n' - ' printable = g_string_new ("");\n') + ' printable = g_string_new ("");\n') f.write(string.Template(template).substitute(translations)) # Now, read the contents of the buffer into the printable representation - self.variable.emit_get_printable(f, ' ', 'printable', 'buffer', 'buffer_len') + self.variable.emit_get_printable(f, ' ') template = ( '\n' - ' /* The remaining size of the buffer needs to be 0 if we successfully read the TLV */\n' - ' if (buffer_len > 0) {\n' - ' g_warning ("Left \'%u\' bytes unread when getting the \'${name}\' TLV as printable", buffer_len);\n' - ' }\n' - '\n' - ' return g_string_free (printable, FALSE);\n' - ' }\n' + ' if ((offset = __qmi_message_tlv_read_remaining_size (message, init_offset, offset)) > 0)\n' + ' g_string_append_printf (printable, "Additional unexpected \'%" G_GSIZE_FORMAT "\' bytes", offset);\n' '\n' - ' return NULL;\n' + 'out:\n' + ' if (error)\n' + ' g_string_append_printf (printable, " ERROR: %s", error->message);\n' + ' return g_string_free (printable, FALSE);\n' '}\n') f.write(string.Template(template).substitute(translations)) diff --git a/build-aux/qmi-codegen/Variable.py b/build-aux/qmi-codegen/Variable.py index a364399..cc992c6 100644 --- a/build-aux/qmi-codegen/Variable.py +++ b/build-aux/qmi-codegen/Variable.py @@ -73,7 +73,7 @@ class Variable: Emits the code involved in reading the variable from the raw byte stream into the specific private format. """ - def emit_buffer_read(self, f, line_prefix, variable_name, buffer_name, buffer_len): + def emit_buffer_read(self, f, line_prefix, tlv_out, error, variable_name): pass @@ -86,16 +86,9 @@ class 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): - pass - - - """ Emits the code to get the contents of the given variable as a printable string. """ - def emit_get_printable(self, f, line_prefix, printable, buffer_name, buffer_len): + def emit_get_printable(self, f, line_prefix): pass """ diff --git a/build-aux/qmi-codegen/VariableArray.py b/build-aux/qmi-codegen/VariableArray.py index 68284c8..b1c8110 100644 --- a/build-aux/qmi-codegen/VariableArray.py +++ b/build-aux/qmi-codegen/VariableArray.py @@ -132,16 +132,14 @@ class VariableArray(Variable): Reading an array from the raw byte buffer is just about providing a loop to read every array element one by one. """ - def emit_buffer_read(self, f, line_prefix, variable_name, buffer_name, buffer_len): + def emit_buffer_read(self, f, line_prefix, tlv_out, error, variable_name): common_var_prefix = utils.build_underscore_name(self.name) - translations = { 'lp' : line_prefix, - 'private_format' : self.private_format, + translations = { 'lp' : line_prefix, + 'variable_name' : variable_name, + 'private_format' : self.private_format, 'public_array_element_format' : self.array_element.public_format, - 'underscore' : self.clear_func_name(), - 'variable_name' : variable_name, - 'buffer_name' : buffer_name, - 'buffer_len' : buffer_len, - 'common_var_prefix' : common_var_prefix } + 'underscore' : self.clear_func_name(), + 'common_var_prefix' : common_var_prefix } template = ( '${lp}{\n' @@ -169,21 +167,20 @@ class VariableArray(Variable): '\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) + self.array_size_element.emit_buffer_read(f, line_prefix + ' ', tlv_out, error, common_var_prefix + '_n_items') 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) + self.array_size_element.emit_buffer_read(f, line_prefix + ' ', tlv_out, error, common_var_prefix + '_sequence') 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' @@ -205,7 +202,7 @@ class VariableArray(Variable): '\n') f.write(string.Template(template).substitute(translations)) - self.array_element.emit_buffer_read(f, line_prefix + ' ', common_var_prefix + '_aux', buffer_name, buffer_len) + self.array_element.emit_buffer_read(f, line_prefix + ' ', tlv_out, error, common_var_prefix + '_aux') template = ( '${lp} g_array_insert_val (${variable_name}, ${common_var_prefix}_i, ${common_var_prefix}_aux);\n' @@ -215,84 +212,6 @@ class VariableArray(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): - common_var_prefix = utils.build_underscore_name(self.name) - translations = { 'lp' : line_prefix, - 'variable_name' : variable_name, - 'buffer_name' : buffer_name, - 'buffer_len' : buffer_len, - 'common_var_prefix' : common_var_prefix } - - template = ( - '${lp}{\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') - f.write(string.Template(template).substitute(translations)) - else: - translations['array_size_element_format'] = self.array_size_element.public_format - if self.array_size_element.public_format == 'guint8': - translations['array_size_element_size'] = '1' - elif self.array_size_element.public_format == 'guint16': - translations['array_size_element_size'] = '2' - elif self.array_size_element.public_format == 'guint32': - translations['array_size_element_size'] = '4' - else: - raise ValueError('Invalid array size element format in %s array' % (self.name)) - - template = ( - '${lp} ${array_size_element_format} ${common_var_prefix}_n_items;\n' - '${lp} const guint8 *${common_var_prefix}_aux_buffer = &${buffer_name}[${variable_name}];\n' - '${lp} guint16 ${common_var_prefix}_aux_buffer_len;\n' - '\n' - '${lp} ${common_var_prefix}_aux_buffer_len = ((${buffer_len} >= ${variable_name}) ? ${buffer_len} - ${variable_name} : 0);\n' - '${lp} if (${common_var_prefix}_aux_buffer_len < ${array_size_element_size}) {\n' - '${lp} g_warning ("Cannot read the array size: expected \'%u\' bytes, but only got \'%u\' bytes",\n' - '${lp} ${array_size_element_size}, ${common_var_prefix}_aux_buffer_len);\n' - '${lp} return FALSE;\n' - '${lp} }\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)) - - self.array_element.emit_size_read(f, line_prefix + ' ', variable_name, buffer_name, buffer_len) - - template = ( - '${lp} }\n' - '${lp}}\n') - f.write(string.Template(template).substitute(translations)) - - """ Writing an array to the raw byte buffer is just about providing a loop to write every array element one by one. """ @@ -340,12 +259,9 @@ class VariableArray(Variable): The array will be printed as a list of fields enclosed between curly brackets """ - def emit_get_printable(self, f, line_prefix, printable, buffer_name, buffer_len): + def emit_get_printable(self, f, line_prefix): common_var_prefix = utils.build_underscore_name(self.name) - translations = { 'lp' : line_prefix, - 'printable' : printable, - 'buffer_name' : buffer_name, - 'buffer_len' : buffer_len, + translations = { 'lp' : line_prefix, 'common_var_prefix' : common_var_prefix } template = ( @@ -374,34 +290,34 @@ class VariableArray(Variable): '\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) + self.array_size_element.emit_buffer_read(f, line_prefix + ' ', 'out', '&error', common_var_prefix + '_n_items') 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) + self.array_sequence_element.emit_buffer_read(f, line_prefix + ' ', 'out', '&error', common_var_prefix + '_sequence') template = ( '\n' - '${lp} g_string_append_printf (${printable}, "[[Seq:%u]] ", ${common_var_prefix}_sequence);\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' + '${lp} g_string_append (printable, "{");\n' '\n' '${lp} for (${common_var_prefix}_i = 0; ${common_var_prefix}_i < ${common_var_prefix}_n_items; ${common_var_prefix}_i++) {\n' - '${lp} g_string_append_printf (${printable}, " [%u] = \'", ${common_var_prefix}_i);\n') + '${lp} g_string_append_printf (printable, " [%u] = \'", ${common_var_prefix}_i);\n') f.write(string.Template(template).substitute(translations)) - self.array_element.emit_get_printable(f, line_prefix + ' ', printable, buffer_name, buffer_len); + self.array_element.emit_get_printable(f, line_prefix + ' '); template = ( - '${lp} g_string_append (${printable}, " \'");\n' + '${lp} g_string_append (printable, " \'");\n' '${lp} }\n' '\n' - '${lp} g_string_append (${printable}, "}");\n' + '${lp} g_string_append (printable, "}");\n' '${lp}}') f.write(string.Template(template).substitute(translations)) diff --git a/build-aux/qmi-codegen/VariableInteger.py b/build-aux/qmi-codegen/VariableInteger.py index 02d5b80..44a0761 100644 --- a/build-aux/qmi-codegen/VariableInteger.py +++ b/build-aux/qmi-codegen/VariableInteger.py @@ -56,81 +56,41 @@ class VariableInteger(Variable): """ Read a single integer from the raw byte buffer """ - def emit_buffer_read(self, f, line_prefix, variable_name, buffer_name, buffer_len): + def emit_buffer_read(self, f, line_prefix, tlv_out, error, variable_name): translations = { 'lp' : line_prefix, + 'tlv_out' : tlv_out, + 'variable_name' : variable_name, + 'error' : error, 'public_format' : self.public_format, 'private_format' : self.private_format, - 'len' : self.guint_sized_size, - 'variable_name' : variable_name, - 'buffer_name' : buffer_name, - 'buffer_len' : buffer_len, - 'endian' : self.endian } + 'len' : self.guint_sized_size } + + if self.private_format != 'guint8' and self.private_format != 'gint8' and self.private_format != 'gfloat': + translations['endian'] = ' ' + self.endian + ',' + else: + translations['endian'] = '' if self.format == 'guint-sized': template = ( - '${lp}/* Read the ${len}-byte long variable from the buffer */\n' - '${lp}qmi_utils_read_sized_guint_from_buffer (\n' - '${lp} &${buffer_name},\n' - '${lp} &${buffer_len},\n' - '${lp} ${len},\n' - '${lp} ${endian},\n' - '${lp} &(${variable_name}));\n') + '${lp}if (!qmi_message_tlv_read_sized_guint (message, init_offset, &offset, ${len},${endian} &(${variable_name}), ${error}))\n' + '${lp} goto ${tlv_out};\n') elif self.private_format == self.public_format: template = ( - '${lp}/* Read the ${private_format} variable from the buffer */\n' - '${lp}qmi_utils_read_${private_format}_from_buffer (\n' - '${lp} &${buffer_name},\n' - '${lp} &${buffer_len},\n') - if self.private_format != 'guint8' and self.private_format != 'gint8' and self.private_format != 'gfloat': - template += ( - '${lp} ${endian},\n') - template += ( - '${lp} &(${variable_name}));\n') + '${lp}if (!qmi_message_tlv_read_${private_format} (message, init_offset, &offset,${endian} &(${variable_name}), ${error}))\n' + '${lp} goto ${tlv_out};\n') else: template = ( '${lp}{\n' '${lp} ${private_format} tmp;\n' '\n' - '${lp} /* Read the ${private_format} variable from the buffer */\n' - '${lp} qmi_utils_read_${private_format}_from_buffer (\n' - '${lp} &${buffer_name},\n' - '${lp} &${buffer_len},\n') - if self.private_format != 'guint8' and self.private_format != 'gint8': - template += ( - '${lp} ${endian},\n') - template += ( - '${lp} &tmp);\n' + '${lp} if (!qmi_message_tlv_read_${private_format} (message, init_offset, &offset,${endian} &tmp, ${error}))\n' + '${lp} goto ${tlv_out};\n' '${lp} ${variable_name} = (${public_format})tmp;\n' '${lp}}\n') f.write(string.Template(template).substitute(translations)) """ - 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' or self.private_format == 'gfloat': - 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)) - - """ Return the data type size of fixed c-types """ @staticmethod @@ -229,12 +189,14 @@ class VariableInteger(Variable): 'private_format' : self.private_format, 'public_format' : self.public_format, 'len' : self.guint_sized_size, - 'printable' : printable, - 'buffer_name' : buffer_name, - 'buffer_len' : buffer_len, 'common_format' : common_format, - 'common_cast' : common_cast, - 'endian' : self.endian } + 'common_cast' : common_cast } + + if self.private_format != 'guint8' and self.private_format != 'gint8' and self.private_format != 'gfloat': + translations['endian'] = ' ' + self.endian + ',' + else: + translations['endian'] = '' + template = ( '\n' '${lp}{\n' @@ -243,42 +205,28 @@ class VariableInteger(Variable): if self.format == 'guint-sized': template += ( - '${lp} /* Read the ${len}-byte long variable from the buffer */\n' - '${lp} qmi_utils_read_sized_guint_from_buffer (\n' - '${lp} &${buffer_name},\n' - '${lp} &${buffer_len},\n' - '${lp} ${len},\n' - '${lp} ${endian},\n' - '${lp} &tmp);\n' - '\n') + '${lp} if (!qmi_message_tlv_read_sized_guint (message, init_offset, &offset, ${len},${endian} &tmp, &error))\n' + '${lp} goto out;\n') else: template += ( - '${lp} /* Read the ${private_format} variable from the buffer */\n' - '${lp} qmi_utils_read_${private_format}_from_buffer (\n' - '${lp} &${buffer_name},\n' - '${lp} &${buffer_len},\n') - if self.private_format != 'guint8' and self.private_format != 'gint8' and self.private_format != 'gfloat': - template += ( - '${lp} ${endian},\n') - template += ( - '${lp} &tmp);\n' - '\n') + '${lp} if (!qmi_message_tlv_read_${private_format} (message, init_offset, &offset,${endian} &tmp, &error))\n' + '${lp} goto out;\n') if self.public_format == 'gboolean': template += ( - '${lp} g_string_append_printf (${printable}, "%s", tmp ? "yes" : "no");\n') + '${lp} g_string_append_printf (printable, "%s", tmp ? "yes" : "no");\n') elif self.public_format != self.private_format: translations['public_type_underscore'] = utils.build_underscore_name_from_camelcase(self.public_format) translations['public_type_underscore_upper'] = utils.build_underscore_name_from_camelcase(self.public_format).upper() template += ( '#if defined __${public_type_underscore_upper}_IS_ENUM__\n' - '${lp} g_string_append_printf (${printable}, "%s", ${public_type_underscore}_get_string ((${public_format})tmp));\n' + '${lp} g_string_append_printf (printable, "%s", ${public_type_underscore}_get_string ((${public_format})tmp));\n' '#elif defined __${public_type_underscore_upper}_IS_FLAGS__\n' '${lp} {\n' '${lp} gchar *flags_str;\n' '\n' '${lp} flags_str = ${public_type_underscore}_build_string_from_mask ((${public_format})tmp);\n' - '${lp} g_string_append_printf (${printable}, "%s", flags_str);\n' + '${lp} g_string_append_printf (printable, "%s", flags_str);\n' '${lp} g_free (flags_str);\n' '${lp} }\n' '#else\n' @@ -286,7 +234,7 @@ class VariableInteger(Variable): '#endif\n') else: template += ( - '${lp} g_string_append_printf (${printable}, "${common_format}", ${common_cast}tmp);\n') + '${lp} g_string_append_printf (printable, "${common_format}", ${common_cast}tmp);\n') template += ( '${lp}}\n') diff --git a/build-aux/qmi-codegen/VariableSequence.py b/build-aux/qmi-codegen/VariableSequence.py index 03dd2d7..c69a0e6 100644 --- a/build-aux/qmi-codegen/VariableSequence.py +++ b/build-aux/qmi-codegen/VariableSequence.py @@ -75,17 +75,9 @@ class VariableSequence(Variable): Reading the contents of a sequence is just about reading each of the sequence fields one by one. """ - def emit_buffer_read(self, f, line_prefix, variable_name, buffer_name, buffer_len): + def emit_buffer_read(self, f, line_prefix, tlv_out, error, variable_name): for member in self.members: - member['object'].emit_buffer_read(f, line_prefix, variable_name + '_' + member['name'], buffer_name, buffer_len) - - - """ - 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): - for member in self.members: - member['object'].emit_size_read(f, line_prefix, variable_name, buffer_name, buffer_len) + member['object'].emit_buffer_read(f, line_prefix, tlv_out, error, variable_name + '_' + member['name']) """ @@ -101,28 +93,27 @@ class VariableSequence(Variable): The sequence will be printed as a list of fields enclosed between square brackets """ - def emit_get_printable(self, f, line_prefix, printable, buffer_name, buffer_len): - translations = { 'lp' : line_prefix, - 'printable' : printable } + def emit_get_printable(self, f, line_prefix): + translations = { 'lp' : line_prefix } template = ( - '${lp}g_string_append (${printable}, "[");\n') + '${lp}g_string_append (printable, "[");\n') f.write(string.Template(template).substitute(translations)) for member in self.members: translations['variable_name'] = member['name'] template = ( - '${lp}g_string_append (${printable}, " ${variable_name} = \'");\n') + '${lp}g_string_append (printable, " ${variable_name} = \'");\n') f.write(string.Template(template).substitute(translations)) - member['object'].emit_get_printable(f, line_prefix, printable, buffer_name, buffer_len) + member['object'].emit_get_printable(f, line_prefix) template = ( - '${lp}g_string_append (${printable}, "\'");\n') + '${lp}g_string_append (printable, "\'");\n') f.write(string.Template(template).substitute(translations)) template = ( - '${lp}g_string_append (${printable}, " ]");\n') + '${lp}g_string_append (printable, " ]");\n') f.write(string.Template(template).substitute(translations)) diff --git a/build-aux/qmi-codegen/VariableString.py b/build-aux/qmi-codegen/VariableString.py index 44fe50e..355fe4a 100644 --- a/build-aux/qmi-codegen/VariableString.py +++ b/build-aux/qmi-codegen/VariableString.py @@ -75,87 +75,24 @@ class VariableString(Variable): """ Read a string from the raw byte buffer. """ - def emit_buffer_read(self, f, line_prefix, variable_name, buffer_name, buffer_len): - translations = { 'lp' : line_prefix, - 'variable_name' : variable_name, - 'buffer_name' : buffer_name, - 'buffer_len' : buffer_len } + def emit_buffer_read(self, f, line_prefix, tlv_out, error, variable_name): + translations = { 'lp' : line_prefix, + 'tlv_out' : tlv_out, + 'variable_name' : variable_name, + 'error' : error } if self.is_fixed_size: translations['fixed_size'] = self.fixed_size template = ( - '${lp}/* Read the fixed-size string variable from the buffer */\n' - '${lp}qmi_utils_read_fixed_size_string_from_buffer (\n' - '${lp} &${buffer_name},\n' - '${lp} &${buffer_len},\n' - '${lp} ${fixed_size},\n' - '${lp} &${variable_name}[0]);\n' + '${lp}if (!qmi_message_tlv_read_fixed_size_string (message, init_offset, &offset, ${fixed_size}, &${variable_name}[0], ${error}))\n' + '${lp} goto ${tlv_out};\n' '${lp}${variable_name}[${fixed_size}] = \'\\0\';\n') else: - translations['length_prefix_size'] = self.length_prefix_size + translations['n_size_prefix_bytes'] = self.n_size_prefix_bytes translations['max_size'] = self.max_size if self.max_size != '' else '0' template = ( - '${lp}/* Read the string variable from the buffer */\n' - '${lp}qmi_utils_read_string_from_buffer (\n' - '${lp} &${buffer_name},\n' - '${lp} &${buffer_len},\n' - '${lp} ${length_prefix_size},\n' - '${lp} ${max_size},\n' - '${lp} &(${variable_name}));\n') - - f.write(string.Template(template).substitute(translations)) - - - """ - 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, - 'variable_name' : variable_name, - 'buffer_name' : buffer_name, - 'buffer_len' : buffer_len } - - if self.is_fixed_size: - translations['fixed_size'] = self.fixed_size - template = ( - '${lp}${variable_name} += ${fixed_size};\n') - elif self.length_prefix_size == 0: - template = ( - '${lp}${variable_name} += ${buffer_len};\n') - elif self.length_prefix_size == 8: - template = ( - '${lp}{\n' - '${lp} guint8 size8;\n' - '${lp} const guint8 *aux_buffer = &${buffer_name}[${variable_name}];\n' - '${lp} guint16 aux_buffer_len;\n' - '\n' - '${lp} aux_buffer_len = ((${buffer_len} >= ${variable_name}) ? ${buffer_len} - ${variable_name} : 0);\n' - '${lp} if (aux_buffer_len < 1) {\n' - '${lp} g_warning ("Cannot read the string size: expected \'1\' bytes, but only got \'%u\' bytes",\n' - '${lp} aux_buffer_len);\n' - '${lp} return FALSE;\n' - '${lp} }\n' - '\n' - '${lp} qmi_utils_read_guint8_from_buffer (&aux_buffer, &aux_buffer_len, &size8);\n' - '${lp} ${variable_name} += (1 + size8);\n' - '${lp}}\n') - elif self.length_prefix_size == 16: - template = ( - '${lp}{\n' - '${lp} guint16 size16;\n' - '${lp} const guint8 *aux_buffer = &${buffer_name}[${variable_name}];\n' - '${lp} guint16 aux_buffer_len;\n' - '\n' - '${lp} aux_buffer_len = ((${buffer_len} >= ${variable_name}) ? ${buffer_len} - ${variable_name} : 0);\n' - '${lp} if (aux_buffer_len < 2) {\n' - '${lp} g_warning ("Cannot read the string size: expected \'2\' bytes, but only got \'%u\' bytes",\n' - '${lp} aux_buffer_len);\n' - '${lp} return FALSE;\n' - '${lp} }\n' - '\n' - '${lp} qmi_utils_read_guint16_from_buffer (&aux_buffer, &aux_buffer_len, QMI_ENDIAN_LITTLE, &size16);\n' - '${lp} ${variable_name} += (2 + size16);\n' - '${lp}}\n') + '${lp}if (!qmi_message_tlv_read_string (message, init_offset, &offset, ${n_size_prefix_bytes}, ${max_size}, &(${variable_name}), ${error}))\n' + '${lp} goto ${tlv_out};\n') f.write(string.Template(template).substitute(translations)) @@ -181,47 +118,31 @@ class VariableString(Variable): """ Get the string as printable """ - def emit_get_printable(self, f, line_prefix, printable, buffer_name, buffer_len): - translations = { 'lp' : line_prefix, - 'printable' : printable, - 'buffer_name' : buffer_name, - 'buffer_len' : buffer_len } + def emit_get_printable(self, f, line_prefix): + translations = { 'lp' : line_prefix } if self.is_fixed_size: translations['fixed_size'] = self.fixed_size - translations['fixed_size_plus_one'] = int(self.fixed_size) + 1 template = ( '\n' '${lp}{\n' - '${lp} gchar tmp[${fixed_size_plus_one}];\n' - '\n' - '${lp} /* Read the fixed-size string variable from the buffer */\n' - '${lp} qmi_utils_read_fixed_size_string_from_buffer (\n' - '${lp} &${buffer_name},\n' - '${lp} &${buffer_len},\n' - '${lp} ${fixed_size},\n' - '${lp} &tmp[0]);\n' - '${lp} tmp[${fixed_size}] = \'\\0\';\n' + '${lp} gchar tmp[${fixed_size}];\n' '\n' - '${lp} g_string_append_printf (${printable}, "%s", tmp);\n' + '${lp} if (!qmi_message_tlv_read_fixed_size_string (message, init_offset, &offset, ${fixed_size}, &tmp[0], &error))\n' + '${lp} goto out;\n' + '${lp} g_string_append_len (printable, tmp, ${fixed_size});\n' '${lp}}\n') else: - translations['length_prefix_size'] = self.length_prefix_size + translations['n_size_prefix_bytes'] = self.n_size_prefix_bytes translations['max_size'] = self.max_size if self.max_size != '' else '0' template = ( '\n' '${lp}{\n' '${lp} gchar *tmp;\n' '\n' - '${lp} /* Read the string variable from the buffer */\n' - '${lp} qmi_utils_read_string_from_buffer (\n' - '${lp} &${buffer_name},\n' - '${lp} &${buffer_len},\n' - '${lp} ${length_prefix_size},\n' - '${lp} ${max_size},\n' - '${lp} &tmp);\n' - '\n' - '${lp} g_string_append_printf (${printable}, "%s", tmp);\n' + '${lp} if (!qmi_message_tlv_read_string (message, init_offset, &offset, ${n_size_prefix_bytes}, ${max_size}, &tmp, &error))\n' + '${lp} goto out;\n' + '${lp} g_string_append (printable, tmp);\n' '${lp} g_free (tmp);\n' '${lp}}\n') diff --git a/build-aux/qmi-codegen/VariableStruct.py b/build-aux/qmi-codegen/VariableStruct.py index 1e96e5d..b19b4c6 100644 --- a/build-aux/qmi-codegen/VariableStruct.py +++ b/build-aux/qmi-codegen/VariableStruct.py @@ -104,17 +104,9 @@ class VariableStruct(Variable): Reading the contents of a struct is just about reading each of the struct fields one by one. """ - def emit_buffer_read(self, f, line_prefix, variable_name, buffer_name, buffer_len): + def emit_buffer_read(self, f, line_prefix, tlv_out, error, variable_name): for member in self.members: - member['object'].emit_buffer_read(f, line_prefix, variable_name + '.' + member['name'], buffer_name, buffer_len) - - - """ - 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): - for member in self.members: - member['object'].emit_size_read(f, line_prefix, variable_name, buffer_name, buffer_len) + member['object'].emit_buffer_read(f, line_prefix, tlv_out, error, variable_name + '.' + member['name']) """ @@ -130,28 +122,27 @@ class VariableStruct(Variable): The struct will be printed as a list of fields enclosed between square brackets """ - def emit_get_printable(self, f, line_prefix, printable, buffer_name, buffer_len): - translations = { 'lp' : line_prefix, - 'printable' : printable } + def emit_get_printable(self, f, line_prefix): + translations = { 'lp' : line_prefix } template = ( - '${lp}g_string_append (${printable}, "[");\n') + '${lp}g_string_append (printable, "[");\n') f.write(string.Template(template).substitute(translations)) for member in self.members: translations['variable_name'] = member['name'] template = ( - '${lp}g_string_append (${printable}, " ${variable_name} = \'");\n') + '${lp}g_string_append (printable, " ${variable_name} = \'");\n') f.write(string.Template(template).substitute(translations)) - member['object'].emit_get_printable(f, line_prefix, printable, buffer_name, buffer_len) + member['object'].emit_get_printable(f, line_prefix) template = ( - '${lp}g_string_append (${printable}, "\'");\n') + '${lp}g_string_append (printable, "\'");\n') f.write(string.Template(template).substitute(translations)) template = ( - '${lp}g_string_append (${printable}, " ]");\n') + '${lp}g_string_append (printable, " ]");\n') f.write(string.Template(template).substitute(translations)) |