diff options
Diffstat (limited to 'java/jvpp/gen/jvppgen/jvpp_model.py')
-rwxr-xr-x | java/jvpp/gen/jvppgen/jvpp_model.py | 45 |
1 files changed, 44 insertions, 1 deletions
diff --git a/java/jvpp/gen/jvppgen/jvpp_model.py b/java/jvpp/gen/jvppgen/jvpp_model.py index 9a3204e..c5a7e74 100755 --- a/java/jvpp/gen/jvppgen/jvpp_model.py +++ b/java/jvpp/gen/jvppgen/jvpp_model.py @@ -142,6 +142,34 @@ class Enum(Type): return "_host_to_net_%s(env, %s, &(%s))" % (self.name, host_ref_name, net_ref_name) +class EnumSet(Type): + def __init__(self, name, value, constants, definition, plugin_name): + _java_name = _underscore_to_camelcase_upper(name) + + super(EnumSet, self).__init__( + name=name, + java_name=_java_name, + java_name_fqn="io.fd.vpp.jvpp.%s.types.%s" % (plugin_name, _java_name), + jni_signature="Lio/fd/vpp/jvpp/%s/types/%s;" % (plugin_name, _java_name), + jni_type="jobject", + jni_accessor="Object", + host_to_net_function="_host_to_net_%s" % name, + net_to_host_function="_net_to_host_%s" % name + ) + + self.value = value + self.constants = constants + self.doc = _message_to_javadoc(definition) + self.java_name_lower = _underscore_to_camelcase_lower(name) + self.vpp_name = "%s%s%s" % (_VPP_TYPE_PREFIX, name, _VPP_TYPE_SUFFIX) + # Fully qualified class name used by FindClass function, see: + # https://docs.oracle.com/javase/8/docs/technotes/guides/jni/spec/functions.html#FindClass + self.jni_name = "io/fd/vpp/jvpp/%s/types/%s" % (plugin_name, _java_name) + + def get_host_to_net_function(self, host_ref_name, net_ref_name): + return "_host_to_net_%s(env, %s, &(%s))" % (self.name, host_ref_name, net_ref_name) + + class Class(Type): def __init__(self, name, crc, fields, definition, plugin_name): _java_name = _underscore_to_camelcase_upper(name) @@ -391,8 +419,10 @@ class JVppModel(object): type = value['type'] data = value['data'][1:] try: - if type == 'enum': + if type == 'enum' and "flags" not in name: type = self._parse_enum(name, data) + elif type == 'enum' and "flags" in name: + type = self._parse_enumset(name, data) elif type == 'union': type = self._parse_union(name, data) elif type == 'type': @@ -468,6 +498,19 @@ class JVppModel(object): raise ParseException("'enumtype' was not defined for %s" % definition) return Enum(name, Field('value', self._types_by_name[type_name]), constants, definition, self.plugin_name) + def _parse_enumset(self, name, definition): + self.logger.debug("Parsing enumset %s: %s", name, definition) + constants = [] + type_name = None + for item in definition: + if type(item) is dict and 'enumtype' in item: + type_name = item['enumtype'] + continue + constants.append({'name': item[0], 'value': item[1]}) + if not type_name: + raise ParseException("'enumtype' was not defined for %s" % definition) + return EnumSet(name, Field('value', self._types_by_name[type_name]), constants, definition, self.plugin_name) + def _parse_union(self, name, definition): self.logger.debug("Parsing union %s: %s", name, definition) crc, fields = self._parse_fields(definition) |