summaryrefslogtreecommitdiff
path: root/build-aux/mbim-codegen/Struct.py
diff options
context:
space:
mode:
Diffstat (limited to 'build-aux/mbim-codegen/Struct.py')
-rw-r--r--build-aux/mbim-codegen/Struct.py132
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)