def clear_func_name(self): # element public format might be a base type like 'gchar *' rather # than a structure name like QmiFooBar elt_name = self.array_element.public_format.replace('*', 'pointer') return utils.build_underscore_name(self.name) + \ '_' + \ utils.build_underscore_name_from_camelcase(utils.build_camelcase_name(elt_name))
def emit_section_content(self, sfile): translations = { 'struct_name' : self.name, 'name_underscore' : utils.build_underscore_name_from_camelcase(self.name) } template = ( '<SUBSECTION ${struct_name}>\n' '${struct_name}\n') if self.single_member == True: template += ( '${name_underscore}_free\n') if self.array_member == True: template += ( '${name_underscore}_array_free\n') sfile.write(string.Template(template).substitute(translations))
def _emit_read(self, cfile): translations = { 'name' : self.name, 'name_underscore' : utils.build_underscore_name_from_camelcase(self.name), 'struct_size' : self.size } template = ( '\n' 'static ${name} *\n' '_mbim_message_read_${name_underscore}_struct (\n' ' const MbimMessage *self,\n' ' guint32 relative_offset,\n' ' guint32 *bytes_read,\n' ' GError **error)\n' '{\n' ' gboolean success = FALSE;\n' ' ${name} *out;\n' ' guint32 offset = relative_offset;\n' '\n' ' g_assert (self != NULL);\n' '\n' ' out = g_new0 (${name}, 1);\n') for field in self.contents: translations['field_name_underscore'] = utils.build_underscore_name_from_camelcase(field['name']) inner_template = '' if field['format'] == 'uuid': inner_template += ( '\n' ' {\n' ' const MbimUuid *tmp;\n' '\n' ' if (!_mbim_message_read_uuid (self, offset, &tmp, error))\n' ' goto out;\n' ' memcpy (&(out->${field_name_underscore}), tmp, 16);\n' ' offset += 16;\n' ' }\n') elif field['format'] in ['ref-byte-array', 'ref-byte-array-no-offset']: translations['has_offset'] = 'TRUE' if field['format'] == 'ref-byte-array' else 'FALSE' if 'array-size-field' in field: translations['array_size_field_name_underscore'] = utils.build_underscore_name_from_camelcase(field['array-size-field']) inner_template += ( '\n' ' {\n' ' const guint8 *tmp;\n' '\n' ' if (!_mbim_message_read_byte_array (self, relative_offset, offset, ${has_offset}, FALSE, out->${array_size_field_name_underscore}, &tmp, NULL, error))\n' ' goto out;\n' ' out->${field_name_underscore} = g_malloc (out->${array_size_field_name_underscore});\n' ' memcpy (out->${field_name_underscore}, tmp, out->${array_size_field_name_underscore});\n' ' offset += 4;\n' ' }\n') else: inner_template += ( '\n' ' {\n' ' const guint8 *tmp;\n' '\n' ' if (!_mbim_message_read_byte_array (self, relative_offset, offset, ${has_offset}, TRUE, 0, &tmp, &(out->${field_name_underscore}_size), error))\n' ' goto out;\n' ' out->${field_name_underscore} = g_malloc (out->${field_name_underscore}_size);\n' ' memcpy (out->${field_name_underscore}, tmp, out->${field_name_underscore}_size);\n' ' offset += 8;\n' ' }\n') elif field['format'] == 'unsized-byte-array': inner_template += ( '\n' ' {\n' ' const guint8 *tmp;\n' '\n' ' if (!_mbim_message_read_byte_array (self, relative_offset, offset, FALSE, FALSE, 0, &tmp, &(out->${field_name_underscore}_size), error))\n' ' goto out;\n' ' out->${field_name_underscore} = g_malloc (out->${field_name_underscore}_size);\n' ' memcpy (out->${field_name_underscore}, tmp, out->${field_name_underscore}_size);\n' ' /* no offset update expected, this should be the last field */\n' ' }\n') elif field['format'] == 'byte-array': translations['array_size'] = field['array-size'] inner_template += ( '\n' ' {\n' ' const guint8 *tmp;\n' '\n' ' if (!_mbim_message_read_byte_array (self, relative_offset, offset, FALSE, FALSE, ${array_size}, &tmp, NULL, error))\n' ' goto out;\n' ' memcpy (out->${field_name_underscore}, tmp, ${array_size});\n' ' offset += ${array_size};\n' ' }\n') elif field['format'] == 'guint32': inner_template += ( '\n' ' if (!_mbim_message_read_guint32 (self, offset, &out->${field_name_underscore}, error))\n' ' goto out;\n' ' offset += 4;\n') elif field['format'] == 'guint32-array': translations['array_size_field_name_underscore'] = utils.build_underscore_name_from_camelcase(field['array-size-field']) inner_template += ( '\n' ' if (!_mbim_message_read_guint32_array (self, out->${array_size_field_name_underscore}, offset, &out->${field_name_underscore}, error))\n' ' goto out;\n' ' offset += (4 * out->${array_size_field_name_underscore});\n') elif field['format'] == 'guint64': inner_template += ( '\n' ' if (!_mbim_message_read_guint64 (self, offset, &out->${field_name_underscore}, error))\n' ' goto out;\n' ' offset += 8;\n') elif field['format'] == 'string': inner_template += ( '\n' ' if (!_mbim_message_read_string (self, relative_offset, offset, &out->${field_name_underscore}, error))\n' ' goto out;\n' ' offset += 8;\n') elif field['format'] == 'string-array': translations['array_size_field_name_underscore'] = utils.build_underscore_name_from_camelcase(field['array-size-field']) inner_template += ( '\n' ' if (!_mbim_message_read_string_array (self, out->${array_size_field_name_underscore}, relative_offset, offset, &out->${field_name_underscore}, error))\n' ' goto out;\n' ' offset += (8 * out->${array_size_field_name_underscore});\n') elif field['format'] == 'ipv4': inner_template += ( '\n' ' {\n' ' const MbimIPv4 *tmp;\n' '\n' ' if (!_mbim_message_read_ipv4 (self, offset, FALSE, &tmp, error))\n' ' goto out;\n' ' memcpy (&(out->${field_name_underscore}), tmp, 4);\n' ' offset += 4;\n' ' }\n') elif field['format'] == 'ref-ipv4': inner_template += ( '\n' ' {\n' ' const MbimIPv4 *tmp;\n' '\n' ' if (!_mbim_message_read_ipv4 (self, offset, TRUE, &tmp, error))\n' ' goto out;\n' ' memcpy (&(out->${field_name_underscore}), tmp, 4);\n' ' offset += 4;\n' ' }\n') elif field['format'] == 'ipv6': inner_template += ( '\n' ' {\n' ' const MbimIPv6 *tmp;\n' '\n' ' if (!_mbim_message_read_ipv6 (self, offset, FALSE, &tmp, error))\n' ' goto out;\n' ' memcpy (&(out->${field_name_underscore}), tmp, 16);\n' ' offset += 16;\n' ' }\n') elif field['format'] == 'ref-ipv6': inner_template += ( '\n' ' {\n' ' const MbimIPv6 *tmp;\n' '\n' ' if (!_mbim_message_read_ipv6 (self, offset, FALSE, &tmp, error))\n' ' goto out;\n' ' memcpy (&(out->${field_name_underscore}), tmp, 16);\n' ' offset += 4;\n' ' }\n') else: raise ValueError('Cannot handle format \'%s\' in struct' % field['format']) template += string.Template(inner_template).substitute(translations) template += ( '\n' ' success = TRUE;\n' '\n' ' out:\n' ' if (success) {\n' ' if (bytes_read)\n' ' *bytes_read = (offset - relative_offset);\n' ' return out;\n' ' }\n' '\n') for field in self.contents: translations['field_name_underscore'] = utils.build_underscore_name_from_camelcase(field['name']) inner_template = '' if field['format'] in ['ref-byte-array', 'ref-byte-array-no-offset', 'unsized-byte-array', 'byte-array', 'string']: inner_template = (' g_free (out->${field_name_underscore});\n') elif field['format'] == 'string-array': inner_template = (' g_strfreev (out->${field_name_underscore});\n') template += string.Template(inner_template).substitute(translations) template += ( ' g_free (out);\n' ' return NULL;\n' '}\n') cfile.write(string.Template(template).substitute(translations)) if self.array_member: template = ( '\n' 'static gboolean\n' '_mbim_message_read_${name_underscore}_struct_array (\n' ' const MbimMessage *self,\n' ' guint32 array_size,\n' ' guint32 relative_offset_array_start,\n' ' gboolean refs,\n' ' ${name} ***out_array,\n' ' GError **error)\n' '{\n' ' GError *inner_error = NULL;\n' ' ${name} **out;\n' ' guint32 i;\n' ' guint32 offset;\n' '\n' ' if (!array_size) {\n' ' *out_array = NULL;\n' ' return TRUE;\n' ' }\n' '\n' ' out = g_new0 (${name} *, array_size + 1);\n' '\n' ' if (!refs) {\n' ' _mbim_message_read_guint32 (self, relative_offset_array_start, &offset, &inner_error);\n' ' for (i = 0; !inner_error && (i < array_size); i++, offset += ${struct_size})\n' ' out[i] = _mbim_message_read_${name_underscore}_struct (self, offset, NULL, &inner_error);\n' ' } else {\n' ' offset = relative_offset_array_start;\n' ' for (i = 0; !inner_error && (i < array_size); i++, offset += 8) {\n' ' guint32 tmp_offset;\n' '\n' ' if (_mbim_message_read_guint32 (self, offset, &tmp_offset, &inner_error))\n' ' out[i] = _mbim_message_read_${name_underscore}_struct (self, tmp_offset, NULL, &inner_error);\n' ' }\n' ' }\n' '\n' ' if (!inner_error) {\n' ' *out_array = out;\n' ' return TRUE;\n' ' }\n' '\n' ' ${name_underscore}_array_free (out);\n' ' g_propagate_error (error, inner_error);\n' ' return FALSE;\n' '}\n') cfile.write(string.Template(template).substitute(translations))
def _emit_message_parser(self, hfile, cfile, message_type, fields): translations = { 'name' : self.name, 'service' : self.service, 'underscore' : utils.build_underscore_name (self.fullname), 'message_type' : message_type, 'message_type_upper' : message_type.upper(), 'service_underscore_upper' : utils.build_underscore_name (self.service).upper() } template = ( '\n' 'gboolean ${underscore}_${message_type}_parse (\n' ' const MbimMessage *message,\n') for field in fields: translations['field'] = utils.build_underscore_name_from_camelcase(field['name']) translations['public'] = field['public-format'] if 'public-format' in field else field['format'] translations['struct'] = field['struct-type'] if 'struct-type' in field else '' if field['format'] == 'byte-array': inner_template = (' const guint8 **${field},\n') elif field['format'] == 'unsized-byte-array' or field['format'] == 'ref-byte-array': inner_template = (' guint32 *${field}_size,\n' ' const guint8 **${field},\n') elif field['format'] == 'uuid': inner_template = (' const MbimUuid **${field},\n') elif field['format'] == 'guint32': inner_template = (' ${public} *${field},\n') elif field['format'] == 'guint32-array': inner_template = (' ${public} **${field},\n') elif field['format'] == 'guint64': inner_template = (' ${public} *${field},\n') elif field['format'] == 'guint64-array': inner_template = (' ${public} **${field},\n') elif field['format'] == 'string': inner_template = (' gchar **${field},\n') elif field['format'] == 'string-array': inner_template = (' gchar ***${field},\n') elif field['format'] == 'struct': inner_template = (' ${struct} **${field},\n') elif field['format'] == 'struct-array': inner_template = (' ${struct} ***${field},\n') elif field['format'] == 'ref-struct-array': inner_template = (' ${struct} ***${field},\n') elif field['format'] == 'ipv4': inner_template = (' const MbimIPv4 **${field},\n') elif field['format'] == 'ref-ipv4': inner_template = (' const MbimIPv4 **${field},\n') elif field['format'] == 'ipv4-array': inner_template = (' MbimIPv4 **${field},\n') elif field['format'] == 'ipv6': inner_template = (' const MbimIPv6 **${field},\n') elif field['format'] == 'ref-ipv6': inner_template = (' const MbimIPv6 **${field},\n') elif field['format'] == 'ipv6-array': inner_template = (' MbimIPv6 **${field},\n') else: raise ValueError('Cannot handle field type \'%s\'' % field['format']) template += (string.Template(inner_template).substitute(translations)) template += ( ' GError **error);\n') hfile.write(string.Template(template).substitute(translations)) template = ( '\n' '/**\n' ' * ${underscore}_${message_type}_parse:\n' ' * @message: the #MbimMessage.\n') for field in fields: translations['field'] = utils.build_underscore_name_from_camelcase(field['name']) translations['name'] = field['name'] translations['public'] = field['public-format'] if 'public-format' in field else field['format'] translations['struct'] = field['struct-type'] if 'struct-type' in field else '' translations['struct_underscore'] = utils.build_underscore_name_from_camelcase (translations['struct']) translations['array_size'] = field['array-size'] if 'array-size' in field else '' if field['format'] == 'byte-array': inner_template = (' * @${field}: return location for an array of ${array_size} #guint8 values. Do not free the returned value, it is owned by @message.\n') elif field['format'] == 'unsized-byte-array' or field['format'] == 'ref-byte-array': inner_template = (' * @${field}_size: return location for the size of the ${field} array.\n' ' * @${field}: return location for an array of #guint8 values. Do not free the returned value, it is owned by @message.\n') elif field['format'] == 'uuid': inner_template = (' * @${field}: return location for a #MbimUuid, or %NULL if the \'${name}\' field is not needed. Do not free the returned value, it is owned by @message.\n') elif field['format'] == 'guint32': inner_template = (' * @${field}: return location for a #${public}, or %NULL if the \'${name}\' field is not needed.\n') elif field['format'] == 'guint32-array': inner_template = (' * @${field}: return location for a newly allocated array of #${public}s, or %NULL if the \'${name}\' field is not needed. Free the returned value with g_free().\n') elif field['format'] == 'guint64': inner_template = (' * @${field}: return location for a #guint64, or %NULL if the \'${name}\' field is not needed.\n') elif field['format'] == 'guint64-array': inner_template = (' * @${field}: return location for a newly allocated array of #guint64s, or %NULL if the \'${name}\' field is not needed. Free the returned value with g_free().\n') elif field['format'] == 'string': inner_template = (' * @${field}: return location for a newly allocated string, or %NULL if the \'${name}\' field is not needed. Free the returned value with g_free().\n') elif field['format'] == 'string-array': inner_template = (' * @${field}: return location for a newly allocated array of strings, or %NULL if the \'${name}\' field is not needed. Free the returned value with g_strfreev().\n') elif field['format'] == 'struct': inner_template = (' * @${field}: return location for a newly allocated #${struct}, or %NULL if the \'${name}\' field is not needed. Free the returned value with ${struct_underscore}_free().\n') elif field['format'] == 'struct-array': inner_template = (' * @${field}: return location for a newly allocated array of #${struct}s, or %NULL if the \'${name}\' field is not needed. Free the returned value with ${struct_underscore}_array_free().\n') elif field['format'] == 'ref-struct-array': inner_template = (' * @${field}: return location for a newly allocated array of #${struct}s, or %NULL if the \'${name}\' field is not needed. Free the returned value with ${struct_underscore}_array_free().\n') elif field['format'] == 'ipv4': inner_template = (' * @${field}: return location for a #MbimIPv4, or %NULL if the \'${name}\' field is not needed. Do not free the returned value, it is owned by @message.\n') elif field['format'] == 'ref-ipv4': inner_template = (' * @${field}: return location for a #MbimIPv4, or %NULL if the \'${name}\' field is not needed. Do not free the returned value, it is owned by @message.\n') elif field['format'] == 'ipv4-array': inner_template = (' * @${field}: return location for a newly allocated array of #MbimIPv4s, or %NULL if the \'${name}\' field is not needed. Free the returned value with g_free().\n') elif field['format'] == 'ipv6': inner_template = (' * @${field}: return location for a #MbimIPv6, or %NULL if the \'${name}\' field is not needed. Do not free the returned value, it is owned by @message.\n') elif field['format'] == 'ref-ipv6': inner_template = (' * @${field}: return location for a #MbimIPv6, or %NULL if the \'${name}\' field is not needed. Do not free the returned value, it is owned by @message.\n') elif field['format'] == 'ipv6-array': inner_template = (' * @${field}: return location for a newly allocated array of #MbimIPv6s, or %NULL if the \'${name}\' field is not needed. Free the returned value with g_free().\n') template += (string.Template(inner_template).substitute(translations)) template += ( ' * @error: return location for error or %NULL.\n' ' *\n' ' * Create a new request for the \'${name}\' ${message_type} command in the \'${service}\' service.\n' ' *\n' ' * Returns: %TRUE if the message was correctly parsed, %FALSE if @error is set.\n' ' */\n' 'gboolean\n' '${underscore}_${message_type}_parse (\n' ' const MbimMessage *message,\n') for field in fields: translations['field'] = utils.build_underscore_name_from_camelcase(field['name']) translations['public'] = field['public-format'] if 'public-format' in field else field['format'] translations['struct'] = field['struct-type'] if 'struct-type' in field else '' if field['format'] == 'byte-array': inner_template = (' const guint8 **${field},\n') elif field['format'] == 'unsized-byte-array' or field['format'] == 'ref-byte-array': inner_template = (' guint32 *${field}_size,\n' ' const guint8 **${field},\n') elif field['format'] == 'uuid': inner_template = (' const MbimUuid **${field},\n') elif field['format'] == 'guint32': inner_template = (' ${public} *${field},\n') elif field['format'] == 'guint32-array': inner_template = (' ${public} **${field},\n') elif field['format'] == 'guint64': inner_template = (' ${public} *${field},\n') elif field['format'] == 'guint64-array': inner_template = (' ${public} **${field},\n') elif field['format'] == 'string': inner_template = (' gchar **${field},\n') elif field['format'] == 'string-array': inner_template = (' gchar ***${field},\n') elif field['format'] == 'struct': inner_template = (' ${struct} **${field},\n') elif field['format'] == 'struct-array': inner_template = (' ${struct} ***${field},\n') elif field['format'] == 'ref-struct-array': inner_template = (' ${struct} ***${field},\n') elif field['format'] == 'ipv4': inner_template = (' const MbimIPv4 **${field},\n') elif field['format'] == 'ref-ipv4': inner_template = (' const MbimIPv4 **${field},\n') elif field['format'] == 'ipv4-array': inner_template = (' MbimIPv4 **${field},\n') elif field['format'] == 'ipv6': inner_template = (' const MbimIPv6 **${field},\n') elif field['format'] == 'ref-ipv6': inner_template = (' const MbimIPv6 **${field},\n') elif field['format'] == 'ipv6-array': inner_template = (' MbimIPv6 **${field},\n') template += (string.Template(inner_template).substitute(translations)) template += ( ' GError **error)\n' '{\n') if fields != []: template += ( ' guint32 offset = 0;\n') for field in fields: if 'always-read' in field: translations['field'] = utils.build_underscore_name_from_camelcase(field['name']) inner_template = (' guint32 _${field};\n') template += (string.Template(inner_template).substitute(translations)) if message_type == 'response': template += ( '\n' ' if (mbim_message_get_message_type (message) != MBIM_MESSAGE_TYPE_COMMAND_DONE) {\n' ' g_set_error (error,\n' ' MBIM_CORE_ERROR,\n' ' MBIM_CORE_ERROR_INVALID_MESSAGE,\n' ' \"Message is not a response\");\n' ' return FALSE;\n' ' }\n') elif message_type == 'notification': template += ( '\n' ' if (mbim_message_get_message_type (message) != MBIM_MESSAGE_TYPE_INDICATE_STATUS) {\n' ' g_set_error (error,\n' ' MBIM_CORE_ERROR,\n' ' MBIM_CORE_ERROR_INVALID_MESSAGE,\n' ' \"Message is not a notification\");\n' ' return FALSE;\n' ' }\n') else: raise ValueError('Unexpected message type \'%s\'' % message_type) for field in fields: translations['field'] = utils.build_underscore_name_from_camelcase(field['name']) translations['field_format_underscore'] = utils.build_underscore_name_from_camelcase(field['format']) translations['field_name'] = field['name'] translations['array_size_field'] = utils.build_underscore_name_from_camelcase(field['array-size-field']) if 'array-size-field' in field else '' translations['struct_name'] = utils.build_underscore_name_from_camelcase(field['struct-type']) if 'struct-type' in field else '' translations['struct_type'] = field['struct-type'] if 'struct-type' in field else '' translations['array_size'] = field['array-size'] if 'array-size' in field else '' inner_template = ( '\n' ' /* Read the \'${field_name}\' variable */\n') if 'available-if' in field: condition = field['available-if'] translations['condition_field'] = utils.build_underscore_name_from_camelcase(condition['field']) translations['condition_operation'] = condition['operation'] translations['condition_value'] = condition['value'] inner_template += ( ' if (!(_${condition_field} ${condition_operation} ${condition_value})) {\n') if field['format'] == 'byte-array': inner_template += ( ' if (${field})\n' ' *${field} = NULL;\n') elif field['format'] == 'unsized-byte-array' or \ field['format'] == 'ref-byte-array': inner_template += ( ' if (${field}_size)\n' ' *${field}_size = 0;\n' ' if (${field})\n' ' *${field} = NULL;\n') elif field['format'] == 'guint32-array' or \ field['format'] == 'string' or \ field['format'] == 'string-array' or \ field['format'] == 'struct' or \ field['format'] == 'struct-array' or \ field['format'] == 'ref-struct-array' or \ field['format'] == 'ipv4' or \ field['format'] == 'ref-ipv4' or \ field['format'] == 'ipv4-array' or \ field['format'] == 'ipv6' or \ field['format'] == 'ref-ipv6' or \ field['format'] == 'ipv6-array': inner_template += ( ' if (${field} != NULL)\n' ' *${field} = NULL;\n') else: raise ValueError('Field format \'%s\' unsupported as optional field' % field['format']) inner_template += ( ' } else {\n') else: inner_template += ( ' {\n') if 'always-read' in field: inner_template += ( ' _${field} = _mbim_message_read_guint32 (message, offset);\n' ' if (${field} != NULL)\n' ' *${field} = _${field};\n' ' offset += 4;\n') elif field['format'] == 'byte-array': inner_template += ( ' const guint8 *tmp;\n' '\n' ' tmp = _mbim_message_read_byte_array (message, 0, offset, FALSE, FALSE, NULL);\n' ' if (${field} != NULL)\n' ' *${field} = tmp;\n' ' offset += ${array_size};\n') elif field['format'] == 'unsized-byte-array': inner_template += ( ' const guint8 *tmp;\n' ' guint32 tmpsize;\n' '\n' ' tmp = _mbim_message_read_byte_array (message, 0, offset, FALSE, FALSE, &tmpsize);\n' ' if (${field} != NULL)\n' ' *${field} = tmp;\n' ' if (${field}_size != NULL)\n' ' *${field}_size = tmpsize;\n' ' offset += tmpsize;\n') elif field['format'] == 'ref-byte-array': inner_template += ( ' const guint8 *tmp;\n' ' guint32 tmpsize;\n' '\n' ' tmp = _mbim_message_read_byte_array (message, 0, offset, TRUE, TRUE, &tmpsize);\n' ' if (${field} != NULL)\n' ' *${field} = tmp;\n' ' if (${field}_size != NULL)\n' ' *${field}_size = tmpsize;\n' ' offset += 8;\n') elif field['format'] == 'uuid': inner_template += ( ' if (${field} != NULL)\n' ' *${field} = _mbim_message_read_uuid (message, offset);\n' ' offset += 16;\n') elif field['format'] == 'guint32': inner_template += ( ' if (${field} != NULL)\n' ' *${field} = _mbim_message_read_guint32 (message, offset);\n' ' offset += 4;\n') elif field['format'] == 'guint32-array': inner_template += ( ' if (${field} != NULL)\n' ' *${field} = _mbim_message_read_guint32_array (message, _{array_size_field}, offset);\n' ' offset += (4 * _${array_size_field});\n') elif field['format'] == 'guint64': inner_template += ( ' if (${field} != NULL)\n' ' *${field} = _mbim_message_read_guint64 (message, offset);\n' ' offset += 8;\n') elif field['format'] == 'string': inner_template += ( ' if (${field} != NULL)\n' ' *${field} = _mbim_message_read_string (message, 0, offset);\n' ' offset += 8;\n') elif field['format'] == 'string-array': inner_template += ( ' if (${field} != NULL)\n' ' *${field} = _mbim_message_read_string_array (message, _${array_size_field}, 0, offset);\n' ' offset += (8 * _${array_size_field});\n') elif field['format'] == 'struct': inner_template += ( ' ${struct_type} *tmp;\n' ' guint32 bytes_read = 0;\n' '\n' ' tmp = _mbim_message_read_${struct_name}_struct (message, offset, &bytes_read);\n' ' if (${field} != NULL)\n' ' *${field} = tmp;\n' ' else\n' ' _${struct_name}_free (tmp);\n' ' offset += bytes_read;\n') elif field['format'] == 'struct-array': inner_template += ( ' if (${field} != NULL)\n' ' *${field} = _mbim_message_read_${struct_name}_struct_array (message, _${array_size_field}, offset, FALSE);\n' ' offset += 4;\n') elif field['format'] == 'ref-struct-array': inner_template += ( ' if (${field} != NULL)\n' ' *${field} = _mbim_message_read_${struct_name}_struct_array (message, _${array_size_field}, offset, TRUE);\n' ' offset += (8 * _${array_size_field});\n') elif field['format'] == 'ipv4': inner_template += ( ' if (${field} != NULL)\n' ' *${field} = _mbim_message_read_ipv4 (message, offset, FALSE);\n' ' offset += 4;\n') elif field['format'] == 'ref-ipv4': inner_template += ( ' if (${field} != NULL)\n' ' *${field} = _mbim_message_read_ipv4 (message, offset, TRUE);\n' ' offset += 4;\n') elif field['format'] == 'ipv4-array': inner_template += ( ' if (${field} != NULL)\n' ' *${field} = _mbim_message_read_ipv4_array (message, _${array_size_field}, offset);\n' ' offset += 4;\n') elif field['format'] == 'ipv6': inner_template += ( ' if (${field} != NULL)\n' ' *${field} = _mbim_message_read_ipv6 (message, offset, FALSE);\n' ' offset += 4;\n') elif field['format'] == 'ref-ipv6': inner_template += ( ' if (${field} != NULL)\n' ' *${field} = _mbim_message_read_ipv6 (message, offset, TRUE);\n' ' offset += 4;\n') elif field['format'] == 'ipv6-array': inner_template += ( ' if (${field} != NULL)\n' ' *${field} = _mbim_message_read_ipv6_array (message, _${array_size_field}, offset);\n' ' offset += 4;\n') inner_template += ( ' }\n') template += (string.Template(inner_template).substitute(translations)) template += ( '\n' ' return TRUE;\n' '}\n') cfile.write(string.Template(template).substitute(translations))
def _emit_message_creator(self, hfile, cfile, message_type, fields): translations = { 'message' : self.name, 'service' : self.service, 'underscore' : utils.build_underscore_name (self.fullname), 'message_type' : message_type, 'message_type_upper' : message_type.upper(), 'service_underscore_upper' : utils.build_underscore_name (self.service).upper(), 'cid_enum_name' : self.cid_enum_name } template = ( '\n' 'MbimMessage *${underscore}_${message_type}_new (\n') for field in fields: translations['field'] = utils.build_underscore_name_from_camelcase (field['name']) translations['struct'] = field['struct-type'] if 'struct-type' in field else '' translations['public'] = field['public-format'] if 'public-format' in field else field['format'] if field['format'] == 'byte-array': inner_template = (' const guint8 *${field},\n') elif field['format'] == 'unsized-byte-array' or \ field['format'] == 'ref-byte-array' or \ field['format'] == 'ref-byte-array-no-offset': inner_template = (' const guint32 ${field}_size,\n' ' const guint8 *${field},\n') elif field['format'] == 'uuid': inner_template = (' const MbimUuid *${field},\n') elif field['format'] == 'guint32': inner_template = (' ${public} ${field},\n') elif field['format'] == 'guint32-array': inner_template = (' const ${public} *${field},\n') elif field['format'] == 'guint64': inner_template = (' ${public} ${field},\n') elif field['format'] == 'guint64-array': inner_template = (' const ${public} *${field},\n') elif field['format'] == 'string': inner_template = (' const gchar *${field},\n') elif field['format'] == 'string-array': inner_template = (' const gchar *const *${field},\n') elif field['format'] == 'struct': inner_template = (' const ${struct} *${field},\n') elif field['format'] == 'struct-array': inner_template = (' const ${struct} *const *${field},\n') elif field['format'] == 'ref-struct-array': inner_template = (' const ${struct} *const *${field},\n') elif field['format'] == 'ipv4': inner_template = (' const MbimIPv4 *${field},\n') elif field['format'] == 'ref-ipv4': inner_template = (' const MbimIPv4 *${field},\n') elif field['format'] == 'ipv4-array': inner_template = (' const MbimIPv4 *${field},\n') elif field['format'] == 'ipv6': inner_template = (' const MbimIPv6 *${field},\n') elif field['format'] == 'ref-ipv6': inner_template = (' const MbimIPv6 *${field},\n') elif field['format'] == 'ipv6-array': inner_template = (' const MbimIPv6 *${field},\n') template += (string.Template(inner_template).substitute(translations)) template += ( ' GError **error);\n') hfile.write(string.Template(template).substitute(translations)) template = ( '\n' '/**\n' ' * ${underscore}_${message_type}_new:\n') for field in fields: translations['name'] = field['name'] translations['field'] = utils.build_underscore_name_from_camelcase (field['name']) translations['struct'] = field['struct-type'] if 'struct-type' in field else '' translations['public'] = field['public-format'] if 'public-format' in field else field['format'] translations['array_size'] = field['array-size'] if 'array-size' in field else '' if field['format'] == 'byte-array': inner_template = (' * @${field}: the \'${name}\' field, given as an array of ${array_size} #guint8 values.\n') elif field['format'] == 'unsized-byte-array' or \ field['format'] == 'ref-byte-array' or \ field['format'] == 'ref-byte-array-no-offset': inner_template = (' * @${field}_size: size of the ${field} array.\n' ' * @${field}: the \'${name}\' field, given as an array of #guint8 values.\n') elif field['format'] == 'uuid': inner_template = (' * @${field}: the \'${name}\' field, given as a #MbimUuid.\n') elif field['format'] == 'guint32': inner_template = (' * @${field}: the \'${name}\' field, given as a #${public}.\n') elif field['format'] == 'guint32-array': inner_template = (' * @${field}: the \'${name}\' field, given as an array of #${public}.\n') elif field['format'] == 'guint64': inner_template = (' * @${field}: the \'${name}\' field, given as a #${public}.\n') elif field['format'] == 'guint64-array': inner_template = (' * @${field}: the \'${name}\' field, given as an array of #${public}.\n') elif field['format'] == 'string': inner_template = (' * @${field}: the \'${name}\' field, given as a string.\n') elif field['format'] == 'string-array': inner_template = (' * @${field}: the \'${name}\' field, given as an array of strings.\n') elif field['format'] == 'struct': inner_template = (' * @${field}: the \'${name}\' field, given as a #${struct}.\n') elif field['format'] == 'struct-array': inner_template = (' * @${field}: the \'${name}\' field, given as an array of #${struct}s.\n') elif field['format'] == 'ref-struct-array': inner_template = (' * @${field}: the \'${name}\' field, given as an array of #${struct}s.\n') elif field['format'] == 'ipv4': inner_template = (' * @${field}: the \'${name}\' field, given as a #MbimIPv4.\n') elif field['format'] == 'ref-ipv4': inner_template = (' * @${field}: the \'${name}\' field, given as a #MbimIPv4.\n') elif field['format'] == 'ipv4-array': inner_template = (' * @${field}: the \'${name}\' field, given as an array of #MbimIPv4.\n') elif field['format'] == 'ipv6': inner_template = (' * @${field}: the \'${name}\' field, given as a #MbimIPv6.\n') elif field['format'] == 'ref-ipv6': inner_template = (' * @${field}: the \'${name}\' field, given as a #MbimIPv6.\n') elif field['format'] == 'ipv6-array': inner_template = (' * @${field}: the \'${name}\' field, given as an array of #MbimIPv6.\n') template += (string.Template(inner_template).substitute(translations)) template += ( ' * @error: return location for error or %NULL.\n' ' *\n' ' * Create a new request for the \'${message}\' ${message_type} command in the \'${service}\' service.\n' ' *\n' ' * Returns: a newly allocated #MbimMessage, which should be freed with mbim_message_unref().\n' ' */\n' 'MbimMessage *\n' '${underscore}_${message_type}_new (\n') for field in fields: translations['field'] = utils.build_underscore_name_from_camelcase (field['name']) translations['struct'] = field['struct-type'] if 'struct-type' in field else '' translations['public'] = field['public-format'] if 'public-format' in field else field['format'] translations['array_size'] = field['array-size'] if 'array-size' in field else '' if field['format'] == 'byte-array': inner_template = (' const guint8 *${field},\n') elif field['format'] == 'unsized-byte-array' or \ field['format'] == 'ref-byte-array' or \ field['format'] == 'ref-byte-array-no-offset': inner_template = (' const guint32 ${field}_size,\n' ' const guint8 *${field},\n') elif field['format'] == 'uuid': inner_template = (' const MbimUuid *${field},\n') elif field['format'] == 'guint32': inner_template = (' ${public} ${field},\n') elif field['format'] == 'guint32-array': inner_template = (' const ${public} *${field},\n') elif field['format'] == 'guint64': inner_template = (' ${public} ${field},\n') elif field['format'] == 'guint64-array': inner_template = (' const ${public} *${field},\n') elif field['format'] == 'string': inner_template = (' const gchar *${field},\n') elif field['format'] == 'string-array': inner_template = (' const gchar *const *${field},\n') elif field['format'] == 'struct': inner_template = (' const ${struct} *${field},\n') elif field['format'] == 'struct-array': inner_template = (' const ${struct} *const *${field},\n') elif field['format'] == 'ref-struct-array': inner_template = (' const ${struct} *const *${field},\n') elif field['format'] == 'ipv4': inner_template = (' const MbimIPv4 *${field},\n') elif field['format'] == 'ref-ipv4': inner_template = (' const MbimIPv4 *${field},\n') elif field['format'] == 'ipv4-array': inner_template = (' const MbimIPv4 *${field},\n') elif field['format'] == 'ipv6': inner_template = (' const MbimIPv6 *${field},\n') elif field['format'] == 'ref-ipv6': inner_template = (' const MbimIPv6 *${field},\n') elif field['format'] == 'ipv6-array': inner_template = (' const MbimIPv6 *${field},\n') template += (string.Template(inner_template).substitute(translations)) template += ( ' GError **error)\n' '{\n' ' MbimMessageCommandBuilder *builder;\n' '\n' ' builder = _mbim_message_command_builder_new (0,\n' ' MBIM_SERVICE_${service_underscore_upper},\n' ' ${cid_enum_name},\n' ' MBIM_MESSAGE_COMMAND_TYPE_${message_type_upper});\n') for field in fields: translations['field'] = utils.build_underscore_name_from_camelcase(field['name']) translations['array_size_field'] = utils.build_underscore_name_from_camelcase(field['array-size-field']) if 'array-size-field' in field else '' translations['struct'] = field['struct-type'] if 'struct-type' in field else '' translations['struct_underscore'] = utils.build_underscore_name_from_camelcase (translations['struct']) translations['array_size'] = field['array-size'] if 'array-size' in field else '' translations['pad_array'] = field['pad-array'] if 'pad-array' in field else 'TRUE' inner_template = '' if 'available-if' in field: condition = field['available-if'] translations['condition_field'] = utils.build_underscore_name_from_camelcase(condition['field']) translations['condition_operation'] = condition['operation'] translations['condition_value'] = condition['value'] inner_template += ( ' if (${condition_field} ${condition_operation} ${condition_value}) {\n') else: inner_template += (' {\n') if field['format'] == 'byte-array': inner_template += (' _mbim_message_command_builder_append_byte_array (builder, FALSE, FALSE, ${pad_array}, ${field}, ${array_size});\n') elif field['format'] == 'unsized-byte-array': inner_template += (' _mbim_message_command_builder_append_byte_array (builder, FALSE, FALSE, ${pad_array}, ${field}, ${field}_size);\n') elif field['format'] == 'ref-byte-array': inner_template += (' _mbim_message_command_builder_append_byte_array (builder, TRUE, TRUE, ${pad_array}, ${field}, ${field}_size);\n') elif field['format'] == 'ref-byte-array-no-offset': inner_template += (' _mbim_message_command_builder_append_byte_array (builder, FALSE, TRUE, ${pad_array}, ${field}, ${field}_size);\n') elif field['format'] == 'uuid': inner_template += (' _mbim_message_command_builder_append_uuid (builder, ${field});\n') elif field['format'] == 'guint32': inner_template += (' _mbim_message_command_builder_append_guint32 (builder, ${field});\n') elif field['format'] == 'guint32-array': inner_template += (' _mbim_message_command_builder_append_guint32_array (builder, ${field}, ${array_size_field});\n') elif field['format'] == 'guint64': inner_template += (' _mbim_message_command_builder_append_guint64 (builder, ${field});\n') elif field['format'] == 'string': inner_template += (' _mbim_message_command_builder_append_string (builder, ${field});\n') elif field['format'] == 'string-array': inner_template += (' _mbim_message_command_builder_append_string_array (builder, ${field}, ${array_size_field});\n') elif field['format'] == 'struct': inner_template += (' _mbim_message_command_builder_append_${struct_underscore}_struct (builder, ${field});\n') elif field['format'] == 'struct-array': inner_template += (' _mbim_message_command_builder_append_${struct_underscore}_struct_array (builder, ${field}, ${array_size_field}, FALSE);\n') elif field['format'] == 'ref-struct-array': inner_template += (' _mbim_message_command_builder_append_${struct_underscore}_struct_array (builder, ${field}, ${array_size_field}, TRUE);\n') elif field['format'] == 'ipv4': inner_template += (' _mbim_message_command_builder_append_ipv4 (builder, ${field}, FALSE);\n') elif field['format'] == 'ref-ipv4': inner_template += (' _mbim_message_command_builder_append_ipv4 (builder, ${field}, TRUE);\n') elif field['format'] == 'ipv4-array': inner_template += (' _mbim_message_command_builder_append_ipv4_array (builder, ${field}, ${array_size_field});\n') elif field['format'] == 'ipv6': inner_template += (' _mbim_message_command_builder_append_ipv6 (builder, ${field}, FALSE);\n') elif field['format'] == 'ref-ipv6': inner_template += (' _mbim_message_command_builder_append_ipv6 (builder, ${field}, TRUE);\n') elif field['format'] == 'ipv6-array': inner_template += (' _mbim_message_command_builder_append_ipv6_array (builder, ${field}, ${array_size_field});\n') else: raise ValueError('Cannot handle field type \'%s\'' % field['format']) inner_template += (' }\n') template += (string.Template(inner_template).substitute(translations)) template += ( '\n' ' return _mbim_message_command_builder_complete (builder);\n' '}\n') cfile.write(string.Template(template).substitute(translations))
def emit_get_printable(self, f, line_prefix): common_format = '' common_cast = '' if self.private_format == 'guint8': common_format = '%u' common_cast = '(guint)' elif self.private_format == 'guint16': common_format = '%" G_GUINT16_FORMAT "' elif self.private_format == 'guint32': common_format = '%" G_GUINT32_FORMAT "' elif self.private_format == 'guint64': common_format = '%" G_GUINT64_FORMAT "' elif self.private_format == 'gint8': common_format = '%d' common_cast = '(gint)' elif self.private_format == 'gint16': common_format = '%" G_GINT16_FORMAT "' elif self.private_format == 'gint32': common_format = '%" G_GINT32_FORMAT "' elif self.private_format == 'gint64': common_format = '%" G_GINT64_FORMAT "' elif self.private_format == 'gfloat': common_format = '%f' translations = { 'lp' : line_prefix, 'private_format' : self.private_format, 'public_format' : self.public_format, 'len' : self.guint_sized_size, 'common_format' : common_format, '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' '${lp} ${private_format} tmp;\n' '\n') if self.format == 'guint-sized': template += ( '${lp} if (!qmi_message_tlv_read_sized_guint (message, init_offset, &offset, ${len},${endian} &tmp, &error))\n' '${lp} goto out;\n') else: template += ( '${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') 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' '#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_free (flags_str);\n' '${lp} }\n' '#else\n' '# error unexpected public format: ${public_format}\n' '#endif\n') else: template += ( '${lp} g_string_append_printf (printable, "${common_format}", ${common_cast}tmp);\n') template += ( '${lp}}\n') f.write(string.Template(template).substitute(translations))
def emit_get_printable(self, f, line_prefix, printable, buffer_name, buffer_len): common_format = '' common_cast = '' if self.private_format == 'guint8': common_format = '%u' common_cast = '(guint)' elif self.private_format == 'guint16': common_format = '%" G_GUINT16_FORMAT "' elif self.private_format == 'guint32': common_format = '%" G_GUINT32_FORMAT "' elif self.private_format == 'guint64': common_format = '%" G_GUINT64_FORMAT "' elif self.private_format == 'gint8': common_format = '%d' common_cast = '(gint)' elif self.private_format == 'gint16': common_format = '%" G_GINT16_FORMAT "' elif self.private_format == 'gint32': common_format = '%" G_GINT32_FORMAT "' elif self.private_format == 'gint64': common_format = '%" G_GINT64_FORMAT "' translations = { 'lp': line_prefix, '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 } template = ('\n' '${lp}{\n' '${lp} ${private_format} tmp;\n' '\n') 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') 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': template += ('${lp} ${endian},\n') template += ('${lp} &tmp);\n' '\n') if self.public_format == 'gboolean': template += ( '${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' '#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_free (flags_str);\n' '${lp} }\n' '#else\n' '# error unexpected public format: ${public_format}\n' '#endif\n') else: template += ( '${lp} g_string_append_printf (${printable}, "${common_format}", ${common_cast}tmp);\n' ) template += ('${lp}}\n') f.write(string.Template(template).substitute(translations))
def _emit_free(self, hfile, cfile): translations = { 'name' : self.name, 'since' : self.since, 'name_underscore' : utils.build_underscore_name_from_camelcase(self.name) } template = '' if self.single_member == True: template = ( '\n' '/**\n' ' * ${name_underscore}_free:\n' ' * @var: a #${name}.\n' ' *\n' ' * Frees the memory allocated for the #${name}.\n' ' *\n' ' * Since: ${since}\n' ' */\n' 'void ${name_underscore}_free (${name} *var);\n' 'G_DEFINE_AUTOPTR_CLEANUP_FUNC (${name}, ${name_underscore}_free)\n') hfile.write(string.Template(template).substitute(translations)) template = ( '\n' 'static void\n' '_${name_underscore}_free (${name} *var)\n' '{\n' ' if (!var)\n' ' return;\n' '\n') for field in self.contents: translations['field_name_underscore'] = utils.build_underscore_name_from_camelcase(field['name']) inner_template = '' if field['format'] == 'uuid': pass elif field['format'] in ['unsized-byte-array', 'ref-byte-array', 'ref-byte-array-no-offset']: inner_template += ( ' g_free (var->${field_name_underscore});\n') elif field['format'] == 'guint32': pass elif field['format'] == 'guint32-array': inner_template += ( ' g_free (var->${field_name_underscore});\n') elif field['format'] == 'guint64': pass elif field['format'] == 'string': inner_template += ( ' g_free (var->${field_name_underscore});\n') elif field['format'] == 'string-array': inner_template += ( ' g_strfreev (var->${field_name_underscore});\n') elif field['format'] == 'ipv4': pass elif field['format'] == 'ref-ipv4': pass elif field['format'] == 'ipv6': pass elif field['format'] == 'ref-ipv6': pass else: raise ValueError('Cannot handle format \'%s\' in struct clear' % field['format']) template += string.Template(inner_template).substitute(translations) template += ( ' g_free (var);\n' '}\n') cfile.write(string.Template(template).substitute(translations)) if self.single_member == True: template = ( '\n' 'void\n' '${name_underscore}_free (${name} *var)\n' '{\n' ' _${name_underscore}_free (var);\n' '}\n') cfile.write(string.Template(template).substitute(translations)) if self.array_member: # TypeArray was introduced in 1.24 translations['array_since'] = self.since if utils.version_compare('1.24', self.since) > 0 else '1.24' template = ( '\n' '/**\n' ' * ${name}Array:\n' ' *\n' ' * A NULL-terminated array of ${name} elements.\n' ' *\n' ' * Since: ${array_since}\n' ' */\n' 'typedef ${name} *${name}Array;\n' '/**\n' ' * ${name_underscore}_array_free:\n' ' * @array: a #NULL terminated array of #${name} structs.\n' ' *\n' ' * Frees the memory allocated for the array of #${name}s.\n' ' *\n' ' * Since: ${since}\n' ' */\n' 'void ${name_underscore}_array_free (${name}Array *array);\n' 'G_DEFINE_AUTOPTR_CLEANUP_FUNC (${name}Array, ${name_underscore}_array_free)\n') hfile.write(string.Template(template).substitute(translations)) template = ( '\n' 'void\n' '${name_underscore}_array_free (${name}Array *array)\n' '{\n' ' guint32 i;\n' '\n' ' if (!array)\n' ' return;\n' '\n' ' for (i = 0; array[i]; i++)\n' ' _${name_underscore}_free (array[i]);\n' ' g_free (array);\n' '}\n') cfile.write(string.Template(template).substitute(translations))
def _emit_free(self, hfile, cfile): translations = { 'name' : self.name, 'name_underscore' : utils.build_underscore_name_from_camelcase(self.name) } template = '' if self.single_member == True: template = ( '\n' 'void ${name_underscore}_free (${name} *var);\n') hfile.write(string.Template(template).substitute(translations)) template = ( '\n' 'static void\n' '_${name_underscore}_free (${name} *var)\n' '{\n' ' if (!var)\n' ' return;\n' '\n') for field in self.contents: translations['field_name_underscore'] = utils.build_underscore_name_from_camelcase(field['name']) inner_template = '' if field['format'] == 'uuid': pass elif field['format'] == 'unsized-byte-array' or field['format'] == 'ref-byte-array': inner_template += ( ' g_free (var->${field_name_underscore});\n') elif field['format'] == 'guint32': pass elif field['format'] == 'guint32-array': inner_template += ( ' g_free (var->${field_name_underscore});\n') elif field['format'] == 'guint64': pass elif field['format'] == 'string': inner_template += ( ' g_free (var->${field_name_underscore});\n') elif field['format'] == 'string-array': inner_template += ( ' g_strfreev (var->${field_name_underscore});\n') elif field['format'] == 'ipv4': pass elif field['format'] == 'ref-ipv4': pass elif field['format'] == 'ipv4-array': inner_template += ( ' g_free (var->${field_name_underscore});\n') elif field['format'] == 'ipv6': pass elif field['format'] == 'ref-ipv6': pass elif field['format'] == 'ipv6-array': inner_template += ( ' g_free (var->${field_name_underscore});\n') else: raise ValueError('Cannot handle format \'%s\' in struct clear' % field['format']) template += string.Template(inner_template).substitute(translations) template += ( ' g_free (var);\n' '}\n') cfile.write(string.Template(template).substitute(translations)) if self.single_member == True: template = ( '\n' '/**\n' ' * ${name_underscore}_free:\n' ' * @var: a #${name}.\n' ' *\n' ' * Frees the memory allocated for the #${name}.\n' ' */\n' 'void\n' '${name_underscore}_free (${name} *var)\n' '{\n' ' _${name_underscore}_free (var);\n' '}\n') cfile.write(string.Template(template).substitute(translations)) if self.array_member: template = ( '\n' 'void ${name_underscore}_array_free (${name} **array);\n') hfile.write(string.Template(template).substitute(translations)) template = ( '\n' '/**\n' ' * ${name_underscore}_array_free:\n' ' * @array: a #NULL terminated array of #${name} structs.\n' ' *\n' ' * Frees the memory allocated for the array of #${name}s.\n' ' */\n' 'void\n' '${name_underscore}_array_free (${name} **array)\n' '{\n' ' guint32 i;\n' '\n' ' if (!array)\n' ' return;\n' '\n' ' for (i = 0; array[i]; i++)\n' ' _${name_underscore}_free (array[i]);\n' ' g_free (array);\n' '}\n') cfile.write(string.Template(template).substitute(translations))
def _emit_append(self, cfile): translations = { 'name' : self.name, 'name_underscore' : utils.build_underscore_name_from_camelcase(self.name), 'struct_size' : self.size } template = ( '\n' 'static GByteArray *\n' '_${name_underscore}_struct_new (const ${name} *value)\n' '{\n' ' MbimStructBuilder *builder;\n' '\n' ' g_assert (value != NULL);\n' '\n' ' builder = _mbim_struct_builder_new ();\n') for field in self.contents: translations['field'] = utils.build_underscore_name_from_camelcase(field['name']) translations['array_size'] = field['array-size'] if 'array-size' in field else '' translations['array_size_field'] = utils.build_underscore_name_from_camelcase(field['array-size-field']) if 'array-size-field' in field else '' translations['pad_array'] = field['pad-array'] if 'pad-array' in field else 'TRUE' if field['format'] == 'uuid': inner_template = (' _mbim_struct_builder_append_uuid (builder, &(value->${field}));\n') elif field['format'] == 'byte-array': inner_template = (' _mbim_struct_builder_append_byte_array (builder, FALSE, FALSE, ${pad_array}, value->${field}, ${array_size});\n') elif field['format'] == 'unsized-byte-array': inner_template = (' _mbim_struct_builder_append_byte_array (builder, FALSE, FALSE, ${pad_array}, value->${field}, value->${field}_size);\n') elif field['format'] == 'ref-byte-array': if 'array-size-field' in field: inner_template = (' _mbim_struct_builder_append_byte_array (builder, TRUE, FALSE, ${pad_array}, value->${field}, value->${array_size_field});\n') else: inner_template = (' _mbim_struct_builder_append_byte_array (builder, TRUE, TRUE, ${pad_array}, value->${field}, value->${field}_size);\n') elif field['format'] == 'guint32': inner_template = (' _mbim_struct_builder_append_guint32 (builder, value->${field});\n') elif field['format'] == 'guint32-array': inner_template = (' _mbim_struct_builder_append_guint32_array (builder, value->${field}, value->${array_size_field});\n') elif field['format'] == 'guint64': inner_template = (' _mbim_struct_builder_append_guint64 (builder, value->${field});\n') elif field['format'] == 'guint64-array': inner_template = (' _mbim_struct_builder_append_guint64_array (builder, value->${field}, value->${array_size_field});\n') elif field['format'] == 'string': inner_template = (' _mbim_struct_builder_append_string (builder, value->${field});\n') elif field['format'] == 'string-array': inner_template = (' _mbim_struct_builder_append_string_array (builder, value->${field}, value->${array_size_field});\n') elif field['format'] == 'ipv4': inner_template = (' _mbim_struct_builder_append_ipv4 (builder, &value->${field}, FALSE);\n') elif field['format'] == 'ref-ipv4': inner_template = (' _mbim_struct_builder_append_ipv4 (builder, &value->${field}, TRUE);\n') elif field['format'] == 'ipv4-array': inner_template = (' _mbim_struct_builder_append_ipv4_array (builder, value->${field}, value->${array_size_field});\n') elif field['format'] == 'ipv6': inner_template = (' _mbim_struct_builder_append_ipv6 (builder, &value->${field}, FALSE);\n') elif field['format'] == 'ref-ipv6': inner_template = (' _mbim_struct_builder_append_ipv6 (builder, &value->${field}, TRUE);\n') elif field['format'] == 'ipv6-array': inner_template = (' _mbim_struct_builder_append_ipv6_array (builder, value->${field}, value->${array_size_field});\n') else: raise ValueError('Cannot handle format \'%s\' in struct' % field['format']) template += string.Template(inner_template).substitute(translations) template += ( '\n' ' return _mbim_struct_builder_complete (builder);\n' '}\n') cfile.write(string.Template(template).substitute(translations)) template = ( '\n' 'static void\n' '_mbim_struct_builder_append_${name_underscore}_struct (\n' ' MbimStructBuilder *builder,\n' ' const ${name} *value)\n' '{\n' ' GByteArray *raw;\n' '\n' ' raw = _${name_underscore}_struct_new (value);\n' ' g_byte_array_append (builder->fixed_buffer, raw->data, raw->len);\n' ' g_byte_array_unref (raw);\n' '}\n' '\n' 'static void\n' '_mbim_message_command_builder_append_${name_underscore}_struct (\n' ' MbimMessageCommandBuilder *builder,\n' ' const ${name} *value)\n' '{\n' ' _mbim_struct_builder_append_${name_underscore}_struct (builder->contents_builder, value);\n' '}\n') cfile.write(string.Template(template).substitute(translations)) template = ( '\n' 'static void\n' '_mbim_struct_builder_append_${name_underscore}_struct_array (\n' ' MbimStructBuilder *builder,\n' ' const ${name} *const *values,\n' ' guint32 n_values,\n' ' gboolean refs)\n' '{\n' ' guint32 offset;\n' ' guint32 i;\n' ' GByteArray *raw_all = NULL;\n' '\n' ' if (!refs) {\n' ' for (i = 0; i < n_values; i++) {\n' ' GByteArray *raw;\n' '\n' ' raw = _${name_underscore}_struct_new (values[i]);\n' ' if (!raw_all)\n' ' raw_all = raw;\n' ' else {\n' ' g_byte_array_append (raw_all, raw->data, raw->len);\n' ' g_byte_array_unref (raw);\n' ' }\n' ' }\n' '\n' ' if (!raw_all) {\n' ' offset = 0;\n' ' g_byte_array_append (builder->fixed_buffer, (guint8 *)&offset, sizeof (offset));\n' ' } else {\n' ' guint32 offset_offset;\n' '\n' ' /* Offset of the offset */\n' ' offset_offset = builder->fixed_buffer->len;\n' ' /* Length *not* in LE yet */\n' ' offset = builder->variable_buffer->len;\n' ' /* Add the offset value */\n' ' g_byte_array_append (builder->fixed_buffer, (guint8 *)&offset, sizeof (offset));\n' ' /* Configure the value to get updated */\n' ' g_array_append_val (builder->offsets, offset_offset);\n' ' /* Add the final array itself */\n' ' g_byte_array_append (builder->variable_buffer, raw_all->data, raw_all->len);\n' ' g_byte_array_unref (raw_all);\n' ' }\n' ' } else {\n' ' for (i = 0; i < n_values; i++) {\n' ' guint32 length;\n' ' guint32 offset_offset;\n' ' GByteArray *raw;\n' '\n' ' raw = _${name_underscore}_struct_new (values[i]);\n' ' g_assert (raw->len > 0);\n' '\n' ' /* Offset of the offset */\n' ' offset_offset = builder->fixed_buffer->len;\n' '\n' ' /* Length *not* in LE yet */\n' ' offset = builder->variable_buffer->len;\n' ' /* Add the offset value */\n' ' g_byte_array_append (builder->fixed_buffer, (guint8 *)&offset, sizeof (offset));\n' ' /* Configure the value to get updated */\n' ' g_array_append_val (builder->offsets, offset_offset);\n' '\n' ' /* Add the length value */\n' ' length = GUINT32_TO_LE (raw->len);\n' ' g_byte_array_append (builder->fixed_buffer, (guint8 *)&length, sizeof (length));\n' '\n' ' /* And finally, the bytearray itself to the variable buffer */\n' ' g_byte_array_append (builder->variable_buffer, (const guint8 *)raw->data, (guint)raw->len);\n' ' g_byte_array_unref (raw);\n' ' }\n' ' }\n' '}\n') cfile.write(string.Template(template).substitute(translations)) template = ( '\n' 'static void\n' '_mbim_message_command_builder_append_${name_underscore}_struct_array (\n' ' MbimMessageCommandBuilder *builder,\n' ' const ${name} *const *values,\n' ' guint32 n_values,\n' ' gboolean refs)\n' '{\n' ' _mbim_struct_builder_append_${name_underscore}_struct_array (builder->contents_builder, values, n_values, refs);\n' '}\n') cfile.write(string.Template(template).substitute(translations))
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))
def _emit_free(self, hfile, cfile): translations = { 'name' : self.name, 'name_underscore' : utils.build_underscore_name_from_camelcase(self.name) } template = '' if self.single_member == True: template = ( '\n' 'void ${name_underscore}_free (${name} *var);\n') hfile.write(string.Template(template).substitute(translations)) template = ( '\n' 'static void\n' '_${name_underscore}_free (${name} *var)\n' '{\n' ' if (!var)\n' ' return;\n' '\n') for field in self.contents: translations['field_name_underscore'] = utils.build_underscore_name_from_camelcase(field['name']) inner_template = '' if field['format'] == 'uuid': pass elif field['format'] in ['unsized-byte-array', 'ref-byte-array', 'ref-byte-array-no-offset']: inner_template += ( ' g_free (var->${field_name_underscore});\n') elif field['format'] == 'guint32': pass elif field['format'] == 'guint32-array': inner_template += ( ' g_free (var->${field_name_underscore});\n') elif field['format'] == 'guint64': pass elif field['format'] == 'string': inner_template += ( ' g_free (var->${field_name_underscore});\n') elif field['format'] == 'string-array': inner_template += ( ' g_strfreev (var->${field_name_underscore});\n') elif field['format'] == 'ipv4': pass elif field['format'] == 'ref-ipv4': pass elif field['format'] == 'ipv6': pass elif field['format'] == 'ref-ipv6': pass else: raise ValueError('Cannot handle format \'%s\' in struct clear' % field['format']) template += string.Template(inner_template).substitute(translations) template += ( ' g_free (var);\n' '}\n') cfile.write(string.Template(template).substitute(translations)) if self.single_member == True: template = ( '\n' '/**\n' ' * ${name_underscore}_free:\n' ' * @var: a #${name}.\n' ' *\n' ' * Frees the memory allocated for the #${name}.\n' ' */\n' 'void\n' '${name_underscore}_free (${name} *var)\n' '{\n' ' _${name_underscore}_free (var);\n' '}\n') cfile.write(string.Template(template).substitute(translations)) if self.array_member: template = ( '\n' 'void ${name_underscore}_array_free (${name} **array);\n') hfile.write(string.Template(template).substitute(translations)) template = ( '\n' '/**\n' ' * ${name_underscore}_array_free:\n' ' * @array: a #NULL terminated array of #${name} structs.\n' ' *\n' ' * Frees the memory allocated for the array of #${name}s.\n' ' */\n' 'void\n' '${name_underscore}_array_free (${name} **array)\n' '{\n' ' guint32 i;\n' '\n' ' if (!array)\n' ' return;\n' '\n' ' for (i = 0; array[i]; i++)\n' ' _${name_underscore}_free (array[i]);\n' ' g_free (array);\n' '}\n') cfile.write(string.Template(template).substitute(translations))
def _emit_read(self, cfile): translations = { 'name': self.name, 'name_underscore': utils.build_underscore_name_from_camelcase(self.name), 'struct_size': self.size } template = ('\n' 'static ${name} *\n' '_mbim_message_read_${name_underscore}_struct (\n' ' const MbimMessage *self,\n' ' guint32 relative_offset,\n' ' guint32 *bytes_read)\n' '{\n' ' ${name} *out;\n' ' guint32 offset = relative_offset;\n' '\n' ' g_assert (self != NULL);\n' '\n' ' out = g_new (${name}, 1);\n') for field in self.contents: translations[ 'field_name_underscore'] = utils.build_underscore_name_from_camelcase( field['name']) inner_template = '' if field['format'] == 'uuid': inner_template += ( '\n' ' memcpy (&(out->${field_name_underscore}), _mbim_message_read_uuid (self, offset), 16);\n' ' offset += 16;\n') elif field['format'] == 'ref-byte-array': if 'array-size-field' in field: translations[ 'array_size_field_name_underscore'] = utils.build_underscore_name_from_camelcase( field['array-size-field']) inner_template += ( '\n' ' {\n' ' const guint8 *tmp;\n' '\n' ' tmp = _mbim_message_read_byte_array (self, relative_offset, offset, TRUE, FALSE, NULL);\n' ' out->${field_name_underscore} = g_malloc (out->${array_size_field_name_underscore});\n' ' memcpy (out->${field_name_underscore}, tmp, out->${array_size_field_name_underscore});\n' ' offset += 4;\n' ' }\n') else: inner_template += ( '\n' ' {\n' ' const guint8 *tmp;\n' '\n' ' tmp = _mbim_message_read_byte_array (self, relative_offset, offset, TRUE, TRUE, &(out->${field_name_underscore}_size));\n' ' out->${field_name_underscore} = g_malloc (out->${field_name_underscore}_size);\n' ' memcpy (out->${field_name_underscore}, tmp, out->${field_name_underscore}_size);\n' ' offset += 8;\n' ' }\n') elif field['format'] == 'unsized-byte-array': inner_template += ( '\n' ' {\n' ' const guint8 *tmp;\n' '\n' ' tmp = _mbim_message_read_byte_array (self, relative_offset, offset, FALSE, FALSE, &(out->${field_name_underscore}_size));\n' ' out->${field_name_underscore} = g_malloc (out->${field_name_underscore}_size);\n' ' memcpy (out->${field_name_underscore}, tmp, out->${field_name_underscore}_size);\n' ' /* no offset update expected, this should be the last field */\n' ' }\n') elif field['format'] == 'byte-array': translations['array_size'] = field['array-size'] inner_template += ( '\n' ' {\n' ' const guint8 *tmp;\n' '\n' ' tmp = _mbim_message_read_byte_array (self, relative_offset, offset, FALSE, FALSE, NULL));\n' ' memcpy (out->${field_name_underscore}, tmp, ${array_size});\n' ' offset += ${array_size};\n' ' }\n') elif field['format'] == 'guint32': inner_template += ( '\n' ' out->${field_name_underscore} = _mbim_message_read_guint32 (self, offset);\n' ' offset += 4;\n') elif field['format'] == 'guint32-array': translations[ 'array_size_field_name_underscore'] = utils.build_underscore_name_from_camelcase( field['array-size-field']) inner_template += ( '\n' ' out->${field_name_underscore} = _mbim_message_read_guint32_array (self, out->${array_size_field_name_underscore}, offset);\n' ' offset += (4 * out->${array_size_field_name_underscore});\n' ) elif field['format'] == 'guint64': inner_template += ( '\n' ' out->${field_name_underscore} = _mbim_message_read_guint64 (self, offset);\n' ' offset += 8;\n') elif field['format'] == 'string': inner_template += ( '\n' ' out->${field_name_underscore} = _mbim_message_read_string (self, relative_offset, offset);\n' ' offset += 8;\n') elif field['format'] == 'string-array': translations[ 'array_size_field_name_underscore'] = utils.build_underscore_name_from_camelcase( field['array-size-field']) inner_template += ( '\n' ' out->${field_name_underscore} = _mbim_message_read_string_array (self, out->${array_size_field_name_underscore}, relative_offset, offset);\n' ' offset += (8 * out->${array_size_field_name_underscore});\n' ) elif field['format'] == 'ipv4': inner_template += ( '\n' ' memcpy (&(out->${field_name_underscore}), _mbim_message_read_ipv4 (self, offset, FALSE), 4);\n' ' offset += 4;\n') elif field['format'] == 'ref-ipv4': inner_template += ( '\n' ' memcpy (&(out->${field_name_underscore}), _mbim_message_read_ipv4 (self, offset, TRUE), 4);\n' ' offset += 4;\n') elif field['format'] == 'ipv4-array': inner_template += ( '\n' ' out->${field_name_underscore} =_mbim_message_read_ipv4_array (self, out->${array_size_field_name_underscore}, offset);\n' ' offset += 4;\n') elif field['format'] == 'ipv6': inner_template += ( '\n' ' memcpy (&(out->${field_name_underscore}), _mbim_message_read_ipv6 (self, offset, FALSE), 16);\n' ' offset += 4;\n') elif field['format'] == 'ref-ipv6': inner_template += ( '\n' ' memcpy (&(out->${field_name_underscore}), _mbim_message_read_ipv6 (self, offset, TRUE), 16);\n' ' offset += 4;\n') elif field['format'] == 'ipv6-array': inner_template += ( '\n' ' out->${field_name_underscore} =_mbim_message_read_ipv6_array (self, out->${array_size_field_name_underscore}, offset);\n' ' offset += 4;\n') else: raise ValueError('Cannot handle format \'%s\' in struct' % field['format']) template += string.Template(inner_template).substitute( translations) template += ('\n' ' if (bytes_read)\n' ' *bytes_read = (offset - relative_offset);\n' '\n' ' return out;\n' '}\n') cfile.write(string.Template(template).substitute(translations)) template = ( '\n' 'static ${name} **\n' '_mbim_message_read_${name_underscore}_struct_array (\n' ' const MbimMessage *self,\n' ' guint32 array_size,\n' ' guint32 relative_offset_array_start,\n' ' gboolean refs)\n' '{\n' ' ${name} **out;\n' ' guint32 i;\n' ' guint32 offset;\n' '\n' ' if (!array_size)\n' ' return NULL;\n' '\n' ' out = g_new (${name} *, array_size + 1);\n' '\n' ' if (!refs) {\n' ' offset = _mbim_message_read_guint32 (self, relative_offset_array_start);\n' ' for (i = 0; i < array_size; i++, offset += ${struct_size})\n' ' out[i] = _mbim_message_read_${name_underscore}_struct (self, offset, NULL);\n' ' } else {\n' ' offset = relative_offset_array_start;\n' ' for (i = 0; i < array_size; i++, offset += 8)\n' ' out[i] = _mbim_message_read_${name_underscore}_struct (self, _mbim_message_read_guint32 (self, offset), NULL);\n' ' }\n' ' out[array_size] = NULL;\n' '\n' ' return out;\n' '}\n') cfile.write(string.Template(template).substitute(translations))
def _emit_message_parser(self, hfile, cfile, message_type, fields): translations = { 'message' : self.name, 'service' : self.service, 'underscore' : utils.build_underscore_name (self.fullname), 'message_type' : message_type, 'message_type_upper' : message_type.upper(), 'service_underscore_upper' : utils.build_underscore_name (self.service).upper() } template = ( '\n' 'gboolean ${underscore}_${message_type}_parse (\n' ' const MbimMessage *message,\n') for field in fields: translations['field'] = utils.build_underscore_name_from_camelcase(field['name']) translations['public'] = field['public-format'] if 'public-format' in field else field['format'] translations['struct'] = field['struct-type'] if 'struct-type' in field else '' if field['format'] == 'byte-array': inner_template = (' const guint8 **${field},\n') elif field['format'] == 'unsized-byte-array' or field['format'] == 'ref-byte-array': inner_template = (' guint32 *${field}_size,\n' ' const guint8 **${field},\n') elif field['format'] == 'uuid': inner_template = (' const MbimUuid **${field},\n') elif field['format'] == 'guint32': inner_template = (' ${public} *${field},\n') elif field['format'] == 'guint32-array': inner_template = (' ${public} **${field},\n') elif field['format'] == 'guint64': inner_template = (' ${public} *${field},\n') elif field['format'] == 'guint64-array': inner_template = (' ${public} **${field},\n') elif field['format'] == 'string': inner_template = (' gchar **${field},\n') elif field['format'] == 'string-array': inner_template = (' gchar ***${field},\n') elif field['format'] == 'struct': inner_template = (' ${struct} **${field},\n') elif field['format'] == 'struct-array': inner_template = (' ${struct} ***${field},\n') elif field['format'] == 'ref-struct-array': inner_template = (' ${struct} ***${field},\n') elif field['format'] == 'ipv4': inner_template = (' const MbimIPv4 **${field},\n') elif field['format'] == 'ref-ipv4': inner_template = (' const MbimIPv4 **${field},\n') elif field['format'] == 'ipv4-array': inner_template = (' MbimIPv4 **${field},\n') elif field['format'] == 'ipv6': inner_template = (' const MbimIPv6 **${field},\n') elif field['format'] == 'ref-ipv6': inner_template = (' const MbimIPv6 **${field},\n') elif field['format'] == 'ipv6-array': inner_template = (' MbimIPv6 **${field},\n') else: raise ValueError('Cannot handle field type \'%s\'' % field['format']) template += (string.Template(inner_template).substitute(translations)) template += ( ' GError **error);\n') hfile.write(string.Template(template).substitute(translations)) template = ( '\n' '/**\n' ' * ${underscore}_${message_type}_parse:\n' ' * @message: the #MbimMessage.\n') for field in fields: translations['field'] = utils.build_underscore_name_from_camelcase(field['name']) translations['name'] = field['name'] translations['public'] = field['public-format'] if 'public-format' in field else field['format'] translations['struct'] = field['struct-type'] if 'struct-type' in field else '' translations['struct_underscore'] = utils.build_underscore_name_from_camelcase (translations['struct']) translations['array_size'] = field['array-size'] if 'array-size' in field else '' if field['format'] == 'byte-array': inner_template = (' * @${field}: return location for an array of ${array_size} #guint8 values. Do not free the returned value, it is owned by @message.\n') elif field['format'] == 'unsized-byte-array' or field['format'] == 'ref-byte-array': inner_template = (' * @${field}_size: return location for the size of the ${field} array.\n' ' * @${field}: return location for an array of #guint8 values. Do not free the returned value, it is owned by @message.\n') elif field['format'] == 'uuid': inner_template = (' * @${field}: return location for a #MbimUuid, or %NULL if the \'${name}\' field is not needed. Do not free the returned value, it is owned by @message.\n') elif field['format'] == 'guint32': inner_template = (' * @${field}: return location for a #${public}, or %NULL if the \'${name}\' field is not needed.\n') elif field['format'] == 'guint32-array': inner_template = (' * @${field}: return location for a newly allocated array of #${public}s, or %NULL if the \'${name}\' field is not needed. Free the returned value with g_free().\n') elif field['format'] == 'guint64': inner_template = (' * @${field}: return location for a #guint64, or %NULL if the \'${name}\' field is not needed.\n') elif field['format'] == 'guint64-array': inner_template = (' * @${field}: return location for a newly allocated array of #guint64s, or %NULL if the \'${name}\' field is not needed. Free the returned value with g_free().\n') elif field['format'] == 'string': inner_template = (' * @${field}: return location for a newly allocated string, or %NULL if the \'${name}\' field is not needed. Free the returned value with g_free().\n') elif field['format'] == 'string-array': inner_template = (' * @${field}: return location for a newly allocated array of strings, or %NULL if the \'${name}\' field is not needed. Free the returned value with g_strfreev().\n') elif field['format'] == 'struct': inner_template = (' * @${field}: return location for a newly allocated #${struct}, or %NULL if the \'${name}\' field is not needed. Free the returned value with ${struct_underscore}_free().\n') elif field['format'] == 'struct-array': inner_template = (' * @${field}: return location for a newly allocated array of #${struct}s, or %NULL if the \'${name}\' field is not needed. Free the returned value with ${struct_underscore}_array_free().\n') elif field['format'] == 'ref-struct-array': inner_template = (' * @${field}: return location for a newly allocated array of #${struct}s, or %NULL if the \'${name}\' field is not needed. Free the returned value with ${struct_underscore}_array_free().\n') elif field['format'] == 'ipv4': inner_template = (' * @${field}: return location for a #MbimIPv4, or %NULL if the \'${name}\' field is not needed. Do not free the returned value, it is owned by @message.\n') elif field['format'] == 'ref-ipv4': inner_template = (' * @${field}: return location for a #MbimIPv4, or %NULL if the \'${name}\' field is not needed. Do not free the returned value, it is owned by @message.\n') elif field['format'] == 'ipv4-array': inner_template = (' * @${field}: return location for a newly allocated array of #MbimIPv4s, or %NULL if the \'${name}\' field is not needed. Free the returned value with g_free().\n') elif field['format'] == 'ipv6': inner_template = (' * @${field}: return location for a #MbimIPv6, or %NULL if the \'${name}\' field is not needed. Do not free the returned value, it is owned by @message.\n') elif field['format'] == 'ref-ipv6': inner_template = (' * @${field}: return location for a #MbimIPv6, or %NULL if the \'${name}\' field is not needed. Do not free the returned value, it is owned by @message.\n') elif field['format'] == 'ipv6-array': inner_template = (' * @${field}: return location for a newly allocated array of #MbimIPv6s, or %NULL if the \'${name}\' field is not needed. Free the returned value with g_free().\n') template += (string.Template(inner_template).substitute(translations)) template += ( ' * @error: return location for error or %NULL.\n' ' *\n' ' * Parses and returns parameters of the \'${message}\' ${message_type} command in the \'${service}\' service.\n' ' *\n' ' * Returns: %TRUE if the message was correctly parsed, %FALSE if @error is set.\n' ' */\n' 'gboolean\n' '${underscore}_${message_type}_parse (\n' ' const MbimMessage *message,\n') for field in fields: translations['field'] = utils.build_underscore_name_from_camelcase(field['name']) translations['public'] = field['public-format'] if 'public-format' in field else field['format'] translations['struct'] = field['struct-type'] if 'struct-type' in field else '' if field['format'] == 'byte-array': inner_template = (' const guint8 **${field},\n') elif field['format'] == 'unsized-byte-array' or field['format'] == 'ref-byte-array': inner_template = (' guint32 *${field}_size,\n' ' const guint8 **${field},\n') elif field['format'] == 'uuid': inner_template = (' const MbimUuid **${field},\n') elif field['format'] == 'guint32': inner_template = (' ${public} *${field},\n') elif field['format'] == 'guint32-array': inner_template = (' ${public} **${field},\n') elif field['format'] == 'guint64': inner_template = (' ${public} *${field},\n') elif field['format'] == 'guint64-array': inner_template = (' ${public} **${field},\n') elif field['format'] == 'string': inner_template = (' gchar **${field},\n') elif field['format'] == 'string-array': inner_template = (' gchar ***${field},\n') elif field['format'] == 'struct': inner_template = (' ${struct} **${field},\n') elif field['format'] == 'struct-array': inner_template = (' ${struct} ***${field},\n') elif field['format'] == 'ref-struct-array': inner_template = (' ${struct} ***${field},\n') elif field['format'] == 'ipv4': inner_template = (' const MbimIPv4 **${field},\n') elif field['format'] == 'ref-ipv4': inner_template = (' const MbimIPv4 **${field},\n') elif field['format'] == 'ipv4-array': inner_template = (' MbimIPv4 **${field},\n') elif field['format'] == 'ipv6': inner_template = (' const MbimIPv6 **${field},\n') elif field['format'] == 'ref-ipv6': inner_template = (' const MbimIPv6 **${field},\n') elif field['format'] == 'ipv6-array': inner_template = (' MbimIPv6 **${field},\n') template += (string.Template(inner_template).substitute(translations)) template += ( ' GError **error)\n' '{\n') if fields != []: template += ( ' guint32 offset = 0;\n') for field in fields: if 'always-read' in field: translations['field'] = utils.build_underscore_name_from_camelcase(field['name']) inner_template = (' guint32 _${field};\n') template += (string.Template(inner_template).substitute(translations)) if message_type == 'response': template += ( '\n' ' if (mbim_message_get_message_type (message) != MBIM_MESSAGE_TYPE_COMMAND_DONE) {\n' ' g_set_error (error,\n' ' MBIM_CORE_ERROR,\n' ' MBIM_CORE_ERROR_INVALID_MESSAGE,\n' ' \"Message is not a response\");\n' ' return FALSE;\n' ' }\n') elif message_type == 'notification': template += ( '\n' ' if (mbim_message_get_message_type (message) != MBIM_MESSAGE_TYPE_INDICATE_STATUS) {\n' ' g_set_error (error,\n' ' MBIM_CORE_ERROR,\n' ' MBIM_CORE_ERROR_INVALID_MESSAGE,\n' ' \"Message is not a notification\");\n' ' return FALSE;\n' ' }\n') else: raise ValueError('Unexpected message type \'%s\'' % message_type) for field in fields: translations['field'] = utils.build_underscore_name_from_camelcase(field['name']) translations['field_format_underscore'] = utils.build_underscore_name_from_camelcase(field['format']) translations['field_name'] = field['name'] translations['array_size_field'] = utils.build_underscore_name_from_camelcase(field['array-size-field']) if 'array-size-field' in field else '' translations['struct_name'] = utils.build_underscore_name_from_camelcase(field['struct-type']) if 'struct-type' in field else '' translations['struct_type'] = field['struct-type'] if 'struct-type' in field else '' translations['array_size'] = field['array-size'] if 'array-size' in field else '' inner_template = ( '\n' ' /* Read the \'${field_name}\' variable */\n') if 'available-if' in field: condition = field['available-if'] translations['condition_field'] = utils.build_underscore_name_from_camelcase(condition['field']) translations['condition_operation'] = condition['operation'] translations['condition_value'] = condition['value'] inner_template += ( ' if (!(_${condition_field} ${condition_operation} ${condition_value})) {\n') if field['format'] == 'byte-array': inner_template += ( ' if (${field})\n' ' *${field} = NULL;\n') elif field['format'] == 'unsized-byte-array' or \ field['format'] == 'ref-byte-array': inner_template += ( ' if (${field}_size)\n' ' *${field}_size = 0;\n' ' if (${field})\n' ' *${field} = NULL;\n') elif field['format'] == 'guint32-array' or \ field['format'] == 'string' or \ field['format'] == 'string-array' or \ field['format'] == 'struct' or \ field['format'] == 'struct-array' or \ field['format'] == 'ref-struct-array' or \ field['format'] == 'ipv4' or \ field['format'] == 'ref-ipv4' or \ field['format'] == 'ipv4-array' or \ field['format'] == 'ipv6' or \ field['format'] == 'ref-ipv6' or \ field['format'] == 'ipv6-array': inner_template += ( ' if (${field} != NULL)\n' ' *${field} = NULL;\n') else: raise ValueError('Field format \'%s\' unsupported as optional field' % field['format']) inner_template += ( ' } else {\n') else: inner_template += ( ' {\n') if 'always-read' in field: inner_template += ( ' _${field} = _mbim_message_read_guint32 (message, offset);\n' ' if (${field} != NULL)\n' ' *${field} = _${field};\n' ' offset += 4;\n') elif field['format'] == 'byte-array': inner_template += ( ' const guint8 *tmp;\n' '\n' ' tmp = _mbim_message_read_byte_array (message, 0, offset, FALSE, FALSE, NULL);\n' ' if (${field} != NULL)\n' ' *${field} = tmp;\n' ' offset += ${array_size};\n') elif field['format'] == 'unsized-byte-array': inner_template += ( ' const guint8 *tmp;\n' ' guint32 tmpsize;\n' '\n' ' tmp = _mbim_message_read_byte_array (message, 0, offset, FALSE, FALSE, &tmpsize);\n' ' if (${field} != NULL)\n' ' *${field} = tmp;\n' ' if (${field}_size != NULL)\n' ' *${field}_size = tmpsize;\n' ' offset += tmpsize;\n') elif field['format'] == 'ref-byte-array': inner_template += ( ' const guint8 *tmp;\n' ' guint32 tmpsize;\n' '\n' ' tmp = _mbim_message_read_byte_array (message, 0, offset, TRUE, TRUE, &tmpsize);\n' ' if (${field} != NULL)\n' ' *${field} = tmp;\n' ' if (${field}_size != NULL)\n' ' *${field}_size = tmpsize;\n' ' offset += 8;\n') elif field['format'] == 'uuid': inner_template += ( ' if (${field} != NULL)\n' ' *${field} = _mbim_message_read_uuid (message, offset);\n' ' offset += 16;\n') elif field['format'] == 'guint32': inner_template += ( ' if (${field} != NULL)\n' ' *${field} = _mbim_message_read_guint32 (message, offset);\n' ' offset += 4;\n') elif field['format'] == 'guint32-array': inner_template += ( ' if (${field} != NULL)\n' ' *${field} = _mbim_message_read_guint32_array (message, _{array_size_field}, offset);\n' ' offset += (4 * _${array_size_field});\n') elif field['format'] == 'guint64': inner_template += ( ' if (${field} != NULL)\n' ' *${field} = _mbim_message_read_guint64 (message, offset);\n' ' offset += 8;\n') elif field['format'] == 'string': inner_template += ( ' if (${field} != NULL)\n' ' *${field} = _mbim_message_read_string (message, 0, offset);\n' ' offset += 8;\n') elif field['format'] == 'string-array': inner_template += ( ' if (${field} != NULL)\n' ' *${field} = _mbim_message_read_string_array (message, _${array_size_field}, 0, offset);\n' ' offset += (8 * _${array_size_field});\n') elif field['format'] == 'struct': inner_template += ( ' ${struct_type} *tmp;\n' ' guint32 bytes_read = 0;\n' '\n' ' tmp = _mbim_message_read_${struct_name}_struct (message, offset, &bytes_read);\n' ' if (${field} != NULL)\n' ' *${field} = tmp;\n' ' else\n' ' _${struct_name}_free (tmp);\n' ' offset += bytes_read;\n') elif field['format'] == 'struct-array': inner_template += ( ' if (${field} != NULL)\n' ' *${field} = _mbim_message_read_${struct_name}_struct_array (message, _${array_size_field}, offset, FALSE);\n' ' offset += 4;\n') elif field['format'] == 'ref-struct-array': inner_template += ( ' if (${field} != NULL)\n' ' *${field} = _mbim_message_read_${struct_name}_struct_array (message, _${array_size_field}, offset, TRUE);\n' ' offset += (8 * _${array_size_field});\n') elif field['format'] == 'ipv4': inner_template += ( ' if (${field} != NULL)\n' ' *${field} = _mbim_message_read_ipv4 (message, offset, FALSE);\n' ' offset += 4;\n') elif field['format'] == 'ref-ipv4': inner_template += ( ' if (${field} != NULL)\n' ' *${field} = _mbim_message_read_ipv4 (message, offset, TRUE);\n' ' offset += 4;\n') elif field['format'] == 'ipv4-array': inner_template += ( ' if (${field} != NULL)\n' ' *${field} = _mbim_message_read_ipv4_array (message, _${array_size_field}, offset);\n' ' offset += 4;\n') elif field['format'] == 'ipv6': inner_template += ( ' if (${field} != NULL)\n' ' *${field} = _mbim_message_read_ipv6 (message, offset, FALSE);\n' ' offset += 4;\n') elif field['format'] == 'ref-ipv6': inner_template += ( ' if (${field} != NULL)\n' ' *${field} = _mbim_message_read_ipv6 (message, offset, TRUE);\n' ' offset += 4;\n') elif field['format'] == 'ipv6-array': inner_template += ( ' if (${field} != NULL)\n' ' *${field} = _mbim_message_read_ipv6_array (message, _${array_size_field}, offset);\n' ' offset += 4;\n') inner_template += ( ' }\n') template += (string.Template(inner_template).substitute(translations)) template += ( '\n' ' return TRUE;\n' '}\n') cfile.write(string.Template(template).substitute(translations))
def _emit_read(self, cfile): translations = { 'name' : self.name, 'name_underscore' : utils.build_underscore_name_from_camelcase(self.name), 'struct_size' : self.size } template = ( '\n' 'static ${name} *\n' '_mbim_message_read_${name_underscore}_struct (\n' ' const MbimMessage *self,\n' ' guint32 relative_offset,\n' ' guint32 *bytes_read)\n' '{\n' ' ${name} *out;\n' ' guint32 offset = relative_offset;\n' '\n' ' g_assert (self != NULL);\n' '\n' ' out = g_new (${name}, 1);\n') for field in self.contents: translations['field_name_underscore'] = utils.build_underscore_name_from_camelcase(field['name']) inner_template = '' if field['format'] == 'uuid': inner_template += ( '\n' ' memcpy (&(out->${field_name_underscore}), _mbim_message_read_uuid (self, offset), 16);\n' ' offset += 16;\n') elif field['format'] == 'ref-byte-array': if 'array-size-field' in field: translations['array_size_field_name_underscore'] = utils.build_underscore_name_from_camelcase(field['array-size-field']) inner_template += ( '\n' ' {\n' ' const guint8 *tmp;\n' '\n' ' tmp = _mbim_message_read_byte_array (self, relative_offset, offset, TRUE, FALSE, NULL);\n' ' out->${field_name_underscore} = g_malloc (out->${array_size_field_name_underscore});\n' ' memcpy (out->${field_name_underscore}, tmp, out->${array_size_field_name_underscore});\n' ' offset += 4;\n' ' }\n') else: inner_template += ( '\n' ' {\n' ' const guint8 *tmp;\n' '\n' ' tmp = _mbim_message_read_byte_array (self, relative_offset, offset, TRUE, TRUE, &(out->${field_name_underscore}_size));\n' ' out->${field_name_underscore} = g_malloc (out->${field_name_underscore}_size);\n' ' memcpy (out->${field_name_underscore}, tmp, out->${field_name_underscore}_size);\n' ' offset += 8;\n' ' }\n') elif field['format'] == 'unsized-byte-array': inner_template += ( '\n' ' {\n' ' const guint8 *tmp;\n' '\n' ' tmp = _mbim_message_read_byte_array (self, relative_offset, offset, FALSE, FALSE, &(out->${field_name_underscore}_size));\n' ' out->${field_name_underscore} = g_malloc (out->${field_name_underscore}_size);\n' ' memcpy (out->${field_name_underscore}, tmp, out->${field_name_underscore}_size);\n' ' /* no offset update expected, this should be the last field */\n' ' }\n') elif field['format'] == 'byte-array': translations['array_size'] = field['array-size'] inner_template += ( '\n' ' {\n' ' const guint8 *tmp;\n' '\n' ' tmp = _mbim_message_read_byte_array (self, relative_offset, offset, FALSE, FALSE, NULL));\n' ' memcpy (out->${field_name_underscore}, tmp, ${array_size});\n' ' offset += ${array_size};\n' ' }\n') elif field['format'] == 'guint32': inner_template += ( '\n' ' out->${field_name_underscore} = _mbim_message_read_guint32 (self, offset);\n' ' offset += 4;\n') elif field['format'] == 'guint32-array': translations['array_size_field_name_underscore'] = utils.build_underscore_name_from_camelcase(field['array-size-field']) inner_template += ( '\n' ' out->${field_name_underscore} = _mbim_message_read_guint32_array (self, out->${array_size_field_name_underscore}, offset);\n' ' offset += (4 * out->${array_size_field_name_underscore});\n') elif field['format'] == 'guint64': inner_template += ( '\n' ' out->${field_name_underscore} = _mbim_message_read_guint64 (self, offset);\n' ' offset += 8;\n') elif field['format'] == 'string': inner_template += ( '\n' ' out->${field_name_underscore} = _mbim_message_read_string (self, relative_offset, offset);\n' ' offset += 8;\n') elif field['format'] == 'string-array': translations['array_size_field_name_underscore'] = utils.build_underscore_name_from_camelcase(field['array-size-field']) inner_template += ( '\n' ' out->${field_name_underscore} = _mbim_message_read_string_array (self, out->${array_size_field_name_underscore}, relative_offset, offset);\n' ' offset += (8 * out->${array_size_field_name_underscore});\n') elif field['format'] == 'ipv4': inner_template += ( '\n' ' memcpy (&(out->${field_name_underscore}), _mbim_message_read_ipv4 (self, offset, FALSE), 4);\n' ' offset += 4;\n') elif field['format'] == 'ref-ipv4': inner_template += ( '\n' ' memcpy (&(out->${field_name_underscore}), _mbim_message_read_ipv4 (self, offset, TRUE), 4);\n' ' offset += 4;\n') elif field['format'] == 'ipv4-array': inner_template += ( '\n' ' out->${field_name_underscore} =_mbim_message_read_ipv4_array (self, out->${array_size_field_name_underscore}, offset);\n' ' offset += 4;\n') elif field['format'] == 'ipv6': inner_template += ( '\n' ' memcpy (&(out->${field_name_underscore}), _mbim_message_read_ipv6 (self, offset, FALSE), 16);\n' ' offset += 4;\n') elif field['format'] == 'ref-ipv6': inner_template += ( '\n' ' memcpy (&(out->${field_name_underscore}), _mbim_message_read_ipv6 (self, offset, TRUE), 16);\n' ' offset += 4;\n') elif field['format'] == 'ipv6-array': inner_template += ( '\n' ' out->${field_name_underscore} =_mbim_message_read_ipv6_array (self, out->${array_size_field_name_underscore}, offset);\n' ' offset += 4;\n') else: raise ValueError('Cannot handle format \'%s\' in struct' % field['format']) template += string.Template(inner_template).substitute(translations) template += ( '\n' ' if (bytes_read)\n' ' *bytes_read = (offset - relative_offset);\n' '\n' ' return out;\n' '}\n') cfile.write(string.Template(template).substitute(translations)) template = ( '\n' 'static ${name} **\n' '_mbim_message_read_${name_underscore}_struct_array (\n' ' const MbimMessage *self,\n' ' guint32 array_size,\n' ' guint32 relative_offset_array_start,\n' ' gboolean refs)\n' '{\n' ' ${name} **out;\n' ' guint32 i;\n' ' guint32 offset;\n' '\n' ' if (!array_size)\n' ' return NULL;\n' '\n' ' out = g_new (${name} *, array_size + 1);\n' '\n' ' if (!refs) {\n' ' offset = _mbim_message_read_guint32 (self, relative_offset_array_start);\n' ' for (i = 0; i < array_size; i++, offset += ${struct_size})\n' ' out[i] = _mbim_message_read_${name_underscore}_struct (self, offset, NULL);\n' ' } else {\n' ' offset = relative_offset_array_start;\n' ' for (i = 0; i < array_size; i++, offset += 8)\n' ' out[i] = _mbim_message_read_${name_underscore}_struct (self, _mbim_message_read_guint32 (self, offset), NULL);\n' ' }\n' ' out[array_size] = NULL;\n' '\n' ' return out;\n' '}\n') cfile.write(string.Template(template).substitute(translations))
def _emit_type(self, hfile): translations = { 'name' : self.name } template = ( '\n' '/**\n' ' * ${name}:\n') for field in self.contents: translations['field_name_underscore'] = utils.build_underscore_name_from_camelcase(field['name']) if field['format'] == 'uuid': inner_template = ( ' * @${field_name_underscore}: a #MbimUuid.\n') elif field['format'] =='byte-array': inner_template = (' * @${field_name_underscore}: an array of #guint8 values.\n') elif field['format'] in ['unsized-byte-array', 'ref-byte-array', 'ref-byte-array-no-offset']: inner_template = '' if 'array-size-field' not in field: inner_template += (' * @${field_name_underscore}_size: size of the ${field_name_underscore} array.\n') inner_template += (' * @${field_name_underscore}: an array of #guint8 values.\n') elif field['format'] == 'guint32': inner_template = ( ' * @${field_name_underscore}: a #guint32.\n') elif field['format'] == 'guint32-array': inner_template = ( ' * @${field_name_underscore}: an array of #guint32 values.\n') elif field['format'] == 'guint64': inner_template = ( ' * @${field_name_underscore}: a #guint64.\n') elif field['format'] == 'string': inner_template = ( ' * @${field_name_underscore}: a string.\n') elif field['format'] == 'string-array': inner_template = ( ' * @${field_name_underscore}: an array of strings.\n') elif field['format'] == 'ipv4': inner_template = ( ' * @${field_name_underscore}: a #MbimIPv4.\n') elif field['format'] == 'ref-ipv4': inner_template = ( ' * @${field_name_underscore}: a #MbimIPv4.\n') elif field['format'] == 'ipv6': inner_template = ( ' * @${field_name_underscore}: a #MbimIPv6\n') elif field['format'] == 'ref-ipv6': inner_template = ( ' * @${field_name_underscore}: a #MbimIPv6\n') else: raise ValueError('Cannot handle format \'%s\' in struct' % field['format']) template += string.Template(inner_template).substitute(translations) template += ( ' */\n' 'typedef struct {\n') for field in self.contents: translations['field_name_underscore'] = utils.build_underscore_name_from_camelcase(field['name']) if field['format'] == 'uuid': inner_template = ( ' MbimUuid ${field_name_underscore};\n') elif field['format'] == 'byte-array': translations['array_size'] = field['array-size'] inner_template = ( ' guint8 ${field_name_underscore}[${array_size}];\n') elif field['format'] in ['unsized-byte-array', 'ref-byte-array', 'ref-byte-array-no-offset']: inner_template = '' if 'array-size-field' not in field: inner_template += ( ' guint32 ${field_name_underscore}_size;\n') inner_template += ( ' guint8 *${field_name_underscore};\n') elif field['format'] == 'guint32': inner_template = ( ' guint32 ${field_name_underscore};\n') elif field['format'] == 'guint32-array': inner_template = ( ' guint32 *${field_name_underscore};\n') elif field['format'] == 'guint64': inner_template = ( ' guint64 ${field_name_underscore};\n') elif field['format'] == 'string': inner_template = ( ' gchar *${field_name_underscore};\n') elif field['format'] == 'string-array': inner_template = ( ' gchar **${field_name_underscore};\n') elif field['format'] == 'ipv4': inner_template = ( ' MbimIPv4 ${field_name_underscore};\n') elif field['format'] == 'ref-ipv4': inner_template = ( ' MbimIPv4 ${field_name_underscore};\n') elif field['format'] == 'ipv6': inner_template = ( ' MbimIPv6 ${field_name_underscore};\n') elif field['format'] == 'ref-ipv6': inner_template = ( ' MbimIPv6 ${field_name_underscore};\n') else: raise ValueError('Cannot handle format \'%s\' in struct' % field['format']) template += string.Template(inner_template).substitute(translations) template += ( '} ${name};\n') hfile.write(string.Template(template).substitute(translations))
def _emit_type(self, hfile): translations = { 'name' : self.name } template = ( '\n' '/**\n' ' * ${name}:\n') for field in self.contents: translations['field_name_underscore'] = utils.build_underscore_name_from_camelcase(field['name']) if field['format'] == 'uuid': inner_template = ( ' * @${field_name_underscore}: a #MbimUuid.\n') elif field['format'] =='byte-array': inner_template = (' * @${field_name_underscore}: an array of #guint8 values.\n') elif field['format'] =='unsized-byte-array' or field['format'] == 'ref-byte-array': inner_template = '' if 'array-size-field' not in field: inner_template += (' * @${field_name_underscore}_size: size of the ${field_name_underscore} array.\n') inner_template += (' * @${field_name_underscore}: an array of #guint8 values.\n') elif field['format'] == 'guint32': inner_template = ( ' * @${field_name_underscore}: a #guint32.\n') elif field['format'] == 'guint32-array': inner_template = ( ' * @${field_name_underscore}: an array of #guint32 values.\n') elif field['format'] == 'guint64': inner_template = ( ' * @${field_name_underscore}: a #guint64.\n') elif field['format'] == 'string': inner_template = ( ' * @${field_name_underscore}: a string.\n') elif field['format'] == 'string-array': inner_template = ( ' * @${field_name_underscore}: an array of strings.\n') elif field['format'] == 'ipv4': inner_template = ( ' * @${field_name_underscore}: a #MbimIPv4.\n') elif field['format'] == 'ref-ipv4': inner_template = ( ' * @${field_name_underscore}: a #MbimIPv4.\n') elif field['format'] == 'ipv4-array': inner_template = ( ' * @${field_name_underscore}: an array of #MbimIPv4 values.\n') elif field['format'] == 'ipv6': inner_template = ( ' * @${field_name_underscore}: a #MbimIPv6\n') elif field['format'] == 'ref-ipv6': inner_template = ( ' * @${field_name_underscore}: a #MbimIPv6\n') elif field['format'] == 'ipv6-array': inner_template = ( ' * @${field_name_underscore}: an array of #MbimIPv6 values.\n') else: raise ValueError('Cannot handle format \'%s\' in struct' % field['format']) template += string.Template(inner_template).substitute(translations) template += ( ' */\n' 'typedef struct {\n') for field in self.contents: translations['field_name_underscore'] = utils.build_underscore_name_from_camelcase(field['name']) if field['format'] == 'uuid': inner_template = ( ' MbimUuid ${field_name_underscore};\n') elif field['format'] == 'byte-array': translations['array_size'] = field['array-size'] inner_template = ( ' guint8 ${field_name_underscore}[${array_size}];\n') elif field['format'] == 'unsized-byte-array' or field['format'] == 'ref-byte-array': inner_template = '' if 'array-size-field' not in field: inner_template += ( ' guint32 ${field_name_underscore}_size;\n') inner_template += ( ' guint8 *${field_name_underscore};\n') elif field['format'] == 'guint32': inner_template = ( ' guint32 ${field_name_underscore};\n') elif field['format'] == 'guint32-array': inner_template = ( ' guint32 *${field_name_underscore};\n') elif field['format'] == 'guint64': inner_template = ( ' guint64 ${field_name_underscore};\n') elif field['format'] == 'string': inner_template = ( ' gchar *${field_name_underscore};\n') elif field['format'] == 'string-array': inner_template = ( ' gchar **${field_name_underscore};\n') elif field['format'] == 'ipv4': inner_template = ( ' MbimIPv4 ${field_name_underscore};\n') elif field['format'] == 'ref-ipv4': inner_template = ( ' MbimIPv4 ${field_name_underscore};\n') elif field['format'] == 'ipv4-array': inner_template = ( ' MbimIPv4 *${field_name_underscore};\n') elif field['format'] == 'ipv6': inner_template = ( ' MbimIPv6 ${field_name_underscore};\n') elif field['format'] == 'ref-ipv6': inner_template = ( ' MbimIPv6 ${field_name_underscore};\n') elif field['format'] == 'ipv6-array': inner_template = ( ' MbimIPv6 *${field_name_underscore};\n') else: raise ValueError('Cannot handle format \'%s\' in struct' % field['format']) template += string.Template(inner_template).substitute(translations) template += ( '} ${name};\n') hfile.write(string.Template(template).substitute(translations))
def _emit_append(self, cfile): translations = { 'name' : self.name, 'name_underscore' : utils.build_underscore_name_from_camelcase(self.name), 'struct_size' : self.size } template = ( '\n' 'static GByteArray *\n' '_${name_underscore}_struct_new (const ${name} *value)\n' '{\n' ' MbimStructBuilder *builder;\n' '\n' ' g_assert (value != NULL);\n' '\n' ' builder = _mbim_struct_builder_new ();\n') for field in self.contents: translations['field'] = utils.build_underscore_name_from_camelcase(field['name']) translations['array_size'] = field['array-size'] if 'array-size' in field else '' translations['array_size_field'] = utils.build_underscore_name_from_camelcase(field['array-size-field']) if 'array-size-field' in field else '' translations['pad_array'] = field['pad-array'] if 'pad-array' in field else 'TRUE' if field['format'] == 'uuid': inner_template = (' _mbim_struct_builder_append_uuid (builder, &(value->${field}));\n') elif field['format'] == 'byte-array': inner_template = (' _mbim_struct_builder_append_byte_array (builder, FALSE, FALSE, ${pad_array}, value->${field}, ${array_size});\n') elif field['format'] == 'unsized-byte-array': inner_template = (' _mbim_struct_builder_append_byte_array (builder, FALSE, FALSE, ${pad_array}, value->${field}, value->${field}_size);\n') elif field['format'] in ['ref-byte-array', 'ref-byte-array-no-offset']: translations['has_offset'] = 'TRUE' if field['format'] == 'ref-byte-array' else 'FALSE' if 'array-size-field' in field: inner_template = (' _mbim_struct_builder_append_byte_array (builder, ${has_offset}, FALSE, ${pad_array}, value->${field}, value->${array_size_field});\n') else: inner_template = (' _mbim_struct_builder_append_byte_array (builder, ${has_offset}, TRUE, ${pad_array}, value->${field}, value->${field}_size);\n') elif field['format'] == 'guint32': inner_template = (' _mbim_struct_builder_append_guint32 (builder, value->${field});\n') elif field['format'] == 'guint32-array': inner_template = (' _mbim_struct_builder_append_guint32_array (builder, value->${field}, value->${array_size_field});\n') elif field['format'] == 'guint64': inner_template = (' _mbim_struct_builder_append_guint64 (builder, value->${field});\n') elif field['format'] == 'string': inner_template = (' _mbim_struct_builder_append_string (builder, value->${field});\n') elif field['format'] == 'string-array': inner_template = (' _mbim_struct_builder_append_string_array (builder, value->${field}, value->${array_size_field});\n') elif field['format'] == 'ipv4': inner_template = (' _mbim_struct_builder_append_ipv4 (builder, &value->${field}, FALSE);\n') elif field['format'] == 'ref-ipv4': inner_template = (' _mbim_struct_builder_append_ipv4 (builder, &value->${field}, TRUE);\n') elif field['format'] == 'ipv6': inner_template = (' _mbim_struct_builder_append_ipv6 (builder, &value->${field}, FALSE);\n') elif field['format'] == 'ref-ipv6': inner_template = (' _mbim_struct_builder_append_ipv6 (builder, &value->${field}, TRUE);\n') else: raise ValueError('Cannot handle format \'%s\' in struct' % field['format']) template += string.Template(inner_template).substitute(translations) template += ( '\n' ' return _mbim_struct_builder_complete (builder);\n' '}\n') cfile.write(string.Template(template).substitute(translations)) template = ( '\n' 'static void\n' '_mbim_struct_builder_append_${name_underscore}_struct (\n' ' MbimStructBuilder *builder,\n' ' const ${name} *value)\n' '{\n' ' GByteArray *raw;\n' '\n' ' raw = _${name_underscore}_struct_new (value);\n' ' g_byte_array_append (builder->fixed_buffer, raw->data, raw->len);\n' ' g_byte_array_unref (raw);\n' '}\n' '\n' 'static void\n' '_mbim_message_command_builder_append_${name_underscore}_struct (\n' ' MbimMessageCommandBuilder *builder,\n' ' const ${name} *value)\n' '{\n' ' _mbim_struct_builder_append_${name_underscore}_struct (builder->contents_builder, value);\n' '}\n') cfile.write(string.Template(template).substitute(translations)) template = ( '\n' 'static void\n' '_mbim_struct_builder_append_${name_underscore}_struct_array (\n' ' MbimStructBuilder *builder,\n' ' const ${name} *const *values,\n' ' guint32 n_values,\n' ' gboolean refs)\n' '{\n' ' guint32 offset;\n' ' guint32 i;\n' ' GByteArray *raw_all = NULL;\n' '\n' ' if (!refs) {\n' ' for (i = 0; i < n_values; i++) {\n' ' GByteArray *raw;\n' '\n' ' raw = _${name_underscore}_struct_new (values[i]);\n' ' if (!raw_all)\n' ' raw_all = raw;\n' ' else {\n' ' g_byte_array_append (raw_all, raw->data, raw->len);\n' ' g_byte_array_unref (raw);\n' ' }\n' ' }\n' '\n' ' if (!raw_all) {\n' ' offset = 0;\n' ' g_byte_array_append (builder->fixed_buffer, (guint8 *)&offset, sizeof (offset));\n' ' } else {\n' ' guint32 offset_offset;\n' '\n' ' /* Offset of the offset */\n' ' offset_offset = builder->fixed_buffer->len;\n' ' /* Length *not* in LE yet */\n' ' offset = builder->variable_buffer->len;\n' ' /* Add the offset value */\n' ' g_byte_array_append (builder->fixed_buffer, (guint8 *)&offset, sizeof (offset));\n' ' /* Configure the value to get updated */\n' ' g_array_append_val (builder->offsets, offset_offset);\n' ' /* Add the final array itself */\n' ' g_byte_array_append (builder->variable_buffer, raw_all->data, raw_all->len);\n' ' g_byte_array_unref (raw_all);\n' ' }\n' ' } else {\n' ' for (i = 0; i < n_values; i++) {\n' ' guint32 length;\n' ' guint32 offset_offset;\n' ' GByteArray *raw;\n' '\n' ' raw = _${name_underscore}_struct_new (values[i]);\n' ' g_assert (raw->len > 0);\n' '\n' ' /* Offset of the offset */\n' ' offset_offset = builder->fixed_buffer->len;\n' '\n' ' /* Length *not* in LE yet */\n' ' offset = builder->variable_buffer->len;\n' ' /* Add the offset value */\n' ' g_byte_array_append (builder->fixed_buffer, (guint8 *)&offset, sizeof (offset));\n' ' /* Configure the value to get updated */\n' ' g_array_append_val (builder->offsets, offset_offset);\n' '\n' ' /* Add the length value */\n' ' length = GUINT32_TO_LE (raw->len);\n' ' g_byte_array_append (builder->fixed_buffer, (guint8 *)&length, sizeof (length));\n' '\n' ' /* And finally, the bytearray itself to the variable buffer */\n' ' g_byte_array_append (builder->variable_buffer, (const guint8 *)raw->data, (guint)raw->len);\n' ' g_byte_array_unref (raw);\n' ' }\n' ' }\n' '}\n') cfile.write(string.Template(template).substitute(translations)) template = ( '\n' 'static void\n' '_mbim_message_command_builder_append_${name_underscore}_struct_array (\n' ' MbimMessageCommandBuilder *builder,\n' ' const ${name} *const *values,\n' ' guint32 n_values,\n' ' gboolean refs)\n' '{\n' ' _mbim_struct_builder_append_${name_underscore}_struct_array (builder->contents_builder, values, n_values, refs);\n' '}\n') cfile.write(string.Template(template).substitute(translations))
def emit_get_printable(self, f, line_prefix): common_format = '' common_cast = '' if self.private_format == 'guint8': common_format = '%u' common_cast = '(guint)' elif self.private_format == 'guint16': common_format = '%" G_GUINT16_FORMAT "' elif self.private_format == 'guint32': common_format = '%" G_GUINT32_FORMAT "' elif self.private_format == 'guint64': common_format = '%" G_GUINT64_FORMAT "' elif self.private_format == 'gint8': common_format = '%d' common_cast = '(gint)' elif self.private_format == 'gint16': common_format = '%" G_GINT16_FORMAT "' elif self.private_format == 'gint32': common_format = '%" G_GINT32_FORMAT "' elif self.private_format == 'gint64': common_format = '%" G_GINT64_FORMAT "' elif self.private_format in ('gfloat', 'gdouble'): common_format = '%lf' common_cast = '(gdouble)' translations = { 'lp' : line_prefix, 'private_format' : self.private_format, 'public_format' : self.public_format, 'len' : self.guint_sized_size, 'common_format' : common_format, 'common_cast' : common_cast } if self.private_format not in ('guint8', 'gint8'): translations['endian'] = ' ' + self.endian + ',' else: translations['endian'] = '' template = ( '\n' '${lp}{\n' '${lp} ${private_format} tmp;\n' '\n') if self.format == 'guint-sized': template += ( '${lp} if (!qmi_message_tlv_read_sized_guint (message, init_offset, &offset, ${len},${endian} &tmp, &error))\n' '${lp} goto out;\n') elif self.format == 'gfloat': template += ( '${lp} if (!qmi_message_tlv_read_gfloat_endian (message, init_offset, &offset,${endian} &tmp, &error))\n' '${lp} goto out;\n') else: template += ( '${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') 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' '#elif defined __${public_type_underscore_upper}_IS_FLAGS__\n' '${lp} {\n' '${lp} g_autofree gchar *flags_str = NULL;\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} }\n' '#else\n' '# error unexpected public format: ${public_format}\n' '#endif\n') else: template += ( '${lp} g_string_append_printf (printable, "${common_format}", ${common_cast}tmp);\n') template += ( '${lp}}\n') f.write(string.Template(template).substitute(translations))
def emit_get_printable(self, f, line_prefix, printable, buffer_name, buffer_len): common_format = '' common_cast = '' if self.private_format == 'guint8': common_format = '%u' common_cast = '(guint)' elif self.private_format == 'guint16': common_format = '%" G_GUINT16_FORMAT "' elif self.private_format == 'guint32': common_format = '%" G_GUINT32_FORMAT "' elif self.private_format == 'guint64': common_format = '%" G_GUINT64_FORMAT "' elif self.private_format == 'gint8': common_format = '%d' common_cast = '(gint)' elif self.private_format == 'gint16': common_format = '%" G_GINT16_FORMAT "' elif self.private_format == 'gint32': common_format = '%" G_GINT32_FORMAT "' elif self.private_format == 'gint64': common_format = '%" G_GINT64_FORMAT "' translations = { 'lp' : line_prefix, '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 } template = ( '\n' '${lp}{\n' '${lp} ${private_format} tmp;\n' '\n') 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') 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': template += ( '${lp} ${endian},\n') template += ( '${lp} &tmp);\n' '\n') if self.public_format == 'gboolean': template += ( '${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' '#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_free (flags_str);\n' '${lp} }\n' '#else\n' '# error unexpected public format: ${public_format}\n' '#endif\n') else: template += ( '${lp} g_string_append_printf (${printable}, "${common_format}", ${common_cast}tmp);\n') template += ( '${lp}}\n') f.write(string.Template(template).substitute(translations))