From efc88b45bbd1764f9423712d6bbe91426ce712f2 Mon Sep 17 00:00:00 2001 From: 0x330a <92654767+0x330a@users.noreply.github.com> Date: Fri, 25 Aug 2023 15:33:36 +1000 Subject: [PATCH] feat: finish group info wrappers --- libsession-util/src/main/cpp/group_info.cpp | 193 +++++++++++++++++- libsession-util/src/main/cpp/group_info.h | 6 + libsession-util/src/main/cpp/util.cpp | 17 ++ libsession-util/src/main/cpp/util.h | 3 + .../loki/messenger/libsession_util/Config.kt | 35 +++- 5 files changed, 237 insertions(+), 17 deletions(-) diff --git a/libsession-util/src/main/cpp/group_info.cpp b/libsession-util/src/main/cpp/group_info.cpp index 13df97fd1..ab0635fb1 100644 --- a/libsession-util/src/main/cpp/group_info.cpp +++ b/libsession-util/src/main/cpp/group_info.cpp @@ -5,25 +5,196 @@ extern "C" JNIEXPORT jobject JNICALL -Java_network_loki_messenger_libsession_1util_GroupInfoConfig_newInstance__Ljava_lang_String_2( - JNIEnv *env, jobject thiz, jstring pub_key_hex) { +Java_network_loki_messenger_libsession_1util_GroupInfoConfig_00024Companion_newInstance___3B( + JNIEnv *env, jobject thiz, jbyteArray pub_key) { std::lock_guard guard{util::util_mutex_}; - auto pub_key_string = util::ustring_from_jstring(env, pub_key_hex); - auto group_info = session::config::groups::Info(pub_key_string, std::nullopt, std::nullopt); - // TODO + auto pub_key_bytes = util::ustring_from_bytes(env, pub_key); + auto* group_info = new session::config::groups::Info(pub_key_bytes, std::nullopt, std::nullopt); + + jclass groupInfoClass = env->FindClass("network/loki/messenger/libsession_util/GroupInfoConfig"); + jmethodID constructor = env->GetMethodID(groupInfoClass, "", "(J)V"); + jobject newConfig = env->NewObject(groupInfoClass, constructor, reinterpret_cast(group_info)); + + return newConfig; } extern "C" JNIEXPORT jobject JNICALL -Java_network_loki_messenger_libsession_1util_GroupInfoConfig_newInstance__Ljava_lang_String_2_3B( - JNIEnv *env, jobject thiz, jstring pub_key_hex, jbyteArray secret_key) { - // TODO: implement newInstance() +Java_network_loki_messenger_libsession_1util_GroupInfoConfig_00024Companion_newInstance___3B_3B( + JNIEnv *env, jobject thiz, jbyteArray pub_key, jbyteArray secret_key) { + std::lock_guard guard{util::util_mutex_}; + auto pub_key_bytes = util::ustring_from_bytes(env, pub_key); + auto secret_key_bytes = util::ustring_from_bytes(env, secret_key); + auto* group_info = new session::config::groups::Info(pub_key_bytes, secret_key_bytes, std::nullopt); + + jclass groupInfoClass = env->FindClass("network/loki/messenger/libsession_util/GroupInfoConfig"); + jmethodID constructor = env->GetMethodID(groupInfoClass, "", "(J)V"); + jobject newConfig = env->NewObject(groupInfoClass, constructor, reinterpret_cast(group_info)); + + return newConfig; } extern "C" JNIEXPORT jobject JNICALL -Java_network_loki_messenger_libsession_1util_GroupInfoConfig_newInstance__Ljava_lang_String_2_3B_3B( - JNIEnv *env, jobject thiz, jstring pub_key_hex, jbyteArray secret_key, +Java_network_loki_messenger_libsession_1util_GroupInfoConfig_00024Companion_newInstance___3B_3B_3B( + JNIEnv *env, jobject thiz, jbyteArray pub_key, jbyteArray secret_key, jbyteArray initial_dump) { - // TODO: implement newInstance() + std::lock_guard guard{util::util_mutex_}; + auto pub_key_bytes = util::ustring_from_bytes(env, pub_key); + auto secret_key_bytes = util::ustring_from_bytes(env, secret_key); + auto initial_dump_bytes = util::ustring_from_bytes(env, initial_dump); + auto* group_info = new session::config::groups::Info(pub_key_bytes, secret_key_bytes, initial_dump_bytes); + + jclass groupInfoClass = env->FindClass("network/loki/messenger/libsession_util/GroupInfoConfig"); + jmethodID constructor = env->GetMethodID(groupInfoClass, "", "(J)V"); + jobject newConfig = env->NewObject(groupInfoClass, constructor, reinterpret_cast(group_info)); + + return newConfig; +} + +extern "C" +JNIEXPORT void JNICALL +Java_network_loki_messenger_libsession_1util_GroupInfoConfig_destroyGroup(JNIEnv *env, + jobject thiz) { + std::lock_guard guard{util::util_mutex_}; + auto group_info = ptrToInfo(env, thiz); + group_info->destroy_group(); +} + + +extern "C" +JNIEXPORT jobject JNICALL +Java_network_loki_messenger_libsession_1util_GroupInfoConfig_getCreated(JNIEnv *env, jobject thiz) { + std::lock_guard guard{util::util_mutex_}; + auto group_info = ptrToInfo(env, thiz); + return util::jlongFromOptional(env, group_info->get_created()); +} +extern "C" +JNIEXPORT jobject JNICALL +Java_network_loki_messenger_libsession_1util_GroupInfoConfig_getDeleteAttachmentsBefore(JNIEnv *env, + jobject thiz) { + std::lock_guard guard{util::util_mutex_}; + auto group_info = ptrToInfo(env, thiz); + return util::jlongFromOptional(env, group_info->get_delete_attach_before()); +} +extern "C" +JNIEXPORT jobject JNICALL +Java_network_loki_messenger_libsession_1util_GroupInfoConfig_getDeleteBefore(JNIEnv *env, + jobject thiz) { + std::lock_guard guard{util::util_mutex_}; + auto group_info = ptrToInfo(env, thiz); + return util::jlongFromOptional(env, group_info->get_delete_before()); +} + +extern "C" +JNIEXPORT jobject JNICALL +Java_network_loki_messenger_libsession_1util_GroupInfoConfig_getExpiryTimer(JNIEnv *env, + jobject thiz) { + std::lock_guard guard{util::util_mutex_}; + auto group_info = ptrToInfo(env, thiz); + auto timer = group_info->get_expiry_timer(); + if (!timer) { + return nullptr; + } + long long in_seconds = timer->count(); + return util::jlongFromOptional(env, std::optional{in_seconds}); +} + +extern "C" +JNIEXPORT jstring JNICALL +Java_network_loki_messenger_libsession_1util_GroupInfoConfig_getName(JNIEnv *env, jobject thiz) { + std::lock_guard guard{util::util_mutex_}; + auto group_info = ptrToInfo(env, thiz); + return util::jstringFromOptional(env, group_info->get_name()); +} + +extern "C" +JNIEXPORT jobject JNICALL +Java_network_loki_messenger_libsession_1util_GroupInfoConfig_getProfilePic(JNIEnv *env, + jobject thiz) { + std::lock_guard guard{util::util_mutex_}; + auto group_info = ptrToInfo(env, thiz); + return util::serialize_user_pic(env, group_info->get_profile_pic()); +} + +extern "C" +JNIEXPORT jboolean JNICALL +Java_network_loki_messenger_libsession_1util_GroupInfoConfig_isDestroyed(JNIEnv *env, + jobject thiz) { + std::lock_guard guard{util::util_mutex_}; + auto group_info = ptrToInfo(env, thiz); + return group_info->is_destroyed(); +} + +extern "C" +JNIEXPORT void JNICALL +Java_network_loki_messenger_libsession_1util_GroupInfoConfig_setCreated(JNIEnv *env, jobject thiz, + jlong created_at) { + std::lock_guard guard{util::util_mutex_}; + auto group_info = ptrToInfo(env, thiz); + group_info->set_created(created_at); +} + +extern "C" +JNIEXPORT void JNICALL +Java_network_loki_messenger_libsession_1util_GroupInfoConfig_setDeleteAttachmentsBefore(JNIEnv *env, + jobject thiz, + jlong delete_before) { + std::lock_guard guard{util::util_mutex_}; + auto group_info = ptrToInfo(env, thiz); + group_info->set_delete_attach_before(delete_before); +} + +extern "C" +JNIEXPORT void JNICALL +Java_network_loki_messenger_libsession_1util_GroupInfoConfig_setDeleteBefore(JNIEnv *env, + jobject thiz, + jlong delete_before) { + std::lock_guard guard{util::util_mutex_}; + auto group_info = ptrToInfo(env, thiz); + group_info->set_delete_before(delete_before); +} + +extern "C" +JNIEXPORT void JNICALL +Java_network_loki_messenger_libsession_1util_GroupInfoConfig_setExpiryTimer(JNIEnv *env, + jobject thiz, + jlong expire_seconds) { + std::lock_guard guard{util::util_mutex_}; + auto group_info = ptrToInfo(env, thiz); + group_info->set_expiry_timer(std::chrono::seconds{expire_seconds}) +} + +extern "C" +JNIEXPORT void JNICALL +Java_network_loki_messenger_libsession_1util_GroupInfoConfig_setName(JNIEnv *env, jobject thiz, + jstring new_name) { + std::lock_guard guard{util::util_mutex_}; + auto group_info = ptrToInfo(env, thiz); + auto bytes = env->GetStringUTFChars(new_name, nullptr); + group_info->set_name(bytes); + env->ReleaseStringUTFChars(new_name, bytes); +} + +extern "C" +JNIEXPORT void JNICALL +Java_network_loki_messenger_libsession_1util_GroupInfoConfig_setProfilePic(JNIEnv *env, + jobject thiz, + jobject new_profile_pic) { + std::lock_guard guard{util::util_mutex_}; + auto group_info = ptrToInfo(env, thiz); + auto user_pic = util::deserialize_user_pic(env, new_profile_pic); + auto url = env->GetStringUTFChars(user_pic.first, nullptr); + auto key = util::ustring_from_bytes(env, user_pic.second); + group_info->set_profile_pic(url, key); + env->ReleaseStringUTFChars(user_pic.first, url); +} + +extern "C" +JNIEXPORT jlong JNICALL +Java_network_loki_messenger_libsession_1util_GroupInfoConfig_storageNamespace(JNIEnv *env, + jobject thiz) { + std::lock_guard guard{util::util_mutex_}; + auto group_info = ptrToInfo(env, thiz); + return static_cast(group_info->storage_namespace()); } \ No newline at end of file diff --git a/libsession-util/src/main/cpp/group_info.h b/libsession-util/src/main/cpp/group_info.h index 210c42cab..9fadf53ca 100644 --- a/libsession-util/src/main/cpp/group_info.h +++ b/libsession-util/src/main/cpp/group_info.h @@ -3,4 +3,10 @@ #include "util.h" +inline session::config::groups::Info* ptrToInfo(JNIEnv* env, jobject obj) { + jclass configClass = env->FindClass("network/loki/messenger/libsession_util/GroupInfoConfig"); + jfieldID pointerField = env->GetFieldID(configClass, "pointer", "J"); + return (session::config::groups::Info*) env->GetLongField(obj, pointerField); +} + #endif //SESSION_ANDROID_GROUP_INFO_H diff --git a/libsession-util/src/main/cpp/util.cpp b/libsession-util/src/main/cpp/util.cpp index e856c0fd3..81d1368ff 100644 --- a/libsession-util/src/main/cpp/util.cpp +++ b/libsession-util/src/main/cpp/util.cpp @@ -113,6 +113,23 @@ namespace util { return std::pair(session::config::expiration_mode::none, 0); } + jobject jlongFromOptional(JNIEnv* env, std::optional optional) { + if (!optional) { + return nullptr; + } + jclass longClass = env->FindClass("java/lang/Long"); + jmethodID constructor = env->GetMethodID(longClass, "", "(J)V"); + jobject returned = env->NewObject(longClass, constructor, (jlong)*optional); + return returned; + } + + jstring jstringFromOptional(JNIEnv* env, std::optional optional) { + if (!optional) { + return nullptr; + } + return env->NewStringUTF(optional->data()); + } + } extern "C" diff --git a/libsession-util/src/main/cpp/util.h b/libsession-util/src/main/cpp/util.h index abde49bb0..35b26b150 100644 --- a/libsession-util/src/main/cpp/util.h +++ b/libsession-util/src/main/cpp/util.h @@ -5,6 +5,7 @@ #include #include #include "session/types.hpp" +#include "session/config/groups/info.hpp" #include "session/config/profile_pic.hpp" #include "session/config/user_groups.hpp" #include "session/config/expiring.hpp" @@ -20,6 +21,8 @@ namespace util { session::config::community deserialize_base_community(JNIEnv *env, jobject base_community); jobject serialize_expiry(JNIEnv *env, const session::config::expiration_mode& mode, const std::chrono::seconds& time_seconds); std::pair deserialize_expiry(JNIEnv *env, jobject expiry_mode); + jobject jlongFromOptional(JNIEnv* env, std::optional optional); + jstring jstringFromOptional(JNIEnv* env, std::optional optional); } #endif \ No newline at end of file diff --git a/libsession-util/src/main/java/network/loki/messenger/libsession_util/Config.kt b/libsession-util/src/main/java/network/loki/messenger/libsession_util/Config.kt index 3669be94a..f0227f1f8 100644 --- a/libsession-util/src/main/java/network/loki/messenger/libsession_util/Config.kt +++ b/libsession-util/src/main/java/network/loki/messenger/libsession_util/Config.kt @@ -201,11 +201,34 @@ class UserGroupsConfig(pointer: Long): ConfigBase(pointer) { } class GroupInfoConfig(pointer: Long): ConfigBase(pointer) { - companion object {} - init { - System.loadLibrary("session_util") + companion object { + init { + System.loadLibrary("session_util") + } + + external fun newInstance(pubKey: ByteArray): GroupInfoConfig + external fun newInstance(pubKey: ByteArray, secretKey: ByteArray?): GroupInfoConfig + external fun newInstance( + pubKey: ByteArray, + secretKey: ByteArray?, + initialDump: ByteArray + ): GroupInfoConfig } - external fun newInstance(pubKeyHex: String): GroupInfoConfig - external fun newInstance(pubKeyHex: String, secretKey: ByteArray?): GroupInfoConfig - external fun newInstance(pubKeyHex: String, secretKey: ByteArray?, initialDump: ByteArray): GroupInfoConfig + + external fun destroyGroup() + external fun getCreated(): Long? + external fun getDeleteAttachmentsBefore(): Long? + external fun getDeleteBefore(): Long? + external fun getExpiryTimer(): Long? // TODO: maybe refactor this to new type when disappearing messages merged + external fun getName(): String? + external fun getProfilePic(): UserPic + external fun isDestroyed(): Boolean + external fun setCreated(createdAt: Long) + external fun setDeleteAttachmentsBefore(deleteBefore: Long) + external fun setDeleteBefore(deleteBefore: Long) + external fun setExpiryTimer(expireSeconds: Long) + external fun setName(newName: String) + external fun setProfilePic(newProfilePic: UserPic) + external fun storageNamespace(): Long + }