From a255490628515e28fd346049087ac775da6a2f2e Mon Sep 17 00:00:00 2001 From: heck Date: Mon, 30 Nov 2020 23:57:34 +0100 Subject: [PATCH] formatting and code style only --- src/codegen/gen_cpp_Engine.ysl2 | 22 +- src/codegen/gen_cpp_Message.ysl2 | 63 +- src/cxx/basic_api.cc | 161 +- ...oundation_pEp_jniadapter_AbstractEngine.cc | 168 +- src/cxx/foundation_pEp_jniadapter__Blob.cc | 45 +- src/cxx/identity_api.cc | 6 +- src/cxx/jniutils.cc | 1535 +++++++++-------- src/cxx/jniutils.hh | 231 +-- src/cxx/passphrase_callback.hh | 9 +- src/cxx/passphrase_callback.hxx | 68 +- 10 files changed, 1157 insertions(+), 1151 deletions(-) diff --git a/src/codegen/gen_cpp_Engine.ysl2 b/src/codegen/gen_cpp_Engine.ysl2 index 4e61e12..d316923 100644 --- a/src/codegen/gen_cpp_Engine.ysl2 +++ b/src/codegen/gen_cpp_Engine.ysl2 @@ -51,10 +51,8 @@ tstylesheet { } || - JNIEXPORT «$CretType» JNICALL «$mangled»( - JNIEnv *env, - jobject obj`apply "parm[in|inout]", mode=sig` - ) + JNIEXPORT «$CretType» JNICALL «$mangled»(JNIEnv *env, + jobject obj`apply "parm[in|inout]", mode=sig`) { std::mutex *mutex_local = nullptr; { @@ -83,13 +81,11 @@ tstylesheet { } } || - if ((status > PEP_STATUS_OK && status < PEP_UNENCRYPTED) |`> |` - status < PEP_STATUS_OK |`> |` - status >= PEP_TRUSTWORD_NOT_FOUND) { + + if ((status > PEP_STATUS_OK && status < PEP_UNENCRYPTED) |`> |` status < PEP_STATUS_OK |`> |` status >= PEP_TRUSTWORD_NOT_FOUND) { throw_pEp_Exception(env, status); return «$CretDefault»; } - || apply "parm[returns|creates]", mode=return; @@ -188,9 +184,9 @@ tstylesheet { } || «$jnitype» «$name»_ = NULL; - if (_«$name») + if (_«$name») { «$name»_ = «$from_type»(env, _«$name»); - + } || } when "ancestor::namespace/child::enum[@name=$type]" { @@ -200,14 +196,12 @@ tstylesheet { { jclass clazz_«$ljtype» = findClass(env, "foundation/pEp/jniadapter/«$jtype»"); assert(clazz_«$ljtype»); - jmethodID method_values = env->GetStaticMethodID(clazz_«$ljtype», "values", - "()[Lfoundation/pEp/jniadapter/«$jtype»;"); + jmethodID method_values = env->GetStaticMethodID(clazz_«$ljtype», "values", "()[Lfoundation/pEp/jniadapter/«$jtype»;"); assert(method_values); jfieldID field_value = env->GetFieldID(clazz_«$ljtype», "value", "I"); assert(field_value); - jobjectArray values = static_cast(env->CallStaticObjectMethod(clazz_«$ljtype», - method_values)); + jobjectArray values = static_cast(env->CallStaticObjectMethod(clazz_«$ljtype», method_values)); assert(values); if (env->ExceptionCheck()) { return nullptr; // handle exception in Java diff --git a/src/codegen/gen_cpp_Message.ysl2 b/src/codegen/gen_cpp_Message.ysl2 index a53688e..13ee28f 100644 --- a/src/codegen/gen_cpp_Message.ysl2 +++ b/src/codegen/gen_cpp_Message.ysl2 @@ -25,28 +25,28 @@ tstylesheet { using namespace std; namespace pEp { - namespace JNIAdapter { - static ::«@name» *«@name»_ptr(JNIEnv *env, jobject me) { - jfieldID handle; - - try { - handle = getFieldID(env, "foundation/pEp/jniadapter/«$jname»", "handle", "J"); - } - catch (std::exception& ex) { - assert(0); - return NULL; - } + namespace JNIAdapter { + static ::«@name» *«@name»_ptr(JNIEnv *env, jobject me) { + jfieldID handle; + + try { + handle = getFieldID(env, "foundation/pEp/jniadapter/«$jname»", "handle", "J"); + } catch (std::exception& ex) { + assert(0); + return NULL; + } + return reinterpret_cast<::«@name» *>(env->GetLongField(me, handle)); + } - return reinterpret_cast<::«@name» *>(env->GetLongField(me, handle)); - } - }; + }; }; extern "C" { using namespace pEp::JNIAdapter; - JNIEXPORT jlong JNICALL Java_foundation_pEp_jniadapter_«$jname»_init(JNIEnv *env, jobject obj) + JNIEXPORT jlong JNICALL Java_foundation_pEp_jniadapter_«$jname»_init(JNIEnv *env, + jobject obj) { pEpLog("called"); ::«@name» * _obj = ::new_«@name»(PEP_dir_incoming); @@ -57,7 +57,9 @@ tstylesheet { return reinterpret_cast(_obj); } - JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_«$jname»_release(JNIEnv *env, jobject obj, jlong value) + JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_«$jname»_release(JNIEnv *env, + jobject obj, + jlong value) { pEpLog("called"); if (value) { @@ -66,7 +68,9 @@ tstylesheet { } } - JNIEXPORT jlong JNICALL Java_foundation_pEp_jniadapter_«$jname»__1«$jname»(JNIEnv *env, jobject msg, jbyteArray mime_text) + JNIEXPORT jlong JNICALL Java_foundation_pEp_jniadapter_«$jname»__1«$jname»(JNIEnv *env, + jobject msg, + jbyteArray mime_text) { pEpLog("called"); char *_mime_text = to_string(env, mime_text); @@ -74,21 +78,26 @@ tstylesheet { ::«@name» *_msg = nullptr; PEP_STATUS status = mime_decode_«@name»(_mime_text, _size, &_msg, NULL); - if (status) + if (status) { throw_pEp_Exception(env, status); + } + return reinterpret_cast(_msg); } - JNIEXPORT jbyteArray JNICALL Java_foundation_pEp_jniadapter_«$jname»__1encodeMIME(JNIEnv *env, jobject msg) + JNIEXPORT jbyteArray JNICALL Java_foundation_pEp_jniadapter_«$jname»__1encodeMIME(JNIEnv *env, + jobject msg) { pEpLog("called"); «@name» *_obj = «@name»_ptr(env, msg); char *mime_text = nullptr; PEP_STATUS status = ::mime_encode_«@name»(_obj, false, &mime_text, false); - if (status) + if (status) { throw_pEp_Exception(env, status); + } jbyteArray result = from_string(env, mime_text); free(mime_text); + return result; } @@ -134,7 +143,8 @@ tstylesheet { with "name", "concat('set', $jname)"; } || - JNIEXPORT `call "jni_type" with "type", "name(.)"` JNICALL «$getname»(JNIEnv *env, jobject obj) + JNIEXPORT `call "jni_type" with "type", "name(.)"` JNICALL «$getname»(JNIEnv *env, + jobject obj) { pEpLog("called"); «$name» *_obj = «$name»_ptr(env, obj); @@ -148,7 +158,10 @@ tstylesheet { || } - JNIEXPORT void JNICALL «$setname»(JNIEnv *env, jobject obj, `call "jni_type" with "type", "name(.)"` value) + JNIEXPORT void JNICALL «$setname»(JNIEnv *env, + jobject obj, + `call "jni_type" with "type", "name(.)"` + value) { pEpLog("called"); «$name» *_obj = «$name»_ptr(env, obj); @@ -171,7 +184,7 @@ tstylesheet { |> free_«$free»(_obj->«$cname»); } } - |> if(value){ + |> if(value) { choose { when "$type = 'string'" { |>> _obj->«$cname» = to_«$type»(env, value); @@ -180,9 +193,9 @@ tstylesheet { |>> _obj->«$cname» = to_«$type»(env, value); } } - |> }else{ + |> } else { |> _obj->«$cname» = NULL; - |> } + |> } } } || diff --git a/src/cxx/basic_api.cc b/src/cxx/basic_api.cc index e014a8d..49c3b2f 100644 --- a/src/cxx/basic_api.cc +++ b/src/cxx/basic_api.cc @@ -12,15 +12,14 @@ #include "passphrase_callback.hh" extern "C" { - using namespace pEp::JNIAdapter; - using pEp::Adapter::session; - using pEp::passphrase_cache; -JNIEXPORT jbyteArray JNICALL Java_foundation_pEp_jniadapter_Engine__1trustwords( - JNIEnv *env, +using namespace pEp::JNIAdapter; +using pEp::Adapter::session; +using pEp::passphrase_cache; + +JNIEXPORT jbyteArray JNICALL Java_foundation_pEp_jniadapter_Engine__1trustwords(JNIEnv *env, jobject obj, - jobject ident - ) + jobject ident) { std::mutex *mutex_local = nullptr; { @@ -37,10 +36,11 @@ JNIEXPORT jbyteArray JNICALL Java_foundation_pEp_jniadapter_Engine__1trustwords( PEP_STATUS status = PEP_STATUS_OK; if (_ident->fpr == NULL || _ident->fpr[0] == 0) { - if (_ident->me) + if (_ident->me) { status = passphraseWrap(::myself, session(), _ident); - else + } else { status = passphraseWrap(::update_identity, session(), _ident); + } } if (status != PEP_STATUS_OK) { @@ -54,13 +54,13 @@ JNIEXPORT jbyteArray JNICALL Java_foundation_pEp_jniadapter_Engine__1trustwords( } const char *lang; - if (_ident->lang[0]) + if (_ident->lang[0]) { lang = _ident->lang; - else + } else { lang = "en"; + } - status = passphraseWrap(::trustwords, - session(), static_cast(_ident->fpr), lang, &words, &wsize, 10); + status = passphraseWrap(::trustwords, session(), static_cast(_ident->fpr), lang, &words, &wsize, 10); if (status != PEP_STATUS_OK) { throw_pEp_Exception(env, status); @@ -70,11 +70,9 @@ JNIEXPORT jbyteArray JNICALL Java_foundation_pEp_jniadapter_Engine__1trustwords( return from_string(env, words); } -JNIEXPORT jobject JNICALL Java_foundation_pEp_jniadapter_Engine__1myself( - JNIEnv *env, +JNIEXPORT jobject JNICALL Java_foundation_pEp_jniadapter_Engine__1myself(JNIEnv *env, jobject obj, - jobject ident - ) + jobject ident) { std::mutex *mutex_local = nullptr; { @@ -96,11 +94,9 @@ JNIEXPORT jobject JNICALL Java_foundation_pEp_jniadapter_Engine__1myself( return from_identity(env, _ident); } -JNIEXPORT jobject JNICALL Java_foundation_pEp_jniadapter_Engine__1updateIdentity( - JNIEnv *env, +JNIEXPORT jobject JNICALL Java_foundation_pEp_jniadapter_Engine__1updateIdentity(JNIEnv *env, jobject obj, - jobject ident - ) + jobject ident) { std::mutex *mutex_local = nullptr; { @@ -111,18 +107,15 @@ JNIEXPORT jobject JNICALL Java_foundation_pEp_jniadapter_Engine__1updateIdentity std::lock_guard l(*mutex_local); pEp_identity *_ident = to_identity(env, ident); - passphraseWrap(::update_identity, session(), _ident); return from_identity(env, _ident); } -JNIEXPORT jobject JNICALL Java_foundation_pEp_jniadapter_Engine__1setOwnKey( - JNIEnv *env, +JNIEXPORT jobject JNICALL Java_foundation_pEp_jniadapter_Engine__1setOwnKey(JNIEnv *env, jobject obj, jobject ident, - jbyteArray fpr - ) + jbyteArray fpr) { std::mutex *mutex_local = nullptr; { @@ -146,11 +139,9 @@ JNIEXPORT jobject JNICALL Java_foundation_pEp_jniadapter_Engine__1setOwnKey( return from_identity(env, _ident); } -JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_Engine__1keyMistrusted( - JNIEnv *env, +JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_Engine__1keyMistrusted(JNIEnv *env, jobject obj, - jobject ident - ) + jobject ident) { std::mutex *mutex_local = nullptr; { @@ -184,11 +175,9 @@ JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_Engine__1keyMistrusted( passphraseWrap(::key_mistrusted, session(), _ident); } -JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_Engine__1keyResetTrust( - JNIEnv *env, +JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_Engine__1keyResetTrust(JNIEnv *env, jobject obj, - jobject ident - ) + jobject ident) { std::mutex *mutex_local = nullptr; { @@ -203,10 +192,11 @@ JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_Engine__1keyResetTrust( PEP_STATUS status = PEP_STATUS_OK; if (_ident->fpr == NULL || _ident->fpr[0] == 0) { - if (_ident->me) + if (_ident->me) { status = passphraseWrap(::myself, session(), _ident); - else + } else { status = passphraseWrap(::update_identity, session(), _ident); + } } if (status != PEP_STATUS_OK) { @@ -222,11 +212,9 @@ JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_Engine__1keyResetTrust( passphraseWrap(::key_reset_trust, session(), _ident); } -JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_Engine__1trustPersonalKey( - JNIEnv *env, +JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_Engine__1trustPersonalKey(JNIEnv *env, jobject obj, - jobject ident - ) + jobject ident) { std::mutex *mutex_local = nullptr; { @@ -241,10 +229,11 @@ JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_Engine__1trustPersonalKey( PEP_STATUS status = PEP_STATUS_OK; if (_ident->fpr == NULL || _ident->fpr[0] == 0) { - if (_ident->me) + if (_ident->me) { status = passphraseWrap(::myself, session(), _ident); - else + } else { status = passphraseWrap(::update_identity, session(), _ident); + } } if (status != PEP_STATUS_OK) { @@ -260,11 +249,9 @@ JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_Engine__1trustPersonalKey( passphraseWrap(::trust_personal_key, session(), _ident); } -JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_Engine__1trustOwnKey( - JNIEnv *env, +JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_Engine__1trustOwnKey(JNIEnv *env, jobject obj, - jobject ident - ) + jobject ident) { std::mutex *mutex_local = nullptr; { @@ -284,11 +271,9 @@ JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_Engine__1trustOwnKey( passphraseWrap(::trust_own_key, session(), _ident); } -JNIEXPORT jobject JNICALL Java_foundation_pEp_jniadapter_Engine__1importKey( - JNIEnv *env, +JNIEXPORT jobject JNICALL Java_foundation_pEp_jniadapter_Engine__1importKey(JNIEnv *env, jobject obj, - jbyteArray key - ) + jbyteArray key) { std::mutex *mutex_local = nullptr; { @@ -301,7 +286,7 @@ JNIEXPORT jobject JNICALL Java_foundation_pEp_jniadapter_Engine__1importKey( size_t _size = static_cast(env->GetArrayLength(key)); jbyte* _key = env->GetByteArrayElements(key, NULL); - if(_key == NULL){ + if(_key == NULL) { throw_pEp_Exception(env, PEP_OUT_OF_MEMORY); return NULL; } @@ -324,11 +309,9 @@ JNIEXPORT jobject JNICALL Java_foundation_pEp_jniadapter_Engine__1importKey( } -JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_Engine__1config_1passive_1mode( - JNIEnv *env, +JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_Engine__1config_1passive_1mode(JNIEnv *env, jobject obj, - jboolean enable - ) + jboolean enable) { std::mutex *mutex_local = nullptr; { @@ -342,11 +325,9 @@ JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_Engine__1config_1passive_1 } -JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_Engine__1config_1unencrypted_1subject( - JNIEnv *env, +JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_Engine__1config_1unencrypted_1subject(JNIEnv *env, jobject obj, - jboolean enable - ) + jboolean enable) { std::mutex *mutex_local = nullptr; { @@ -359,8 +340,7 @@ JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_Engine__1config_1unencrypt ::config_unencrypted_subject(session(), static_cast(enable)); } -JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_Engine__1blacklist_1add( - JNIEnv *env, +JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_Engine__1blacklist_1add(JNIEnv *env, jobject obj, jbyteArray fpr ) @@ -385,14 +365,11 @@ JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_Engine__1blacklist_1add( throw_pEp_Exception(env, status); return; } - } -JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_Engine__1blacklist_1delete( - JNIEnv *env, +JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_Engine__1blacklist_1delete(JNIEnv *env, jobject obj, - jbyteArray fpr - ) + jbyteArray fpr) { std::mutex *mutex_local = nullptr; { @@ -417,11 +394,9 @@ JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_Engine__1blacklist_1delete } -JNIEXPORT jboolean JNICALL Java_foundation_pEp_jniadapter_Engine__1blacklist_1is_1listed( - JNIEnv *env, +JNIEXPORT jboolean JNICALL Java_foundation_pEp_jniadapter_Engine__1blacklist_1is_1listed(JNIEnv *env, jobject obj, - jbyteArray fpr - ) + jbyteArray fpr) { std::mutex *mutex_local = nullptr; { @@ -448,12 +423,10 @@ JNIEXPORT jboolean JNICALL Java_foundation_pEp_jniadapter_Engine__1blacklist_1is return (jboolean)_listed; } -JNIEXPORT jbyteArray JNICALL Java_foundation_pEp_jniadapter_Engine__1getCrashdumpLog( - JNIEnv *env, +JNIEXPORT jbyteArray JNICALL Java_foundation_pEp_jniadapter_Engine__1getCrashdumpLog(JNIEnv *env, jobject obj, jint dummy, - jint maxlines - ) + jint maxlines) { std::mutex *mutex_local = nullptr; { @@ -477,40 +450,24 @@ JNIEXPORT jbyteArray JNICALL Java_foundation_pEp_jniadapter_Engine__1getCrashdum return from_string(env, _logdata); } -JNIEXPORT jbyteArray JNICALL Java_foundation_pEp_jniadapter_Engine__1getUserDirectory( - JNIEnv *env, - jobject obj - ) +JNIEXPORT jbyteArray JNICALL Java_foundation_pEp_jniadapter_Engine__1getUserDirectory(JNIEnv *env, + jobject obj) { pEpLog("called"); return from_string(env, ::per_user_directory()); } -JNIEXPORT jbyteArray JNICALL Java_foundation_pEp_jniadapter_Engine__1getMachineDirectory( - JNIEnv *env, - jobject obj - ) +JNIEXPORT jbyteArray JNICALL Java_foundation_pEp_jniadapter_Engine__1getMachineDirectory(JNIEnv *env, + jobject obj) { pEpLog("called"); return from_string(env, ::per_machine_directory()); } -//void logPassphraseCache() { -// try { -//// while(true) { -// pEpLog("Cache: '" << cache.latest_passphrase() << "'"); -//// } -// } catch(pEp::PassphraseCache::Empty e) { -// pEpLog(e.what()); -// } catch(pEp::PassphraseCache::Exhausted ex) { -// pEpLog(ex.what()); -// } -//} - -JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_Engine__1config_1passphrase - (JNIEnv * env, - jobject obj, - jbyteArray passphrase) + +JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_Engine__1config_1passphrase(JNIEnv * env, + jobject obj, + jbyteArray passphrase) { std::mutex *mutex_local = nullptr; { @@ -530,12 +487,10 @@ JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_Engine__1config_1passphras } -JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_Engine__1config_1passphrase_1for_1new_1keys( - JNIEnv *env, +JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_Engine__1config_1passphrase_1for_1new_1keys(JNIEnv *env, jobject obj, jboolean enable, - jbyteArray passphrase - ) + jbyteArray passphrase) { std::mutex *mutex_local = nullptr; { @@ -555,8 +510,6 @@ JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_Engine__1config_1passphras throw_pEp_Exception(env, status); return ; } - - } } // extern "C" diff --git a/src/cxx/foundation_pEp_jniadapter_AbstractEngine.cc b/src/cxx/foundation_pEp_jniadapter_AbstractEngine.cc index 0ef7a30..87641ff 100644 --- a/src/cxx/foundation_pEp_jniadapter_AbstractEngine.cc +++ b/src/cxx/foundation_pEp_jniadapter_AbstractEngine.cc @@ -15,9 +15,7 @@ using namespace pEp::JNIAdapter; using namespace utility; // for libpEpAdapter locked queue impl. TODO:rename bool first = true; - JavaVM *jvm= nullptr; - std::mutex mutex_obj; jfieldID signal_field_value = nullptr; @@ -67,45 +65,60 @@ namespace JNISync { void jni_init() { - JNIEnv *_env = JNISync::env(); - - messageClass = static_cast( - _env->NewGlobalRef(findClass(_env, "foundation/pEp/jniadapter/Message"))); - identityClass = static_cast( - _env->NewGlobalRef(findClass(_env, "foundation/pEp/jniadapter/_Identity"))); - signalClass = static_cast( - _env->NewGlobalRef(findClass(_env, "foundation/pEp/jniadapter/SyncHandshakeSignal"))); - passphraseTypeClass = static_cast( - _env->NewGlobalRef(findClass(_env, "foundation/pEp/jniadapter/PassphraseType"))); + JNIEnv * _env = JNISync::env(); + + messageClass = static_cast(_env->NewGlobalRef(findClass(_env, "foundation/pEp/jniadapter/Message"))); + identityClass = static_cast(_env->NewGlobalRef(findClass(_env, "foundation/pEp/jniadapter/_Identity"))); + signalClass = static_cast(_env->NewGlobalRef(findClass(_env, "foundation/pEp/jniadapter/SyncHandshakeSignal"))); + passphraseTypeClass = static_cast(_env->NewGlobalRef(findClass(_env, "foundation/pEp/jniadapter/PassphraseType"))); engineClass = static_cast(_env->NewGlobalRef(findClass(_env, "foundation/pEp/jniadapter/Engine"))); - messageConstructorMethodID = _env->GetMethodID(messageClass, "", "(J)V"); + messageConstructorMethodID = _env->GetMethodID( + messageClass, + "", + "(J)V"); + messageToSendMethodID = _env->GetMethodID( - engineClass, - "messageToSendCallFromC", - "(Lfoundation/pEp/jniadapter/Message;)I"); + engineClass, + "messageToSendCallFromC", + "(Lfoundation/pEp/jniadapter/Message;)I"); + needsFastPollMethodID = _env->GetMethodID( - engineClass, - "needsFastPollCallFromC", - "(Z)I"); + engineClass, + "needsFastPollCallFromC", + "(Z)I"); + notifyHandShakeMethodID = _env->GetMethodID( - engineClass, - "notifyHandshakeCallFromC", - "(Lfoundation/pEp/jniadapter/_Identity;Lfoundation/pEp/jniadapter/_Identity;Lfoundation/pEp/jniadapter/SyncHandshakeSignal;)I"); + engineClass, + "notifyHandshakeCallFromC", + "(Lfoundation/pEp/jniadapter/_Identity;Lfoundation/pEp/jniadapter/_Identity;Lfoundation/pEp/jniadapter/SyncHandshakeSignal;)I"); + passphraseRequiredMethodID = _env->GetMethodID( - engineClass, - "passphraseRequiredFromC", - "(Lfoundation/pEp/jniadapter/PassphraseType;)[B"); - - sync_handshake_signal_values = JNISync::env()->GetStaticMethodID(signalClass, "values", - "()[Lfoundation/pEp/jniadapter/SyncHandshakeSignal;"); - passphrase_status_values = JNISync::env()->GetStaticMethodID(passphraseTypeClass, "values", - "()[Lfoundation/pEp/jniadapter/PassphraseType;"); - signal_field_value = JNISync::env()->GetFieldID(signalClass, "value", "I"); - passphrase_type_field_value = JNISync::env()->GetFieldID(passphraseTypeClass, "value", "I"); + engineClass, + "passphraseRequiredFromC", + "(Lfoundation/pEp/jniadapter/PassphraseType;)[B"); + + sync_handshake_signal_values = JNISync::env()->GetStaticMethodID( + signalClass, + "values", + "()[Lfoundation/pEp/jniadapter/SyncHandshakeSignal;"); + + passphrase_status_values = JNISync::env()->GetStaticMethodID( + passphraseTypeClass, + "values", + "()[Lfoundation/pEp/jniadapter/PassphraseType;"); + + signal_field_value = JNISync::env()->GetFieldID( + signalClass, + "value", + "I"); + + passphrase_type_field_value = JNISync::env()->GetFieldID(passphraseTypeClass, "value", "I"); } -char* JNIAdapter::passphraseRequiredCallback(const PEP_STATUS status) { +char* JNIAdapter::passphraseRequiredCallback( + const PEP_STATUS status) +{ pEpLog("called"); jobject status_ = nullptr; { @@ -113,8 +126,7 @@ char* JNIAdapter::passphraseRequiredCallback(const PEP_STATUS status) { assert(passphrase_status_values); assert(passphrase_type_field_value); - jobjectArray values = static_cast(JNISync::env()->CallStaticObjectMethod(passphraseTypeClass, - passphrase_status_values)); + jobjectArray values = static_cast(JNISync::env()->CallStaticObjectMethod(passphraseTypeClass, passphrase_status_values)); if (JNISync::env()->ExceptionCheck()) { JNISync::env()->ExceptionClear(); @@ -149,19 +161,21 @@ char* JNIAdapter::passphraseRequiredCallback(const PEP_STATUS status) { PEP_STATUS messageToSend(message *msg) { - std::lock_guard l(mutex_obj); + std::lock_guard l(mutex_obj); pEpLog("called"); // Passphrase // When a protocol implementation of the p≡p engine using messageToSend() cannot sign or encrypt with an // empty passphrase and not with the configured passphrase it is calling messageToSend() with a NULL instead // of a struct _message object. - if (Adapter::on_sync_thread() && !msg) + if (Adapter::on_sync_thread() && !msg) { return pEp::PassphraseCache::config_next_passphrase(); + } // reset passphrase iterator - if (Adapter::on_sync_thread()) + if (Adapter::on_sync_thread()) { pEp::PassphraseCache::config_next_passphrase(true); + } jobject msg_ = nullptr; assert(messageClass && messageConstructorMethodID && objj && messageToSendMethodID); @@ -175,11 +189,12 @@ PEP_STATUS messageToSend(message *msg) JNISync::env()->ExceptionClear(); } - return status; } -PEP_STATUS notifyHandshake(pEp_identity *me, pEp_identity *partner, sync_handshake_signal signal) +PEP_STATUS notifyHandshake(pEp_identity *me, + pEp_identity *partner, + sync_handshake_signal signal) { std::lock_guard l(mutex_obj); pEpLog("called"); @@ -196,8 +211,7 @@ PEP_STATUS notifyHandshake(pEp_identity *me, pEp_identity *partner, sync_handsha assert(sync_handshake_signal_values); assert(signal_field_value); - jobjectArray values = static_cast(JNISync::env()->CallStaticObjectMethod(signalClass, - sync_handshake_signal_values)); + jobjectArray values = static_cast(JNISync::env()->CallStaticObjectMethod(signalClass, sync_handshake_signal_values)); if (JNISync::env()->ExceptionCheck()) { JNISync::env()->ExceptionClear(); return PEP_UNKNOWN_ERROR; @@ -231,10 +245,8 @@ PEP_STATUS notifyHandshake(pEp_identity *me, pEp_identity *partner, sync_handsha extern "C" { using namespace pEp; -JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_AbstractEngine_init( - JNIEnv *env, - jobject obj - ) +JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_AbstractEngine_init(JNIEnv *env, + jobject obj) { std::lock_guard l(global_mutex); // global mutex for write access to pEpLog("called"); @@ -253,10 +265,8 @@ JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_AbstractEngine_init( Adapter::session(); } -JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_AbstractEngine_release( - JNIEnv *env, - jobject obj - ) +JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_AbstractEngine_release(JNIEnv *env, + jobject obj) { std::lock_guard l(global_mutex); // global mutex for write access to pEpLog("called"); @@ -264,10 +274,8 @@ JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_AbstractEngine_release( Adapter::session(pEp::Adapter::release); } -JNIEXPORT jstring JNICALL Java_foundation_pEp_jniadapter_AbstractEngine__1getVersion( - JNIEnv *env, - jobject obj - ) +JNIEXPORT jstring JNICALL Java_foundation_pEp_jniadapter_AbstractEngine__1getVersion(JNIEnv *env, + jobject obj) { std::mutex *mutex_local = nullptr; { @@ -280,10 +288,8 @@ JNIEXPORT jstring JNICALL Java_foundation_pEp_jniadapter_AbstractEngine__1getVer return env->NewStringUTF(::get_engine_version()); } -JNIEXPORT jstring JNICALL Java_foundation_pEp_jniadapter_AbstractEngine__1getProtocolVersion( - JNIEnv *env, - jobject obj - ) +JNIEXPORT jstring JNICALL Java_foundation_pEp_jniadapter_AbstractEngine__1getProtocolVersion(JNIEnv *env, + jobject obj) { std::mutex *mutex_local = nullptr; { @@ -296,9 +302,10 @@ JNIEXPORT jstring JNICALL Java_foundation_pEp_jniadapter_AbstractEngine__1getPro return env->NewStringUTF(::get_protocol_version()); } -int examine_identity(pEp_identity *ident, void *arg) +int examine_identity(pEp_identity *ident, + void *arg) { - locked_queue< pEp_identity * > *queue = static_cast*>(arg); + locked_queue < pEp_identity * > *queue = static_cast * > (arg); queue->push_back(identity_dup(ident)); return 0; } @@ -306,10 +313,11 @@ int examine_identity(pEp_identity *ident, void *arg) pEp_identity *retrieve_next_identity(void *arg) { pEpLog("called"); - locked_queue< pEp_identity * > *queue = static_cast*>(arg); + locked_queue < pEp_identity * > *queue = static_cast * > (arg); - while (!queue->size()) + while (!queue->size()) { usleep(100000); + } pEp_identity *ident = queue->front(); queue->pop_front(); @@ -319,7 +327,7 @@ pEp_identity *retrieve_next_identity(void *arg) static void *keyserver_thread_routine(void *arg) { PEP_STATUS status = do_keymanagement(retrieve_next_identity, arg); - locked_queue< pEp_identity * > *queue = static_cast*>(arg); + locked_queue < pEp_identity * > *queue = static_cast * > (arg); while (queue->size()) { pEp_identity *ident = queue->front(); @@ -328,13 +336,11 @@ static void *keyserver_thread_routine(void *arg) } delete queue; - return reinterpret_cast(status); + return reinterpret_cast(status); } -JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_AbstractEngine__1startKeyserverLookup( - JNIEnv *env, - jobject obj - ) +JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_AbstractEngine__1startKeyserverLookup(JNIEnv *env, + jobject obj) { std::mutex *mutex_local = nullptr; { @@ -375,10 +381,8 @@ JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_AbstractEngine__1startKeys pthread_create(thread, nullptr, keyserver_thread_routine, static_cast(queue)); } -JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_AbstractEngine__1stopKeyserverLookup( - JNIEnv *env, - jobject obj - ) +JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_AbstractEngine__1stopKeyserverLookup(JNIEnv *env, + jobject obj) { std::mutex *mutex_local = nullptr; { @@ -419,10 +423,8 @@ JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_AbstractEngine__1stopKeyse free(thread); } -JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_AbstractEngine__1startSync( - JNIEnv *env, - jobject obj - ) +JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_AbstractEngine__1startSync(JNIEnv *env, + jobject obj) { std::mutex *mutex_local = nullptr; { @@ -434,17 +436,14 @@ JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_AbstractEngine__1startSync try { CallbackDispatcher::start_sync(); -// Adapter::startup(messageToSend, notifyHandshake, &o, &JNISync::onSyncStartup, &JNISync::onSyncShutdown); } catch (RuntimeError& ex) { throw_pEp_Exception(env, ex.status); return; } } -JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_AbstractEngine__1stopSync( - JNIEnv *env, - jobject obj - ) +JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_AbstractEngine__1stopSync(JNIEnv *env, + jobject obj) { std::mutex *mutex_local = nullptr; { @@ -455,13 +454,10 @@ JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_AbstractEngine__1stopSync( std::lock_guard l(*mutex_local); CallbackDispatcher::stop_sync(); -// Adapter::shutdown(); } -JNIEXPORT jboolean JNICALL Java_foundation_pEp_jniadapter_AbstractEngine__1isSyncRunning( - JNIEnv *env, - jobject obj - ) +JNIEXPORT jboolean JNICALL Java_foundation_pEp_jniadapter_AbstractEngine__1isSyncRunning(JNIEnv *env, + jobject obj) { std::mutex *mutex_local = nullptr; { diff --git a/src/cxx/foundation_pEp_jniadapter__Blob.cc b/src/cxx/foundation_pEp_jniadapter__Blob.cc index a817fae..713d2d6 100644 --- a/src/cxx/foundation_pEp_jniadapter__Blob.cc +++ b/src/cxx/foundation_pEp_jniadapter__Blob.cc @@ -8,39 +8,43 @@ #include "foundation_pEp_jniadapter__Blob.h" namespace pEp { - namespace JNIAdapter { - static ::bloblist_t *bloblist_ptr(JNIEnv *env, jobject me) { - jfieldID handle; +namespace JNIAdapter { - try { - handle = getFieldID(env, "foundation/pEp/jniadapter/Blob", "mime_type", "Ljava/lang/String"); - } - catch (std::exception& ex) { - assert(0); - return NULL; - } +static ::bloblist_t *bloblist_ptr(JNIEnv *env, jobject me) { + jfieldID handle; - return reinterpret_cast<::bloblist_t*>(env->GetLongField(me, handle)); - } - }; -}; + try { + handle = getFieldID(env, "foundation/pEp/jniadapter/Blob", "mime_type", "Ljava/lang/String"); + } catch (std::exception &ex) { + assert(0); + return NULL; + } + + return reinterpret_cast<::bloblist_t *>(env->GetLongField(me, handle)); +} + +}; //namespace JNIAdapter +}; //namespace pEp extern "C" { using namespace std; using namespace pEp::JNIAdapter; -JNIEXPORT jbyteArray JNICALL Java_foundation_pEp_jniadapter__1Blob__1dataToXER(JNIEnv *env, jobject obj) + +JNIEXPORT jbyteArray JNICALL Java_foundation_pEp_jniadapter__1Blob__1dataToXER(JNIEnv *env, + jobject obj) { pEpLog("called"); bloblist_t *b = to_blob(env, obj); char *out = nullptr; // RFC 1049 / RFC 2045 : The type, subtype, and parameter names are not case sensitive. - if(strcasecmp(b->mime_type, "application/pEp.sync") == 0) { + if (strcasecmp(b->mime_type, "application/pEp.sync") == 0) { PEP_STATUS status = ::PER_to_XER_Sync_msg(b->value, static_cast(b->size), &out); - if (status) + if (status) { throw_pEp_Exception(env, status); + } jbyteArray result = from_string(env, out); free(out); @@ -48,17 +52,18 @@ JNIEXPORT jbyteArray JNICALL Java_foundation_pEp_jniadapter__1Blob__1dataToXER(J } // RFC 1049 / RFC 2045 : The type, subtype, and parameter names are not case sensitive. - if(strcasecmp(b->mime_type, "application/pEp.keyreset") == 0) { + if (strcasecmp(b->mime_type, "application/pEp.keyreset") == 0) { PEP_STATUS status = ::PER_to_XER_Distribution_msg(b->value, static_cast(b->size), &out); - if (status) + if (status) { throw_pEp_Exception(env, status); + } jbyteArray result = from_string(env, out); free(out); return result; } - return from_string(env,b->value); + return from_string(env, b->value); } }; // extern "C" diff --git a/src/cxx/identity_api.cc b/src/cxx/identity_api.cc index 12fb3d1..c9b850f 100644 --- a/src/cxx/identity_api.cc +++ b/src/cxx/identity_api.cc @@ -3,10 +3,12 @@ #include "jniutils.hh" - extern "C" { -JNIEXPORT jint JNICALL Java_foundation_pEp_jniadapter_Identity__1getRating(JNIEnv *env, jobject thiz, jint comm_type) +JNIEXPORT jint JNICALL Java_foundation_pEp_jniadapter_Identity__1getRating( + JNIEnv *env, + jobject thiz, + jint comm_type) { pEpLog("called"); return ::rating_from_comm_type(static_cast(comm_type)); diff --git a/src/cxx/jniutils.cc b/src/cxx/jniutils.cc index 262e6d9..27f2438 100644 --- a/src/cxx/jniutils.cc +++ b/src/cxx/jniutils.cc @@ -1,8 +1,11 @@ #include #include "jniutils.hh" #include + #ifndef __LP64__ + #include + #define time_t time64_t #define timegm timegm64 #define gmtime_r gmtime64_r @@ -11,760 +14,782 @@ #endif namespace pEp { - namespace JNIAdapter { - std::mutex global_mutex; - std::unordered_map engine_objid_mutex; - - std::mutex* get_engine_java_object_mutex( - JNIEnv *env, - jobject obj - ) - { - long engine_obj_id = static_cast(callLongMethod(env, obj, "getId")); - assert(engine_obj_id); - pEpLog("for java object id: " << engine_obj_id); - std::mutex *engine_obj_mutex = engine_objid_mutex.at(engine_obj_id); - pEpLog("found mutex: " << engine_obj_mutex << " with native_handle: " << engine_obj_mutex->native_handle()); - assert(engine_obj_mutex); - return engine_obj_mutex; - } - - void create_engine_java_object_mutex( - JNIEnv *env, - jobject obj - ) - { - long engine_obj_id = static_cast(callLongMethod(env, obj, "getId")); - assert(engine_obj_id); - std::mutex *engine_obj_mutex = new std::mutex(); - pEpLog(engine_obj_mutex << " with native_handle: " << engine_obj_mutex->native_handle() << " for java object id: " << engine_obj_id); - assert(engine_obj_mutex); - if(engine_objid_mutex.count(engine_obj_id) > 0) { - pEpLog("Fatal: mutex already existing for object id: " << engine_obj_id); - assert(0); - } - engine_objid_mutex.insert(std::make_pair(engine_obj_id, engine_obj_mutex )); - } - - void release_engine_java_object_mutex( - JNIEnv *env, - jobject obj - ) - { - long engine_obj_id = static_cast(callLongMethod(env, obj, "getId")); - assert(engine_obj_id); - std::mutex *engine_obj_mutex = engine_objid_mutex.at(engine_obj_id); - pEpLog(engine_obj_mutex << " with native_handle: " << engine_obj_mutex->native_handle() << " for java object id: " << engine_obj_id); - assert(engine_obj_mutex); - engine_objid_mutex.erase(engine_obj_id); - delete engine_obj_mutex; - } - - jclass findClass(JNIEnv *env, const char *classname) - { - jclass clazz = env->FindClass(classname); - if (!clazz) - fprintf(stderr, "class not found: %s\n", classname); - assert(clazz); - - if (clazz == NULL) { - jclass ex = env->FindClass("java/lang/NoClassDefFoundError"); - assert(ex); - env->ThrowNew(ex, classname); - throw std::bad_cast(); - } - - return clazz; - } - - jfieldID getFieldID( - JNIEnv *env, - const char *classname, - const char *fieldname, - const char *signature - ) - { - jclass clazz = findClass(env, classname); - assert(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)); - } - - env->DeleteLocalRef(clazz); - - 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, - const char *methodname - ) - { - jclass clazz = env->GetObjectClass(obj); - assert(clazz); - - jmethodID method = env->GetMethodID(clazz, methodname, "()I"); - if (method == NULL) { - jclass ex = env->FindClass("java/lang/NoSuchMethodError"); - assert(ex); - env->ThrowNew(ex, methodname); - throw std::invalid_argument(std::string(methodname)); - } - - env->DeleteLocalRef(clazz); - - jint result = env->CallIntMethod(obj, method); - env->ExceptionCheck(); // handle exception in Java - return result; - } - - jlong callLongMethod( - JNIEnv *env, - jobject obj, - const char *methodname - ) - { - jclass clazz = env->GetObjectClass(obj); - assert(clazz); - - jmethodID method = env->GetMethodID(clazz, methodname, "()J"); - if (method == NULL) { - jclass ex = env->FindClass("java/lang/NoSuchMethodError"); - assert(ex); - env->ThrowNew(ex, methodname); - throw std::invalid_argument(std::string(methodname)); - } - - env->DeleteLocalRef(clazz); - - jlong result = env->CallLongMethod(obj, method); - env->ExceptionCheck(); // handle exception in Java - return result; - } - - jobject callObjectMethod( - JNIEnv *env, - jobject obj, - const char *methodname, - jint index - ) - { - jclass clazz = env->GetObjectClass(obj); - assert(clazz); - - jmethodID method = env->GetMethodID(clazz, methodname, - "(I)Ljava/lang/Object;"); - if (method == NULL) { - jclass ex = env->FindClass("java/lang/NoSuchMethodError"); - assert(ex); - env->ThrowNew(ex, methodname); - throw std::invalid_argument(std::string(methodname)); - } - - env->DeleteLocalRef(clazz); - - jobject result = env->CallObjectMethod(obj, method, index); - env->ExceptionCheck(); // handle exception in Java - return result; - } - - jboolean callBooleanMethod( - JNIEnv *env, - jobject obj, - const char *methodname, - jobject o - ) - { - jclass clazz = env->GetObjectClass(obj); - assert(clazz); - - jmethodID method = env->GetMethodID(clazz, methodname, - "(Ljava/lang/Object;)Z"); - if (method == NULL) { - jclass ex = env->FindClass("java/lang/NoSuchMethodError"); - assert(ex); - env->ThrowNew(ex, methodname); - throw std::invalid_argument(std::string(methodname)); - } - - env->DeleteLocalRef(clazz); - - jboolean result = env->CallBooleanMethod(obj, method, o); - env->ExceptionCheck(); // handle exception in Java - return result; - } - - jint outOfMemory(JNIEnv *env) - { - jclass ex; - const char *ex_name = "java/lang/OutOfMemoryError"; - - ex = env->FindClass(ex_name); - assert(ex); - return env->ThrowNew(ex, ex_name); - } - - jobject from_Integer(JNIEnv *env, int val) - { - assert(env); - jclass clazz = findClass(env, "java/lang/Integer"); - - jmethodID constructor = env->GetMethodID(clazz, "", "(I)V"); - assert(constructor); - - jobject obj = env->NewObject(clazz, constructor, val); - assert(obj); - return obj; - } - - int to_Integer(JNIEnv *env, jobject obj) - { - assert(env && obj); - int _val = callIntMethod(env, obj, "intValue"); - return _val; - } - - jbyteArray from_string(JNIEnv *env, const char *str) - { - if (str && str[0]) { - jboolean isCopy; - size_t l = strlen(str); - jbyteArray _str = env->NewByteArray(l); - env->SetByteArrayRegion(_str, 0, l, (jbyte*)str); - return _str; - } - else if (str) { - return env->NewByteArray(0); - } else { - return (jbyteArray) NULL; - } - } - - char *to_string(JNIEnv *env, jbyteArray str) - { - if (str == NULL) - return NULL; - - size_t l = env->GetArrayLength(str); - char *_str = static_cast(calloc(1,l+1)); - assert(_str); - env->GetByteArrayRegion(str, 0, l, (jbyte*)_str); - return _str; - } - - jobject from_stringlist(JNIEnv *env, stringlist_t *sl) - { - if (!sl) - return (jobject) NULL; - - jclass clazz = findClass(env, "java/util/Vector"); - jmethodID constructor = env->GetMethodID(clazz, "", "()V"); - assert(constructor); - jobject obj = env->NewObject(clazz, constructor); - assert(obj); - - stringlist_t *_sl; - for (_sl = sl; _sl && _sl->value; _sl = _sl->next) { - jobject o = from_string(env, _sl->value); - callBooleanMethod(env, obj, "add", o); - } - - env->DeleteLocalRef(clazz); - - return obj; - } - - stringlist_t *to_stringlist(JNIEnv *env, jobject obj) - { - if (!obj) - return NULL; - - jint size = callIntMethod(env, obj, "size"); - if (size == 0) - return NULL; - - stringlist_t *sl = new_stringlist(NULL); - stringlist_t *_sl; - jint i; - for (_sl = sl, i = 0; i < (int) size; i++) { - jobject o = callObjectMethod(env, obj, "get", i); - jbyteArray a = static_cast(o); - char * str = to_string(env, a); - _sl = stringlist_add(_sl, str); - env->DeleteLocalRef(o); - free(str); - } - - return sl; - } - - jobject from_stringpairlist(JNIEnv *env, stringpair_list_t *sl) - { - if (!sl) - return (jobject) NULL; - - jclass clazz = findClass(env, "java/util/ArrayList"); - jclass clazz_pair = findClass(env, "foundation/pEp/jniadapter/Pair"); - jmethodID constructor = env->GetMethodID(clazz, "", "()V"); - assert(constructor); - jmethodID constructor_pair = env->GetMethodID(clazz_pair, "", - "(Ljava/lang/Object;Ljava/lang/Object;)V"); - assert(constructor_pair); - - jobject obj = env->NewObject(clazz, constructor); - assert(obj); - - stringpair_list_t *_sl; - for (_sl = sl; _sl && _sl->value; _sl = _sl->next) { - assert(_sl->value->key); - assert(_sl->value->value); - - jbyteArray first = from_string(env, _sl->value->key); - jbyteArray second = from_string(env, _sl->value->value); - jobject pair = env->NewObject(clazz_pair, constructor_pair, - first, second); - callBooleanMethod(env, obj, "add", pair); - - env->DeleteLocalRef(first); - env->DeleteLocalRef(second); - env->DeleteLocalRef(pair); - - - } - - env->DeleteLocalRef(clazz); - env->DeleteLocalRef(clazz_pair); - - return obj; - } - - stringpair_list_t *to_stringpairlist(JNIEnv *env, jobject obj) - { - if (!obj) - return NULL; - - jint size = callIntMethod(env, obj, "size"); - if (size == 0) - return NULL; - - jfieldID first_id = getFieldID(env, "foundation/pEp/jniadapter/Pair", - "first", "Ljava/lang/Object;"); - jfieldID second_id = getFieldID(env, "foundation/pEp/jniadapter/Pair", - "second", "Ljava/lang/Object;"); - - stringpair_list_t *sl = new_stringpair_list(NULL); - stringpair_list_t *_sl; - jint i; - - for (_sl = sl, i = 0; i < (int) size; i++) { - jobject pair = callObjectMethod(env, obj, "get", i); - jbyteArray first = - static_cast(env->GetObjectField(pair, - first_id)); - jbyteArray second = - static_cast(env->GetObjectField(pair, - second_id)); - - char *first_str = to_string(env, first); - char *second_str = to_string(env, second); - stringpair_t *sp = new_stringpair(first_str, second_str); - env->DeleteLocalRef(pair); - free(first_str); - free(second_str); - - _sl = stringpair_list_add(_sl, sp); - } - - return sl; - } - - jobject from_timestamp(JNIEnv *env, timestamp *ts) - { - if (!ts) - return NULL; - - //LOGD("/* Seconds (0-60) */ FROM :%d", ts->tm_sec); - //LOGD("/* Minutes (0-59) */ :%d", ts->tm_min); - //LOGD("/* Hours (0-23) */ :%d", ts->tm_hour); - //LOGD("/* Day of the month (1-31) */:%d", ts->tm_mday); - //LOGD("/* Month (0-11) */ :%d", ts->tm_mon); - //LOGD("/* Year - 1900 */ :%d", ts->tm_year); - - time_t t = timegm(ts)*1000; - //LOGD( "TimeGM returns : %lld", t); - jclass clazz = findClass(env, "java/util/Date"); - jmethodID constructor = env->GetMethodID(clazz, "", "(J)V"); - assert(constructor); - - jobject result = env->NewObject(clazz, constructor, (jlong) t); - - env->DeleteLocalRef(clazz); - - return result; - - } - - timestamp *to_timestamp(JNIEnv *env, jobject date) - { - if (!date) - return NULL; - - jlong t = callLongMethod(env, date, "getTime"); - //LOGD( "Set Time to : %lld", t); - timestamp *ts = static_cast(calloc(1, sizeof(timestamp))); - assert(ts); - if (ts == NULL) - return NULL; - - if (t){ - time_t clock = t/1000; - gmtime_r(&clock, ts); - - //LOGD("/* Seconds (0-60) */ TO :%d", ts->tm_sec); - //LOGD("/* Minutes (0-59) */ :%d", ts->tm_min); - //LOGD("/* Hours (0-23) */ :%d", ts->tm_hour); - //LOGD("/* Day of the month (1-31) */:%d", ts->tm_mday); - //LOGD("/* Month (0-11) */ :%d", ts->tm_mon); - //LOGD("/* Year - 1900 */ :%d", ts->tm_year); - } - - return ts; - } - - static void _setStringField(JNIEnv *env, const char *classname, - jobject obj, const char *name, const char *value) - { - if (value) { - jfieldID fieldID = getFieldID(env, classname, name, "[B"); - env->SetObjectField(obj, fieldID, static_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, static_cast(from_string(env, value))); - - } - } - - jobject from_identity(JNIEnv *env, pEp_identity *ident) - { - if (!ident) - return (jobject) NULL; - - static const char *classname = "foundation/pEp/jniadapter/_Identity"; - jclass clazz = findClass(env, classname); - jmethodID constructor = env->GetMethodID(clazz, "", "()V"); - assert(constructor); - jobject obj = env->NewObject(clazz, constructor); - - env->DeleteLocalRef(clazz); - - if (ident) { - _setStringField(env, classname, obj, "address", ident->address); - _setStringField(env, classname, obj, "fpr", ident->fpr); - _setStringField(env, classname, obj, "user_id", ident->user_id); - _setStringField(env, classname, obj, "username", ident->username); - - jfieldID comm_type_id = getFieldID(env, classname, "comm_type", "I"); - env->SetIntField(obj, comm_type_id, static_cast(ident->comm_type)); - - _setStringField(env, classname, obj, "lang", ident->lang); - - jfieldID me_id = getFieldID(env, classname, "me", "Z"); - env->SetBooleanField(obj, me_id, static_cast(ident->me)); - - jfieldID flags_id = getFieldID(env, classname, "flags", "I"); - env->SetIntField(obj, flags_id, static_cast(ident->flags)); - } - - 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 = "foundation/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, static_cast(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, static_cast(ident->me)); - - jfieldID flags_id = getFieldID(env, classname, "flags", "I", identityClass); - env->SetIntField(obj, flags_id, static_cast(ident->flags)); - } - - return obj; - } - - char *_getStringField(JNIEnv *env, const char *classname, jobject obj, - const char *name) - { - jfieldID fieldID = getFieldID(env, classname, name, "[B"); - jobject fobj = env->GetObjectField(obj, fieldID); - - char *res = to_string(env, static_cast(fobj)); - - env->DeleteLocalRef(fobj); - return res; - } - - pEp_identity *to_identity(JNIEnv *env, jobject obj) - { - if (!obj) - return NULL; - - static const char *classname = "foundation/pEp/jniadapter/_Identity"; - pEp_identity *ident = new_identity(NULL, NULL, NULL, NULL); - - ident->address = _getStringField(env, classname, obj, "address"); - ident->fpr = _getStringField(env, classname, obj, "fpr"); - ident->user_id = _getStringField(env, classname, obj, "user_id"); - ident->username = _getStringField(env, classname, obj, "username"); - - jfieldID comm_type_id = getFieldID(env, classname, "comm_type", "I"); - ident->comm_type = static_cast(env->GetIntField(obj, comm_type_id)); - - char *lang = _getStringField(env, classname, obj, "lang"); - if (lang && lang[0]) { - ident->lang[0] = lang[0]; - ident->lang[1] = lang[1]; - } - free(lang); - - jfieldID me_id = getFieldID(env, classname, "me", "Z"); - ident->me = static_cast(env->GetBooleanField(obj, me_id)); - - jfieldID flags_id = getFieldID(env, classname, "flags", "I"); - ident->flags = static_cast(env->GetIntField(obj, flags_id)); - - return ident; - } - - jobject from_identitylist(JNIEnv *env, identity_list *il) - { - if (!il) - return (jobject) NULL; - - jclass clazz = findClass(env, "java/util/Vector"); - jmethodID constructor = env->GetMethodID(clazz, "", "()V"); - assert(constructor); - jobject obj = env->NewObject(clazz, constructor); - assert(obj); - - identity_list *_il; - for (_il = il; _il && _il->ident; _il = _il->next) { - jobject o = from_identity(env, _il->ident); - callBooleanMethod(env, obj, "add", o); - } - - env->DeleteLocalRef(clazz); - - return obj; - } - - identity_list *to_identitylist(JNIEnv *env, jobject obj) - { - if (!obj) - return NULL; - - jint size = callIntMethod(env, obj, "size"); - if (size == 0) - return NULL; - - identity_list *il = new_identity_list(NULL); - identity_list *_il; - jint i; - for (_il = il, i = 0; i < (int) size; i++) { - jobject o = callObjectMethod(env, obj, "get", i); - pEp_identity* ident = to_identity(env, o); - _il = identity_list_add(_il, ident); - env->DeleteLocalRef(o); - } - - return il; - } - - jobject _from_blob(JNIEnv *env, bloblist_t *b) - { - if (!b) - return (jobject) NULL; - - static const char *classname = "foundation/pEp/jniadapter/_Blob"; - jclass clazz = findClass(env, classname); - jmethodID constructor = env->GetMethodID(clazz, "", "()V"); - assert(constructor); - jobject obj = env->NewObject(clazz, constructor); - - env->DeleteLocalRef(clazz); - - jfieldID fieldID = getFieldID(env, classname, "data", "[B"); - jbyteArray _data = env->NewByteArray(static_cast(b->size)); - env->SetByteArrayRegion(_data, 0, b->size, reinterpret_cast(b->value)); - env->SetObjectField(obj, fieldID, static_cast(_data)); - _setStringField(env, classname, obj, "mime_type", b->mime_type); - _setStringField(env, classname, obj, "filename", b->filename); - - return obj; - } - - jobject from_bloblist(JNIEnv *env, bloblist_t *bl) - { - if (!bl) - return (jobject) NULL; - - jclass clazz = findClass(env, "java/util/Vector"); - jmethodID constructor = env->GetMethodID(clazz, "", "()V"); - assert(constructor); - jobject obj = env->NewObject(clazz, constructor); - assert(obj); - - env->DeleteLocalRef(clazz); - - bloblist_t *_bl; - for (_bl = bl; _bl && _bl->value; _bl = _bl->next) { - jobject o = _from_blob(env, _bl); - if(o) - callBooleanMethod(env, obj, "add", o); - } - - return obj; - } - - bloblist_t *to_blob(JNIEnv *env, jobject obj) - { - if (!obj) - return NULL; - - static const char *classname = "foundation/pEp/jniadapter/_Blob"; - jclass clazz = findClass(env, classname); - - char *mime_type = _getStringField(env, classname, obj, "mime_type"); - char *filename = _getStringField(env, classname, obj, "filename"); - - jfieldID data_id = getFieldID(env, classname, "data", "[B"); - jbyteArray _data = static_cast(env->GetObjectField(obj, data_id)); - size_t size = static_cast(env->GetArrayLength(_data)); - char *b = static_cast(malloc(size)); - assert(b); - - env->GetByteArrayRegion(_data, 0, size, reinterpret_cast(b)); - bloblist_t *bl = new_bloblist( b, size, mime_type, filename); - - free(mime_type); - free(filename); - return bl; - } - - - bloblist_t *to_bloblist(JNIEnv *env, jobject obj) - { - if (!obj) - return NULL; - - jint size = callIntMethod(env, obj, "size"); - if (size == 0) - return NULL; - - bloblist_t *bl = new_bloblist(NULL, 0, NULL, NULL); - bloblist_t *_bl; - _bl = bl; - jint i; - for (i = 0; i < (int) size; i++) { - jobject o = callObjectMethod(env, obj, "get", i); - bloblist_t *b = to_blob(env, o); - _bl = bloblist_add(_bl, b->value, b->size, b->mime_type, b->filename); - env->DeleteLocalRef(o); - } - - return bl; - } - - PEP_enc_format to_EncFormat(JNIEnv *env, jobject obj) - { - static const char *classname = "foundation/pEp/jniadapter/Message$EncFormat"; - jclass clazz_enc_format = findClass(env, classname); - jfieldID field_value = env->GetFieldID(clazz_enc_format, "value", "I"); - assert(field_value); - - env->DeleteLocalRef(clazz_enc_format); - return static_cast(env->GetIntField(obj, field_value)); - } - - PEP_CIPHER_SUITE to_CipherSuite(JNIEnv *env, jobject obj) - { - static const char *classname = "foundation/pEp/jniadapter/CipherSuite"; - jclass clazz_enc_format = findClass(env, classname); - jfieldID field_value = env->GetFieldID(clazz_enc_format, "value", "I"); - assert(field_value); - - env->DeleteLocalRef(clazz_enc_format); - return static_cast(env->GetIntField(obj, field_value)); - } - - sync_handshake_result to_SyncHandshakeResult(JNIEnv *env, jobject obj) - { - static const char *classname = "foundation/pEp/jniadapter/SyncHandshakeResult"; - jclass clazz_enc_format = findClass(env, classname); - jfieldID field_value = env->GetFieldID(clazz_enc_format, "value", "I"); - assert(field_value); - - env->DeleteLocalRef(clazz_enc_format); - return static_cast(env->GetIntField(obj, field_value)); - } - }; +namespace JNIAdapter { + +std::mutex global_mutex; +std::unordered_map engine_objid_mutex; + +std::mutex *get_engine_java_object_mutex(JNIEnv *env, + jobject obj) +{ + long engine_obj_id = static_cast(callLongMethod(env, obj, "getId")); + assert(engine_obj_id); + pEpLog("for java object id: " << engine_obj_id); + std::mutex *engine_obj_mutex = engine_objid_mutex.at(engine_obj_id); + pEpLog("found mutex: " << engine_obj_mutex << " with native_handle: " << engine_obj_mutex->native_handle()); + assert(engine_obj_mutex); + return engine_obj_mutex; +} + +void create_engine_java_object_mutex(JNIEnv *env, + jobject obj) +{ + long engine_obj_id = static_cast(callLongMethod(env, obj, "getId")); + assert(engine_obj_id); + std::mutex *engine_obj_mutex = new std::mutex(); + pEpLog(engine_obj_mutex << " with native_handle: " << engine_obj_mutex->native_handle() << " for java object id: " << engine_obj_id); + assert(engine_obj_mutex); + if (engine_objid_mutex.count(engine_obj_id) > 0) { + pEpLog("Fatal: mutex already existing for object id: " << engine_obj_id); + assert(0); + } + engine_objid_mutex.insert(std::make_pair(engine_obj_id, engine_obj_mutex)); +} + +void release_engine_java_object_mutex(JNIEnv *env, + jobject obj) +{ + long engine_obj_id = static_cast(callLongMethod(env, obj, "getId")); + assert(engine_obj_id); + std::mutex *engine_obj_mutex = engine_objid_mutex.at(engine_obj_id); + pEpLog(engine_obj_mutex << " with native_handle: " << engine_obj_mutex->native_handle() << " for java object id: " << engine_obj_id); + assert(engine_obj_mutex); + engine_objid_mutex.erase(engine_obj_id); + delete engine_obj_mutex; +} + +jclass findClass(JNIEnv *env, + const char *classname) +{ + jclass clazz = env->FindClass(classname); + if (!clazz) { + fprintf(stderr, "class not found: %s\n", classname); + } + assert(clazz); + + if (clazz == NULL) { + jclass ex = env->FindClass("java/lang/NoClassDefFoundError"); + assert(ex); + env->ThrowNew(ex, classname); + throw std::bad_cast(); + } + + return clazz; +} + +jfieldID getFieldID(JNIEnv *env, + const char *classname, + const char *fieldname, + const char *signature) +{ + jclass clazz = findClass(env, classname); + assert(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)); + } + + env->DeleteLocalRef(clazz); + + 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, + const char *methodname) +{ + jclass clazz = env->GetObjectClass(obj); + assert(clazz); + + jmethodID method = env->GetMethodID(clazz, methodname, "()I"); + if (method == NULL) { + jclass ex = env->FindClass("java/lang/NoSuchMethodError"); + assert(ex); + env->ThrowNew(ex, methodname); + throw std::invalid_argument(std::string(methodname)); + } + + env->DeleteLocalRef(clazz); + + jint result = env->CallIntMethod(obj, method); + env->ExceptionCheck(); // handle exception in Java + return result; +} + +jlong callLongMethod(JNIEnv *env, + jobject obj, + const char *methodname) +{ + jclass clazz = env->GetObjectClass(obj); + assert(clazz); + + jmethodID method = env->GetMethodID(clazz, methodname, "()J"); + if (method == NULL) { + jclass ex = env->FindClass("java/lang/NoSuchMethodError"); + assert(ex); + env->ThrowNew(ex, methodname); + throw std::invalid_argument(std::string(methodname)); + } + + env->DeleteLocalRef(clazz); + + jlong result = env->CallLongMethod(obj, method); + env->ExceptionCheck(); // handle exception in Java + return result; +} + +jobject callObjectMethod(JNIEnv *env, + jobject obj, + const char *methodname, + jint index) +{ + jclass clazz = env->GetObjectClass(obj); + assert(clazz); + + jmethodID method = env->GetMethodID(clazz, methodname, "(I)Ljava/lang/Object;"); + if (method == NULL) { + jclass ex = env->FindClass("java/lang/NoSuchMethodError"); + assert(ex); + env->ThrowNew(ex, methodname); + throw std::invalid_argument(std::string(methodname)); + } + + env->DeleteLocalRef(clazz); + + jobject result = env->CallObjectMethod(obj, method, index); + env->ExceptionCheck(); // handle exception in Java + return result; +} + +jboolean callBooleanMethod(JNIEnv *env, + jobject obj, + const char *methodname, + jobject o) +{ + jclass clazz = env->GetObjectClass(obj); + assert(clazz); + + jmethodID method = env->GetMethodID(clazz, methodname, "(Ljava/lang/Object;)Z"); + if (method == NULL) { + jclass ex = env->FindClass("java/lang/NoSuchMethodError"); + assert(ex); + env->ThrowNew(ex, methodname); + throw std::invalid_argument(std::string(methodname)); + } + + env->DeleteLocalRef(clazz); + + jboolean result = env->CallBooleanMethod(obj, method, o); + env->ExceptionCheck(); // handle exception in Java + return result; +} + +jint outOfMemory(JNIEnv *env) +{ + jclass ex; + const char *ex_name = "java/lang/OutOfMemoryError"; + + ex = env->FindClass(ex_name); + assert(ex); + return env->ThrowNew(ex, ex_name); +} + +jobject from_Integer(JNIEnv *env, + int val) +{ + assert(env); + jclass clazz = findClass(env, "java/lang/Integer"); + + jmethodID constructor = env->GetMethodID(clazz, "", "(I)V"); + assert(constructor); + + jobject obj = env->NewObject(clazz, constructor, val); + assert(obj); + return obj; +} + +int to_Integer(JNIEnv *env, + jobject obj) +{ + assert(env && obj); + int _val = callIntMethod(env, obj, "intValue"); + return _val; +} + +jbyteArray from_string(JNIEnv *env, + const char *str) +{ + if (str && str[0]) { + jboolean isCopy; + size_t l = strlen(str); + jbyteArray _str = env->NewByteArray(l); + env->SetByteArrayRegion(_str, 0, l, (jbyte *) str); + return _str; + } else if (str) { + return env->NewByteArray(0); + } else { + return (jbyteArray) NULL; + } +} + +char *to_string(JNIEnv *env, + jbyteArray str) +{ + if (str == NULL) { + return NULL; + } + + size_t l = env->GetArrayLength(str); + char *_str = static_cast(calloc(1, l + 1)); + assert(_str); + env->GetByteArrayRegion(str, 0, l, (jbyte *) _str); + return _str; +} + +jobject from_stringlist(JNIEnv *env, + stringlist_t *sl) +{ + if (!sl) { + return (jobject) NULL; + } + + jclass clazz = findClass(env, "java/util/Vector"); + jmethodID constructor = env->GetMethodID(clazz, "", "()V"); + assert(constructor); + jobject obj = env->NewObject(clazz, constructor); + assert(obj); + + stringlist_t *_sl; + for (_sl = sl; _sl && _sl->value; _sl = _sl->next) { + jobject o = from_string(env, _sl->value); + callBooleanMethod(env, obj, "add", o); + } + + env->DeleteLocalRef(clazz); + + return obj; +} + +stringlist_t *to_stringlist(JNIEnv *env, + jobject obj) +{ + if (!obj) { + return NULL; + } + + jint size = callIntMethod(env, obj, "size"); + if (size == 0) { + return NULL; + } + + stringlist_t *sl = new_stringlist(NULL); + stringlist_t *_sl; + jint i; + for (_sl = sl, i = 0; i < (int) size; i++) { + jobject o = callObjectMethod(env, obj, "get", i); + jbyteArray a = static_cast(o); + char *str = to_string(env, a); + _sl = stringlist_add(_sl, str); + env->DeleteLocalRef(o); + free(str); + } + + return sl; +} + +jobject from_stringpairlist(JNIEnv *env, + stringpair_list_t *sl) +{ + if (!sl) { + return (jobject) NULL; + } + + jclass clazz = findClass(env, "java/util/ArrayList"); + jclass clazz_pair = findClass(env, "foundation/pEp/jniadapter/Pair"); + jmethodID constructor = env->GetMethodID(clazz, "", "()V"); + assert(constructor); + jmethodID constructor_pair = env->GetMethodID(clazz_pair, "", "(Ljava/lang/Object;Ljava/lang/Object;)V"); + assert(constructor_pair); + + jobject obj = env->NewObject(clazz, constructor); + assert(obj); + + stringpair_list_t *_sl; + for (_sl = sl; _sl && _sl->value; _sl = _sl->next) { + assert(_sl->value->key); + assert(_sl->value->value); + + jbyteArray first = from_string(env, _sl->value->key); + jbyteArray second = from_string(env, _sl->value->value); + jobject pair = env->NewObject(clazz_pair, constructor_pair, first, second); + callBooleanMethod(env, obj, "add", pair); + + env->DeleteLocalRef(first); + env->DeleteLocalRef(second); + env->DeleteLocalRef(pair); + } + + env->DeleteLocalRef(clazz); + env->DeleteLocalRef(clazz_pair); + + return obj; +} + +stringpair_list_t *to_stringpairlist(JNIEnv *env, + jobject obj) +{ + if (!obj) { + return NULL; + } + + jint size = callIntMethod(env, obj, "size"); + if (size == 0) { + return NULL; + } + + jfieldID first_id = getFieldID(env, "foundation/pEp/jniadapter/Pair", "first", "Ljava/lang/Object;"); + jfieldID second_id = getFieldID(env, "foundation/pEp/jniadapter/Pair", "second", "Ljava/lang/Object;"); + + stringpair_list_t *sl = new_stringpair_list(NULL); + stringpair_list_t *_sl; + jint i; + + for (_sl = sl, i = 0; i < (int) size; i++) { + jobject pair = callObjectMethod(env, obj, "get", i); + jbyteArray first = static_cast(env->GetObjectField(pair, first_id)); + jbyteArray second = static_cast(env->GetObjectField(pair, second_id)); + + char *first_str = to_string(env, first); + char *second_str = to_string(env, second); + stringpair_t *sp = new_stringpair(first_str, second_str); + env->DeleteLocalRef(pair); + free(first_str); + free(second_str); + + _sl = stringpair_list_add(_sl, sp); + } + + return sl; +} + +jobject from_timestamp(JNIEnv *env, + timestamp *ts) +{ + if (!ts) { + return NULL; + } + + //LOGD("/* Seconds (0-60) */ FROM :%d", ts->tm_sec); + //LOGD("/* Minutes (0-59) */ :%d", ts->tm_min); + //LOGD("/* Hours (0-23) */ :%d", ts->tm_hour); + //LOGD("/* Day of the month (1-31) */:%d", ts->tm_mday); + //LOGD("/* Month (0-11) */ :%d", ts->tm_mon); + //LOGD("/* Year - 1900 */ :%d", ts->tm_year); + + time_t t = timegm(ts) * 1000; + //LOGD( "TimeGM returns : %lld", t); + jclass clazz = findClass(env, "java/util/Date"); + jmethodID constructor = env->GetMethodID(clazz, "", "(J)V"); + assert(constructor); + + jobject result = env->NewObject(clazz, constructor, (jlong) t); + + env->DeleteLocalRef(clazz); + + return result; +} + +timestamp *to_timestamp(JNIEnv *env, + jobject date) +{ + if (!date) { + return NULL; + } + + jlong t = callLongMethod(env, date, "getTime"); + //LOGD( "Set Time to : %lld", t); + timestamp *ts = static_cast(calloc(1, sizeof(timestamp))); + assert(ts); + if (ts == NULL) { + return NULL; + } + + if (t) { + time_t clock = t / 1000; + gmtime_r(&clock, ts); + + //LOGD("/* Seconds (0-60) */ TO :%d", ts->tm_sec); + //LOGD("/* Minutes (0-59) */ :%d", ts->tm_min); + //LOGD("/* Hours (0-23) */ :%d", ts->tm_hour); + //LOGD("/* Day of the month (1-31) */:%d", ts->tm_mday); + //LOGD("/* Month (0-11) */ :%d", ts->tm_mon); + //LOGD("/* Year - 1900 */ :%d", ts->tm_year); + } + + return ts; +} + +static void _setStringField(JNIEnv *env, + const char *classname, + jobject obj, + const char *name, + const char *value) +{ + if (value) { + jfieldID fieldID = getFieldID(env, classname, name, "[B"); + env->SetObjectField(obj, fieldID, static_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, static_cast(from_string(env, value))); + } +} + +jobject from_identity(JNIEnv *env, + pEp_identity *ident) +{ + if (!ident) { + return (jobject) NULL; + } + + static const char *classname = "foundation/pEp/jniadapter/_Identity"; + jclass clazz = findClass(env, classname); + jmethodID constructor = env->GetMethodID(clazz, "", "()V"); + assert(constructor); + jobject obj = env->NewObject(clazz, constructor); + + env->DeleteLocalRef(clazz); + + if (ident) { + _setStringField(env, classname, obj, "address", ident->address); + _setStringField(env, classname, obj, "fpr", ident->fpr); + _setStringField(env, classname, obj, "user_id", ident->user_id); + _setStringField(env, classname, obj, "username", ident->username); + + jfieldID comm_type_id = getFieldID(env, classname, "comm_type", "I"); + env->SetIntField(obj, comm_type_id, static_cast(ident->comm_type)); + + _setStringField(env, classname, obj, "lang", ident->lang); + + jfieldID me_id = getFieldID(env, classname, "me", "Z"); + env->SetBooleanField(obj, me_id, static_cast(ident->me)); + + jfieldID flags_id = getFieldID(env, classname, "flags", "I"); + env->SetIntField(obj, flags_id, static_cast(ident->flags)); + } + + 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 = "foundation/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, static_cast(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, static_cast(ident->me)); + + jfieldID flags_id = getFieldID(env, classname, "flags", "I", identityClass); + env->SetIntField(obj, flags_id, static_cast(ident->flags)); + } + + return obj; +} + +char *_getStringField(JNIEnv *env, + const char *classname, + jobject obj, + const char *name) +{ + jfieldID fieldID = getFieldID(env, classname, name, "[B"); + jobject fobj = env->GetObjectField(obj, fieldID); + + char *res = to_string(env, static_cast(fobj)); + + env->DeleteLocalRef(fobj); + return res; +} + +pEp_identity *to_identity(JNIEnv *env, + jobject obj) +{ + if (!obj) { + return NULL; + } + + static const char *classname = "foundation/pEp/jniadapter/_Identity"; + pEp_identity *ident = new_identity(NULL, NULL, NULL, NULL); + + ident->address = _getStringField(env, classname, obj, "address"); + ident->fpr = _getStringField(env, classname, obj, "fpr"); + ident->user_id = _getStringField(env, classname, obj, "user_id"); + ident->username = _getStringField(env, classname, obj, "username"); + + jfieldID comm_type_id = getFieldID(env, classname, "comm_type", "I"); + ident->comm_type = static_cast(env->GetIntField(obj, comm_type_id)); + + char *lang = _getStringField(env, classname, obj, "lang"); + if (lang && lang[0]) { + ident->lang[0] = lang[0]; + ident->lang[1] = lang[1]; + } + free(lang); + + jfieldID me_id = getFieldID(env, classname, "me", "Z"); + ident->me = static_cast(env->GetBooleanField(obj, me_id)); + + jfieldID flags_id = getFieldID(env, classname, "flags", "I"); + ident->flags = static_cast(env->GetIntField(obj, flags_id)); + + return ident; +} + +jobject from_identitylist(JNIEnv *env, + identity_list *il) +{ + if (!il) { + return (jobject) NULL; + } + + jclass clazz = findClass(env, "java/util/Vector"); + jmethodID constructor = env->GetMethodID(clazz, "", "()V"); + assert(constructor); + jobject obj = env->NewObject(clazz, constructor); + assert(obj); + + identity_list *_il; + for (_il = il; _il && _il->ident; _il = _il->next) { + jobject o = from_identity(env, _il->ident); + callBooleanMethod(env, obj, "add", o); + } + + env->DeleteLocalRef(clazz); + + return obj; +} + +identity_list *to_identitylist(JNIEnv *env, + jobject obj) +{ + if (!obj) { + return NULL; + } + + jint size = callIntMethod(env, obj, "size"); + if (size == 0) { + return NULL; + } + + identity_list *il = new_identity_list(NULL); + identity_list *_il; + jint i; + for (_il = il, i = 0; i < (int) size; i++) { + jobject o = callObjectMethod(env, obj, "get", i); + pEp_identity *ident = to_identity(env, o); + _il = identity_list_add(_il, ident); + env->DeleteLocalRef(o); + } + + return il; +} + +jobject _from_blob(JNIEnv *env, + bloblist_t *b) +{ + if (!b) { + return (jobject) NULL; + } + + static const char *classname = "foundation/pEp/jniadapter/_Blob"; + jclass clazz = findClass(env, classname); + jmethodID constructor = env->GetMethodID(clazz, "", "()V"); + assert(constructor); + jobject obj = env->NewObject(clazz, constructor); + + env->DeleteLocalRef(clazz); + + jfieldID fieldID = getFieldID(env, classname, "data", "[B"); + jbyteArray _data = env->NewByteArray(static_cast(b->size)); + env->SetByteArrayRegion(_data, 0, b->size, reinterpret_cast(b->value)); + env->SetObjectField(obj, fieldID, static_cast(_data)); + _setStringField(env, classname, obj, "mime_type", b->mime_type); + _setStringField(env, classname, obj, "filename", b->filename); + + return obj; +} + +jobject from_bloblist(JNIEnv *env, + bloblist_t *bl) +{ + if (!bl) { + return (jobject) NULL; + } + + jclass clazz = findClass(env, "java/util/Vector"); + jmethodID constructor = env->GetMethodID(clazz, "", "()V"); + assert(constructor); + jobject obj = env->NewObject(clazz, constructor); + assert(obj); + + env->DeleteLocalRef(clazz); + + bloblist_t *_bl; + for (_bl = bl; _bl && _bl->value; _bl = _bl->next) { + jobject o = _from_blob(env, _bl); + if (o) { + callBooleanMethod(env, obj, "add", o); + } + } + + return obj; +} + +bloblist_t *to_blob(JNIEnv *env, + jobject obj) +{ + if (!obj) { + return NULL; + } + + static const char *classname = "foundation/pEp/jniadapter/_Blob"; + jclass clazz = findClass(env, classname); + + char *mime_type = _getStringField(env, classname, obj, "mime_type"); + char *filename = _getStringField(env, classname, obj, "filename"); + + jfieldID data_id = getFieldID(env, classname, "data", "[B"); + jbyteArray _data = static_cast(env->GetObjectField(obj, data_id)); + size_t size = static_cast(env->GetArrayLength(_data)); + char *b = static_cast(malloc(size)); + assert(b); + + env->GetByteArrayRegion(_data, 0, size, reinterpret_cast(b)); + bloblist_t *bl = new_bloblist(b, size, mime_type, filename); + + free(mime_type); + free(filename); + return bl; +} + + +bloblist_t *to_bloblist(JNIEnv *env, + jobject obj) +{ + if (!obj) { + return NULL; + } + + jint size = callIntMethod(env, obj, "size"); + if (size == 0) { + return NULL; + } + + bloblist_t *bl = new_bloblist(NULL, 0, NULL, NULL); + bloblist_t *_bl; + _bl = bl; + jint i; + for (i = 0; i < (int) size; i++) { + jobject o = callObjectMethod(env, obj, "get", i); + bloblist_t *b = to_blob(env, o); + _bl = bloblist_add(_bl, b->value, b->size, b->mime_type, b->filename); + env->DeleteLocalRef(o); + } + + return bl; +} + +PEP_enc_format to_EncFormat(JNIEnv *env, + jobject obj) +{ + static const char *classname = "foundation/pEp/jniadapter/Message$EncFormat"; + jclass clazz_enc_format = findClass(env, classname); + jfieldID field_value = env->GetFieldID(clazz_enc_format, "value", "I"); + assert(field_value); + + env->DeleteLocalRef(clazz_enc_format); + return static_cast(env->GetIntField(obj, field_value)); +} + +PEP_CIPHER_SUITE to_CipherSuite(JNIEnv *env, + jobject obj) +{ + static const char *classname = "foundation/pEp/jniadapter/CipherSuite"; + jclass clazz_enc_format = findClass(env, classname); + jfieldID field_value = env->GetFieldID(clazz_enc_format, "value", "I"); + assert(field_value); + + env->DeleteLocalRef(clazz_enc_format); + return static_cast(env->GetIntField(obj, field_value)); +} + +sync_handshake_result to_SyncHandshakeResult(JNIEnv *env, + jobject obj) +{ + static const char *classname = "foundation/pEp/jniadapter/SyncHandshakeResult"; + jclass clazz_enc_format = findClass(env, classname); + jfieldID field_value = env->GetFieldID(clazz_enc_format, "value", "I"); + assert(field_value); + + env->DeleteLocalRef(clazz_enc_format); + return static_cast(env->GetIntField(obj, field_value)); +} +}; }; diff --git a/src/cxx/jniutils.hh b/src/cxx/jniutils.hh index 54fcfb2..747d55a 100644 --- a/src/cxx/jniutils.hh +++ b/src/cxx/jniutils.hh @@ -1,4 +1,5 @@ #pragma once + #include #include #include @@ -19,112 +20,128 @@ #endif namespace pEp { - namespace JNIAdapter { - // Global mutex needs to be locked in all constructors which insert their own mutex object - // into the unordered_map (which is thread safe for read, but not for write) - extern std::mutex global_mutex; - - // Stores mutex per java object - extern std::unordered_map engine_objid_mutex; - - // needs to be called after create_engine_java_object_mutex() - // and before release_engine_java_object_mutex() - // Thread safe - std::mutex* get_engine_java_object_mutex( - JNIEnv *env, - jobject me - ); - - // Needs to be called exactly once per obj, in the constructor of the obj - // You need to lock a global mutex before calling this function (write to unordered_map) - void create_engine_java_object_mutex( - JNIEnv *env, - jobject me - ); - - // Needs to be called exactly once per obj, in the destructor of this obj - // You need to lock a global mutex before calling this function (write to unordered_map) - void release_engine_java_object_mutex( - JNIEnv *env, - jobject me - ); - - - jclass findClass(JNIEnv *env, const char *classname); - - jfieldID getFieldID( - JNIEnv *env, - const char *classname, - const char *fieldname, - 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, - const char *methodname - ); - - jlong callLongMethod( - JNIEnv *env, - jobject obj, - const char *methodname - ); - - jobject callObjectMethod( - JNIEnv *env, - jobject obj, - const char *methodname, - jint index - ); - - jboolean callBooleanMethod( - JNIEnv *env, - jobject obj, - const char *methodname, - jobject o - ); - - jint outOfMemory(JNIEnv *env); - - jobject from_Integer(JNIEnv *env, int val); - int to_Integer(JNIEnv *env, jobject obj); - - jbyteArray from_string(JNIEnv *env, const char *str); - char *to_string(JNIEnv *env, jbyteArray str); - - jobject from_stringlist(JNIEnv *env, stringlist_t *sl); - stringlist_t *to_stringlist(JNIEnv *env, jobject obj); - - jobject from_stringpairlist(JNIEnv *env, stringpair_list_t *sl); - stringpair_list_t *to_stringpairlist(JNIEnv *env, jobject obj); - - jobject from_timestamp(JNIEnv *env, timestamp *ts); - 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); - identity_list *to_identitylist(JNIEnv *env, jobject obj); - - jobject from_bloblist(JNIEnv *env, bloblist_t *bl); - bloblist_t *to_blob(JNIEnv *env, jobject obj); - bloblist_t *to_bloblist(JNIEnv *env, jobject obj); - - PEP_enc_format to_EncFormat(JNIEnv *env, jobject obj); - PEP_CIPHER_SUITE to_CipherSuite(JNIEnv *env, jobject obj); - - sync_handshake_result to_SyncHandshakeResult(JNIEnv *env, jobject obj); - }; +namespace JNIAdapter { +// Global mutex needs to be locked in all constructors which insert their own mutex object +// into the unordered_map (which is thread safe for read, but not for write) +extern std::mutex global_mutex; + +// Stores mutex per java object +extern std::unordered_map engine_objid_mutex; + +// needs to be called after create_engine_java_object_mutex() +// and before release_engine_java_object_mutex() +// Thread safe +std::mutex *get_engine_java_object_mutex(JNIEnv *env, + jobject me); + +// Needs to be called exactly once per obj, in the constructor of the obj +// You need to lock a global mutex before calling this function (write to unordered_map) +void create_engine_java_object_mutex(JNIEnv *env, + jobject me); + +// Needs to be called exactly once per obj, in the destructor of this obj +// You need to lock a global mutex before calling this function (write to unordered_map) +void release_engine_java_object_mutex(JNIEnv *env, + jobject me); + + +jclass findClass(JNIEnv *env, + const char *classname); + +jfieldID getFieldID(JNIEnv *env, + const char *classname, + const char *fieldname, + 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, + const char *methodname); + +jlong callLongMethod(JNIEnv *env, + jobject obj, + const char *methodname); + +jobject callObjectMethod(JNIEnv *env, + jobject obj, + const char *methodname, + jint index); + +jboolean callBooleanMethod(JNIEnv *env, + jobject obj, + const char *methodname, + jobject o); + +jint outOfMemory(JNIEnv *env); + +jobject from_Integer(JNIEnv *env, + int val); + +int to_Integer(JNIEnv *env, + jobject obj); + +jbyteArray from_string(JNIEnv *env, + const char *str); + +char *to_string(JNIEnv *env, + jbyteArray str); + +jobject from_stringlist(JNIEnv *env, + stringlist_t *sl); + +stringlist_t *to_stringlist(JNIEnv *env, + jobject obj); + +jobject from_stringpairlist(JNIEnv *env, + stringpair_list_t *sl); + +stringpair_list_t *to_stringpairlist(JNIEnv *env, + jobject obj); + +jobject from_timestamp(JNIEnv *env, + timestamp *ts); + +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); + +identity_list *to_identitylist(JNIEnv *env, + jobject obj); + +jobject from_bloblist(JNIEnv *env, + bloblist_t *bl); + +bloblist_t *to_blob(JNIEnv *env, + jobject obj); + +bloblist_t *to_bloblist(JNIEnv *env, + jobject obj); + +PEP_enc_format to_EncFormat(JNIEnv *env, + jobject obj); + +PEP_CIPHER_SUITE to_CipherSuite(JNIEnv *env, + jobject obj); + +sync_handshake_result to_SyncHandshakeResult(JNIEnv *env, + jobject obj); +}; }; diff --git a/src/cxx/passphrase_callback.hh b/src/cxx/passphrase_callback.hh index e0f9804..9906491 100644 --- a/src/cxx/passphrase_callback.hh +++ b/src/cxx/passphrase_callback.hh @@ -1,14 +1,15 @@ #pragma once + #include namespace pEp { - namespace JNIAdapter { +namespace JNIAdapter { - char* passphraseRequiredCallback(const PEP_STATUS status); +char *passphraseRequiredCallback(const PEP_STATUS status); +template PEP_STATUS passphraseWrap(PEP_STATUS f(PEP_SESSION, A...), PEP_SESSION session, A... a); - template PEP_STATUS passphraseWrap(PEP_STATUS f(PEP_SESSION, A...), PEP_SESSION session, A... a); - } +} } #include "passphrase_callback.hxx" \ No newline at end of file diff --git a/src/cxx/passphrase_callback.hxx b/src/cxx/passphrase_callback.hxx index e812841..8cc8417 100644 --- a/src/cxx/passphrase_callback.hxx +++ b/src/cxx/passphrase_callback.hxx @@ -3,40 +3,40 @@ #include "passphrase_callback.hh" namespace pEp { - namespace JNIAdapter { +namespace JNIAdapter { - template PEP_STATUS passphraseWrap(PEP_STATUS f(PEP_SESSION, A...), PEP_SESSION session, A... a) { - pEpLog("cached passphrase mode"); - bool retryAgain = false; - int maxRetries = 3; - int retryCount = 0; - PEP_STATUS status; - do { - // the actual target function - pEpLog("calling passphrase_cache.api from basic_api"); - status = passphrase_cache.api(f, session, a...); - pEpLog("PEP_STATUS:" << status); - if (status == PEP_PASSPHRASE_REQUIRED || - status == PEP_WRONG_PASSPHRASE || - status == PEP_PASSPHRASE_FOR_NEW_KEYS_REQUIRED) - { - pEpLog("none of the cached passphrases worked"); - if (retryCount < maxRetries) { - // call the app - char *_passphrase = passphraseRequiredCallback(status); - pEpLog("callback returned, config_passphrase() with new passphrase"); - PEP_STATUS status = ::config_passphrase(session, passphrase_cache.add(_passphrase)); - retryAgain = true; - retryCount++; - } else { - pEpLog("max retries reached:" << maxRetries); - retryAgain = false; - } - } else { - retryAgain = false; - } - } while (retryAgain); - return status; +template PEP_STATUS passphraseWrap(PEP_STATUS f(PEP_SESSION, A...), PEP_SESSION session, A... a) { + pEpLog("cached passphrase mode"); + bool retryAgain = false; + int maxRetries = 3; + int retryCount = 0; + PEP_STATUS status; + do { + // the actual target function + pEpLog("calling passphrase_cache.api from basic_api"); + status = passphrase_cache.api(f, session, a...); + pEpLog("PEP_STATUS:" << status); + if (status == PEP_PASSPHRASE_REQUIRED || + status == PEP_WRONG_PASSPHRASE || + status == PEP_PASSPHRASE_FOR_NEW_KEYS_REQUIRED) + { + pEpLog("none of the cached passphrases worked"); + if (retryCount < maxRetries) { + // call the app + char *_passphrase = passphraseRequiredCallback(status); + pEpLog("callback returned, config_passphrase() with new passphrase"); + PEP_STATUS status = ::config_passphrase(session, passphrase_cache.add(_passphrase)); + retryAgain = true; + retryCount++; + } else { + pEpLog("max retries reached:" << maxRetries); + retryAgain = false; + } + } else { + retryAgain = false; } - } + } while (retryAgain); + return status; +} +} } \ No newline at end of file