summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Williams <dcbw@redhat.com>2012-08-31 15:04:00 -0500
committerAleksander Morgado <aleksander@lanedo.com>2012-09-08 10:34:13 +0200
commite7a72f26b60d05face81dd07f244bc01fbac50ee (patch)
tree8abe49a53e4a7128646f09d25499dcb507fc0d33
parentaf5966923ff3631686e2b1da9948c0e9430eeff3 (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.py24
-rw-r--r--libqmi-glib/qmi-utils.c47
-rw-r--r--libqmi-glib/qmi-utils.h4
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,