summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjacobkeeler <jacob.keeler@livioradio.com>2020-08-12 16:14:55 -0400
committerjacobkeeler <jacob.keeler@livioradio.com>2020-08-12 16:14:55 -0400
commit529a121e0707ad3919da201dfa5f2d305e335134 (patch)
tree50ee3761a6d432b57eaf9175799bfbc761e73264
parentcb42c627b837df0ce184ba849c232dd36bd92c91 (diff)
downloadsdl_core-fix/function_versioning.tar.gz
Add versioning information for functions in InterfaceGenerator scriptfix/function_versioning
-rw-r--r--src/components/smart_objects/src/object_schema_item.cc9
-rwxr-xr-xtools/InterfaceGenerator/generator/generators/SmartFactoryBase.py123
2 files changed, 124 insertions, 8 deletions
diff --git a/src/components/smart_objects/src/object_schema_item.cc b/src/components/smart_objects/src/object_schema_item.cc
index c8eab82e8a..7e5c49bae0 100644
--- a/src/components/smart_objects/src/object_schema_item.cc
+++ b/src/components/smart_objects/src/object_schema_item.cc
@@ -42,6 +42,7 @@ namespace {
const char connection_key[] = "connection_key";
const char binary_data[] = "binary_data";
const char app_id[] = "appID";
+const char msg_params[] = "msg_params";
const utils::SemanticVersion kModuleVersion(application_manager::major_version,
application_manager::minor_version,
application_manager::patch_version);
@@ -132,6 +133,14 @@ errors::eType CObjectSchemaItem::validate(
std::string validation_info = "Missing mandatory parameter: " + key;
report->set_validation_info(validation_info);
return errors::MISSING_MANDATORY_PARAMETER;
+ } else if (key.compare(msg_params) == 0) {
+ // If the message params struct was filtered, that means that the
+ // app's version is too low to use the message.
+ std::string validation_info =
+ "Function is not available for SyncMsgVersion " +
+ MessageVersion.toString();
+ report->set_validation_info(validation_info);
+ return errors::INVALID_VALUE;
}
continue;
}
diff --git a/tools/InterfaceGenerator/generator/generators/SmartFactoryBase.py b/tools/InterfaceGenerator/generator/generators/SmartFactoryBase.py
index de0067bba8..73ab03f205 100755
--- a/tools/InterfaceGenerator/generator/generators/SmartFactoryBase.py
+++ b/tools/InterfaceGenerator/generator/generators/SmartFactoryBase.py
@@ -738,19 +738,18 @@ class CodeGenerator(object):
item.name += "_history_v" + str(len(history_list)-count)
result_array.append(self._gen_schema_item_decl(item))
count += 1
- result_array.append(self._gen_history_vector_decl(history_list, x.name))
+ result_array.append(self._gen_history_vector_decl(x.name))
result = u"\n\n".join(result_array)
return result
- def _gen_history_vector_decl(self, history_list, name):
+ def _gen_history_vector_decl(self, name):
"""Generate History Vector Declaration.
Generates the declaration and initialization
of a vector of schema items
Arguments:
- history_list -> list of history items
name -> name of parent parameter name
Returns:
@@ -759,9 +758,40 @@ class CodeGenerator(object):
result_array = []
result_array.append(self._impl_code_shared_ptr_vector_template.substitute(var_name = name))
result = u"\n".join(result_array)
+ if result is not "":
+ result += u"\n\n"
return result
+ def _gen_function_history_decl(self, member):
+ """Generate History Vector Declaration for function.
+ Generates the declaration and initialization
+ of a function
+
+ Arguments:
+ member -> function member
+
+ Returns:
+ String with history array code.
+ """
+ result_array = []
+ count = 0
+ if member.history is not None:
+ history_list = member.history
+ result_array.append(self._gen_history_vector_decl(member.name))
+ for item in history_list:
+ item.name += "_history_v" + str(len(history_list)-count)
+ result_array.append(self._impl_code_item_decl_template.substitute(
+ comment="",
+ var_name=self._gen_schema_item_var_name(item),
+ item_decl=self._impl_function_schema))
+ result_array.append(self._gen_function_history_vector_item_fill(item, member.name))
+ count += 1
+
+ result = u"\n\n".join(result_array)
+ if result is not "":
+ result += u"\n\n"
+ return result
def _gen_schema_item_decl(self, member):
"""Generate schema item declaration.
@@ -777,7 +807,7 @@ class CodeGenerator(object):
"""
- return self._impl_code_item_decl_temlate.substitute(
+ return self._impl_code_item_decl_template.substitute(
comment=self._gen_comment(member, False),
var_name=self._gen_schema_item_var_name(member),
item_decl=self._gen_schema_item_decl_code(
@@ -960,6 +990,40 @@ class CodeGenerator(object):
raise GenerateError("Unexpected call to the unimplemented function.")
+ def _gen_function_member(self, member):
+ """Generate function member fill code.
+
+ Generates source code that fills new schema with items.
+
+ Keyword arguments:
+ members -- list of struct members/function parameters to process.
+
+ Returns:
+ String with function member definition fill code.
+
+ """
+ self._check_member_history(member)
+
+ if (member.since is not None):
+ if member.history is not None:
+ return self._impl_function_member_fill_template_with_version_and_history_vector.substitute(
+ schema=self._impl_function_schema,
+ since=member.since if member.since is not None else "",
+ until=member.until if member.until is not None else "",
+ deprecated=member.deprecated if member.deprecated is not None else u"false",
+ removed=member.removed if member.removed is not None else u"false",
+ vector_name=member.name)
+ else:
+ return self._impl_function_member_fill_template_with_version.substitute(
+ schema=self._impl_function_schema,
+ since=member.since if member.since is not None else "",
+ until=member.until if member.until is not None else "",
+ deprecated=member.deprecated if member.deprecated is not None else u"false",
+ removed=member.removed if member.removed is not None else u"false")
+ else:
+ return self._impl_function_member_fill_template.substitute(
+ schema=self._impl_function_schema)
+
def _check_member_history(self, member):
"""
Checks set of rules that history items are valid
@@ -1056,6 +1120,34 @@ class CodeGenerator(object):
else:
print("Warning! History item does not have any version history. Omitting " + member.name)
+ def _gen_function_history_vector_item_fill(self, member, vector_name):
+ """Generate schema item fill code for function.
+
+ Generates source code that fills history vector with item.
+
+ Keyword arguments:
+ member -- struct member/function parameter to process.
+
+ Returns:
+ String with schema item fill code.
+
+ """
+
+ if (member.since is not None or
+ member.until is not None or
+ member.deprecated is not None or
+ member.removed is not None):
+ return self._impl_code_append_history_vector_template.substitute(
+ vector_name=vector_name,
+ name=member.name,
+ mandatory=u"true",
+ since=member.since if member.since is not None else "",
+ until=member.until if member.until is not None else "",
+ deprecated=member.deprecated if member.deprecated is not None else u"false",
+ removed=member.removed if member.removed is not None else u"false")
+ else:
+ print("Warning! History item does not have any version history. Omitting " + member.name)
+
@staticmethod
def _gen_schema_item_var_name(member):
"""Generate schema item variable name.
@@ -1158,7 +1250,11 @@ class CodeGenerator(object):
schema_item_fill=self._gen_schema_items_fill(
function.params.values(), function.since, function.until, function.deprecated, function.removed),
schema_params_fill=self._gen_schema_params_fill(
- function.message_type.name)),
+ function.message_type.name),
+ function_history_fill=self._gen_function_history_decl(
+ function),
+ function_member=self._gen_function_member(
+ function)),
1))
def _gen_enums(self, enums, structs):
@@ -1831,7 +1927,7 @@ class CodeGenerator(object):
_impl_gen_schema_enum_history_map_template = string.Template(
u'''${name}_element_signatures''')
- _impl_code_item_decl_temlate = string.Template(
+ _impl_code_item_decl_template = string.Template(
u'''${comment}'''
u'''std::shared_ptr<ISchemaItem> ${var_name} = ${item_decl};''')
@@ -1874,6 +1970,17 @@ class CodeGenerator(object):
_impl_code_item_fill_template_with_version_and_history_vector = string.Template(
u'''schema_members["${name}"] = SMember(${var_name}, ${is_mandatory}, "${since}", "${until}", ${deprecated}, ${removed}, ${vector_name}_history_vector);''')
+
+ _impl_function_schema = u'''CObjectSchemaItem::create(schema_members)'''
+
+ _impl_function_member_fill_template = string.Template(
+ u'''SMember(${schema}, true)''')
+
+ _impl_function_member_fill_template_with_version = string.Template(
+ u'''SMember(${schema}, true, "${since}", "${until}", ${deprecated}, ${removed})''')
+
+ _impl_function_member_fill_template_with_version_and_history_vector = string.Template(
+ u'''SMember(${schema}, true, "${since}", "${until}", ${deprecated}, ${removed}, ${vector_name}_history_vector)''')
_function_impl_template = string.Template(
u'''CSmartSchema $namespace::$class_name::'''
@@ -1894,12 +2001,12 @@ class CodeGenerator(object):
u'''params_members;\n'''
u'''${schema_params_fill}'''
u'''\n'''
+ u'''${function_history_fill}'''
u'''Members '''
u'''root_members_map;\n'''
u'''root_members_map[ns_smart_device_link::ns_json_handler::'''
u'''strings::S_MSG_PARAMS] = '''
- u'''SMember(CObjectSchemaItem::'''
- u'''create(schema_members), true);\n'''
+ u'''${function_member};\n'''
u'''root_members_map[ns_smart_device_link::ns_json_handler::'''
u'''strings::S_PARAMS] = '''
u'''SMember(CObjectSchemaItem::'''