From 85a84c07ed3dad08de6fe604cd4b9b45c16327a2 Mon Sep 17 00:00:00 2001 From: link2xt Date: Tue, 28 Feb 2023 10:08:54 +0000 Subject: [PATCH] Add DcJsonrpcInstance class --- jni/dc_wrapper.c | 44 +++++++++++++++++++ scripts/ndk-make.sh | 8 ++-- src/com/b44t/messenger/DcAccounts.java | 1 + src/com/b44t/messenger/DcJsonrpcInstance.java | 22 ++++++++++ .../securesms/ApplicationContext.java | 10 +++-- 5 files changed, 77 insertions(+), 8 deletions(-) create mode 100644 src/com/b44t/messenger/DcJsonrpcInstance.java diff --git a/jni/dc_wrapper.c b/jni/dc_wrapper.c index 1ef241e7ea..6a435d218c 100644 --- a/jni/dc_wrapper.c +++ b/jni/dc_wrapper.c @@ -194,6 +194,11 @@ JNIEXPORT jlong Java_com_b44t_messenger_DcAccounts_getEventEmitterCPtr(JNIEnv *e return (jlong)dc_accounts_get_event_emitter(get_dc_accounts(env, obj)); } +JNIEXPORT jlong Java_com_b44t_messenger_DcAccounts_getJsonrpcInstanceCPtr(JNIEnv *env, jobject obj) +{ + return (jlong)dc_jsonrpc_init(get_dc_accounts(env, obj)); +} + JNIEXPORT void Java_com_b44t_messenger_DcAccounts_startIo(JNIEnv *env, jobject obj) { @@ -1947,3 +1952,42 @@ JNIEXPORT jstring Java_com_b44t_messenger_DcProvider_getOverviewPage(JNIEnv *env return ret; } + +/******************************************************************************* + * DcJsonrpcInstance + ******************************************************************************/ + + +static dc_jsonrpc_instance_t* get_dc_jsonrpc_instance(JNIEnv *env, jobject obj) +{ + static jfieldID fid = 0; + if (fid==0) { + jclass cls = (*env)->GetObjectClass(env, obj); + fid = (*env)->GetFieldID(env, cls, "jsonrpcInstanceCPtr", "J" /*Signature, J=long*/); + } + if (fid) { + return (dc_jsonrpc_instance_t*)(*env)->GetLongField(env, obj, fid); + } + return NULL; +} + + +JNIEXPORT void Java_com_b44t_messenger_DcJsonrpcInstance_unrefJsonrpcInstanceCPtr(JNIEnv *env, jobject obj) +{ + dc_provider_unref(get_dc_jsonrpc_instance(env, obj)); +} + +JNIEXPORT void Java_com_b44t_messenger_DcJsonrpcInstance_request(JNIEnv *env, jobject obj, jstring request) +{ + CHAR_REF(request); + dc_jsonrpc_request(get_dc_jsonrpc_instance(env, obj), request); + CHAR_UNREF(request); +} + +JNIEXPORT jstring Java_com_b44t_messenger_DcJsonrpcInstance_getNextResponse(JNIEnv *env, jobject obj) +{ + char* temp = dc_jsonrpc_next_response(get_dc_jsonrpc_instance(env, obj)); + jstring ret = JSTRING_NEW(temp); + dc_str_unref(temp); + return ret; +} diff --git a/scripts/ndk-make.sh b/scripts/ndk-make.sh index 3d23c109fe..dc2fd6f5f6 100755 --- a/scripts/ndk-make.sh +++ b/scripts/ndk-make.sh @@ -115,7 +115,7 @@ if test -z $1 || test $1 = armeabi-v7a; then export CFLAGS=-D__ANDROID_API__=16 TARGET_CC=armv7a-linux-androideabi16-clang \ TARGET_AR=llvm-ar \ - cargo "+$RUSTUP_TOOLCHAIN" rustc $RELEASEFLAG --target armv7-linux-androideabi -p deltachat_ffi -- -L "$TMPLIB" + cargo "+$RUSTUP_TOOLCHAIN" rustc $RELEASEFLAG --target armv7-linux-androideabi -p deltachat_ffi --features jsonrpc -- -L "$TMPLIB" cp target/armv7-linux-androideabi/$RELEASE/libdeltachat.a $jnidir/armeabi-v7a fi @@ -124,7 +124,7 @@ if test -z $1 || test $1 = arm64-v8a; then export CFLAGS=-D__ANDROID_API__=21 TARGET_CC=aarch64-linux-android21-clang \ TARGET_AR=llvm-ar \ - cargo "+$RUSTUP_TOOLCHAIN" rustc $RELEASEFLAG --target aarch64-linux-android -p deltachat_ffi -- -L "$TMPLIB" + cargo "+$RUSTUP_TOOLCHAIN" rustc $RELEASEFLAG --target aarch64-linux-android -p deltachat_ffi --features jsonrpc -- -L "$TMPLIB" cp target/aarch64-linux-android/$RELEASE/libdeltachat.a $jnidir/arm64-v8a fi @@ -133,7 +133,7 @@ if test -z $1 || test $1 = x86; then export CFLAGS=-D__ANDROID_API__=16 TARGET_CC=i686-linux-android16-clang \ TARGET_AR=llvm-ar \ - cargo "+$RUSTUP_TOOLCHAIN" rustc $RELEASEFLAG --target i686-linux-android -p deltachat_ffi -- -L "$TMPLIB" + cargo "+$RUSTUP_TOOLCHAIN" rustc $RELEASEFLAG --target i686-linux-android -p deltachat_ffi --features jsonrpc -- -L "$TMPLIB" cp target/i686-linux-android/$RELEASE/libdeltachat.a $jnidir/x86 fi @@ -142,7 +142,7 @@ if test -z $1 || test $1 = x86_64; then export CFLAGS=-D__ANDROID_API__=21 TARGET_CC=x86_64-linux-android21-clang \ TARGET_AR=llvm-ar \ - cargo "+$RUSTUP_TOOLCHAIN" rustc $RELEASEFLAG --target x86_64-linux-android -p deltachat_ffi -- -L "$TMPLIB" + cargo "+$RUSTUP_TOOLCHAIN" rustc $RELEASEFLAG --target x86_64-linux-android -p deltachat_ffi --features jsonrpc -- -L "$TMPLIB" cp target/x86_64-linux-android/$RELEASE/libdeltachat.a $jnidir/x86_64 fi diff --git a/src/com/b44t/messenger/DcAccounts.java b/src/com/b44t/messenger/DcAccounts.java index 4ac4014e85..a8bc69dc6f 100644 --- a/src/com/b44t/messenger/DcAccounts.java +++ b/src/com/b44t/messenger/DcAccounts.java @@ -20,6 +20,7 @@ public void unref() { } public DcEventEmitter getEventEmitter () { return new DcEventEmitter(getEventEmitterCPtr()); } + public DcJsonrpcInstance getJsonrpcInstance () { return new DcJsonrpcInstance(getJsonrpcInstanceCPtr()); } public native void startIo (); public native void stopIo (); public native void maybeNetwork (); diff --git a/src/com/b44t/messenger/DcJsonrpcInstance.java b/src/com/b44t/messenger/DcJsonrpcInstance.java new file mode 100644 index 0000000000..98424910df --- /dev/null +++ b/src/com/b44t/messenger/DcJsonrpcInstance.java @@ -0,0 +1,22 @@ +package com.b44t.messenger; + +public class DcJsonrpcInstance { + + public DcJsonrpcInstance(long jsonrpcInstanceCPtr) { + this.jsonrpcInstanceCPtr = jsonrpcInstanceCPtr; + } + + @Override protected void finalize() throws Throwable { + super.finalize(); + unrefJsonrpcInstanceCPtr(); + jsonrpcInstanceCPtr = 0; + } + + public native void request(String request); + public native String getNextResponse(); + + // working with raw c-data + private long jsonrpcInstanceCPtr; // CAVE: the name is referenced in the JNI + private native long getNextEventCPtr (); + private native void unrefJsonrpcInstanceCPtr(); +} diff --git a/src/org/thoughtcrime/securesms/ApplicationContext.java b/src/org/thoughtcrime/securesms/ApplicationContext.java index fa190cba6a..94790e695b 100644 --- a/src/org/thoughtcrime/securesms/ApplicationContext.java +++ b/src/org/thoughtcrime/securesms/ApplicationContext.java @@ -23,6 +23,7 @@ import com.b44t.messenger.DcContext; import com.b44t.messenger.DcEvent; import com.b44t.messenger.DcEventEmitter; +import com.b44t.messenger.DcJsonrpcInstance; import org.thoughtcrime.securesms.components.emoji.EmojiProvider; import org.thoughtcrime.securesms.connect.AccountManager; @@ -111,13 +112,14 @@ public void onCreate() { notificationCenter = new NotificationCenter(this); eventCenter = new DcEventCenter(this); new Thread(() -> { - DcEventEmitter emitter = dcAccounts.getEventEmitter(); + DcJsonrpcInstance emitter = dcAccounts.getJsonrpcInstance(); while (true) { - DcEvent event = emitter.getNextEvent(); - if (event==null) { + String response = emitter.getNextResponse(); + if (response==null) { break; } - eventCenter.handleEvent(event); + // TODO convert notification to event + //eventCenter.handleEvent(event); } Log.i("DeltaChat", "shutting down event handler"); }, "eventThread").start();