Browse Source

formatting and code style only

jni117 Release_2.2.0-RC1
heck 5 years ago
parent
commit
a255490628
  1. 22
      src/codegen/gen_cpp_Engine.ysl2
  2. 41
      src/codegen/gen_cpp_Message.ysl2
  3. 157
      src/cxx/basic_api.cc
  4. 136
      src/cxx/foundation_pEp_jniadapter_AbstractEngine.cc
  5. 33
      src/cxx/foundation_pEp_jniadapter__Blob.cc
  6. 6
      src/cxx/identity_api.cc
  7. 443
      src/cxx/jniutils.cc
  8. 177
      src/cxx/jniutils.hh
  9. 9
      src/cxx/passphrase_callback.hh
  10. 8
      src/cxx/passphrase_callback.hxx

22
src/codegen/gen_cpp_Engine.ysl2

@ -51,10 +51,8 @@ tstylesheet {
} }
|| ||
JNIEXPORT «$CretType» JNICALL «$mangled»( JNIEXPORT «$CretType» JNICALL «$mangled»(JNIEnv *env,
JNIEnv *env, jobject obj`apply "parm[in|inout]", mode=sig`)
jobject obj`apply "parm[in|inout]", mode=sig`
)
{ {
std::mutex *mutex_local = nullptr; std::mutex *mutex_local = nullptr;
{ {
@ -83,13 +81,11 @@ tstylesheet {
} }
} }
|| ||
if ((status > PEP_STATUS_OK && status < PEP_UNENCRYPTED) |`> |`
status < PEP_STATUS_OK |`> |` if ((status > PEP_STATUS_OK && status < PEP_UNENCRYPTED) |`> |` status < PEP_STATUS_OK |`> |` status >= PEP_TRUSTWORD_NOT_FOUND) {
status >= PEP_TRUSTWORD_NOT_FOUND) {
throw_pEp_Exception(env, status); throw_pEp_Exception(env, status);
return «$CretDefault»; return «$CretDefault»;
} }
|| ||
apply "parm[returns|creates]", mode=return; apply "parm[returns|creates]", mode=return;
@ -188,9 +184,9 @@ tstylesheet {
} }
|| ||
«$jnitype» «$name»_ = NULL; «$jnitype» «$name»_ = NULL;
if (_«$name») if (_«$name») {
«$name»_ = «$from_type»(env, _«$name»); «$name»_ = «$from_type»(env, _«$name»);
}
|| ||
} }
when "ancestor::namespace/child::enum[@name=$type]" { when "ancestor::namespace/child::enum[@name=$type]" {
@ -200,14 +196,12 @@ tstylesheet {
{ {
jclass clazz_«$ljtype» = findClass(env, "foundation/pEp/jniadapter/«$jtype»"); jclass clazz_«$ljtype» = findClass(env, "foundation/pEp/jniadapter/«$jtype»");
assert(clazz_«$ljtype»); assert(clazz_«$ljtype»);
jmethodID method_values = env->GetStaticMethodID(clazz_«$ljtype», "values", jmethodID method_values = env->GetStaticMethodID(clazz_«$ljtype», "values", "()[Lfoundation/pEp/jniadapter/«$jtype»;");
"()[Lfoundation/pEp/jniadapter/«$jtype»;");
assert(method_values); assert(method_values);
jfieldID field_value = env->GetFieldID(clazz_«$ljtype», "value", "I"); jfieldID field_value = env->GetFieldID(clazz_«$ljtype», "value", "I");
assert(field_value); assert(field_value);
jobjectArray values = static_cast<jobjectArray>(env->CallStaticObjectMethod(clazz_«$ljtype», jobjectArray values = static_cast<jobjectArray>(env->CallStaticObjectMethod(clazz_«$ljtype», method_values));
method_values));
assert(values); assert(values);
if (env->ExceptionCheck()) { if (env->ExceptionCheck()) {
return nullptr; // handle exception in Java return nullptr; // handle exception in Java

41
src/codegen/gen_cpp_Message.ysl2

@ -31,14 +31,13 @@ tstylesheet {
try { try {
handle = getFieldID(env, "foundation/pEp/jniadapter/«$jname»", "handle", "J"); handle = getFieldID(env, "foundation/pEp/jniadapter/«$jname»", "handle", "J");
} } catch (std::exception& ex) {
catch (std::exception& ex) {
assert(0); assert(0);
return NULL; return NULL;
} }
return reinterpret_cast<::«@name» *>(env->GetLongField(me, handle)); return reinterpret_cast<::«@name» *>(env->GetLongField(me, handle));
} }
}; };
}; };
@ -46,7 +45,8 @@ tstylesheet {
using namespace pEp::JNIAdapter; 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"); pEpLog("called");
::«@name» * _obj = ::new_«@name»(PEP_dir_incoming); ::«@name» * _obj = ::new_«@name»(PEP_dir_incoming);
@ -57,7 +57,9 @@ tstylesheet {
return reinterpret_cast<jlong>(_obj); return reinterpret_cast<jlong>(_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"); pEpLog("called");
if (value) { 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"); pEpLog("called");
char *_mime_text = to_string(env, mime_text); char *_mime_text = to_string(env, mime_text);
@ -74,21 +78,26 @@ tstylesheet {
::«@name» *_msg = nullptr; ::«@name» *_msg = nullptr;
PEP_STATUS status = mime_decode_«@name»(_mime_text, _size, &_msg, NULL); PEP_STATUS status = mime_decode_«@name»(_mime_text, _size, &_msg, NULL);
if (status) if (status) {
throw_pEp_Exception(env, status); throw_pEp_Exception(env, status);
}
return reinterpret_cast<jlong>(_msg); return reinterpret_cast<jlong>(_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"); pEpLog("called");
«@name» *_obj = «@name»_ptr(env, msg); «@name» *_obj = «@name»_ptr(env, msg);
char *mime_text = nullptr; char *mime_text = nullptr;
PEP_STATUS status = ::mime_encode_«@name»(_obj, false, &mime_text, false); PEP_STATUS status = ::mime_encode_«@name»(_obj, false, &mime_text, false);
if (status) if (status) {
throw_pEp_Exception(env, status); throw_pEp_Exception(env, status);
}
jbyteArray result = from_string(env, mime_text); jbyteArray result = from_string(env, mime_text);
free(mime_text); free(mime_text);
return result; return result;
} }
@ -134,7 +143,8 @@ tstylesheet {
with "name", "concat('set', $jname)"; 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"); pEpLog("called");
«$name» *_obj = «$name»_ptr(env, obj); «$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"); pEpLog("called");
«$name» *_obj = «$name»_ptr(env, obj); «$name» *_obj = «$name»_ptr(env, obj);
@ -171,7 +184,7 @@ tstylesheet {
|> free_«$free»(_obj->«$cname»); |> free_«$free»(_obj->«$cname»);
} }
} }
|> if(value){ |> if(value) {
choose { choose {
when "$type = 'string'" { when "$type = 'string'" {
|>> _obj->«$cname» = to_«$type»(env, value); |>> _obj->«$cname» = to_«$type»(env, value);
@ -180,9 +193,9 @@ tstylesheet {
|>> _obj->«$cname» = to_«$type»(env, value); |>> _obj->«$cname» = to_«$type»(env, value);
} }
} }
|> }else{ |> } else {
|> _obj->«$cname» = NULL; |> _obj->«$cname» = NULL;
|> } |> }
} }
} }
|| ||

157
src/cxx/basic_api.cc

@ -12,15 +12,14 @@
#include "passphrase_callback.hh" #include "passphrase_callback.hh"
extern "C" { extern "C" {
using namespace pEp::JNIAdapter;
using pEp::Adapter::session;
using pEp::passphrase_cache;
JNIEXPORT jbyteArray JNICALL Java_foundation_pEp_jniadapter_Engine__1trustwords( using namespace pEp::JNIAdapter;
JNIEnv *env, using pEp::Adapter::session;
using pEp::passphrase_cache;
JNIEXPORT jbyteArray JNICALL Java_foundation_pEp_jniadapter_Engine__1trustwords(JNIEnv *env,
jobject obj, jobject obj,
jobject ident jobject ident)
)
{ {
std::mutex *mutex_local = nullptr; std::mutex *mutex_local = nullptr;
{ {
@ -37,11 +36,12 @@ JNIEXPORT jbyteArray JNICALL Java_foundation_pEp_jniadapter_Engine__1trustwords(
PEP_STATUS status = PEP_STATUS_OK; PEP_STATUS status = PEP_STATUS_OK;
if (_ident->fpr == NULL || _ident->fpr[0] == 0) { if (_ident->fpr == NULL || _ident->fpr[0] == 0) {
if (_ident->me) if (_ident->me) {
status = passphraseWrap(::myself, session(), _ident); status = passphraseWrap(::myself, session(), _ident);
else } else {
status = passphraseWrap(::update_identity, session(), _ident); status = passphraseWrap(::update_identity, session(), _ident);
} }
}
if (status != PEP_STATUS_OK) { if (status != PEP_STATUS_OK) {
throw_pEp_Exception(env, status); throw_pEp_Exception(env, status);
@ -54,13 +54,13 @@ JNIEXPORT jbyteArray JNICALL Java_foundation_pEp_jniadapter_Engine__1trustwords(
} }
const char *lang; const char *lang;
if (_ident->lang[0]) if (_ident->lang[0]) {
lang = _ident->lang; lang = _ident->lang;
else } else {
lang = "en"; lang = "en";
}
status = passphraseWrap(::trustwords, status = passphraseWrap(::trustwords, session(), static_cast<const char *>(_ident->fpr), lang, &words, &wsize, 10);
session(), static_cast<const char*>(_ident->fpr), lang, &words, &wsize, 10);
if (status != PEP_STATUS_OK) { if (status != PEP_STATUS_OK) {
throw_pEp_Exception(env, status); throw_pEp_Exception(env, status);
@ -70,11 +70,9 @@ JNIEXPORT jbyteArray JNICALL Java_foundation_pEp_jniadapter_Engine__1trustwords(
return from_string(env, words); return from_string(env, words);
} }
JNIEXPORT jobject JNICALL Java_foundation_pEp_jniadapter_Engine__1myself( JNIEXPORT jobject JNICALL Java_foundation_pEp_jniadapter_Engine__1myself(JNIEnv *env,
JNIEnv *env,
jobject obj, jobject obj,
jobject ident jobject ident)
)
{ {
std::mutex *mutex_local = nullptr; std::mutex *mutex_local = nullptr;
{ {
@ -96,11 +94,9 @@ JNIEXPORT jobject JNICALL Java_foundation_pEp_jniadapter_Engine__1myself(
return from_identity(env, _ident); return from_identity(env, _ident);
} }
JNIEXPORT jobject JNICALL Java_foundation_pEp_jniadapter_Engine__1updateIdentity( JNIEXPORT jobject JNICALL Java_foundation_pEp_jniadapter_Engine__1updateIdentity(JNIEnv *env,
JNIEnv *env,
jobject obj, jobject obj,
jobject ident jobject ident)
)
{ {
std::mutex *mutex_local = nullptr; std::mutex *mutex_local = nullptr;
{ {
@ -111,18 +107,15 @@ JNIEXPORT jobject JNICALL Java_foundation_pEp_jniadapter_Engine__1updateIdentity
std::lock_guard<std::mutex> l(*mutex_local); std::lock_guard<std::mutex> l(*mutex_local);
pEp_identity *_ident = to_identity(env, ident); pEp_identity *_ident = to_identity(env, ident);
passphraseWrap(::update_identity, session(), _ident); passphraseWrap(::update_identity, session(), _ident);
return from_identity(env, _ident); return from_identity(env, _ident);
} }
JNIEXPORT jobject JNICALL Java_foundation_pEp_jniadapter_Engine__1setOwnKey( JNIEXPORT jobject JNICALL Java_foundation_pEp_jniadapter_Engine__1setOwnKey(JNIEnv *env,
JNIEnv *env,
jobject obj, jobject obj,
jobject ident, jobject ident,
jbyteArray fpr jbyteArray fpr)
)
{ {
std::mutex *mutex_local = nullptr; std::mutex *mutex_local = nullptr;
{ {
@ -146,11 +139,9 @@ JNIEXPORT jobject JNICALL Java_foundation_pEp_jniadapter_Engine__1setOwnKey(
return from_identity(env, _ident); return from_identity(env, _ident);
} }
JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_Engine__1keyMistrusted( JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_Engine__1keyMistrusted(JNIEnv *env,
JNIEnv *env,
jobject obj, jobject obj,
jobject ident jobject ident)
)
{ {
std::mutex *mutex_local = nullptr; std::mutex *mutex_local = nullptr;
{ {
@ -184,11 +175,9 @@ JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_Engine__1keyMistrusted(
passphraseWrap(::key_mistrusted, session(), _ident); passphraseWrap(::key_mistrusted, session(), _ident);
} }
JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_Engine__1keyResetTrust( JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_Engine__1keyResetTrust(JNIEnv *env,
JNIEnv *env,
jobject obj, jobject obj,
jobject ident jobject ident)
)
{ {
std::mutex *mutex_local = nullptr; std::mutex *mutex_local = nullptr;
{ {
@ -203,11 +192,12 @@ JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_Engine__1keyResetTrust(
PEP_STATUS status = PEP_STATUS_OK; PEP_STATUS status = PEP_STATUS_OK;
if (_ident->fpr == NULL || _ident->fpr[0] == 0) { if (_ident->fpr == NULL || _ident->fpr[0] == 0) {
if (_ident->me) if (_ident->me) {
status = passphraseWrap(::myself, session(), _ident); status = passphraseWrap(::myself, session(), _ident);
else } else {
status = passphraseWrap(::update_identity, session(), _ident); status = passphraseWrap(::update_identity, session(), _ident);
} }
}
if (status != PEP_STATUS_OK) { if (status != PEP_STATUS_OK) {
throw_pEp_Exception(env, status); throw_pEp_Exception(env, status);
@ -222,11 +212,9 @@ JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_Engine__1keyResetTrust(
passphraseWrap(::key_reset_trust, session(), _ident); passphraseWrap(::key_reset_trust, session(), _ident);
} }
JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_Engine__1trustPersonalKey( JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_Engine__1trustPersonalKey(JNIEnv *env,
JNIEnv *env,
jobject obj, jobject obj,
jobject ident jobject ident)
)
{ {
std::mutex *mutex_local = nullptr; std::mutex *mutex_local = nullptr;
{ {
@ -241,11 +229,12 @@ JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_Engine__1trustPersonalKey(
PEP_STATUS status = PEP_STATUS_OK; PEP_STATUS status = PEP_STATUS_OK;
if (_ident->fpr == NULL || _ident->fpr[0] == 0) { if (_ident->fpr == NULL || _ident->fpr[0] == 0) {
if (_ident->me) if (_ident->me) {
status = passphraseWrap(::myself, session(), _ident); status = passphraseWrap(::myself, session(), _ident);
else } else {
status = passphraseWrap(::update_identity, session(), _ident); status = passphraseWrap(::update_identity, session(), _ident);
} }
}
if (status != PEP_STATUS_OK) { if (status != PEP_STATUS_OK) {
throw_pEp_Exception(env, status); throw_pEp_Exception(env, status);
@ -260,11 +249,9 @@ JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_Engine__1trustPersonalKey(
passphraseWrap(::trust_personal_key, session(), _ident); passphraseWrap(::trust_personal_key, session(), _ident);
} }
JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_Engine__1trustOwnKey( JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_Engine__1trustOwnKey(JNIEnv *env,
JNIEnv *env,
jobject obj, jobject obj,
jobject ident jobject ident)
)
{ {
std::mutex *mutex_local = nullptr; std::mutex *mutex_local = nullptr;
{ {
@ -284,11 +271,9 @@ JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_Engine__1trustOwnKey(
passphraseWrap(::trust_own_key, session(), _ident); passphraseWrap(::trust_own_key, session(), _ident);
} }
JNIEXPORT jobject JNICALL Java_foundation_pEp_jniadapter_Engine__1importKey( JNIEXPORT jobject JNICALL Java_foundation_pEp_jniadapter_Engine__1importKey(JNIEnv *env,
JNIEnv *env,
jobject obj, jobject obj,
jbyteArray key jbyteArray key)
)
{ {
std::mutex *mutex_local = nullptr; std::mutex *mutex_local = nullptr;
{ {
@ -301,7 +286,7 @@ JNIEXPORT jobject JNICALL Java_foundation_pEp_jniadapter_Engine__1importKey(
size_t _size = static_cast<size_t>(env->GetArrayLength(key)); size_t _size = static_cast<size_t>(env->GetArrayLength(key));
jbyte* _key = env->GetByteArrayElements(key, NULL); jbyte* _key = env->GetByteArrayElements(key, NULL);
if(_key == NULL){ if(_key == NULL) {
throw_pEp_Exception(env, PEP_OUT_OF_MEMORY); throw_pEp_Exception(env, PEP_OUT_OF_MEMORY);
return NULL; 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( JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_Engine__1config_1passive_1mode(JNIEnv *env,
JNIEnv *env,
jobject obj, jobject obj,
jboolean enable jboolean enable)
)
{ {
std::mutex *mutex_local = nullptr; 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( JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_Engine__1config_1unencrypted_1subject(JNIEnv *env,
JNIEnv *env,
jobject obj, jobject obj,
jboolean enable jboolean enable)
)
{ {
std::mutex *mutex_local = nullptr; 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<bool>(enable)); ::config_unencrypted_subject(session(), static_cast<bool>(enable));
} }
JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_Engine__1blacklist_1add( JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_Engine__1blacklist_1add(JNIEnv *env,
JNIEnv *env,
jobject obj, jobject obj,
jbyteArray fpr jbyteArray fpr
) )
@ -385,14 +365,11 @@ JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_Engine__1blacklist_1add(
throw_pEp_Exception(env, status); throw_pEp_Exception(env, status);
return; return;
} }
} }
JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_Engine__1blacklist_1delete( JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_Engine__1blacklist_1delete(JNIEnv *env,
JNIEnv *env,
jobject obj, jobject obj,
jbyteArray fpr jbyteArray fpr)
)
{ {
std::mutex *mutex_local = nullptr; 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( JNIEXPORT jboolean JNICALL Java_foundation_pEp_jniadapter_Engine__1blacklist_1is_1listed(JNIEnv *env,
JNIEnv *env,
jobject obj, jobject obj,
jbyteArray fpr jbyteArray fpr)
)
{ {
std::mutex *mutex_local = nullptr; std::mutex *mutex_local = nullptr;
{ {
@ -448,12 +423,10 @@ JNIEXPORT jboolean JNICALL Java_foundation_pEp_jniadapter_Engine__1blacklist_1is
return (jboolean)_listed; return (jboolean)_listed;
} }
JNIEXPORT jbyteArray JNICALL Java_foundation_pEp_jniadapter_Engine__1getCrashdumpLog( JNIEXPORT jbyteArray JNICALL Java_foundation_pEp_jniadapter_Engine__1getCrashdumpLog(JNIEnv *env,
JNIEnv *env,
jobject obj, jobject obj,
jint dummy, jint dummy,
jint maxlines jint maxlines)
)
{ {
std::mutex *mutex_local = nullptr; std::mutex *mutex_local = nullptr;
{ {
@ -477,38 +450,22 @@ JNIEXPORT jbyteArray JNICALL Java_foundation_pEp_jniadapter_Engine__1getCrashdum
return from_string(env, _logdata); return from_string(env, _logdata);
} }
JNIEXPORT jbyteArray JNICALL Java_foundation_pEp_jniadapter_Engine__1getUserDirectory( JNIEXPORT jbyteArray JNICALL Java_foundation_pEp_jniadapter_Engine__1getUserDirectory(JNIEnv *env,
JNIEnv *env, jobject obj)
jobject obj
)
{ {
pEpLog("called"); pEpLog("called");
return from_string(env, ::per_user_directory()); return from_string(env, ::per_user_directory());
} }
JNIEXPORT jbyteArray JNICALL Java_foundation_pEp_jniadapter_Engine__1getMachineDirectory( JNIEXPORT jbyteArray JNICALL Java_foundation_pEp_jniadapter_Engine__1getMachineDirectory(JNIEnv *env,
JNIEnv *env, jobject obj)
jobject obj
)
{ {
pEpLog("called"); pEpLog("called");
return from_string(env, ::per_machine_directory()); return from_string(env, ::per_machine_directory());
} }
//void logPassphraseCache() {
// try { JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_Engine__1config_1passphrase(JNIEnv * env,
//// 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, jobject obj,
jbyteArray passphrase) jbyteArray passphrase)
{ {
@ -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( JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_Engine__1config_1passphrase_1for_1new_1keys(JNIEnv *env,
JNIEnv *env,
jobject obj, jobject obj,
jboolean enable, jboolean enable,
jbyteArray passphrase jbyteArray passphrase)
)
{ {
std::mutex *mutex_local = nullptr; std::mutex *mutex_local = nullptr;
{ {
@ -555,8 +510,6 @@ JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_Engine__1config_1passphras
throw_pEp_Exception(env, status); throw_pEp_Exception(env, status);
return ; return ;
} }
} }
} // extern "C" } // extern "C"

136
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 using namespace utility; // for libpEpAdapter locked queue impl. TODO:rename
bool first = true; bool first = true;
JavaVM *jvm= nullptr; JavaVM *jvm= nullptr;
std::mutex mutex_obj; std::mutex mutex_obj;
jfieldID signal_field_value = nullptr; jfieldID signal_field_value = nullptr;
@ -67,45 +65,60 @@ namespace JNISync {
void jni_init() { void jni_init() {
JNIEnv *_env = JNISync::env(); JNIEnv * _env = JNISync::env();
messageClass = static_cast<jclass>( messageClass = static_cast<jclass>(_env->NewGlobalRef(findClass(_env, "foundation/pEp/jniadapter/Message")));
_env->NewGlobalRef(findClass(_env, "foundation/pEp/jniadapter/Message"))); identityClass = static_cast<jclass>(_env->NewGlobalRef(findClass(_env, "foundation/pEp/jniadapter/_Identity")));
identityClass = static_cast<jclass>( signalClass = static_cast<jclass>(_env->NewGlobalRef(findClass(_env, "foundation/pEp/jniadapter/SyncHandshakeSignal")));
_env->NewGlobalRef(findClass(_env, "foundation/pEp/jniadapter/_Identity"))); passphraseTypeClass = static_cast<jclass>(_env->NewGlobalRef(findClass(_env, "foundation/pEp/jniadapter/PassphraseType")));
signalClass = static_cast<jclass>(
_env->NewGlobalRef(findClass(_env, "foundation/pEp/jniadapter/SyncHandshakeSignal")));
passphraseTypeClass = static_cast<jclass>(
_env->NewGlobalRef(findClass(_env, "foundation/pEp/jniadapter/PassphraseType")));
engineClass = static_cast<jclass>(_env->NewGlobalRef(findClass(_env, "foundation/pEp/jniadapter/Engine"))); engineClass = static_cast<jclass>(_env->NewGlobalRef(findClass(_env, "foundation/pEp/jniadapter/Engine")));
messageConstructorMethodID = _env->GetMethodID(messageClass, "<init>", "(J)V"); messageConstructorMethodID = _env->GetMethodID(
messageClass,
"<init>",
"(J)V");
messageToSendMethodID = _env->GetMethodID( messageToSendMethodID = _env->GetMethodID(
engineClass, engineClass,
"messageToSendCallFromC", "messageToSendCallFromC",
"(Lfoundation/pEp/jniadapter/Message;)I"); "(Lfoundation/pEp/jniadapter/Message;)I");
needsFastPollMethodID = _env->GetMethodID( needsFastPollMethodID = _env->GetMethodID(
engineClass, engineClass,
"needsFastPollCallFromC", "needsFastPollCallFromC",
"(Z)I"); "(Z)I");
notifyHandShakeMethodID = _env->GetMethodID( notifyHandShakeMethodID = _env->GetMethodID(
engineClass, engineClass,
"notifyHandshakeCallFromC", "notifyHandshakeCallFromC",
"(Lfoundation/pEp/jniadapter/_Identity;Lfoundation/pEp/jniadapter/_Identity;Lfoundation/pEp/jniadapter/SyncHandshakeSignal;)I"); "(Lfoundation/pEp/jniadapter/_Identity;Lfoundation/pEp/jniadapter/_Identity;Lfoundation/pEp/jniadapter/SyncHandshakeSignal;)I");
passphraseRequiredMethodID = _env->GetMethodID( passphraseRequiredMethodID = _env->GetMethodID(
engineClass, engineClass,
"passphraseRequiredFromC", "passphraseRequiredFromC",
"(Lfoundation/pEp/jniadapter/PassphraseType;)[B"); "(Lfoundation/pEp/jniadapter/PassphraseType;)[B");
sync_handshake_signal_values = JNISync::env()->GetStaticMethodID(signalClass, "values", sync_handshake_signal_values = JNISync::env()->GetStaticMethodID(
signalClass,
"values",
"()[Lfoundation/pEp/jniadapter/SyncHandshakeSignal;"); "()[Lfoundation/pEp/jniadapter/SyncHandshakeSignal;");
passphrase_status_values = JNISync::env()->GetStaticMethodID(passphraseTypeClass, "values",
passphrase_status_values = JNISync::env()->GetStaticMethodID(
passphraseTypeClass,
"values",
"()[Lfoundation/pEp/jniadapter/PassphraseType;"); "()[Lfoundation/pEp/jniadapter/PassphraseType;");
signal_field_value = JNISync::env()->GetFieldID(signalClass, "value", "I");
signal_field_value = JNISync::env()->GetFieldID(
signalClass,
"value",
"I");
passphrase_type_field_value = JNISync::env()->GetFieldID(passphraseTypeClass, "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"); pEpLog("called");
jobject status_ = nullptr; jobject status_ = nullptr;
{ {
@ -113,8 +126,7 @@ char* JNIAdapter::passphraseRequiredCallback(const PEP_STATUS status) {
assert(passphrase_status_values); assert(passphrase_status_values);
assert(passphrase_type_field_value); assert(passphrase_type_field_value);
jobjectArray values = static_cast<jobjectArray>(JNISync::env()->CallStaticObjectMethod(passphraseTypeClass, jobjectArray values = static_cast<jobjectArray>(JNISync::env()->CallStaticObjectMethod(passphraseTypeClass, passphrase_status_values));
passphrase_status_values));
if (JNISync::env()->ExceptionCheck()) { if (JNISync::env()->ExceptionCheck()) {
JNISync::env()->ExceptionClear(); JNISync::env()->ExceptionClear();
@ -149,19 +161,21 @@ char* JNIAdapter::passphraseRequiredCallback(const PEP_STATUS status) {
PEP_STATUS messageToSend(message *msg) PEP_STATUS messageToSend(message *msg)
{ {
std::lock_guard<std::mutex> l(mutex_obj); std::lock_guard <std::mutex> l(mutex_obj);
pEpLog("called"); pEpLog("called");
// Passphrase // Passphrase
// When a protocol implementation of the p≡p engine using messageToSend() cannot sign or encrypt with an // 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 // empty passphrase and not with the configured passphrase it is calling messageToSend() with a NULL instead
// of a struct _message object. // of a struct _message object.
if (Adapter::on_sync_thread() && !msg) if (Adapter::on_sync_thread() && !msg) {
return pEp::PassphraseCache::config_next_passphrase(); return pEp::PassphraseCache::config_next_passphrase();
}
// reset passphrase iterator // reset passphrase iterator
if (Adapter::on_sync_thread()) if (Adapter::on_sync_thread()) {
pEp::PassphraseCache::config_next_passphrase(true); pEp::PassphraseCache::config_next_passphrase(true);
}
jobject msg_ = nullptr; jobject msg_ = nullptr;
assert(messageClass && messageConstructorMethodID && objj && messageToSendMethodID); assert(messageClass && messageConstructorMethodID && objj && messageToSendMethodID);
@ -175,11 +189,12 @@ PEP_STATUS messageToSend(message *msg)
JNISync::env()->ExceptionClear(); JNISync::env()->ExceptionClear();
} }
return status; 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<std::mutex> l(mutex_obj); std::lock_guard<std::mutex> l(mutex_obj);
pEpLog("called"); pEpLog("called");
@ -196,8 +211,7 @@ PEP_STATUS notifyHandshake(pEp_identity *me, pEp_identity *partner, sync_handsha
assert(sync_handshake_signal_values); assert(sync_handshake_signal_values);
assert(signal_field_value); assert(signal_field_value);
jobjectArray values = static_cast<jobjectArray>(JNISync::env()->CallStaticObjectMethod(signalClass, jobjectArray values = static_cast<jobjectArray>(JNISync::env()->CallStaticObjectMethod(signalClass, sync_handshake_signal_values));
sync_handshake_signal_values));
if (JNISync::env()->ExceptionCheck()) { if (JNISync::env()->ExceptionCheck()) {
JNISync::env()->ExceptionClear(); JNISync::env()->ExceptionClear();
return PEP_UNKNOWN_ERROR; return PEP_UNKNOWN_ERROR;
@ -231,10 +245,8 @@ PEP_STATUS notifyHandshake(pEp_identity *me, pEp_identity *partner, sync_handsha
extern "C" { extern "C" {
using namespace pEp; using namespace pEp;
JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_AbstractEngine_init( JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_AbstractEngine_init(JNIEnv *env,
JNIEnv *env, jobject obj)
jobject obj
)
{ {
std::lock_guard<std::mutex> l(global_mutex); // global mutex for write access to <unordered_map> std::lock_guard<std::mutex> l(global_mutex); // global mutex for write access to <unordered_map>
pEpLog("called"); pEpLog("called");
@ -253,10 +265,8 @@ JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_AbstractEngine_init(
Adapter::session(); Adapter::session();
} }
JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_AbstractEngine_release( JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_AbstractEngine_release(JNIEnv *env,
JNIEnv *env, jobject obj)
jobject obj
)
{ {
std::lock_guard<std::mutex> l(global_mutex); // global mutex for write access to <unordered_map> std::lock_guard<std::mutex> l(global_mutex); // global mutex for write access to <unordered_map>
pEpLog("called"); pEpLog("called");
@ -264,10 +274,8 @@ JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_AbstractEngine_release(
Adapter::session(pEp::Adapter::release); Adapter::session(pEp::Adapter::release);
} }
JNIEXPORT jstring JNICALL Java_foundation_pEp_jniadapter_AbstractEngine__1getVersion( JNIEXPORT jstring JNICALL Java_foundation_pEp_jniadapter_AbstractEngine__1getVersion(JNIEnv *env,
JNIEnv *env, jobject obj)
jobject obj
)
{ {
std::mutex *mutex_local = nullptr; std::mutex *mutex_local = nullptr;
{ {
@ -280,10 +288,8 @@ JNIEXPORT jstring JNICALL Java_foundation_pEp_jniadapter_AbstractEngine__1getVer
return env->NewStringUTF(::get_engine_version()); return env->NewStringUTF(::get_engine_version());
} }
JNIEXPORT jstring JNICALL Java_foundation_pEp_jniadapter_AbstractEngine__1getProtocolVersion( JNIEXPORT jstring JNICALL Java_foundation_pEp_jniadapter_AbstractEngine__1getProtocolVersion(JNIEnv *env,
JNIEnv *env, jobject obj)
jobject obj
)
{ {
std::mutex *mutex_local = nullptr; std::mutex *mutex_local = nullptr;
{ {
@ -296,9 +302,10 @@ JNIEXPORT jstring JNICALL Java_foundation_pEp_jniadapter_AbstractEngine__1getPro
return env->NewStringUTF(::get_protocol_version()); 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<locked_queue<pEp_identity*>*>(arg); locked_queue < pEp_identity * > *queue = static_cast<locked_queue < pEp_identity * > * > (arg);
queue->push_back(identity_dup(ident)); queue->push_back(identity_dup(ident));
return 0; return 0;
} }
@ -306,10 +313,11 @@ int examine_identity(pEp_identity *ident, void *arg)
pEp_identity *retrieve_next_identity(void *arg) pEp_identity *retrieve_next_identity(void *arg)
{ {
pEpLog("called"); pEpLog("called");
locked_queue< pEp_identity * > *queue = static_cast<locked_queue<pEp_identity*>*>(arg); locked_queue < pEp_identity * > *queue = static_cast<locked_queue < pEp_identity * > * > (arg);
while (!queue->size()) while (!queue->size()) {
usleep(100000); usleep(100000);
}
pEp_identity *ident = queue->front(); pEp_identity *ident = queue->front();
queue->pop_front(); queue->pop_front();
@ -319,7 +327,7 @@ pEp_identity *retrieve_next_identity(void *arg)
static void *keyserver_thread_routine(void *arg) static void *keyserver_thread_routine(void *arg)
{ {
PEP_STATUS status = do_keymanagement(retrieve_next_identity, arg); PEP_STATUS status = do_keymanagement(retrieve_next_identity, arg);
locked_queue< pEp_identity * > *queue = static_cast<locked_queue<pEp_identity*>*>(arg); locked_queue < pEp_identity * > *queue = static_cast<locked_queue < pEp_identity * > * > (arg);
while (queue->size()) { while (queue->size()) {
pEp_identity *ident = queue->front(); pEp_identity *ident = queue->front();
@ -328,13 +336,11 @@ static void *keyserver_thread_routine(void *arg)
} }
delete queue; delete queue;
return reinterpret_cast<void*>(status); return reinterpret_cast<void *>(status);
} }
JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_AbstractEngine__1startKeyserverLookup( JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_AbstractEngine__1startKeyserverLookup(JNIEnv *env,
JNIEnv *env, jobject obj)
jobject obj
)
{ {
std::mutex *mutex_local = nullptr; 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<void*>(queue)); pthread_create(thread, nullptr, keyserver_thread_routine, static_cast<void*>(queue));
} }
JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_AbstractEngine__1stopKeyserverLookup( JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_AbstractEngine__1stopKeyserverLookup(JNIEnv *env,
JNIEnv *env, jobject obj)
jobject obj
)
{ {
std::mutex *mutex_local = nullptr; std::mutex *mutex_local = nullptr;
{ {
@ -419,10 +423,8 @@ JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_AbstractEngine__1stopKeyse
free(thread); free(thread);
} }
JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_AbstractEngine__1startSync( JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_AbstractEngine__1startSync(JNIEnv *env,
JNIEnv *env, jobject obj)
jobject obj
)
{ {
std::mutex *mutex_local = nullptr; std::mutex *mutex_local = nullptr;
{ {
@ -434,17 +436,14 @@ JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_AbstractEngine__1startSync
try { try {
CallbackDispatcher::start_sync(); CallbackDispatcher::start_sync();
// Adapter::startup<JNISync>(messageToSend, notifyHandshake, &o, &JNISync::onSyncStartup, &JNISync::onSyncShutdown);
} catch (RuntimeError& ex) { } catch (RuntimeError& ex) {
throw_pEp_Exception(env, ex.status); throw_pEp_Exception(env, ex.status);
return; return;
} }
} }
JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_AbstractEngine__1stopSync( JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_AbstractEngine__1stopSync(JNIEnv *env,
JNIEnv *env, jobject obj)
jobject obj
)
{ {
std::mutex *mutex_local = nullptr; std::mutex *mutex_local = nullptr;
{ {
@ -455,13 +454,10 @@ JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_AbstractEngine__1stopSync(
std::lock_guard<std::mutex> l(*mutex_local); std::lock_guard<std::mutex> l(*mutex_local);
CallbackDispatcher::stop_sync(); CallbackDispatcher::stop_sync();
// Adapter::shutdown();
} }
JNIEXPORT jboolean JNICALL Java_foundation_pEp_jniadapter_AbstractEngine__1isSyncRunning( JNIEXPORT jboolean JNICALL Java_foundation_pEp_jniadapter_AbstractEngine__1isSyncRunning(JNIEnv *env,
JNIEnv *env, jobject obj)
jobject obj
)
{ {
std::mutex *mutex_local = nullptr; std::mutex *mutex_local = nullptr;
{ {

33
src/cxx/foundation_pEp_jniadapter__Blob.cc

@ -8,39 +8,43 @@
#include "foundation_pEp_jniadapter__Blob.h" #include "foundation_pEp_jniadapter__Blob.h"
namespace pEp { namespace pEp {
namespace JNIAdapter { namespace JNIAdapter {
static ::bloblist_t *bloblist_ptr(JNIEnv *env, jobject me) {
static ::bloblist_t *bloblist_ptr(JNIEnv *env, jobject me) {
jfieldID handle; jfieldID handle;
try { try {
handle = getFieldID(env, "foundation/pEp/jniadapter/Blob", "mime_type", "Ljava/lang/String"); handle = getFieldID(env, "foundation/pEp/jniadapter/Blob", "mime_type", "Ljava/lang/String");
} } catch (std::exception &ex) {
catch (std::exception& ex) {
assert(0); assert(0);
return NULL; return NULL;
} }
return reinterpret_cast<::bloblist_t*>(env->GetLongField(me, handle)); return reinterpret_cast<::bloblist_t *>(env->GetLongField(me, handle));
} }
};
}; }; //namespace JNIAdapter
}; //namespace pEp
extern "C" { extern "C" {
using namespace std; using namespace std;
using namespace pEp::JNIAdapter; 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"); pEpLog("called");
bloblist_t *b = to_blob(env, obj); bloblist_t *b = to_blob(env, obj);
char *out = nullptr; char *out = nullptr;
// RFC 1049 / RFC 2045 : The type, subtype, and parameter names are not case sensitive. // 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<size_t>(b->size), &out); PEP_STATUS status = ::PER_to_XER_Sync_msg(b->value, static_cast<size_t>(b->size), &out);
if (status) if (status) {
throw_pEp_Exception(env, status); throw_pEp_Exception(env, status);
}
jbyteArray result = from_string(env, out); jbyteArray result = from_string(env, out);
free(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. // 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<size_t>(b->size), &out); PEP_STATUS status = ::PER_to_XER_Distribution_msg(b->value, static_cast<size_t>(b->size), &out);
if (status) if (status) {
throw_pEp_Exception(env, status); throw_pEp_Exception(env, status);
}
jbyteArray result = from_string(env, out); jbyteArray result = from_string(env, out);
free(out); free(out);
return result; return result;
} }
return from_string(env,b->value); return from_string(env, b->value);
} }
}; // extern "C" }; // extern "C"

6
src/cxx/identity_api.cc

@ -3,10 +3,12 @@
#include "jniutils.hh" #include "jniutils.hh"
extern "C" { 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"); pEpLog("called");
return ::rating_from_comm_type(static_cast<PEP_comm_type>(comm_type)); return ::rating_from_comm_type(static_cast<PEP_comm_type>(comm_type));

443
src/cxx/jniutils.cc

@ -1,8 +1,11 @@
#include <cassert> #include <cassert>
#include "jniutils.hh" #include "jniutils.hh"
#include <pEp/pEpLog.hh> #include <pEp/pEpLog.hh>
#ifndef __LP64__ #ifndef __LP64__
#include <time64.h> #include <time64.h>
#define time_t time64_t #define time_t time64_t
#define timegm timegm64 #define timegm timegm64
#define gmtime_r gmtime64_r #define gmtime_r gmtime64_r
@ -11,15 +14,14 @@
#endif #endif
namespace pEp { namespace pEp {
namespace JNIAdapter { namespace JNIAdapter {
std::mutex global_mutex;
std::unordered_map<long, std::mutex*> engine_objid_mutex; std::mutex global_mutex;
std::unordered_map<long, std::mutex *> engine_objid_mutex;
std::mutex* get_engine_java_object_mutex(
JNIEnv *env, std::mutex *get_engine_java_object_mutex(JNIEnv *env,
jobject obj jobject obj)
) {
{
long engine_obj_id = static_cast<long>(callLongMethod(env, obj, "getId")); long engine_obj_id = static_cast<long>(callLongMethod(env, obj, "getId"));
assert(engine_obj_id); assert(engine_obj_id);
pEpLog("for java object id: " << engine_obj_id); pEpLog("for java object id: " << engine_obj_id);
@ -27,30 +29,26 @@ namespace pEp {
pEpLog("found mutex: " << engine_obj_mutex << " with native_handle: " << engine_obj_mutex->native_handle()); pEpLog("found mutex: " << engine_obj_mutex << " with native_handle: " << engine_obj_mutex->native_handle());
assert(engine_obj_mutex); assert(engine_obj_mutex);
return engine_obj_mutex; return engine_obj_mutex;
} }
void create_engine_java_object_mutex( void create_engine_java_object_mutex(JNIEnv *env,
JNIEnv *env, jobject obj)
jobject obj {
)
{
long engine_obj_id = static_cast<long>(callLongMethod(env, obj, "getId")); long engine_obj_id = static_cast<long>(callLongMethod(env, obj, "getId"));
assert(engine_obj_id); assert(engine_obj_id);
std::mutex *engine_obj_mutex = new std::mutex(); 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); pEpLog(engine_obj_mutex << " with native_handle: " << engine_obj_mutex->native_handle() << " for java object id: " << engine_obj_id);
assert(engine_obj_mutex); assert(engine_obj_mutex);
if(engine_objid_mutex.count(engine_obj_id) > 0) { if (engine_objid_mutex.count(engine_obj_id) > 0) {
pEpLog("Fatal: mutex already existing for object id: " << engine_obj_id); pEpLog("Fatal: mutex already existing for object id: " << engine_obj_id);
assert(0); assert(0);
} }
engine_objid_mutex.insert(std::make_pair(engine_obj_id, engine_obj_mutex )); engine_objid_mutex.insert(std::make_pair(engine_obj_id, engine_obj_mutex));
} }
void release_engine_java_object_mutex( void release_engine_java_object_mutex(JNIEnv *env,
JNIEnv *env, jobject obj)
jobject obj {
)
{
long engine_obj_id = static_cast<long>(callLongMethod(env, obj, "getId")); long engine_obj_id = static_cast<long>(callLongMethod(env, obj, "getId"));
assert(engine_obj_id); assert(engine_obj_id);
std::mutex *engine_obj_mutex = engine_objid_mutex.at(engine_obj_id); std::mutex *engine_obj_mutex = engine_objid_mutex.at(engine_obj_id);
@ -58,13 +56,15 @@ namespace pEp {
assert(engine_obj_mutex); assert(engine_obj_mutex);
engine_objid_mutex.erase(engine_obj_id); engine_objid_mutex.erase(engine_obj_id);
delete engine_obj_mutex; delete engine_obj_mutex;
} }
jclass findClass(JNIEnv *env, const char *classname) jclass findClass(JNIEnv *env,
{ const char *classname)
{
jclass clazz = env->FindClass(classname); jclass clazz = env->FindClass(classname);
if (!clazz) if (!clazz) {
fprintf(stderr, "class not found: %s\n", classname); fprintf(stderr, "class not found: %s\n", classname);
}
assert(clazz); assert(clazz);
if (clazz == NULL) { if (clazz == NULL) {
@ -75,15 +75,13 @@ namespace pEp {
} }
return clazz; return clazz;
} }
jfieldID getFieldID( jfieldID getFieldID(JNIEnv *env,
JNIEnv *env,
const char *classname, const char *classname,
const char *fieldname, const char *fieldname,
const char *signature const char *signature)
) {
{
jclass clazz = findClass(env, classname); jclass clazz = findClass(env, classname);
assert(clazz); assert(clazz);
@ -100,18 +98,15 @@ namespace pEp {
env->DeleteLocalRef(clazz); env->DeleteLocalRef(clazz);
return field; return field;
} }
//TODO: fix/generalize/clean patch added to make keysync work using globalref to class //TODO: fix/generalize/clean patch added to make keysync work using globalref to class
jfieldID getFieldID( jfieldID getFieldID(JNIEnv *env,
JNIEnv *env,
const char *classname, const char *classname,
const char *fieldname, const char *fieldname,
const char *signature, const char *signature,
const jclass clazz const jclass clazz)
) {
{
jfieldID field = env->GetFieldID(clazz, fieldname, signature); jfieldID field = env->GetFieldID(clazz, fieldname, signature);
assert(field); assert(field);
@ -124,14 +119,12 @@ namespace pEp {
return field; return field;
} }
jint callIntMethod( jint callIntMethod(JNIEnv *env,
JNIEnv *env,
jobject obj, jobject obj,
const char *methodname const char *methodname)
) {
{
jclass clazz = env->GetObjectClass(obj); jclass clazz = env->GetObjectClass(obj);
assert(clazz); assert(clazz);
@ -148,14 +141,12 @@ namespace pEp {
jint result = env->CallIntMethod(obj, method); jint result = env->CallIntMethod(obj, method);
env->ExceptionCheck(); // handle exception in Java env->ExceptionCheck(); // handle exception in Java
return result; return result;
} }
jlong callLongMethod( jlong callLongMethod(JNIEnv *env,
JNIEnv *env,
jobject obj, jobject obj,
const char *methodname const char *methodname)
) {
{
jclass clazz = env->GetObjectClass(obj); jclass clazz = env->GetObjectClass(obj);
assert(clazz); assert(clazz);
@ -172,20 +163,17 @@ namespace pEp {
jlong result = env->CallLongMethod(obj, method); jlong result = env->CallLongMethod(obj, method);
env->ExceptionCheck(); // handle exception in Java env->ExceptionCheck(); // handle exception in Java
return result; return result;
} }
jobject callObjectMethod( jobject callObjectMethod(JNIEnv *env,
JNIEnv *env,
jobject obj, jobject obj,
const char *methodname, const char *methodname,
jint index jint index)
) {
{
jclass clazz = env->GetObjectClass(obj); jclass clazz = env->GetObjectClass(obj);
assert(clazz); assert(clazz);
jmethodID method = env->GetMethodID(clazz, methodname, jmethodID method = env->GetMethodID(clazz, methodname, "(I)Ljava/lang/Object;");
"(I)Ljava/lang/Object;");
if (method == NULL) { if (method == NULL) {
jclass ex = env->FindClass("java/lang/NoSuchMethodError"); jclass ex = env->FindClass("java/lang/NoSuchMethodError");
assert(ex); assert(ex);
@ -198,20 +186,17 @@ namespace pEp {
jobject result = env->CallObjectMethod(obj, method, index); jobject result = env->CallObjectMethod(obj, method, index);
env->ExceptionCheck(); // handle exception in Java env->ExceptionCheck(); // handle exception in Java
return result; return result;
} }
jboolean callBooleanMethod( jboolean callBooleanMethod(JNIEnv *env,
JNIEnv *env,
jobject obj, jobject obj,
const char *methodname, const char *methodname,
jobject o jobject o)
) {
{
jclass clazz = env->GetObjectClass(obj); jclass clazz = env->GetObjectClass(obj);
assert(clazz); assert(clazz);
jmethodID method = env->GetMethodID(clazz, methodname, jmethodID method = env->GetMethodID(clazz, methodname, "(Ljava/lang/Object;)Z");
"(Ljava/lang/Object;)Z");
if (method == NULL) { if (method == NULL) {
jclass ex = env->FindClass("java/lang/NoSuchMethodError"); jclass ex = env->FindClass("java/lang/NoSuchMethodError");
assert(ex); assert(ex);
@ -224,20 +209,21 @@ namespace pEp {
jboolean result = env->CallBooleanMethod(obj, method, o); jboolean result = env->CallBooleanMethod(obj, method, o);
env->ExceptionCheck(); // handle exception in Java env->ExceptionCheck(); // handle exception in Java
return result; return result;
} }
jint outOfMemory(JNIEnv *env) jint outOfMemory(JNIEnv *env)
{ {
jclass ex; jclass ex;
const char *ex_name = "java/lang/OutOfMemoryError"; const char *ex_name = "java/lang/OutOfMemoryError";
ex = env->FindClass(ex_name); ex = env->FindClass(ex_name);
assert(ex); assert(ex);
return env->ThrowNew(ex, ex_name); return env->ThrowNew(ex, ex_name);
} }
jobject from_Integer(JNIEnv *env, int val) jobject from_Integer(JNIEnv *env,
{ int val)
{
assert(env); assert(env);
jclass clazz = findClass(env, "java/lang/Integer"); jclass clazz = findClass(env, "java/lang/Integer");
@ -247,47 +233,52 @@ namespace pEp {
jobject obj = env->NewObject(clazz, constructor, val); jobject obj = env->NewObject(clazz, constructor, val);
assert(obj); assert(obj);
return obj; return obj;
} }
int to_Integer(JNIEnv *env, jobject obj) int to_Integer(JNIEnv *env,
{ jobject obj)
{
assert(env && obj); assert(env && obj);
int _val = callIntMethod(env, obj, "intValue"); int _val = callIntMethod(env, obj, "intValue");
return _val; return _val;
} }
jbyteArray from_string(JNIEnv *env, const char *str) jbyteArray from_string(JNIEnv *env,
{ const char *str)
{
if (str && str[0]) { if (str && str[0]) {
jboolean isCopy; jboolean isCopy;
size_t l = strlen(str); size_t l = strlen(str);
jbyteArray _str = env->NewByteArray(l); jbyteArray _str = env->NewByteArray(l);
env->SetByteArrayRegion(_str, 0, l, (jbyte*)str); env->SetByteArrayRegion(_str, 0, l, (jbyte *) str);
return _str; return _str;
} } else if (str) {
else if (str) {
return env->NewByteArray(0); return env->NewByteArray(0);
} else { } else {
return (jbyteArray) NULL; return (jbyteArray) NULL;
} }
} }
char *to_string(JNIEnv *env, jbyteArray str) char *to_string(JNIEnv *env,
{ jbyteArray str)
if (str == NULL) {
if (str == NULL) {
return NULL; return NULL;
}
size_t l = env->GetArrayLength(str); size_t l = env->GetArrayLength(str);
char *_str = static_cast<char*>(calloc(1,l+1)); char *_str = static_cast<char *>(calloc(1, l + 1));
assert(_str); assert(_str);
env->GetByteArrayRegion(str, 0, l, (jbyte*)_str); env->GetByteArrayRegion(str, 0, l, (jbyte *) _str);
return _str; return _str;
} }
jobject from_stringlist(JNIEnv *env, stringlist_t *sl) jobject from_stringlist(JNIEnv *env,
{ stringlist_t *sl)
if (!sl) {
if (!sl) {
return (jobject) NULL; return (jobject) NULL;
}
jclass clazz = findClass(env, "java/util/Vector"); jclass clazz = findClass(env, "java/util/Vector");
jmethodID constructor = env->GetMethodID(clazz, "<init>", "()V"); jmethodID constructor = env->GetMethodID(clazz, "<init>", "()V");
@ -304,16 +295,19 @@ namespace pEp {
env->DeleteLocalRef(clazz); env->DeleteLocalRef(clazz);
return obj; return obj;
} }
stringlist_t *to_stringlist(JNIEnv *env, jobject obj) stringlist_t *to_stringlist(JNIEnv *env,
{ jobject obj)
if (!obj) {
if (!obj) {
return NULL; return NULL;
}
jint size = callIntMethod(env, obj, "size"); jint size = callIntMethod(env, obj, "size");
if (size == 0) if (size == 0) {
return NULL; return NULL;
}
stringlist_t *sl = new_stringlist(NULL); stringlist_t *sl = new_stringlist(NULL);
stringlist_t *_sl; stringlist_t *_sl;
@ -321,26 +315,27 @@ namespace pEp {
for (_sl = sl, i = 0; i < (int) size; i++) { for (_sl = sl, i = 0; i < (int) size; i++) {
jobject o = callObjectMethod(env, obj, "get", i); jobject o = callObjectMethod(env, obj, "get", i);
jbyteArray a = static_cast<jbyteArray>(o); jbyteArray a = static_cast<jbyteArray>(o);
char * str = to_string(env, a); char *str = to_string(env, a);
_sl = stringlist_add(_sl, str); _sl = stringlist_add(_sl, str);
env->DeleteLocalRef(o); env->DeleteLocalRef(o);
free(str); free(str);
} }
return sl; return sl;
} }
jobject from_stringpairlist(JNIEnv *env, stringpair_list_t *sl) jobject from_stringpairlist(JNIEnv *env,
{ stringpair_list_t *sl)
if (!sl) {
if (!sl) {
return (jobject) NULL; return (jobject) NULL;
}
jclass clazz = findClass(env, "java/util/ArrayList"); jclass clazz = findClass(env, "java/util/ArrayList");
jclass clazz_pair = findClass(env, "foundation/pEp/jniadapter/Pair"); jclass clazz_pair = findClass(env, "foundation/pEp/jniadapter/Pair");
jmethodID constructor = env->GetMethodID(clazz, "<init>", "()V"); jmethodID constructor = env->GetMethodID(clazz, "<init>", "()V");
assert(constructor); assert(constructor);
jmethodID constructor_pair = env->GetMethodID(clazz_pair, "<init>", jmethodID constructor_pair = env->GetMethodID(clazz_pair, "<init>", "(Ljava/lang/Object;Ljava/lang/Object;)V");
"(Ljava/lang/Object;Ljava/lang/Object;)V");
assert(constructor_pair); assert(constructor_pair);
jobject obj = env->NewObject(clazz, constructor); jobject obj = env->NewObject(clazz, constructor);
@ -353,36 +348,34 @@ namespace pEp {
jbyteArray first = from_string(env, _sl->value->key); jbyteArray first = from_string(env, _sl->value->key);
jbyteArray second = from_string(env, _sl->value->value); jbyteArray second = from_string(env, _sl->value->value);
jobject pair = env->NewObject(clazz_pair, constructor_pair, jobject pair = env->NewObject(clazz_pair, constructor_pair, first, second);
first, second);
callBooleanMethod(env, obj, "add", pair); callBooleanMethod(env, obj, "add", pair);
env->DeleteLocalRef(first); env->DeleteLocalRef(first);
env->DeleteLocalRef(second); env->DeleteLocalRef(second);
env->DeleteLocalRef(pair); env->DeleteLocalRef(pair);
} }
env->DeleteLocalRef(clazz); env->DeleteLocalRef(clazz);
env->DeleteLocalRef(clazz_pair); env->DeleteLocalRef(clazz_pair);
return obj; return obj;
} }
stringpair_list_t *to_stringpairlist(JNIEnv *env, jobject obj) stringpair_list_t *to_stringpairlist(JNIEnv *env,
{ jobject obj)
if (!obj) {
if (!obj) {
return NULL; return NULL;
}
jint size = callIntMethod(env, obj, "size"); jint size = callIntMethod(env, obj, "size");
if (size == 0) if (size == 0) {
return NULL; return NULL;
}
jfieldID first_id = getFieldID(env, "foundation/pEp/jniadapter/Pair", jfieldID first_id = getFieldID(env, "foundation/pEp/jniadapter/Pair", "first", "Ljava/lang/Object;");
"first", "Ljava/lang/Object;"); jfieldID second_id = getFieldID(env, "foundation/pEp/jniadapter/Pair", "second", "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 = new_stringpair_list(NULL);
stringpair_list_t *_sl; stringpair_list_t *_sl;
@ -390,12 +383,8 @@ namespace pEp {
for (_sl = sl, i = 0; i < (int) size; i++) { for (_sl = sl, i = 0; i < (int) size; i++) {
jobject pair = callObjectMethod(env, obj, "get", i); jobject pair = callObjectMethod(env, obj, "get", i);
jbyteArray first = jbyteArray first = static_cast<jbyteArray>(env->GetObjectField(pair, first_id));
static_cast<jbyteArray>(env->GetObjectField(pair, jbyteArray second = static_cast<jbyteArray>(env->GetObjectField(pair, second_id));
first_id));
jbyteArray second =
static_cast<jbyteArray>(env->GetObjectField(pair,
second_id));
char *first_str = to_string(env, first); char *first_str = to_string(env, first);
char *second_str = to_string(env, second); char *second_str = to_string(env, second);
@ -408,12 +397,14 @@ namespace pEp {
} }
return sl; return sl;
} }
jobject from_timestamp(JNIEnv *env, timestamp *ts) jobject from_timestamp(JNIEnv *env,
{ timestamp *ts)
if (!ts) {
if (!ts) {
return NULL; return NULL;
}
//LOGD("/* Seconds (0-60) */ FROM :%d", ts->tm_sec); //LOGD("/* Seconds (0-60) */ FROM :%d", ts->tm_sec);
//LOGD("/* Minutes (0-59) */ :%d", ts->tm_min); //LOGD("/* Minutes (0-59) */ :%d", ts->tm_min);
@ -422,7 +413,7 @@ namespace pEp {
//LOGD("/* Month (0-11) */ :%d", ts->tm_mon); //LOGD("/* Month (0-11) */ :%d", ts->tm_mon);
//LOGD("/* Year - 1900 */ :%d", ts->tm_year); //LOGD("/* Year - 1900 */ :%d", ts->tm_year);
time_t t = timegm(ts)*1000; time_t t = timegm(ts) * 1000;
//LOGD( "TimeGM returns : %lld", t); //LOGD( "TimeGM returns : %lld", t);
jclass clazz = findClass(env, "java/util/Date"); jclass clazz = findClass(env, "java/util/Date");
jmethodID constructor = env->GetMethodID(clazz, "<init>", "(J)V"); jmethodID constructor = env->GetMethodID(clazz, "<init>", "(J)V");
@ -433,23 +424,25 @@ namespace pEp {
env->DeleteLocalRef(clazz); env->DeleteLocalRef(clazz);
return result; return result;
}
} timestamp *to_timestamp(JNIEnv *env,
jobject date)
timestamp *to_timestamp(JNIEnv *env, jobject date) {
{ if (!date) {
if (!date)
return NULL; return NULL;
}
jlong t = callLongMethod(env, date, "getTime"); jlong t = callLongMethod(env, date, "getTime");
//LOGD( "Set Time to : %lld", t); //LOGD( "Set Time to : %lld", t);
timestamp *ts = static_cast<timestamp*>(calloc(1, sizeof(timestamp))); timestamp *ts = static_cast<timestamp *>(calloc(1, sizeof(timestamp)));
assert(ts); assert(ts);
if (ts == NULL) if (ts == NULL) {
return NULL; return NULL;
}
if (t){ if (t) {
time_t clock = t/1000; time_t clock = t / 1000;
gmtime_r(&clock, ts); gmtime_r(&clock, ts);
//LOGD("/* Seconds (0-60) */ TO :%d", ts->tm_sec); //LOGD("/* Seconds (0-60) */ TO :%d", ts->tm_sec);
@ -461,33 +454,40 @@ namespace pEp {
} }
return ts; return ts;
} }
static void _setStringField(JNIEnv *env, const char *classname, static void _setStringField(JNIEnv *env,
jobject obj, const char *name, const char *value) const char *classname,
{ jobject obj,
const char *name,
const char *value)
{
if (value) { if (value) {
jfieldID fieldID = getFieldID(env, classname, name, "[B"); jfieldID fieldID = getFieldID(env, classname, name, "[B");
env->SetObjectField(obj, fieldID, static_cast<jobject>(from_string(env, value))); env->SetObjectField(obj, fieldID, static_cast<jobject>(from_string(env, value)));
}
} }
}
//TODO: fix/generalize/clean patch added to make keysync work using globalref to class //TODO: fix/generalize/clean patch added to make keysync work using globalref to class
static void _setStringField(JNIEnv *env, const char *classname, static void _setStringField(JNIEnv *env,
jobject obj, const char *name, const char *value, const jclass clazz) const char *classname,
{ jobject obj,
const char *name,
const char *value,
const jclass clazz)
{
if (value) { if (value) {
jfieldID fieldID = getFieldID(env, classname, name, "[B", clazz); jfieldID fieldID = getFieldID(env, classname, name, "[B", clazz);
env->SetObjectField(obj, fieldID, static_cast<jobject>(from_string(env, value))); env->SetObjectField(obj, fieldID, static_cast<jobject>(from_string(env, value)));
}
} }
}
jobject from_identity(JNIEnv *env, pEp_identity *ident) jobject from_identity(JNIEnv *env,
{ pEp_identity *ident)
if (!ident) {
if (!ident) {
return (jobject) NULL; return (jobject) NULL;
}
static const char *classname = "foundation/pEp/jniadapter/_Identity"; static const char *classname = "foundation/pEp/jniadapter/_Identity";
jclass clazz = findClass(env, classname); jclass clazz = findClass(env, classname);
@ -516,13 +516,16 @@ namespace pEp {
} }
return obj; return obj;
} }
//TODO: fix/generalize/clean patch added to make keysync work using globalref to class //TODO: fix/generalize/clean patch added to make keysync work using globalref to class
jobject from_identity(JNIEnv *env, pEp_identity *ident, jclass identityClass) jobject from_identity(JNIEnv *env,
{ pEp_identity *ident,
if (!ident) jclass identityClass)
{
if (!ident) {
return (jobject) NULL; return (jobject) NULL;
}
static const char *classname = "foundation/pEp/jniadapter/_Identity"; static const char *classname = "foundation/pEp/jniadapter/_Identity";
jmethodID constructor = env->GetMethodID(identityClass, "<init>", "()V"); jmethodID constructor = env->GetMethodID(identityClass, "<init>", "()V");
@ -548,11 +551,13 @@ namespace pEp {
} }
return obj; return obj;
} }
char *_getStringField(JNIEnv *env, const char *classname, jobject obj, char *_getStringField(JNIEnv *env,
const char *classname,
jobject obj,
const char *name) const char *name)
{ {
jfieldID fieldID = getFieldID(env, classname, name, "[B"); jfieldID fieldID = getFieldID(env, classname, name, "[B");
jobject fobj = env->GetObjectField(obj, fieldID); jobject fobj = env->GetObjectField(obj, fieldID);
@ -560,12 +565,14 @@ namespace pEp {
env->DeleteLocalRef(fobj); env->DeleteLocalRef(fobj);
return res; return res;
} }
pEp_identity *to_identity(JNIEnv *env, jobject obj) pEp_identity *to_identity(JNIEnv *env,
{ jobject obj)
if (!obj) {
if (!obj) {
return NULL; return NULL;
}
static const char *classname = "foundation/pEp/jniadapter/_Identity"; static const char *classname = "foundation/pEp/jniadapter/_Identity";
pEp_identity *ident = new_identity(NULL, NULL, NULL, NULL); pEp_identity *ident = new_identity(NULL, NULL, NULL, NULL);
@ -592,12 +599,14 @@ namespace pEp {
ident->flags = static_cast<identity_flags_t>(env->GetIntField(obj, flags_id)); ident->flags = static_cast<identity_flags_t>(env->GetIntField(obj, flags_id));
return ident; return ident;
} }
jobject from_identitylist(JNIEnv *env, identity_list *il) jobject from_identitylist(JNIEnv *env,
{ identity_list *il)
if (!il) {
if (!il) {
return (jobject) NULL; return (jobject) NULL;
}
jclass clazz = findClass(env, "java/util/Vector"); jclass clazz = findClass(env, "java/util/Vector");
jmethodID constructor = env->GetMethodID(clazz, "<init>", "()V"); jmethodID constructor = env->GetMethodID(clazz, "<init>", "()V");
@ -614,34 +623,39 @@ namespace pEp {
env->DeleteLocalRef(clazz); env->DeleteLocalRef(clazz);
return obj; return obj;
} }
identity_list *to_identitylist(JNIEnv *env, jobject obj) identity_list *to_identitylist(JNIEnv *env,
{ jobject obj)
if (!obj) {
if (!obj) {
return NULL; return NULL;
}
jint size = callIntMethod(env, obj, "size"); jint size = callIntMethod(env, obj, "size");
if (size == 0) if (size == 0) {
return NULL; return NULL;
}
identity_list *il = new_identity_list(NULL); identity_list *il = new_identity_list(NULL);
identity_list *_il; identity_list *_il;
jint i; jint i;
for (_il = il, i = 0; i < (int) size; i++) { for (_il = il, i = 0; i < (int) size; i++) {
jobject o = callObjectMethod(env, obj, "get", i); jobject o = callObjectMethod(env, obj, "get", i);
pEp_identity* ident = to_identity(env, o); pEp_identity *ident = to_identity(env, o);
_il = identity_list_add(_il, ident); _il = identity_list_add(_il, ident);
env->DeleteLocalRef(o); env->DeleteLocalRef(o);
} }
return il; return il;
} }
jobject _from_blob(JNIEnv *env, bloblist_t *b) jobject _from_blob(JNIEnv *env,
{ bloblist_t *b)
if (!b) {
if (!b) {
return (jobject) NULL; return (jobject) NULL;
}
static const char *classname = "foundation/pEp/jniadapter/_Blob"; static const char *classname = "foundation/pEp/jniadapter/_Blob";
jclass clazz = findClass(env, classname); jclass clazz = findClass(env, classname);
@ -653,18 +667,20 @@ namespace pEp {
jfieldID fieldID = getFieldID(env, classname, "data", "[B"); jfieldID fieldID = getFieldID(env, classname, "data", "[B");
jbyteArray _data = env->NewByteArray(static_cast<jsize>(b->size)); jbyteArray _data = env->NewByteArray(static_cast<jsize>(b->size));
env->SetByteArrayRegion(_data, 0, b->size, reinterpret_cast<jbyte*>(b->value)); env->SetByteArrayRegion(_data, 0, b->size, reinterpret_cast<jbyte *>(b->value));
env->SetObjectField(obj, fieldID, static_cast<jobject>(_data)); env->SetObjectField(obj, fieldID, static_cast<jobject>(_data));
_setStringField(env, classname, obj, "mime_type", b->mime_type); _setStringField(env, classname, obj, "mime_type", b->mime_type);
_setStringField(env, classname, obj, "filename", b->filename); _setStringField(env, classname, obj, "filename", b->filename);
return obj; return obj;
} }
jobject from_bloblist(JNIEnv *env, bloblist_t *bl) jobject from_bloblist(JNIEnv *env,
{ bloblist_t *bl)
if (!bl) {
if (!bl) {
return (jobject) NULL; return (jobject) NULL;
}
jclass clazz = findClass(env, "java/util/Vector"); jclass clazz = findClass(env, "java/util/Vector");
jmethodID constructor = env->GetMethodID(clazz, "<init>", "()V"); jmethodID constructor = env->GetMethodID(clazz, "<init>", "()V");
@ -677,17 +693,20 @@ namespace pEp {
bloblist_t *_bl; bloblist_t *_bl;
for (_bl = bl; _bl && _bl->value; _bl = _bl->next) { for (_bl = bl; _bl && _bl->value; _bl = _bl->next) {
jobject o = _from_blob(env, _bl); jobject o = _from_blob(env, _bl);
if(o) if (o) {
callBooleanMethod(env, obj, "add", o); callBooleanMethod(env, obj, "add", o);
} }
}
return obj; return obj;
} }
bloblist_t *to_blob(JNIEnv *env, jobject obj) bloblist_t *to_blob(JNIEnv *env,
{ jobject obj)
if (!obj) {
if (!obj) {
return NULL; return NULL;
}
static const char *classname = "foundation/pEp/jniadapter/_Blob"; static const char *classname = "foundation/pEp/jniadapter/_Blob";
jclass clazz = findClass(env, classname); jclass clazz = findClass(env, classname);
@ -701,23 +720,26 @@ namespace pEp {
char *b = static_cast<char *>(malloc(size)); char *b = static_cast<char *>(malloc(size));
assert(b); assert(b);
env->GetByteArrayRegion(_data, 0, size, reinterpret_cast<jbyte*>(b)); env->GetByteArrayRegion(_data, 0, size, reinterpret_cast<jbyte *>(b));
bloblist_t *bl = new_bloblist( b, size, mime_type, filename); bloblist_t *bl = new_bloblist(b, size, mime_type, filename);
free(mime_type); free(mime_type);
free(filename); free(filename);
return bl; return bl;
} }
bloblist_t *to_bloblist(JNIEnv *env, jobject obj) bloblist_t *to_bloblist(JNIEnv *env,
{ jobject obj)
if (!obj) {
if (!obj) {
return NULL; return NULL;
}
jint size = callIntMethod(env, obj, "size"); jint size = callIntMethod(env, obj, "size");
if (size == 0) if (size == 0) {
return NULL; return NULL;
}
bloblist_t *bl = new_bloblist(NULL, 0, NULL, NULL); bloblist_t *bl = new_bloblist(NULL, 0, NULL, NULL);
bloblist_t *_bl; bloblist_t *_bl;
@ -731,10 +753,11 @@ namespace pEp {
} }
return bl; return bl;
} }
PEP_enc_format to_EncFormat(JNIEnv *env, jobject obj) PEP_enc_format to_EncFormat(JNIEnv *env,
{ jobject obj)
{
static const char *classname = "foundation/pEp/jniadapter/Message$EncFormat"; static const char *classname = "foundation/pEp/jniadapter/Message$EncFormat";
jclass clazz_enc_format = findClass(env, classname); jclass clazz_enc_format = findClass(env, classname);
jfieldID field_value = env->GetFieldID(clazz_enc_format, "value", "I"); jfieldID field_value = env->GetFieldID(clazz_enc_format, "value", "I");
@ -742,10 +765,11 @@ namespace pEp {
env->DeleteLocalRef(clazz_enc_format); env->DeleteLocalRef(clazz_enc_format);
return static_cast<PEP_enc_format>(env->GetIntField(obj, field_value)); return static_cast<PEP_enc_format>(env->GetIntField(obj, field_value));
} }
PEP_CIPHER_SUITE to_CipherSuite(JNIEnv *env, jobject obj) PEP_CIPHER_SUITE to_CipherSuite(JNIEnv *env,
{ jobject obj)
{
static const char *classname = "foundation/pEp/jniadapter/CipherSuite"; static const char *classname = "foundation/pEp/jniadapter/CipherSuite";
jclass clazz_enc_format = findClass(env, classname); jclass clazz_enc_format = findClass(env, classname);
jfieldID field_value = env->GetFieldID(clazz_enc_format, "value", "I"); jfieldID field_value = env->GetFieldID(clazz_enc_format, "value", "I");
@ -753,10 +777,11 @@ namespace pEp {
env->DeleteLocalRef(clazz_enc_format); env->DeleteLocalRef(clazz_enc_format);
return static_cast<PEP_CIPHER_SUITE>(env->GetIntField(obj, field_value)); return static_cast<PEP_CIPHER_SUITE>(env->GetIntField(obj, field_value));
} }
sync_handshake_result to_SyncHandshakeResult(JNIEnv *env, jobject obj) sync_handshake_result to_SyncHandshakeResult(JNIEnv *env,
{ jobject obj)
{
static const char *classname = "foundation/pEp/jniadapter/SyncHandshakeResult"; static const char *classname = "foundation/pEp/jniadapter/SyncHandshakeResult";
jclass clazz_enc_format = findClass(env, classname); jclass clazz_enc_format = findClass(env, classname);
jfieldID field_value = env->GetFieldID(clazz_enc_format, "value", "I"); jfieldID field_value = env->GetFieldID(clazz_enc_format, "value", "I");
@ -764,7 +789,7 @@ namespace pEp {
env->DeleteLocalRef(clazz_enc_format); env->DeleteLocalRef(clazz_enc_format);
return static_cast<sync_handshake_result>(env->GetIntField(obj, field_value)); return static_cast<sync_handshake_result>(env->GetIntField(obj, field_value));
} }
}; };
}; };

177
src/cxx/jniutils.hh

@ -1,4 +1,5 @@
#pragma once #pragma once
#include <unordered_map> #include <unordered_map>
#include <thread> #include <thread>
#include <mutex> #include <mutex>
@ -19,112 +20,128 @@
#endif #endif
namespace pEp { namespace pEp {
namespace JNIAdapter { namespace JNIAdapter {
// Global mutex needs to be locked in all constructors which insert their own mutex object // 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) // into the unordered_map (which is thread safe for read, but not for write)
extern std::mutex global_mutex; extern std::mutex global_mutex;
// Stores mutex per java object // Stores mutex per java object
extern std::unordered_map<long, std::mutex*> engine_objid_mutex; extern std::unordered_map<long, std::mutex *> engine_objid_mutex;
// needs to be called after create_engine_java_object_mutex() // needs to be called after create_engine_java_object_mutex()
// and before release_engine_java_object_mutex() // and before release_engine_java_object_mutex()
// Thread safe // Thread safe
std::mutex* get_engine_java_object_mutex( std::mutex *get_engine_java_object_mutex(JNIEnv *env,
JNIEnv *env, jobject me);
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)
// Needs to be called exactly once per obj, in the constructor of the obj void create_engine_java_object_mutex(JNIEnv *env,
// You need to lock a global mutex before calling this function (write to unordered_map) jobject me);
void create_engine_java_object_mutex(
JNIEnv *env, // Needs to be called exactly once per obj, in the destructor of this obj
jobject me // 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);
// 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( jclass findClass(JNIEnv *env,
JNIEnv *env, const char *classname);
jobject me
); jfieldID getFieldID(JNIEnv *env,
jclass findClass(JNIEnv *env, const char *classname);
jfieldID getFieldID(
JNIEnv *env,
const char *classname, const char *classname,
const char *fieldname, const char *fieldname,
const char *signature const char *signature);
);
jfieldID getFieldID( jfieldID getFieldID(JNIEnv *env,
JNIEnv *env,
const char *classname, const char *classname,
const char *fieldname, const char *fieldname,
const char *signature, const char *signature,
const jclass clazz const jclass clazz);
);
jint callIntMethod( jint callIntMethod(JNIEnv *env,
JNIEnv *env,
jobject obj, jobject obj,
const char *methodname const char *methodname);
);
jlong callLongMethod( jlong callLongMethod(JNIEnv *env,
JNIEnv *env,
jobject obj, jobject obj,
const char *methodname const char *methodname);
);
jobject callObjectMethod( jobject callObjectMethod(JNIEnv *env,
JNIEnv *env,
jobject obj, jobject obj,
const char *methodname, const char *methodname,
jint index jint index);
);
jboolean callBooleanMethod( jboolean callBooleanMethod(JNIEnv *env,
JNIEnv *env,
jobject obj, jobject obj,
const char *methodname, const char *methodname,
jobject o jobject o);
);
jint outOfMemory(JNIEnv *env);
jobject from_Integer(JNIEnv *env,
int val);
jint outOfMemory(JNIEnv *env); int to_Integer(JNIEnv *env,
jobject obj);
jobject from_Integer(JNIEnv *env, int val); jbyteArray from_string(JNIEnv *env,
int to_Integer(JNIEnv *env, jobject obj); const char *str);
jbyteArray from_string(JNIEnv *env, const char *str); char *to_string(JNIEnv *env,
char *to_string(JNIEnv *env, jbyteArray str); jbyteArray str);
jobject from_stringlist(JNIEnv *env, stringlist_t *sl); jobject from_stringlist(JNIEnv *env,
stringlist_t *to_stringlist(JNIEnv *env, jobject obj); stringlist_t *sl);
jobject from_stringpairlist(JNIEnv *env, stringpair_list_t *sl); stringlist_t *to_stringlist(JNIEnv *env,
stringpair_list_t *to_stringpairlist(JNIEnv *env, jobject obj); jobject obj);
jobject from_timestamp(JNIEnv *env, timestamp *ts); jobject from_stringpairlist(JNIEnv *env,
timestamp *to_timestamp(JNIEnv *env, jobject date); stringpair_list_t *sl);
jobject from_identity(JNIEnv *env, pEp_identity *ident); stringpair_list_t *to_stringpairlist(JNIEnv *env,
jobject from_identity(JNIEnv *env, pEp_identity *ident, jclass identityClass); jobject obj);
pEp_identity *to_identity(JNIEnv *env, jobject obj);
jobject from_identitylist(JNIEnv *env, identity_list *il); jobject from_timestamp(JNIEnv *env,
identity_list *to_identitylist(JNIEnv *env, jobject obj); timestamp *ts);
jobject from_bloblist(JNIEnv *env, bloblist_t *bl); timestamp *to_timestamp(JNIEnv *env,
bloblist_t *to_blob(JNIEnv *env, jobject obj); jobject date);
bloblist_t *to_bloblist(JNIEnv *env, jobject obj);
PEP_enc_format to_EncFormat(JNIEnv *env, jobject obj); jobject from_identity(JNIEnv *env,
PEP_CIPHER_SUITE to_CipherSuite(JNIEnv *env, jobject obj); pEp_identity *ident);
sync_handshake_result to_SyncHandshakeResult(JNIEnv *env, jobject obj); 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);
};
}; };

9
src/cxx/passphrase_callback.hh

@ -1,14 +1,15 @@
#pragma once #pragma once
#include <pEp/passphrase_cache.hh> #include <pEp/passphrase_cache.hh>
namespace pEp { namespace pEp {
namespace JNIAdapter { namespace JNIAdapter {
char* passphraseRequiredCallback(const PEP_STATUS status); char *passphraseRequiredCallback(const PEP_STATUS status);
template<typename... A> PEP_STATUS passphraseWrap(PEP_STATUS f(PEP_SESSION, A...), PEP_SESSION session, A... a);
template<typename... A> PEP_STATUS passphraseWrap(PEP_STATUS f(PEP_SESSION, A...), PEP_SESSION session, A... a); }
}
} }
#include "passphrase_callback.hxx" #include "passphrase_callback.hxx"

8
src/cxx/passphrase_callback.hxx

@ -3,9 +3,9 @@
#include "passphrase_callback.hh" #include "passphrase_callback.hh"
namespace pEp { namespace pEp {
namespace JNIAdapter { namespace JNIAdapter {
template<typename... A> PEP_STATUS passphraseWrap(PEP_STATUS f(PEP_SESSION, A...), PEP_SESSION session, A... a) { template<typename... A> PEP_STATUS passphraseWrap(PEP_STATUS f(PEP_SESSION, A...), PEP_SESSION session, A... a) {
pEpLog("cached passphrase mode"); pEpLog("cached passphrase mode");
bool retryAgain = false; bool retryAgain = false;
int maxRetries = 3; int maxRetries = 3;
@ -37,6 +37,6 @@ namespace pEp {
} }
} while (retryAgain); } while (retryAgain);
return status; return status;
} }
} }
} }
Loading…
Cancel
Save