From e6849af9d30da5adbecab4019c83a20878d61343 Mon Sep 17 00:00:00 2001 From: Hussein Kasem Date: Mon, 24 Oct 2016 20:21:58 +0200 Subject: [PATCH] Changes needed to trigger keysync. - Make syncthread use only global class refs - Fix typos - Make pEpExepcions public --- src/basic_api.cc | 10 ++-- src/gen_java_exceptions.ysl2 | 2 +- src/jniutils.cc | 66 ++++++++++++++++++++++ src/jniutils.hh | 9 +++ src/org/pEp/jniadapter/AbstractEngine.java | 5 +- src/org_pEp_jniadapter_AbstractEngine.cc | 17 ++++-- src/pEp.yml2 | 7 ++- 7 files changed, 101 insertions(+), 15 deletions(-) diff --git a/src/basic_api.cc b/src/basic_api.cc index c5c2444..3867c91 100644 --- a/src/basic_api.cc +++ b/src/basic_api.cc @@ -260,7 +260,7 @@ JNIEXPORT jboolean JNICALL Java_org_pEp_jniadapter_Engine_blacklist_1is_1listed( return (jboolean)_listed; } -JNIEXPORT void JNICALL Java_org_pEp_jniadapter_Engine_accept_1sync_1hanshake( +JNIEXPORT void JNICALL Java_org_pEp_jniadapter_Engine_accept_1sync_1handshake( JNIEnv *env, jobject obj, jobject ident @@ -269,8 +269,8 @@ JNIEXPORT void JNICALL Java_org_pEp_jniadapter_Engine_accept_1sync_1hanshake( { PEP_SESSION session = (PEP_SESSION) callLongMethod(env, obj, "getHandle"); pEp_identity *_ident = to_identity(env, ident); - - PEP_STATUS status = + + PEP_STATUS status = ::deliverHandshakeResult(session, _ident, SYNC_HANDSHAKE_ACCEPTED); if (status != PEP_STATUS_OK) { @@ -280,7 +280,7 @@ JNIEXPORT void JNICALL Java_org_pEp_jniadapter_Engine_accept_1sync_1hanshake( } -JNIEXPORT void JNICALL Java_org_pEp_jniadapter_Engine_reject_sync_1hanshake( +JNIEXPORT void JNICALL Java_org_pEp_jniadapter_Engine_reject_sync_1handshake( JNIEnv *env, jobject obj, jobject ident @@ -298,7 +298,7 @@ JNIEXPORT void JNICALL Java_org_pEp_jniadapter_Engine_reject_sync_1hanshake( } } -JNIEXPORT void JNICALL Java_org_pEp_jniadapter_Engine_cancel_sync_1hanshake( +JNIEXPORT void JNICALL Java_org_pEp_jniadapter_Engine_cancel_sync_1handshake( JNIEnv *env, jobject obj, jobject ident diff --git a/src/gen_java_exceptions.ysl2 b/src/gen_java_exceptions.ysl2 index 1a62f00..eb0826d 100644 --- a/src/gen_java_exceptions.ysl2 +++ b/src/gen_java_exceptions.ysl2 @@ -21,7 +21,7 @@ tstylesheet { document "org/pEp/jniadapter/{$name}.java", "text" { | package org.pEp.jniadapter; | - | class «$name» extends pEpException { + | public class «$name» extends pEpException { | public «$name»(String message) { | super(message); | } diff --git a/src/jniutils.cc b/src/jniutils.cc index 447c112..310ce7d 100644 --- a/src/jniutils.cc +++ b/src/jniutils.cc @@ -55,6 +55,30 @@ namespace pEp { return field; } + //TODO: fix/generalize/clean patch added to make keysync work using globalref to class + jfieldID getFieldID( + JNIEnv *env, + const char *classname, + const char *fieldname, + const char *signature, + const jclass clazz + ) + { + + jfieldID field = env->GetFieldID(clazz, fieldname, signature); + assert(field); + + if (field == NULL) { + jclass ex = env->FindClass("java/lang/NoSuchFieldError"); + assert(ex); + env->ThrowNew(ex, fieldname); + throw std::invalid_argument(std::string(fieldname)); + } + + + return field; + } + jint callIntMethod( JNIEnv *env, jobject obj, @@ -363,6 +387,19 @@ namespace pEp { jfieldID fieldID = getFieldID(env, classname, name, "[B"); env->SetObjectField(obj, fieldID, reinterpret_cast(from_string(env, value))); + + } + } + + //TODO: fix/generalize/clean patch added to make keysync work using globalref to class + static void _setStringField(JNIEnv *env, const char *classname, + jobject obj, const char *name, const char *value, const jclass clazz) + { + if (value) { + jfieldID fieldID = getFieldID(env, classname, name, "[B", clazz); + env->SetObjectField(obj, fieldID, + reinterpret_cast(from_string(env, value))); + } } @@ -398,6 +435,35 @@ namespace pEp { return obj; } + //TODO: fix/generalize/clean patch added to make keysync work using globalref to class + jobject from_identity(JNIEnv *env, pEp_identity *ident, jclass identityClass) + { + if (!ident) + return (jobject) NULL; + + static const char *classname = "org/pEp/jniadapter/_Identity"; + jmethodID constructor = env->GetMethodID(identityClass, "", "()V"); + assert(constructor); + jobject obj = env->NewObject(identityClass, constructor); + + if (ident) { + _setStringField(env, classname, obj, "address", ident->address, identityClass); + _setStringField(env, classname, obj, "fpr", ident->fpr, identityClass); + _setStringField(env, classname, obj, "user_id", ident->user_id, identityClass); + _setStringField(env, classname, obj, "username", ident->username, identityClass); + + jfieldID comm_type_id = getFieldID(env, classname, "comm_type", "I", identityClass); + env->SetIntField(obj, comm_type_id, (jint) (int) ident->comm_type); + + _setStringField(env, classname, obj, "lang", ident->lang, identityClass); + + jfieldID me_id = getFieldID(env, classname, "me", "Z", identityClass); + env->SetBooleanField(obj, me_id, (jboolean) ident->me); + } + + return obj; + } + char *_getStringField(JNIEnv *env, const char *classname, jobject obj, const char *name) { diff --git a/src/jniutils.hh b/src/jniutils.hh index 5d9df07..f1cd50d 100644 --- a/src/jniutils.hh +++ b/src/jniutils.hh @@ -114,6 +114,14 @@ namespace pEp { const char *signature ); + jfieldID getFieldID( + JNIEnv *env, + const char *classname, + const char *fieldname, + const char *signature, + const jclass clazz + ); + jint callIntMethod( JNIEnv *env, jobject obj, @@ -155,6 +163,7 @@ namespace pEp { timestamp *to_timestamp(JNIEnv *env, jobject date); jobject from_identity(JNIEnv *env, pEp_identity *ident); + jobject from_identity(JNIEnv *env, pEp_identity *ident, jclass identityClass); pEp_identity *to_identity(JNIEnv *env, jobject obj); jobject from_identitylist(JNIEnv *env, identity_list *il); diff --git a/src/org/pEp/jniadapter/AbstractEngine.java b/src/org/pEp/jniadapter/AbstractEngine.java index 452bd58..b2b74f7 100644 --- a/src/org/pEp/jniadapter/AbstractEngine.java +++ b/src/org/pEp/jniadapter/AbstractEngine.java @@ -155,7 +155,10 @@ abstract class AbstractEngine implements AutoCloseable { this.showHandshakeCallback = showHandshakeCallback; } - public int showHandshakeCallFromC(Identity myself, Identity partner) { + public int showHandshakeCallFromC(_Identity _myself, _Identity _partner) { + Identity myself = new Identity(_myself); + Identity partner = new Identity(_partner); + if (showHandshakeCallback != null) { showHandshakeCallback.showHandshake(myself, partner); } else { diff --git a/src/org_pEp_jniadapter_AbstractEngine.cc b/src/org_pEp_jniadapter_AbstractEngine.cc index d19016d..86c99b6 100644 --- a/src/org_pEp_jniadapter_AbstractEngine.cc +++ b/src/org_pEp_jniadapter_AbstractEngine.cc @@ -202,6 +202,7 @@ extern "C" { static jmethodID showHandShakeMethodID = NULL; static jmethodID messageToSendMethodID = NULL; static jclass messageClass = NULL; + static jclass identityClass = NULL; static jmethodID messageConstructorMethodID = NULL; // Called by sync thread only @@ -211,8 +212,8 @@ extern "C" { jobject me_ = NULL; jobject partner_ = NULL; - me_ = from_identity(sync_env, me); - partner_ = from_identity(sync_env, partner); + me_ = from_identity(sync_env, me, identityClass); + partner_ = from_identity(sync_env, partner, identityClass); jint result = sync_env->CallIntMethod(sync_obj, showHandShakeMethodID, me_, partner_); @@ -273,9 +274,9 @@ extern "C" { jclass clazz = sync_env->GetObjectClass(sync_obj); showHandShakeMethodID = sync_env->GetMethodID( - clazz, - "showHandshakeCallFromC", - "(Lorg/pEp/jniadapter/Identity;Lorg/pEp/jniadapter/Identity;)I"); + clazz, + "showHandshakeCallFromC", + "(Lorg/pEp/jniadapter/_Identity;Lorg/pEp/jniadapter/_Identity;)I"); assert(showHandShakeMethodID); messageToSendMethodID = sync_env->GetMethodID( @@ -348,6 +349,7 @@ extern "C" { a->session = session; a->queue = queue; messageClass = reinterpret_cast(env->NewGlobalRef(findClass(env, "org/pEp/jniadapter/Message"))); + identityClass = reinterpret_cast(env->NewGlobalRef(findClass(env, "org/pEp/jniadapter/_Identity"))); messageConstructorMethodID = env->GetMethodID(messageClass, "", "(J)V"); env->GetJavaVM(&a->sync_jvm); @@ -399,8 +401,13 @@ extern "C" { sync_session = NULL; unregister_sync_callbacks(session); + env->DeleteGlobalRef(sync_obj); + env->DeleteGlobalRef(messageClass); + env->DeleteGlobalRef(identityClass); sync_obj = NULL; + messageClass = NULL; + identityClass = NULL; queue->push_front(NULL); pthread_join(*thread, NULL); diff --git a/src/pEp.yml2 b/src/pEp.yml2 index 9528289..a02f460 100644 --- a/src/pEp.yml2 +++ b/src/pEp.yml2 @@ -71,6 +71,7 @@ namespace pEp { pEp_commit_failed > 0xff01 pEp_message_consumed > 0xff02 + pEp_message_discarded > 0xff03 pEp_record_not_found > -6 @@ -181,9 +182,9 @@ namespace pEp { basic bool blacklist_is_listed(string fpr); basic void config_passive_mode(bool enable); basic void config_unencrypted_subject(bool enable); - basic void accept_sync_handshake_result(identity ident); - basic void reject_sync_handshake_result(identity ident); - basic void cancel_sync_handshake_result(identity ident); + basic void accept_sync_handshake(identity ident); + basic void reject_sync_handshake(identity ident); + basic void cancel_sync_handshake(identity ident); };