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;
}
JNIEXPORT void JNICALL Java_org_pEp_jniadapter_Engine_accept_1sync_1hanshake(
JNIEXPORT void JNICALL Java_org_pEp_jniadapter_Engine_accept_1sync_1handshake(
JNIEnv *env,
jobject obj,
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_identity *_ident = to_identity(env, ident);
PEP_STATUS status =
PEP_STATUS status =
::deliverHandshakeResult(session, _ident, SYNC_HANDSHAKE_ACCEPTED);
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,
jobject obj,
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,
jobject obj,
jobject ident

2
src/gen_java_exceptions.ysl2

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

66
src/jniutils.cc

@ -55,6 +55,30 @@ namespace pEp {
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(
JNIEnv *env,
jobject obj,
@ -363,6 +387,19 @@ namespace pEp {
jfieldID fieldID = getFieldID(env, classname, name, "[B");
env->SetObjectField(obj, fieldID,
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;
}
//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,
const char *name)
{

9
src/jniutils.hh

@ -114,6 +114,14 @@ namespace pEp {
const char *signature
);
jfieldID getFieldID(
JNIEnv *env,
const char *classname,
const char *fieldname,
const char *signature,
const jclass clazz
);
jint callIntMethod(
JNIEnv *env,
jobject obj,
@ -155,6 +163,7 @@ namespace pEp {
timestamp *to_timestamp(JNIEnv *env, jobject date);
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);
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;
}
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) {
showHandshakeCallback.showHandshake(myself, partner);
} else {

17
src/org_pEp_jniadapter_AbstractEngine.cc

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

7
src/pEp.yml2

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

Loading…
Cancel
Save