diff --git a/src/jniutils.cc b/src/jniutils.cc index ea16935..9d0c094 100644 --- a/src/jniutils.cc +++ b/src/jniutils.cc @@ -275,6 +275,88 @@ namespace pEp { time_t t = (time_t) callLongMethod(env, date, "getTime"); return new_timestamp(t); } + + static void _setStringField(JNIEnv *env, const char *classname, + jobject obj, const char *name, const char *value) + { + if (value) { + jfieldID fieldID = getFieldID(env, classname, name, "[B"); + env->SetObjectField(obj, fieldID, + reinterpret_cast(from_string(env, value))); + } + } + + jobject from_identity(JNIEnv *env, pEp_identity *ident) + { + static const char *classname = "org/pEp/jniadapter/_Identity"; + jclass clazz = findClass(env, classname); + jmethodID constructor = env->GetMethodID(clazz, "", "()V"); + assert(constructor); + jobject obj = env->NewObject(clazz, constructor); + + if (ident) { + _setStringField(env, classname, obj, "address", ident->address); + _setStringField(env, classname, obj, "fpr", ident->fpr); + _setStringField(env, classname, obj, "user_id", ident->user_id); + _setStringField(env, classname, obj, "username", ident->username); + + jfieldID comm_type_id = getFieldID(env, classname, "comm_type", "I"); + env->SetIntField(obj, comm_type_id, (jint) (int) ident->comm_type); + + _setStringField(env, classname, obj, "lang", ident->lang); + + jfieldID me_id = getFieldID(env, classname, "me", "Z"); + env->SetBooleanField(obj, me_id, (jboolean) ident->me); + } + + return obj; + } + + char *_getStringField(JNIEnv *env, const char *classname, jobject obj, + const char *name) + { + jfieldID fieldID = getFieldID(env, classname, name, "[B"); + jbyteArray field = + reinterpret_cast(env->GetObjectField(obj, + fieldID)); + return to_string(env, field); + } + + pEp_identity *to_identity(JNIEnv *env, jobject obj) + { + static const char *classname = "org/pEp/jniadapter/_Identity"; + pEp_identity *ident = new_identity(NULL, NULL, NULL, NULL); + + ident->address = _getStringField(env, classname, obj, "address"); + ident->fpr = _getStringField(env, classname, obj, "fpr"); + ident->user_id = _getStringField(env, classname, obj, "user_id"); + ident->username = _getStringField(env, classname, obj, "username"); + + jfieldID comm_type_id = getFieldID(env, classname, "comm_type", "I"); + ident->comm_type = (PEP_comm_type) (int) env->GetIntField(obj, comm_type_id); + + char *lang = _getStringField(env, classname, obj, "lang"); + if (lang && lang[0]) { + ident->lang[0] = lang[0]; + ident->lang[1] = lang[1]; + } + free(lang); + + jfieldID me_id = getFieldID(env, classname, "me", "Z"); + ident->me = (bool) env->GetBooleanField(obj, me_id); + + return ident; + } + + jobject from_identitylist(JNIEnv *env, identity_list *il) + { + + } + + identity_list *to_identitylist(JNIEnv *env, jobject obj) + { + + } }; }; diff --git a/src/jniutils.hh b/src/jniutils.hh index 929e5eb..6dca348 100644 --- a/src/jniutils.hh +++ b/src/jniutils.hh @@ -57,7 +57,7 @@ namespace pEp { timestamp *to_timestamp(JNIEnv *env, jobject date); jobject from_identity(JNIEnv *env, pEp_identity *ident); - pEp_identity *to_identity(JNIEnv *env, jobject ident); + pEp_identity *to_identity(JNIEnv *env, jobject obj); jobject from_identitylist(JNIEnv *env, identity_list *il); identity_list *to_identitylist(JNIEnv *env, jobject obj); diff --git a/src/org/pEp/jniadapter/CommType.java b/src/org/pEp/jniadapter/CommType.java index 8cb144e..d30302c 100644 --- a/src/org/pEp/jniadapter/CommType.java +++ b/src/org/pEp/jniadapter/CommType.java @@ -1,5 +1,7 @@ package org.pEp.jniadapter; +import java.util.HashMap; + public enum CommType { PEP_ct_unknown (0), @@ -58,10 +60,20 @@ public enum CommType { PEP_ct_confirmed_enc_anon (0xc0), // generic PEP_ct_pEp (0xff); + static class Management { + public static final HashMap tag = + new HashMap(); + } + public final int value; CommType(int value) { this.value = value; + fill(value); + } + + private void fill(int value) { + Management.tag.put(value, this); } } diff --git a/src/org/pEp/jniadapter/Identity.java b/src/org/pEp/jniadapter/Identity.java index bfcbd3e..40e8183 100644 --- a/src/org/pEp/jniadapter/Identity.java +++ b/src/org/pEp/jniadapter/Identity.java @@ -22,7 +22,7 @@ public class Identity { fpr = AbstractEngine.toUTF16(i.address); user_id = AbstractEngine.toUTF16(i.address); username = AbstractEngine.toUTF16(i.address); - comm_type = i.comm_type; + comm_type = CommType.Management.tag.get(i.comm_type); lang = AbstractEngine.toUTF16(i.address); me = i.me; } diff --git a/src/org/pEp/jniadapter/Pair.java b/src/org/pEp/jniadapter/Pair.java index 421475d..625bcfe 100644 --- a/src/org/pEp/jniadapter/Pair.java +++ b/src/org/pEp/jniadapter/Pair.java @@ -4,9 +4,9 @@ public class Pair { public F first; public S second; - Pair() { } + Pair() { } - Pair(F f, S s) { + Pair(F f, S s) { first = f; second = s; } diff --git a/src/org/pEp/jniadapter/_Identity.java b/src/org/pEp/jniadapter/_Identity.java index 9f2074c..980c77d 100644 --- a/src/org/pEp/jniadapter/_Identity.java +++ b/src/org/pEp/jniadapter/_Identity.java @@ -5,7 +5,7 @@ public class _Identity { public byte[] fpr; public byte[] user_id; public byte[] username; - CommType comm_type; + int comm_type; public byte[] lang; public boolean me; @@ -22,7 +22,7 @@ public class _Identity { fpr = AbstractEngine.toUTF8(i.address); user_id = AbstractEngine.toUTF8(i.address); username = AbstractEngine.toUTF8(i.address); - comm_type = i.comm_type; + comm_type = i.comm_type.value; lang = AbstractEngine.toUTF8(i.address); me = i.me; }