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:
parent
a6bee847c7
commit
75f3c85b10
|
@ -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"
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
Loading…
Reference in New Issue