From 357e19a07fd841d4f95597eb2c9dc69bcf1d8ba5 Mon Sep 17 00:00:00 2001 From: Volker Birk Date: Fri, 21 Aug 2015 11:30:25 +0200 Subject: [PATCH 01/10] throwing exception on error --- src/gen_cpp_Engine.ysl2 | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/gen_cpp_Engine.ysl2 b/src/gen_cpp_Engine.ysl2 index 057ff8c..df88b67 100644 --- a/src/gen_cpp_Engine.ysl2 +++ b/src/gen_cpp_Engine.ysl2 @@ -12,6 +12,7 @@ tstylesheet { #include #include #include "org_pEp_jniadapter_«@name».h" + #include "throw_pEp_exception.hh" #include "jniutils.hh" using namespace pEp::JNIAdapter; @@ -41,6 +42,11 @@ tstylesheet { `` apply "parm[creates|returns]", mode=out PEP_STATUS status = ::«@name»(session`apply "parm", mode=call``if "@name = 'encrypt_message'" > , PEP_enc_PEP`); + if ((status > PEP_STATUS_OK && status < PEP_UNENCRYPTED) |`> |` + status >= PEP_TRUSTWORD_NOT_FOUND) { + throw_pEp_Exception(env, status); + return NULL; + } || From aa35dc10a7cfe6c6595dffdae5498957b68580a9 Mon Sep 17 00:00:00 2001 From: Volker Birk Date: Fri, 21 Aug 2015 11:55:08 +0200 Subject: [PATCH 02/10] handling empty return values --- src/gen_cpp_Engine.ysl2 | 44 ++++++++++++++++++++++++++++++----------- 1 file changed, 32 insertions(+), 12 deletions(-) diff --git a/src/gen_cpp_Engine.ysl2 b/src/gen_cpp_Engine.ysl2 index df88b67..1356c7d 100644 --- a/src/gen_cpp_Engine.ysl2 +++ b/src/gen_cpp_Engine.ysl2 @@ -99,8 +99,16 @@ tstylesheet { const "name", "name(*[3])"; || jfieldID «$name»_field = getFieldID(env, "«$jtype»", - "«$name»", "«$sig»"); - env->SetObjectField(result_, «$name»_field, «$name»_); + "«$name»", "«$sig»"); + if («$name»_) + env->SetObjectField(result_, «$name»_field, «$name»_); + || + if "$name = 'dst'" + || + else + env->SetObjectField(result_, «$name»_field, src); + || + || || } @@ -126,20 +134,32 @@ tstylesheet { choose { when "$jnitype = 'jbyteArray'" || - jobject «$name»_ = from_stringlist(env, _«$retname»); + jobject «$name»_ = NULL; + if (_«$retname») + «$name»_ = from_stringlist(env, _«$retname»); || otherwise { - || - jclass clazz_«$name»_ = findClass(env, "org/pEp/jniadapter/«$jtype»"); - jmethodID constructor_«$name»_ = env->GetMethodID(clazz_«$name»_, "", "«$sig»"); - assert(constructor_«$name»_); - || - indent(0); - > jobject «$name»_ = env->NewObject(clazz_«$name»_, constructor_«$name»_ - if "$jnitype != ''" > , («$jnitype») _«$retname» - > );\n\n + | jobject «$name»_ = NULL; + indent(0); + if "$retname != 'result'" > if (_«$retname») + > {\n + || + jclass clazz_«$name»_ = findClass(env, "org/pEp/jniadapter/«$jtype»"); + jmethodID constructor_«$name»_ = env->GetMethodID(clazz_«$name»_, "", "«$sig»"); + assert(constructor_«$name»_); + || + + indent(1); + > «$name»_ = env->NewObject(clazz_«$name»_, constructor_«$name»_ + if "$jnitype != ''" > , («$jnitype») _«$retname» + > );\n + + || + } + + || } } } From bc9c8319dc55882799d592f00686c41bd55a903e Mon Sep 17 00:00:00 2001 From: Volker Birk Date: Fri, 21 Aug 2015 14:10:57 +0200 Subject: [PATCH 03/10] trustwords --- src/Makefile | 4 +++- src/gen_java_Engine.ysl2 | 18 ++++++++++++++++-- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/Makefile b/src/Makefile index e4f845d..a6c0cb6 100644 --- a/src/Makefile +++ b/src/Makefile @@ -36,7 +36,7 @@ org_pEp_jniadapter_AbstractEngine.o: %.o: %.cc %.h throw_pEp_exception.hh jniuti org_pEp_jniadapter_Engine.o org_pEp_jniadapter_Message.o: %.o: %.cc %.h -$(LIBRARY): org_pEp_jniadapter_AbstractEngine.o org_pEp_jniadapter_Engine.o org_pEp_jniadapter_Message.o throw_pEp_exception.o jniutils.o +$(LIBRARY): org_pEp_jniadapter_AbstractEngine.o org_pEp_jniadapter_Engine.o org_pEp_jniadapter_Message.o throw_pEp_exception.o jniutils.o basic_api.o ar -r $@ *.o org/pEp/jniadapter/pEpException.java: pEp.yml2 gen_java_exceptions.ysl2 @@ -59,6 +59,8 @@ throw_pEp_exception.cc throw_pEp_exception.hh: pEp.yml2 gen_throw_pEp_exception. throw_pEp_exception.o: throw_pEp_exception.cc throw_pEp_exception.hh +basic_api.o: basic_api.cc jniutils.hh throw_pEp_exception.hh + .PHONY: clean clean: diff --git a/src/gen_java_Engine.ysl2 b/src/gen_java_Engine.ysl2 index 6366b4c..0e2c86b 100644 --- a/src/gen_java_Engine.ysl2 +++ b/src/gen_java_Engine.ysl2 @@ -18,6 +18,12 @@ tstylesheet { public «$cname»() throws pEpException { } `` apply "method", mode=plain + private native byte[] trustwords(_Identity ident); + + public String trustwords(Identity ident) { + _Identity _ident = new _Identity(ident); + return AbstractEngine.toUTF16(trustwords(_ident)); + } } || @@ -47,6 +53,7 @@ tstylesheet { template "method", mode=plain { const "convert", "count(parm/stringlist|parm/string|parm/identity) > 0"; + const "convertreturn", "count(parm[returns]/stringlist|parm[returns]/string|parm[returns]/identity) > 0"; const "singlereturn", "count(parm/creates|parm/returns) = 1"; const "multireturn", "count(parm/creates|parm/returns) > 1"; @@ -85,7 +92,12 @@ tstylesheet { | { apply "parm", mode=convertIn; - if "$singlereturn" |> return _«@name»(`apply "parm[in]", mode=call;`); + if "$singlereturn" choose { + when "$convertreturn" + |> return AbstractEngine.toUTF16(_«@name»(`apply "parm[in]", mode=call;`)); + otherwise + |> return _«@name»(`apply "parm[in]", mode=call;`); + } if "$multireturn" || @@ -97,9 +109,11 @@ tstylesheet { || } - || } + || + + || } template "parm", mode=java { From bcbb6f49cbaa52b9bd723addeaf70759bbc64bea Mon Sep 17 00:00:00 2001 From: Volker Birk Date: Fri, 21 Aug 2015 14:45:52 +0200 Subject: [PATCH 04/10] updateIdentity and myself --- src/gen_java_Engine.ysl2 | 35 ++++++++++++++++++---- src/org/pEp/jniadapter/AbstractEngine.java | 34 --------------------- src/pEp.yml2 | 6 ++++ src/types_java.ysl2 | 1 + 4 files changed, 36 insertions(+), 40 deletions(-) diff --git a/src/gen_java_Engine.ysl2 b/src/gen_java_Engine.ysl2 index 0e2c86b..a93e3e4 100644 --- a/src/gen_java_Engine.ysl2 +++ b/src/gen_java_Engine.ysl2 @@ -18,17 +18,40 @@ tstylesheet { public «$cname»() throws pEpException { } `` apply "method", mode=plain - private native byte[] trustwords(_Identity ident); - - public String trustwords(Identity ident) { - _Identity _ident = new _Identity(ident); - return AbstractEngine.toUTF16(trustwords(_ident)); - } + `` apply "basic" } || } + template "basic" { + const "itype" call "toIntermediate" with "type", "@type"; + const "jtype" call "toJava" with "type", "@type"; + const "ptype", "name(parm/*[1])"; + const "pitype" call "toIntermediate" with "type", "$ptype"; + const "pjtype" call "toJava" with "type", "$ptype"; + const "pname", "name(parm/*[2])"; + + || + private native «$itype» «@name»(«$pitype» «$pname»); + + public «$jtype» «@name»(«$pjtype» «$pname») { + «$pitype» _«$pname» = new «$pitype»(«$pname»); + || + choose { + when "@type = 'void'" + |> «@name»(_«$pname»); + when "@type = 'identity'" + |> return new Identity(«@name»(_«$pname»)); + otherwise + |> return AbstractEngine.toUTF16(«@name»(_«$pname»)); + } + || + } + + || + } + function "returnJava" { const "returning", "count(parm/creates|parm/returns)"; const "returntype" call "toJava" with "type", "name(parm[creates|returns]/*[2])"; diff --git a/src/org/pEp/jniadapter/AbstractEngine.java b/src/org/pEp/jniadapter/AbstractEngine.java index 36905f7..48d1e91 100644 --- a/src/org/pEp/jniadapter/AbstractEngine.java +++ b/src/org/pEp/jniadapter/AbstractEngine.java @@ -101,39 +101,5 @@ abstract class AbstractEngine implements AutoCloseable { return result; } - - public class _Identity { - public byte[] address; - public byte[] fpr; - public byte[] user_id; - public byte[] username; - CommType comm_type; - public byte[] lang; - public boolean me; - - public _Identity(Identity value) { - address = toUTF8(value.address); - fpr = toUTF8(value.fpr); - user_id = toUTF8(value.user_id); - username = toUTF8(value.username); - comm_type = value.comm_type; - lang = toUTF8(value.lang); - me = value.me; - } - - public Identity getIdentity() { - Identity ident = new Identity(me); - - ident.address = toUTF16(address); - ident.fpr = toUTF16(fpr); - ident.user_id = toUTF16(user_id); - ident.username = toUTF16(username); - ident.comm_type = comm_type; - ident.lang = toUTF16(lang); - ident.me = me; - - return ident; - } - } } diff --git a/src/pEp.yml2 b/src/pEp.yml2 index c485127..383f3a6 100644 --- a/src/pEp.yml2 +++ b/src/pEp.yml2 @@ -4,6 +4,7 @@ decl interface @name; decl exception @name; decl method @name; decl struct @name; +decl basic @type @name; namespace pEp { exception pEp_status { @@ -86,6 +87,11 @@ namespace pEp { in message msg, returns Color color ); + + basic string trustwords(identity ident); + basic identity myself(identity ident); + basic identity updateIdentity(identity ident); + basic void keyCompromized(identity ident); }; struct message { diff --git a/src/types_java.ysl2 b/src/types_java.ysl2 index 5536dc3..e384728 100644 --- a/src/types_java.ysl2 +++ b/src/types_java.ysl2 @@ -12,6 +12,7 @@ function "toJava" { when "$type='bloblist'" > Vector when "$type='stringpairlist'" > ArrayList> when "$type='message'" > Message + when "$type='void'" > void otherwise call "CamelCase" with "text", "$type"; } From 7eb00c95b3bf7ee8cb1aa4cbf6c6c6da6a57d0b3 Mon Sep 17 00:00:00 2001 From: Volker Birk Date: Fri, 21 Aug 2015 14:49:15 +0200 Subject: [PATCH 05/10] keyCompromized --- src/basic_api.cc | 94 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 src/basic_api.cc diff --git a/src/basic_api.cc b/src/basic_api.cc new file mode 100644 index 0000000..439da33 --- /dev/null +++ b/src/basic_api.cc @@ -0,0 +1,94 @@ +#include + +#include "throw_pEp_exception.hh" +#include "jniutils.hh" + +using namespace pEp::JNIAdapter; + +extern "C" { +JNIEXPORT jobject JNICALL Java_org_pEp_jniadapter_Engine_trustwords( + JNIEnv *env, + jobject obj, + jobject ident + ) +{ + PEP_SESSION session = (PEP_SESSION) callLongMethod(env, obj, "getHandle"); + pEp_identity *_ident = to_identity(env, ident); + char *words; + size_t wsize; + + if (_ident->fpr == NULL || _ident->fpr[0] == 0) { + if (_ident->me) + ::myself(session, _ident); + else + ::update_identity(session, _ident); + } + + if (_ident->fpr == NULL || _ident->fpr[0] == 0) { + throw_pEp_Exception(env, PEP_CANNOT_FIND_IDENTITY); + return NULL; + } + + PEP_STATUS status = ::trustwords(session, _ident->fpr, _ident->lang, &words, &wsize, 10); + if (status != PEP_STATUS_OK) { + throw_pEp_Exception(env, status); + return NULL; + } + + return from_string(env, words); +} + +JNIEXPORT jobject JNICALL Java_org_pEp_jniadapter_Engine_myself( + JNIEnv *env, + jobject obj, + jobject ident + ) +{ + PEP_SESSION session = (PEP_SESSION) callLongMethod(env, obj, "getHandle"); + pEp_identity *_ident = to_identity(env, ident); + + ::myself(session, _ident); + + return from_identity(env, _ident); +} + +JNIEXPORT jobject JNICALL Java_org_pEp_jniadapter_Engine_updateIdentity( + JNIEnv *env, + jobject obj, + jobject ident + ) +{ + PEP_SESSION session = (PEP_SESSION) callLongMethod(env, obj, "getHandle"); + pEp_identity *_ident = to_identity(env, ident); + + ::update_identity(session, _ident); + + return from_identity(env, _ident); +} + +JNIEXPORT void JNICALL Java_org_pEp_jniadapter_Engine_keyCompromized( + JNIEnv *env, + jobject obj, + jobject ident + ) +{ + PEP_SESSION session = (PEP_SESSION) callLongMethod(env, obj, "getHandle"); + pEp_identity *_ident = to_identity(env, ident); + + if (_ident->fpr == NULL || _ident->fpr[0] == 0) { + if (_ident->me) + ::myself(session, _ident); + else + ::update_identity(session, _ident); + } + + if (_ident->fpr == NULL || _ident->fpr[0] == 0) { + throw_pEp_Exception(env, PEP_CANNOT_FIND_IDENTITY); + return; + } + + ::key_compromized(session, _ident->fpr); +} + +} // extern "C" + From 60b5eedca11b4fa6afd4ad5fd24236a3b78774cf Mon Sep 17 00:00:00 2001 From: Volker Birk Date: Fri, 21 Aug 2015 18:21:34 +0200 Subject: [PATCH 06/10] locked queue and threads --- src/basic_api.cc | 4 +- src/jniutils.hh | 79 ++++++++++++++++++++++ src/org/pEp/jniadapter/AbstractEngine.java | 5 ++ src/org_pEp_jniadapter_AbstractEngine.cc | 62 ++++++++++++++++- 4 files changed, 146 insertions(+), 4 deletions(-) diff --git a/src/basic_api.cc b/src/basic_api.cc index 439da33..bdbaf8c 100644 --- a/src/basic_api.cc +++ b/src/basic_api.cc @@ -3,9 +3,9 @@ #include "throw_pEp_exception.hh" #include "jniutils.hh" -using namespace pEp::JNIAdapter; - extern "C" { + using namespace pEp::JNIAdapter; + JNIEXPORT jobject JNICALL Java_org_pEp_jniadapter_Engine_trustwords( JNIEnv *env, jobject obj, diff --git a/src/jniutils.hh b/src/jniutils.hh index 6dca348..b7598fd 100644 --- a/src/jniutils.hh +++ b/src/jniutils.hh @@ -1,11 +1,90 @@ #pragma once +#include +#include #include #include #include #include namespace pEp { + namespace utility { + using namespace std; + + class mutex { + pthread_mutex_t _mutex; + + public: + mutex() { + pthread_mutex_init(&_mutex, NULL); + } + ~mutex() { + pthread_mutex_destroy(&_mutex); + } + void lock() { + pthread_mutex_lock(&_mutex); + } + void unlock() { + pthread_mutex_unlock(&_mutex); + } + }; + + template class lock_guard { + T& _mtx; + + public: + lock_guard(T& mtx) : _mtx(mtx) { + _mtx.lock(); + } + ~lock_guard() { + _mtx.unlock(); + } + }; + + template class locked_queue + { + mutex _mtx; + list _q; + + public: + T& back() + { + lock_guard lg(_mtx); + return _q.back(); + } + T& front() + { + lock_guard lg(_mtx); + return _q.front(); + } + void pop_back() + { + lock_guard lg(_mtx); + _q.pop_back(); + } + void pop_front() + { + lock_guard lg(_mtx); + _q.pop_front(); + } + void push_back(const T& data) + { + lock_guard lg(_mtx); + _q.push_back(data); + } + void push_front(const T& data) + { + lock_guard lg(_mtx); + _q.push_front(data); + } + size_t size() + { + lock_guard lg(_mtx); + return _q.size(); + } + }; + } + namespace JNIAdapter { jclass findClass(JNIEnv *env, const char *classname); diff --git a/src/org/pEp/jniadapter/AbstractEngine.java b/src/org/pEp/jniadapter/AbstractEngine.java index 48d1e91..799cd82 100644 --- a/src/org/pEp/jniadapter/AbstractEngine.java +++ b/src/org/pEp/jniadapter/AbstractEngine.java @@ -27,6 +27,11 @@ abstract class AbstractEngine implements AutoCloseable { release(); } + private long keyserverThread; + + public native void startKeyserverLookup(); + public native void stopKeyserverLookup(); + public static byte[] toUTF8(String str) { try { String _str = Normalizer.normalize(str, Normalizer.Form.NFC); diff --git a/src/org_pEp_jniadapter_AbstractEngine.cc b/src/org_pEp_jniadapter_AbstractEngine.cc index 26cdf16..0e2cebe 100644 --- a/src/org_pEp_jniadapter_AbstractEngine.cc +++ b/src/org_pEp_jniadapter_AbstractEngine.cc @@ -2,7 +2,8 @@ #include #include -#include +#include +#include #include "throw_pEp_exception.hh" #include "jniutils.hh" @@ -62,5 +63,62 @@ extern "C" { else env->SetLongField(me, handle, jlong(0)); } -} + + static void *start_routine(void *arg) + { + return NULL; + } + + JNIEXPORT void JNICALL Java_org_pEp_jniadapter_AbstractEngine_startKeyserverLookup( + JNIEnv *env, + jobject obj + ) + { + pthread_t *thread = NULL; + jfieldID handle; + + try { + handle = getFieldID(env, "org/pEp/jniadapter/Engine", "keyserverThread", "J"); + } + catch (std::exception& ex) { + assert(0); + return; + } + + thread = (pthread_t *) env->GetLongField(obj, handle); + if (thread) + return; + + thread = (pthread_t *) calloc(1, sizeof(pthread_t)); + assert(thread); + env->SetLongField(obj, handle, (jlong) thread); + + pthread_create(thread, NULL, start_routine, NULL); + } + + JNIEXPORT void JNICALL Java_org_pEp_jniadapter_AbstractEngine_stopKeyserverLookup( + JNIEnv *env, + jobject obj + ) + { + pthread_t *thread = NULL; + jfieldID handle; + + try { + handle = getFieldID(env, "org/pEp/jniadapter/Engine", "keyserverThread", "J"); + } + catch (std::exception& ex) { + assert(0); + return; + } + + thread = (pthread_t *) env->GetLongField(obj, handle); + if (!thread) + return; + + // stop thread + } + +} // extern "C" + From 02ba1b07f1b3467bacfca096500201fef41ea455 Mon Sep 17 00:00:00 2001 From: Volker Birk Date: Fri, 21 Aug 2015 21:54:23 +0200 Subject: [PATCH 07/10] keymanagement thread --- src/org/pEp/jniadapter/AbstractEngine.java | 1 + src/org_pEp_jniadapter_AbstractEngine.cc | 55 ++++++++++++++++++---- 2 files changed, 46 insertions(+), 10 deletions(-) diff --git a/src/org/pEp/jniadapter/AbstractEngine.java b/src/org/pEp/jniadapter/AbstractEngine.java index 799cd82..1475aa6 100644 --- a/src/org/pEp/jniadapter/AbstractEngine.java +++ b/src/org/pEp/jniadapter/AbstractEngine.java @@ -28,6 +28,7 @@ abstract class AbstractEngine implements AutoCloseable { } private long keyserverThread; + private long queueThread; public native void startKeyserverLookup(); public native void stopKeyserverLookup(); diff --git a/src/org_pEp_jniadapter_AbstractEngine.cc b/src/org_pEp_jniadapter_AbstractEngine.cc index 0e2cebe..c4f0966 100644 --- a/src/org_pEp_jniadapter_AbstractEngine.cc +++ b/src/org_pEp_jniadapter_AbstractEngine.cc @@ -1,6 +1,7 @@ #include "org_pEp_jniadapter_AbstractEngine.h" #include +#include #include #include #include @@ -10,6 +11,7 @@ extern "C" { using namespace pEp::JNIAdapter; + using namespace pEp::utility; JNIEXPORT void JNICALL Java_org_pEp_jniadapter_Engine_init( JNIEnv *env, @@ -64,9 +66,26 @@ extern "C" { env->SetLongField(me, handle, jlong(0)); } + pEp_identity *retrieve_next_identity(void *arg) + { + locked_queue< pEp_identity * > *queue = (locked_queue< pEp_identity * > *) arg; + + while (!queue->size()) + usleep(10000); + + pEp_identity *ident = queue->front(); + queue->pop_front(); + return ident; + } + static void *start_routine(void *arg) { - return NULL; + PEP_STATUS status = do_keymanagement(retrieve_next_identity, arg); + + locked_queue< pEp_identity * > *queue = (locked_queue< pEp_identity * > *) arg; + delete queue; + + return (void *) status; } JNIEXPORT void JNICALL Java_org_pEp_jniadapter_AbstractEngine_startKeyserverLookup( @@ -75,25 +94,32 @@ extern "C" { ) { pthread_t *thread = NULL; - jfieldID handle; + locked_queue< pEp_identity * > *queue = NULL; + + jfieldID thread_handle; + jfieldID queue_handle; try { - handle = getFieldID(env, "org/pEp/jniadapter/Engine", "keyserverThread", "J"); + thread_handle = getFieldID(env, "org/pEp/jniadapter/Engine", "keyserverThread", "J"); + queue_handle = getFieldID(env, "org/pEp/jniadapter/Engine", "queueThread", "J"); } catch (std::exception& ex) { assert(0); return; } - thread = (pthread_t *) env->GetLongField(obj, handle); + thread = (pthread_t *) env->GetLongField(obj, thread_handle); if (thread) return; thread = (pthread_t *) calloc(1, sizeof(pthread_t)); assert(thread); - env->SetLongField(obj, handle, (jlong) thread); + env->SetLongField(obj, thread_handle, (jlong) thread); - pthread_create(thread, NULL, start_routine, NULL); + queue = new locked_queue< pEp_identity * >(); + env->SetLongField(obj, queue_handle, (jlong) queue); + + pthread_create(thread, NULL, start_routine, (void *) queue); } JNIEXPORT void JNICALL Java_org_pEp_jniadapter_AbstractEngine_stopKeyserverLookup( @@ -102,21 +128,30 @@ extern "C" { ) { pthread_t *thread = NULL; - jfieldID handle; + locked_queue< pEp_identity * > *queue = NULL; + + jfieldID thread_handle; + jfieldID queue_handle; try { - handle = getFieldID(env, "org/pEp/jniadapter/Engine", "keyserverThread", "J"); + thread_handle = getFieldID(env, "org/pEp/jniadapter/Engine", "keyserverThread", "J"); + queue_handle = getFieldID(env, "org/pEp/jniadapter/Engine", "queueThread", "J"); } catch (std::exception& ex) { assert(0); return; } - thread = (pthread_t *) env->GetLongField(obj, handle); + thread = (pthread_t *) env->GetLongField(obj, thread_handle); if (!thread) return; - // stop thread + queue = (locked_queue< pEp_identity * > *) env->GetLongField(obj, queue_handle); + + env->SetLongField(obj, queue_handle, (jlong) 0); + env->SetLongField(obj, thread_handle, (jlong) 0); + + queue->push_front(NULL); } } // extern "C" From 557c3821be5ba69fea4f398262caeee642dda288 Mon Sep 17 00:00:00 2001 From: Volker Birk Date: Fri, 21 Aug 2015 22:16:50 +0200 Subject: [PATCH 08/10] examine_identity --- src/org_pEp_jniadapter_AbstractEngine.cc | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/org_pEp_jniadapter_AbstractEngine.cc b/src/org_pEp_jniadapter_AbstractEngine.cc index c4f0966..64ce299 100644 --- a/src/org_pEp_jniadapter_AbstractEngine.cc +++ b/src/org_pEp_jniadapter_AbstractEngine.cc @@ -66,12 +66,19 @@ extern "C" { env->SetLongField(me, handle, jlong(0)); } + int examine_identity(pEp_identity *ident, void *arg) + { + locked_queue< pEp_identity * > *queue = (locked_queue< pEp_identity * > *) arg; + queue->push_back(ident); + return 0; + } + pEp_identity *retrieve_next_identity(void *arg) { locked_queue< pEp_identity * > *queue = (locked_queue< pEp_identity * > *) arg; while (!queue->size()) - usleep(10000); + usleep(100000); pEp_identity *ident = queue->front(); queue->pop_front(); @@ -93,6 +100,8 @@ extern "C" { jobject obj ) { + PEP_SESSION session = (PEP_SESSION) callLongMethod(env, obj, "getHandle"); + pthread_t *thread = NULL; locked_queue< pEp_identity * > *queue = NULL; @@ -120,6 +129,7 @@ extern "C" { env->SetLongField(obj, queue_handle, (jlong) queue); pthread_create(thread, NULL, start_routine, (void *) queue); + register_examine_function(session, examine_identity, (void *) queue); } JNIEXPORT void JNICALL Java_org_pEp_jniadapter_AbstractEngine_stopKeyserverLookup( @@ -127,6 +137,8 @@ extern "C" { jobject obj ) { + PEP_SESSION session = (PEP_SESSION) callLongMethod(env, obj, "getHandle"); + pthread_t *thread = NULL; locked_queue< pEp_identity * > *queue = NULL; @@ -151,7 +163,11 @@ extern "C" { env->SetLongField(obj, queue_handle, (jlong) 0); env->SetLongField(obj, thread_handle, (jlong) 0); + register_examine_function(session, NULL, NULL); + queue->push_front(NULL); + pthread_join(*thread, NULL); + free(thread); } } // extern "C" From 14771ec5263036061f74175adb89d4fabba3b013 Mon Sep 17 00:00:00 2001 From: Volker Birk Date: Fri, 21 Aug 2015 22:25:18 +0200 Subject: [PATCH 09/10] memory management --- src/org_pEp_jniadapter_AbstractEngine.cc | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/org_pEp_jniadapter_AbstractEngine.cc b/src/org_pEp_jniadapter_AbstractEngine.cc index 64ce299..98a3a5c 100644 --- a/src/org_pEp_jniadapter_AbstractEngine.cc +++ b/src/org_pEp_jniadapter_AbstractEngine.cc @@ -69,7 +69,7 @@ extern "C" { int examine_identity(pEp_identity *ident, void *arg) { locked_queue< pEp_identity * > *queue = (locked_queue< pEp_identity * > *) arg; - queue->push_back(ident); + queue->push_back(identity_dup(ident)); return 0; } @@ -90,6 +90,13 @@ extern "C" { PEP_STATUS status = do_keymanagement(retrieve_next_identity, arg); locked_queue< pEp_identity * > *queue = (locked_queue< pEp_identity * > *) arg; + + while (queue->size()) { + pEp_identity *ident = queue->front(); + queue->pop_front(); + free_identity(ident); + } + delete queue; return (void *) status; From 6ea374bc468b8ff5a85df1ad606bddb057ce22cc Mon Sep 17 00:00:00 2001 From: Volker Birk Date: Fri, 21 Aug 2015 22:32:56 +0200 Subject: [PATCH 10/10] art & beauty --- src/jniutils.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/src/jniutils.cc b/src/jniutils.cc index 49abb8b..74677ea 100644 --- a/src/jniutils.cc +++ b/src/jniutils.cc @@ -63,6 +63,7 @@ namespace pEp { return env->CallIntMethod(obj, method); } + jlong callLongMethod( JNIEnv *env, jobject obj,