From 0d930569861daec756e1165a78010dc80971d640 Mon Sep 17 00:00:00 2001 From: Volker Birk Date: Fri, 14 Aug 2015 11:18:03 +0200 Subject: [PATCH] bloblist conversion --- src/jniutils.cc | 105 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) diff --git a/src/jniutils.cc b/src/jniutils.cc index 9d0c094..5e06379 100644 --- a/src/jniutils.cc +++ b/src/jniutils.cc @@ -350,12 +350,117 @@ namespace pEp { jobject from_identitylist(JNIEnv *env, identity_list *il) { + jclass clazz = findClass(env, "java/util/ArrayList"); + jmethodID constructor = env->GetMethodID(clazz, "", "()V"); + assert(constructor); + jobject obj = env->NewObject(clazz, constructor); + assert(obj); + + identity_list *_il; + for (_il = il; _il && _il->ident; _il = _il->next) { + jobject o = from_identity(env, _il->ident); + callBooleanMethod(env, obj, "add", o); + } + return obj; } identity_list *to_identitylist(JNIEnv *env, jobject obj) { + jint size = callIntMethod(env, obj, "size"); + if (size == 0) + return NULL; + + identity_list *il = new_identity_list(NULL); + identity_list *_il; + jint i; + for (_il = il, i = 0; i < (int) size; i++) { + jobject o = callObjectMethod(env, obj, "get", i); + pEp_identity* ident = to_identity(env, o); + _il = identity_list_add(_il, ident); + } + + return il; + } + + jobject _from_blob(JNIEnv *env, bloblist_t *b) + { + static const char *classname = "org/pEp/jniadapter/_Blob"; + jclass clazz = findClass(env, classname); + jmethodID constructor = env->GetMethodID(clazz, "", "()V"); + assert(constructor); + jobject obj = env->NewObject(clazz, constructor); + + jfieldID fieldID = getFieldID(env, classname, "data", "[B"); + jboolean isCopy; + jbyteArray _data = env->NewByteArray((jsize) b->size); + jbyte *_b = env->GetByteArrayElements(_data, &isCopy); + memcpy((char *)_b, b->value, b->size); + env->ReleaseByteArrayElements(_data, _b, 0); + + _setStringField(env, classname, obj, "mime_type", b->mime_type); + _setStringField(env, classname, obj, "filename", b->filename); + + return obj; + } + + jobject from_bloblist(JNIEnv *env, bloblist_t *bl) + { + jclass clazz = findClass(env, "java/util/ArrayList"); + jmethodID constructor = env->GetMethodID(clazz, "", "()V"); + assert(constructor); + jobject obj = env->NewObject(clazz, constructor); + assert(obj); + + bloblist_t *_bl; + for (_bl = bl; _bl && _bl->value; _bl = _bl->next) { + jobject o = _from_blob(env, _bl); + callBooleanMethod(env, obj, "add", o); + } + + return obj; + } + + bloblist_t *to_bloblist(JNIEnv *env, jobject obj) + { + jint size = callIntMethod(env, obj, "size"); + if (size == 0) + return NULL; + + static const char *classname = "org/pEp/jniadapter/_Blob"; + jclass clazz = findClass(env, classname); + jfieldID data_id = getFieldID(env, classname, "data", "[B"); + + bloblist_t *bl = new_bloblist(NULL, 0, NULL, NULL); + bloblist_t *_bl; + jint i; + for (_bl = bl, i = 0; i < (int) size; i++) { + jobject o = callObjectMethod(env, obj, "get", i); + char *mime_type = _getStringField(env, classname, o, + "mime_type"); + char *filename = _getStringField(env, classname, o, + "filename"); + + jbyteArray _data = + reinterpret_cast(env->GetObjectField(o, + data_id)); + + size_t size = (size_t) env->GetArrayLength(_data); + char *b = (char *) malloc(size); + assert(b); + + jboolean isCopy; + jbyte *_b = env->GetByteArrayElements(_data, &isCopy); + memcpy(b, _b, size); + env->ReleaseByteArrayElements(_data, _b, JNI_ABORT); + + _bl = bloblist_add(_bl, b, size, mime_type, filename); + + free(mime_type); + free(filename); + } + return bl; } }; };