diff options
Diffstat (limited to 'java/jvpp/gen/jvppgen/jni_type_handlers_gen.py')
-rwxr-xr-x | java/jvpp/gen/jvppgen/jni_type_handlers_gen.py | 56 |
1 files changed, 55 insertions, 1 deletions
diff --git a/java/jvpp/gen/jvppgen/jni_type_handlers_gen.py b/java/jvpp/gen/jvppgen/jni_type_handlers_gen.py index d733dd5..657972d 100755 --- a/java/jvpp/gen/jvppgen/jni_type_handlers_gen.py +++ b/java/jvpp/gen/jvppgen/jni_type_handlers_gen.py @@ -16,7 +16,7 @@ from string import Template from jni_common_gen import generate_j2c_swap, generate_j2c_field_swap, generate_j2c_identifiers, generate_c2j_swap -from jvpp_model import Class, Enum, Union +from jvpp_model import Class, Enum, EnumSet, Union def generate_type_handlers(model, logger): @@ -32,6 +32,8 @@ def generate_type_handlers(model, logger): _generate_class(model, t, type_handlers) elif isinstance(t, Enum): _generate_enum(model, t, type_handlers) + elif isinstance(t, EnumSet): + _generate_enumset(model, t, type_handlers) elif isinstance(t, Union): _generate_union(model, t, type_handlers) else: @@ -138,6 +140,58 @@ static inline ${jni_type} _net_to_host_${c_name}(vl_api_${c_name}_t _net) }""") +def _generate_enumset(model, t, type_handlers): + value_type = t.value.type + type_handlers.append(_ENUMSET_NET_TO_HOST_TEMPLATE.substitute( + c_name=t.name, + json_filename=model.json_api_files, + json_definition=t.doc, + class_FQN=t.jni_name, + jni_signature=value_type.jni_signature, + jni_type=value_type.jni_type, + jni_accessor=value_type.jni_accessor, + swap=_generate_scalar_host_to_net_swap(t.value) + )) + + type_handlers.append(_ENUMSET_HOST_TO_NET_TEMPLATE.substitute( + c_name=t.name, + json_filename=model.json_api_files, + json_definition=t.doc, + class_FQN=t.jni_name, + jni_type=value_type.jni_type, + type_swap=_generate_scalar_net_to_host_swap(t.value) + )) + + +_ENUMSET_NET_TO_HOST_TEMPLATE = Template(""" +/** + * Host to network byte order conversion for ${c_name} enum. + * Generated based on $json_filename: +$json_definition + */ +static inline void _host_to_net_${c_name}(JNIEnv * env, jobject _host, vl_api_${c_name}_t * _net) +{ + jclass enumClass = (*env)->FindClass(env, "${class_FQN}"); + jmethodID getValueMethod = (*env)->GetMethodID(env, enumClass, "getOptionsValue", "()I"); + ${jni_type} value = (*env)->CallIntMethod(env, _host, getValueMethod); + ${swap}; +}""") + +_ENUMSET_HOST_TO_NET_TEMPLATE = Template(""" +/** + * Network to host byte order conversion for ${c_name} type. + * Generated based on $json_filename: +$json_definition + */ +static inline jobject _net_to_host_${c_name}(JNIEnv * env, vl_api_${c_name}_t _net) +{ + jclass enumClass = (*env)->FindClass(env, "${class_FQN}"); + jmethodID enumInit = (*env)->GetMethodID(env, enumClass, "setOptionsValue", "(I)V"); + ${jni_type} value = (${jni_type}) $type_swap + return (*env)->NewObject(env, enumClass, enumInit, value); +}""") + + def _generate_scalar_host_to_net_swap(field): field_type = field.type if field_type.is_swap_needed: |