Browse Source

Changes needed to trigger keysync.

- Make syncthread use only global class refs
- Fix typos
- Make pEpExepcions public
JNI-44
Hussein Kasem 9 years ago
parent
commit
e6849af9d3
  1. 10
      src/basic_api.cc
  2. 2
      src/gen_java_exceptions.ysl2
  3. 66
      src/jniutils.cc
  4. 9
      src/jniutils.hh
  5. 5
      src/org/pEp/jniadapter/AbstractEngine.java
  6. 17
      src/org_pEp_jniadapter_AbstractEngine.cc
  7. 7
      src/pEp.yml2

10
src/basic_api.cc

@ -260,7 +260,7 @@ JNIEXPORT jboolean JNICALL Java_org_pEp_jniadapter_Engine_blacklist_1is_1listed(
return (jboolean)_listed; return (jboolean)_listed;
} }
JNIEXPORT void JNICALL Java_org_pEp_jniadapter_Engine_accept_1sync_1hanshake( JNIEXPORT void JNICALL Java_org_pEp_jniadapter_Engine_accept_1sync_1handshake(
JNIEnv *env, JNIEnv *env,
jobject obj, jobject obj,
jobject ident jobject ident
@ -269,8 +269,8 @@ JNIEXPORT void JNICALL Java_org_pEp_jniadapter_Engine_accept_1sync_1hanshake(
{ {
PEP_SESSION session = (PEP_SESSION) callLongMethod(env, obj, "getHandle"); PEP_SESSION session = (PEP_SESSION) callLongMethod(env, obj, "getHandle");
pEp_identity *_ident = to_identity(env, ident); pEp_identity *_ident = to_identity(env, ident);
PEP_STATUS status = PEP_STATUS status =
::deliverHandshakeResult(session, _ident, SYNC_HANDSHAKE_ACCEPTED); ::deliverHandshakeResult(session, _ident, SYNC_HANDSHAKE_ACCEPTED);
if (status != PEP_STATUS_OK) { if (status != PEP_STATUS_OK) {
@ -280,7 +280,7 @@ JNIEXPORT void JNICALL Java_org_pEp_jniadapter_Engine_accept_1sync_1hanshake(
} }
JNIEXPORT void JNICALL Java_org_pEp_jniadapter_Engine_reject_sync_1hanshake( JNIEXPORT void JNICALL Java_org_pEp_jniadapter_Engine_reject_sync_1handshake(
JNIEnv *env, JNIEnv *env,
jobject obj, jobject obj,
jobject ident jobject ident
@ -298,7 +298,7 @@ JNIEXPORT void JNICALL Java_org_pEp_jniadapter_Engine_reject_sync_1hanshake(
} }
} }
JNIEXPORT void JNICALL Java_org_pEp_jniadapter_Engine_cancel_sync_1hanshake( JNIEXPORT void JNICALL Java_org_pEp_jniadapter_Engine_cancel_sync_1handshake(
JNIEnv *env, JNIEnv *env,
jobject obj, jobject obj,
jobject ident jobject ident

2
src/gen_java_exceptions.ysl2

@ -21,7 +21,7 @@ tstylesheet {
document "org/pEp/jniadapter/{$name}.java", "text" { document "org/pEp/jniadapter/{$name}.java", "text" {
| package org.pEp.jniadapter; | package org.pEp.jniadapter;
| |
| class «$name» extends pEpException { | public class «$name» extends pEpException {
| public «$name»(String message) { | public «$name»(String message) {
| super(message); | super(message);
| } | }

66
src/jniutils.cc

@ -55,6 +55,30 @@ namespace pEp {
return field; return field;
} }
//TODO: fix/generalize/clean patch added to make keysync work using globalref to class
jfieldID getFieldID(
JNIEnv *env,
const char *classname,
const char *fieldname,
const char *signature,
const jclass clazz
)
{
jfieldID field = env->GetFieldID(clazz, fieldname, signature);
assert(field);
if (field == NULL) {
jclass ex = env->FindClass("java/lang/NoSuchFieldError");
assert(ex);
env->ThrowNew(ex, fieldname);
throw std::invalid_argument(std::string(fieldname));
}
return field;
}
jint callIntMethod( jint callIntMethod(
JNIEnv *env, JNIEnv *env,
jobject obj, jobject obj,
@ -363,6 +387,19 @@ namespace pEp {
jfieldID fieldID = getFieldID(env, classname, name, "[B"); jfieldID fieldID = getFieldID(env, classname, name, "[B");
env->SetObjectField(obj, fieldID, env->SetObjectField(obj, fieldID,
reinterpret_cast<jobject>(from_string(env, value))); reinterpret_cast<jobject>(from_string(env, value)));
}
}
//TODO: fix/generalize/clean patch added to make keysync work using globalref to class
static void _setStringField(JNIEnv *env, const char *classname,
jobject obj, const char *name, const char *value, const jclass clazz)
{
if (value) {
jfieldID fieldID = getFieldID(env, classname, name, "[B", clazz);
env->SetObjectField(obj, fieldID,
reinterpret_cast<jobject>(from_string(env, value)));
} }
} }
@ -398,6 +435,35 @@ namespace pEp {
return obj; return obj;
} }
//TODO: fix/generalize/clean patch added to make keysync work using globalref to class
jobject from_identity(JNIEnv *env, pEp_identity *ident, jclass identityClass)
{
if (!ident)
return (jobject) NULL;
static const char *classname = "org/pEp/jniadapter/_Identity";
jmethodID constructor = env->GetMethodID(identityClass, "<init>", "()V");
assert(constructor);
jobject obj = env->NewObject(identityClass, constructor);
if (ident) {
_setStringField(env, classname, obj, "address", ident->address, identityClass);
_setStringField(env, classname, obj, "fpr", ident->fpr, identityClass);
_setStringField(env, classname, obj, "user_id", ident->user_id, identityClass);
_setStringField(env, classname, obj, "username", ident->username, identityClass);
jfieldID comm_type_id = getFieldID(env, classname, "comm_type", "I", identityClass);
env->SetIntField(obj, comm_type_id, (jint) (int) ident->comm_type);
_setStringField(env, classname, obj, "lang", ident->lang, identityClass);
jfieldID me_id = getFieldID(env, classname, "me", "Z", identityClass);
env->SetBooleanField(obj, me_id, (jboolean) ident->me);
}
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)
{ {

9
src/jniutils.hh

@ -114,6 +114,14 @@ namespace pEp {
const char *signature const char *signature
); );
jfieldID getFieldID(
JNIEnv *env,
const char *classname,
const char *fieldname,
const char *signature,
const jclass clazz
);
jint callIntMethod( jint callIntMethod(
JNIEnv *env, JNIEnv *env,
jobject obj, jobject obj,
@ -155,6 +163,7 @@ namespace pEp {
timestamp *to_timestamp(JNIEnv *env, jobject date); timestamp *to_timestamp(JNIEnv *env, jobject date);
jobject from_identity(JNIEnv *env, pEp_identity *ident); jobject from_identity(JNIEnv *env, pEp_identity *ident);
jobject from_identity(JNIEnv *env, pEp_identity *ident, jclass identityClass);
pEp_identity *to_identity(JNIEnv *env, jobject obj); pEp_identity *to_identity(JNIEnv *env, jobject obj);
jobject from_identitylist(JNIEnv *env, identity_list *il); jobject from_identitylist(JNIEnv *env, identity_list *il);

5
src/org/pEp/jniadapter/AbstractEngine.java

@ -155,7 +155,10 @@ abstract class AbstractEngine implements AutoCloseable {
this.showHandshakeCallback = showHandshakeCallback; this.showHandshakeCallback = showHandshakeCallback;
} }
public int showHandshakeCallFromC(Identity myself, Identity partner) { public int showHandshakeCallFromC(_Identity _myself, _Identity _partner) {
Identity myself = new Identity(_myself);
Identity partner = new Identity(_partner);
if (showHandshakeCallback != null) { if (showHandshakeCallback != null) {
showHandshakeCallback.showHandshake(myself, partner); showHandshakeCallback.showHandshake(myself, partner);
} else { } else {

17
src/org_pEp_jniadapter_AbstractEngine.cc

@ -202,6 +202,7 @@ extern "C" {
static jmethodID showHandShakeMethodID = NULL; static jmethodID showHandShakeMethodID = NULL;
static jmethodID messageToSendMethodID = NULL; static jmethodID messageToSendMethodID = NULL;
static jclass messageClass = NULL; static jclass messageClass = NULL;
static jclass identityClass = NULL;
static jmethodID messageConstructorMethodID = NULL; static jmethodID messageConstructorMethodID = NULL;
// Called by sync thread only // Called by sync thread only
@ -211,8 +212,8 @@ extern "C" {
jobject me_ = NULL; jobject me_ = NULL;
jobject partner_ = NULL; jobject partner_ = NULL;
me_ = from_identity(sync_env, me); me_ = from_identity(sync_env, me, identityClass);
partner_ = from_identity(sync_env, partner); partner_ = from_identity(sync_env, partner, identityClass);
jint result = sync_env->CallIntMethod(sync_obj, showHandShakeMethodID, me_, partner_); jint result = sync_env->CallIntMethod(sync_obj, showHandShakeMethodID, me_, partner_);
@ -273,9 +274,9 @@ extern "C" {
jclass clazz = sync_env->GetObjectClass(sync_obj); jclass clazz = sync_env->GetObjectClass(sync_obj);
showHandShakeMethodID = sync_env->GetMethodID( showHandShakeMethodID = sync_env->GetMethodID(
clazz, clazz,
"showHandshakeCallFromC", "showHandshakeCallFromC",
"(Lorg/pEp/jniadapter/Identity;Lorg/pEp/jniadapter/Identity;)I"); "(Lorg/pEp/jniadapter/_Identity;Lorg/pEp/jniadapter/_Identity;)I");
assert(showHandShakeMethodID); assert(showHandShakeMethodID);
messageToSendMethodID = sync_env->GetMethodID( messageToSendMethodID = sync_env->GetMethodID(
@ -348,6 +349,7 @@ extern "C" {
a->session = session; a->session = session;
a->queue = queue; a->queue = queue;
messageClass = reinterpret_cast<jclass>(env->NewGlobalRef(findClass(env, "org/pEp/jniadapter/Message"))); messageClass = reinterpret_cast<jclass>(env->NewGlobalRef(findClass(env, "org/pEp/jniadapter/Message")));
identityClass = reinterpret_cast<jclass>(env->NewGlobalRef(findClass(env, "org/pEp/jniadapter/_Identity")));
messageConstructorMethodID = env->GetMethodID(messageClass, "<init>", "(J)V"); messageConstructorMethodID = env->GetMethodID(messageClass, "<init>", "(J)V");
env->GetJavaVM(&a->sync_jvm); env->GetJavaVM(&a->sync_jvm);
@ -399,8 +401,13 @@ extern "C" {
sync_session = NULL; sync_session = NULL;
unregister_sync_callbacks(session); unregister_sync_callbacks(session);
env->DeleteGlobalRef(sync_obj);
env->DeleteGlobalRef(messageClass);
env->DeleteGlobalRef(identityClass);
sync_obj = NULL; sync_obj = NULL;
messageClass = NULL;
identityClass = NULL;
queue->push_front(NULL); queue->push_front(NULL);
pthread_join(*thread, NULL); pthread_join(*thread, NULL);

7
src/pEp.yml2

@ -71,6 +71,7 @@ namespace pEp {
pEp_commit_failed > 0xff01 pEp_commit_failed > 0xff01
pEp_message_consumed > 0xff02 pEp_message_consumed > 0xff02
pEp_message_discarded > 0xff03
pEp_record_not_found > -6 pEp_record_not_found > -6
@ -181,9 +182,9 @@ namespace pEp {
basic bool blacklist_is_listed(string fpr); basic bool blacklist_is_listed(string fpr);
basic void config_passive_mode(bool enable); basic void config_passive_mode(bool enable);
basic void config_unencrypted_subject(bool enable); basic void config_unencrypted_subject(bool enable);
basic void accept_sync_handshake_result(identity ident); basic void accept_sync_handshake(identity ident);
basic void reject_sync_handshake_result(identity ident); basic void reject_sync_handshake(identity ident);
basic void cancel_sync_handshake_result(identity ident); basic void cancel_sync_handshake(identity ident);
}; };

Loading…
Cancel
Save