From 4a8514a6c990d4f3dc99e1ece3216067723c1e1e Mon Sep 17 00:00:00 2001 From: heck Date: Tue, 25 Jan 2022 20:02:58 +0100 Subject: [PATCH] JNI-167: add Message.decodeASN1XER() / fromXER() --- src/codegen/gen_cpp_Message.ysl2 | 78 +++++++++++++++++++++++++++++++ src/codegen/gen_java_Message.ysl2 | 12 ++++- 2 files changed, 88 insertions(+), 2 deletions(-) diff --git a/src/codegen/gen_cpp_Message.ysl2 b/src/codegen/gen_cpp_Message.ysl2 index e3433e0..d154daf 100644 --- a/src/codegen/gen_cpp_Message.ysl2 +++ b/src/codegen/gen_cpp_Message.ysl2 @@ -174,6 +174,84 @@ tstylesheet { return result; } + JNIEXPORT jobject JNICALL Java_foundation_pEp_jniadapter_Message__1decodeASN1XER(JNIEnv *env, + jclass clazz, + jbyteArray _msg_xer) + { + pEpLog("called"); + char *msg_xer = nullptr; + if(_msg_xer) { + msg_xer = to_string(env, _msg_xer); + } + // validate param msg_xer + if (msg_xer == nullptr) { + jclass ex = env->FindClass("java/lang/IllegalStateException"); + assert(ex); + env->ThrowNew(ex, nullptr); + return NULL; + } + + // convert XER to PER + char *msg_per = nullptr; + size_t msg_per_size = 0; + PEP_STATUS status = ::XER_to_PER_ASN1Message_msg(msg_xer, &msg_per, &msg_per_size); + free(msg_xer); + if (status) { + throw_pEp_Exception(env, status); + return NULL; + } + if (msg_per == nullptr) { + jclass ex = env->FindClass("java/lang/IllegalStateException"); + assert(ex); + env->ThrowNew(ex, nullptr); + return NULL; + } + + // decode PER to ASN1Message + ASN1Message *msg_asn1 = nullptr; + status = ::decode_ASN1Message_message(msg_per, msg_per_size, &msg_asn1); + free(msg_per); + if (status) { + throw_pEp_Exception(env, status); + return NULL; + } + if (msg_asn1 == nullptr) { + jclass ex = env->FindClass("java/lang/IllegalStateException"); + assert(ex); + env->ThrowNew(ex, nullptr); + return NULL; + } + + // convert ASN1Message to message + message *msg_out = nullptr; + msg_out = ::ASN1Message_to_message(msg_asn1, NULL, false, 0); + // msg_asn1 gets moved, so dont free it + if (msg_out == nullptr) { + jclass ex = env->FindClass("java/lang/IllegalStateException"); + assert(ex); + env->ThrowNew(ex, nullptr); + return NULL; + } + + // Convert message to java class Message + jobject msg_ = nullptr; + jclass clazz_dst_ = findClass(env, "foundation/pEp/jniadapter/Message"); + assert(clazz_dst_); + jmethodID constructor_dst_ = env->GetMethodID(clazz_dst_, "", "(J)V"); + assert(constructor_dst_); + msg_ = env->NewObject(clazz_dst_, constructor_dst_, reinterpret_cast(msg_out)); + + // msg_ will point to msg_out, so dont free it + if (msg_ == nullptr) { + jclass ex = env->FindClass("java/lang/IllegalStateException"); + assert(ex); + env->ThrowNew(ex, nullptr); + return NULL; + } + + return msg_; + } + || apply "*[name(.)!='enum']", 0, mode=entry { with "name", "@name"; diff --git a/src/codegen/gen_java_Message.ysl2 b/src/codegen/gen_java_Message.ysl2 index 15a8168..b9de724 100644 --- a/src/codegen/gen_java_Message.ysl2 +++ b/src/codegen/gen_java_Message.ysl2 @@ -76,8 +76,16 @@ tstylesheet { private native static Message _decodeASN1XER(byte[] msgXER) throws pEpException; - public String encodeASN1XER() { - return Utils.toUTF16(_encodeASN1XER()); + public static Message decodeASN1XER(String msgXER) { + byte[] _msgXER = new byte[0]; + if (msgXER != null) { + _msgXER = Utils.toUTF8(msgXER); + } + return _decodeASN1XER(_msgXER); + } + + public static Message fromXER(String msgXER) { + return decodeASN1XER(msgXER); } private «$cname»(long h) {