diff options
author | Dan Williams <dcbw@redhat.com> | 2012-08-31 15:04:00 -0500 |
---|---|---|
committer | Aleksander Morgado <aleksander@lanedo.com> | 2012-09-08 10:34:13 +0200 |
commit | e7a72f26b60d05face81dd07f244bc01fbac50ee (patch) | |
tree | 8abe49a53e4a7128646f09d25499dcb507fc0d33 | |
parent | af5966923ff3631686e2b1da9948c0e9430eeff3 (diff) |
qmi-codegen: handle variable-sized string length prefix fields
Most string lengths are UINT8, but some (WDS Get Current Settings
PCSCF Domain Name List, for example) are UINT16.
-rw-r--r-- | build-aux/qmi-codegen/VariableString.py | 24 | ||||
-rw-r--r-- | libqmi-glib/qmi-utils.c | 47 | ||||
-rw-r--r-- | libqmi-glib/qmi-utils.h | 4 |
3 files changed, 54 insertions, 21 deletions
diff --git a/build-aux/qmi-codegen/VariableString.py b/build-aux/qmi-codegen/VariableString.py index 02f827b..5be84e2 100644 --- a/build-aux/qmi-codegen/VariableString.py +++ b/build-aux/qmi-codegen/VariableString.py @@ -42,7 +42,7 @@ class VariableString(Variable): self.is_fixed_size = True # Fixed-size strings self.needs_dispose = False - self.length_prefix = False + self.length_prefix_size = 0 self.fixed_size = dictionary['fixed-size'] self.max_size = '' else: @@ -51,7 +51,15 @@ class VariableString(Variable): self.needs_dispose = True # Strings which are given as the full value of a TLV will NOT have a # length prefix - self.length_prefix = False if 'type' in dictionary and dictionary['type'] == 'TLV' else True + if 'type' in dictionary and dictionary['type'] == 'TLV': + self.length_prefix_size = 0 + elif 'length-prefix-size' in dictionary: + self.length_prefix_size = dictionary['length-prefix-size'] + if self.length_prefix_size not in ['8', '16']: + raise ValueError('Invalid length prefix size %s: not 8 or 16' % self.length_prefix_size) + else: + # Default to UINT8 + self.length_prefix_size = 8 self.fixed_size = '' self.max_size = dictionary['max-size'] if 'max-size' in dictionary else '' @@ -76,14 +84,14 @@ class VariableString(Variable): '${lp} &${variable_name}[0]);\n' '${lp}${variable_name}[${fixed_size}] = \'\\0\';\n') else: - translations['length_prefix'] = 'TRUE' if self.length_prefix else 'FALSE' + translations['length_prefix_size'] = self.length_prefix_size 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},\n' + '${lp} ${length_prefix_size},\n' '${lp} ${max_size},\n' '${lp} &(${variable_name}));\n') @@ -109,13 +117,13 @@ class VariableString(Variable): '${lp} ${fixed_size},\n' '${lp} ${variable_name});\n') else: - translations['length_prefix'] = 'TRUE' if self.length_prefix else 'FALSE' + translations['length_prefix_size'] = self.length_prefix_size template = ( '${lp}/* Write the string variable to the buffer */\n' '${lp}qmi_utils_write_string_to_buffer (\n' '${lp} &${buffer_name},\n' '${lp} &${buffer_len},\n' - '${lp} ${length_prefix},\n' + '${lp} ${length_prefix_size},\n' '${lp} ${variable_name});\n') f.write(string.Template(template).substitute(translations)) @@ -149,7 +157,7 @@ class VariableString(Variable): '${lp} g_string_append_printf (${printable}, "%s", tmp);\n' '${lp}}\n') else: - translations['length_prefix'] = 'TRUE' if self.length_prefix else 'FALSE' + translations['length_prefix_size'] = self.length_prefix_size translations['max_size'] = self.max_size if self.max_size != '' else '0' template = ( '\n' @@ -160,7 +168,7 @@ class VariableString(Variable): '${lp} qmi_utils_read_string_from_buffer (\n' '${lp} &${buffer_name},\n' '${lp} &${buffer_len},\n' - '${lp} ${length_prefix},\n' + '${lp} ${length_prefix_size},\n' '${lp} ${max_size},\n' '${lp} &tmp);\n' '\n' diff --git a/libqmi-glib/qmi-utils.c b/libqmi-glib/qmi-utils.c index 8eba462..4f0b292 100644 --- a/libqmi-glib/qmi-utils.c +++ b/libqmi-glib/qmi-utils.c @@ -360,26 +360,37 @@ qmi_utils_write_sized_guint_to_buffer (guint8 **buffer, void qmi_utils_read_string_from_buffer (guint8 **buffer, guint16 *buffer_size, - gboolean length_prefix, + guint8 length_prefix_size, guint16 max_size, gchar **out) { guint16 string_length; guint16 valid_string_length; + guint8 string_length_8; + guint16 string_length_16; g_assert (out != NULL); g_assert (buffer != NULL); g_assert (buffer_size != NULL); + g_assert (length_prefix_size == 0 || + length_prefix_size == 8 || + length_prefix_size == 16); - /* If no length prefix given, read the whole buffer into a string */ - if (!length_prefix) + switch (length_prefix_size) { + case 0: + /* If no length prefix given, read the whole buffer into a string */ string_length = *buffer_size; - else { - /* We assume the length prefix is always a guint8 */ - guint8 string_length_8; - + break; + case 8: qmi_utils_read_guint8_from_buffer (buffer, buffer_size, &string_length_8); string_length = string_length_8; + break; + case 16: + qmi_utils_read_guint16_from_buffer (buffer, buffer_size, &string_length_16); + string_length = string_length_16; + break; + default: + g_assert_not_reached (); } if (max_size > 0 && string_length > max_size) @@ -417,23 +428,37 @@ qmi_utils_read_fixed_size_string_from_buffer (guint8 **buffer, void qmi_utils_write_string_to_buffer (guint8 **buffer, guint16 *buffer_size, - gboolean length_prefix, + guint8 length_prefix_size, const gchar *in) { guint16 len; + guint8 len_8; + guint16 len_16; g_assert (in != NULL); g_assert (buffer != NULL); g_assert (buffer_size != NULL); + g_assert (length_prefix_size == 0 || + length_prefix_size == 8 || + length_prefix_size == 16); len = (guint16) strlen (in); - if (length_prefix) { - guint8 len_8; - + switch (length_prefix_size) { + case 0: + break; + case 8: g_warn_if_fail (len <= G_MAXUINT8); len_8 = (guint8)len; qmi_utils_write_guint8_to_buffer (buffer, buffer_size, &len_8); + break; + case 16: + g_warn_if_fail (len <= G_MAXUINT16); + len_16 = (guint16)len; + qmi_utils_write_guint16_to_buffer (buffer, buffer_size, &len_16); + break; + default: + g_assert_not_reached (); } memcpy (*buffer, in, len); diff --git a/libqmi-glib/qmi-utils.h b/libqmi-glib/qmi-utils.h index 6034b64..1e7671f 100644 --- a/libqmi-glib/qmi-utils.h +++ b/libqmi-glib/qmi-utils.h @@ -106,12 +106,12 @@ void qmi_utils_write_sized_guint_to_buffer (guint8 **buffer, void qmi_utils_read_string_from_buffer (guint8 **buffer, guint16 *buffer_size, - gboolean length_prefix, + guint8 length_prefix_size, guint16 max_size, gchar **out); void qmi_utils_write_string_to_buffer (guint8 **buffer, guint16 *buffer_size, - gboolean length_prefix, + guint8 length_prefix_size, const gchar *in); void qmi_utils_read_fixed_size_string_from_buffer (guint8 **buffer, |