qmi-codegen: support a new 'version' tag in the messages

If the 'version' tag is given in the messages and the `QmiDevice' is opened with
a explicit version info check, we will return an error if we're trying to send
a message which was introduced in a newer version of a service we support.
This commit is contained in:
Aleksander Morgado 2012-07-23 12:19:04 +02:00
parent a6bee847c7
commit 75f3c85b10
4 changed files with 68 additions and 4 deletions

View File

@ -42,6 +42,8 @@ class Message:
self.id = dictionary['id']
# The type, which must always be 'Message'
self.type = dictionary['type']
# The version info, optional
self.version_info = dictionary['version'].split('.') if 'version' in dictionary else []
# Create the composed full name (prefix + service + name),
# e.g. "Qmi Message Ctl Something Output Result"

View File

@ -118,6 +118,52 @@ class MessageList:
cfile.write(string.Template(template).substitute(translations))
"""
Emit the method responsible for getting in which version the messages were
introduced.
"""
def __emit_get_version_introduced(self, hfile, cfile):
translations = { 'service' : string.lower(self.service) }
template = (
'\n'
'gboolean qmi_message_${service}_get_version_introduced (\n'
' QmiMessage *self,\n'
' guint *major,\n'
' guint *minor);\n')
hfile.write(string.Template(template).substitute(translations))
template = (
'\n'
'gboolean\n'
'qmi_message_${service}_get_version_introduced (\n'
' QmiMessage *self,\n'
' guint *major,\n'
' guint *minor)\n'
'{\n'
' switch (qmi_message_get_message_id (self)) {\n')
for message in self.list:
# Only add if we know the version info
if message.version_info != []:
translations['enum_name'] = message.id_enum_name
translations['message_major'] = message.version_info[0]
translations['message_minor'] = message.version_info[1]
inner_template = (
' case ${enum_name}:\n'
' *major = ${message_major};\n'
' *minor = ${message_minor};\n'
' return TRUE;\n')
template += string.Template(inner_template).substitute(translations)
template += (
' default:\n'
' return FALSE;\n'
' }\n'
'}\n')
cfile.write(string.Template(template).substitute(translations))
"""
Emit the message list handling implementation
"""
@ -133,3 +179,4 @@ class MessageList:
utils.add_separator(hfile, 'Service-specific printable', self.service);
utils.add_separator(cfile, 'Service-specific printable', self.service);
self.__emit_get_printable(hfile, cfile)
self.__emit_get_version_introduced(hfile, cfile)

View File

@ -707,10 +707,25 @@ qmi_message_get_printable (QmiMessage *self,
}
gboolean
qmi_message_get_version_introduced (QmiMessage *message,
qmi_message_get_version_introduced (QmiMessage *self,
guint *major,
guint *minor)
{
/* TODO */
return FALSE;
switch (qmi_message_get_service (self)) {
case QMI_SERVICE_CTL:
/* For CTL service, we'll assume the minimum one */
*major = 0;
*minor = 0;
return TRUE;
case QMI_SERVICE_DMS:
return qmi_message_dms_get_version_introduced (self, major, minor);
case QMI_SERVICE_WDS:
return qmi_message_wds_get_version_introduced (self, major, minor);
default:
/* For the still unsupported services, cannot do anything */
return FALSE;
}
}

View File

@ -99,7 +99,7 @@ guint16 qmi_message_get_transaction_id (QmiMessage *self);
guint8 qmi_message_get_qmux_flags (QmiMessage *self);
guint8 qmi_message_get_qmi_flags (QmiMessage *self);
gboolean qmi_message_get_version_introduced (QmiMessage *message,
gboolean qmi_message_get_version_introduced (QmiMessage *self,
guint *major,
guint *minor);