diff options
Diffstat (limited to 'build-aux/mbim-codegen/Struct.py')
-rw-r--r-- | build-aux/mbim-codegen/Struct.py | 132 |
1 files changed, 131 insertions, 1 deletions
diff --git a/build-aux/mbim-codegen/Struct.py b/build-aux/mbim-codegen/Struct.py index ed68e27..7e874d0 100644 --- a/build-aux/mbim-codegen/Struct.py +++ b/build-aux/mbim-codegen/Struct.py @@ -14,7 +14,7 @@ # with this program; if not, write to the Free Software Foundation, Inc., 51 # Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # -# Copyright (C) 2013 - 2014 Aleksander Morgado <aleksander@aleksander.es> +# Copyright (C) 2013 - 2018 Aleksander Morgado <aleksander@aleksander.es> # import string @@ -268,6 +268,134 @@ class Struct: '}\n') cfile.write(string.Template(template).substitute(translations)) + """ + Emit the type's print methods + """ + def _emit_print(self, cfile): + translations = { 'name' : self.name, + 'name_underscore' : utils.build_underscore_name_from_camelcase(self.name), + 'struct_size' : self.size } + + template = ( + '\n' + 'static gchar *\n' + '_mbim_message_print_${name_underscore}_struct (\n' + ' const ${name} *self,\n' + ' const gchar *line_prefix)\n' + '{\n' + ' GString *str;\n' + '\n' + ' str = g_string_new ("");\n' + '\n') + + for field in self.contents: + translations['field_name'] = field['name'] + translations['field_name_underscore'] = utils.build_underscore_name_from_camelcase(field['name']) + + inner_template = ( + ' g_string_append_printf (str, "%s ${field_name} = ", line_prefix);\n' + ' {\n') + + if field['format'] == 'uuid': + inner_template += ( + ' gchar *tmpstr;\n' + '\n' + ' tmpstr = mbim_uuid_get_printable (&(self->${field_name_underscore}));\n' + ' g_string_append_printf (str, "\'%s\'", tmpstr);\n' + ' g_free (tmpstr);\n') + + elif field['format'] in ['byte-array', 'ref-byte-array', 'ref-byte-array-no-offset', 'unsized-byte-array']: + inner_template += ( + ' guint i;\n' + ' guint array_size;\n' + '\n') + + if field['format'] == 'byte-array': + translations['array_size'] = field['array-size'] + inner_template += ( + ' array_size = ${array_size};\n') + elif 'array-size-field' in field: + translations['array_size_field_name_underscore'] = utils.build_underscore_name_from_camelcase(field['array-size-field']) + inner_template += ( + ' array_size = self->${array_size_field_name_underscore};\n') + else: + inner_template += ( + ' array_size = self->${field_name_underscore}_size;\n') + + inner_template += ( + ' g_string_append (str, "\'");\n' + ' for (i = 0; i < array_size; i++)\n' + ' g_string_append_printf (str, "%02x%s", self->${field_name_underscore}[i], (i == (array_size - 1)) ? "" : ":" );\n' + ' g_string_append (str, "\'");\n') + + elif field['format'] == 'guint32': + inner_template += ( + ' g_string_append_printf (str, "\'%" G_GUINT32_FORMAT "\'", self->${field_name_underscore});\n') + + elif field['format'] == 'guint64': + inner_template += ( + ' g_string_append_printf (str, "\'%" G_GUINT64_FORMAT "\'", self->${field_name_underscore});\n') + + elif field['format'] == 'guint32-array': + translations['array_size_field_name_underscore'] = utils.build_underscore_name_from_camelcase(field['array-size-field']) + inner_template += ( + ' guint i;\n' + '\n' + ' g_string_append (str, "\'");\n' + ' for (i = 0; i < self->${array_size_field_name_underscore}; i++)\n' + ' g_string_append_printf (str, "%" G_GUINT32_FORMAT "%s", self->${field_name_underscore}[i], (i == (self->${array_size_field_name_underscore} - 1)) ? "" : "," );\n' + ' g_string_append (str, "\'");\n') + + elif field['format'] == 'string': + inner_template += ( + ' g_string_append_printf (str, "\'%s\'", self->${field_name_underscore});\n') + + elif field['format'] == 'string-array': + translations['array_size_field_name_underscore'] = utils.build_underscore_name_from_camelcase(field['array-size-field']) + inner_template += ( + ' guint i;\n' + '\n' + ' g_string_append (str, "\'");\n' + ' for (i = 0; i < self->${array_size_field_name_underscore}; i++)\n' + ' g_string_append_printf (str, "%s%s", self->${field_name_underscore}[i], (i == (self->${array_size_field_name_underscore} - 1)) ? "" : "," );\n' + ' g_string_append (str, "\'");\n') + + elif field['format'] == 'ipv4' or \ + field['format'] == 'ref-ipv4' or \ + field['format'] == 'ipv6' or \ + field['format'] == 'ref-ipv6': + inner_template += ( + ' GInetAddress *addr;\n' + ' gchar *tmpstr;\n' + '\n') + + if field['format'] == 'ipv4' or \ + field['format'] == 'ref-ipv4': + inner_template += ( + ' addr = g_inet_address_new_from_bytes ((guint8 *)&(self->${field_name_underscore}.addr), G_SOCKET_FAMILY_IPV4);\n') + elif field['format'] == 'ipv6' or \ + field['format'] == 'ref-ipv6': + inner_template += ( + ' addr = g_inet_address_new_from_bytes ((guint8 *)&(self->${field_name_underscore}.addr), G_SOCKET_FAMILY_IPV6);\n') + + inner_template += ( + ' tmpstr = g_inet_address_to_string (addr);\n' + ' g_string_append_printf (str, "\'%s\'", tmpstr);\n' + ' g_free (tmpstr);\n' + ' g_object_unref (addr);\n') + + else: + raise ValueError('Cannot handle format \'%s\' in struct' % field['format']) + + inner_template += ( + ' }\n' + ' g_string_append (str, "\\n");\n') + template += (string.Template(inner_template).substitute(translations)) + + template += ( + ' return g_string_free (str, FALSE);\n' + '}\n') + cfile.write(string.Template(template).substitute(translations)) """ Emit the type's read methods @@ -634,6 +762,8 @@ class Struct: self._emit_free(hfile, cfile) # Emit type's read self._emit_read(cfile) + # Emit type's print + self._emit_print(cfile) # Emit type's append self._emit_append(cfile) |