#include #include "conversation.h" #pragma clang diagnostic push extern "C" JNIEXPORT jobject JNICALL Java_network_loki_messenger_libsession_1util_util_Conversation_00024OpenGroup_00024Companion_parseFullUrl( JNIEnv *env, jobject thiz, jstring full_url) { auto bytes = env->GetStringUTFChars(full_url, nullptr); auto [base, room, pk] = session::config::convo::open_group::parse_full_url(bytes); env->ReleaseStringUTFChars(full_url, bytes); jclass clazz = env->FindClass("kotlin/Triple"); jmethodID constructor = env->GetMethodID(clazz, "", "(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V"); auto base_j = env->NewStringUTF(base.data()); auto room_j = env->NewStringUTF(room.data()); auto pk_jbytes = util::bytes_from_ustring(env, pk); jobject triple = env->NewObject(clazz, constructor, base_j, room_j, pk_jbytes); return triple; } extern "C" #pragma ide diagnostic ignored "bugprone-reserved-identifier" JNIEXPORT jobject JNICALL Java_network_loki_messenger_libsession_1util_ConversationVolatileConfig_00024Companion_newInstance___3B( JNIEnv *env, jobject thiz, jbyteArray ed25519_secret_key) { auto secret_key = util::ustring_from_bytes(env, ed25519_secret_key); auto* convo_info_volatile = new session::config::ConvoInfoVolatile(secret_key, std::nullopt); jclass convoClass = env->FindClass("network/loki/messenger/libsession_util/ConversationVolatileConfig"); jmethodID constructor = env->GetMethodID(convoClass, "", "(J)V"); jobject newConfig = env->NewObject(convoClass, constructor, reinterpret_cast(convo_info_volatile)); return newConfig; } extern "C" #pragma ide diagnostic ignored "bugprone-reserved-identifier" JNIEXPORT jobject JNICALL Java_network_loki_messenger_libsession_1util_ConversationVolatileConfig_00024Companion_newInstance___3B_3B( JNIEnv *env, jobject thiz, jbyteArray ed25519_secret_key, jbyteArray initial_dump) { auto secret_key = util::ustring_from_bytes(env, ed25519_secret_key); auto initial = util::ustring_from_bytes(env, initial_dump); auto* convo_info_volatile = new session::config::ConvoInfoVolatile(secret_key, initial); jclass convoClass = env->FindClass("network/loki/messenger/libsession_util/ConversationVolatileConfig"); jmethodID constructor = env->GetMethodID(convoClass, "", "(J)V"); jobject newConfig = env->NewObject(convoClass, constructor, reinterpret_cast(convo_info_volatile)); return newConfig; } extern "C" JNIEXPORT jint JNICALL Java_network_loki_messenger_libsession_1util_ConversationVolatileConfig_sizeOneToOnes(JNIEnv *env, jobject thiz) { auto conversations = ptrToConvoInfo(env, thiz); return conversations->size_1to1(); } #pragma clang diagnostic pop extern "C" JNIEXPORT jint JNICALL Java_network_loki_messenger_libsession_1util_ConversationVolatileConfig_eraseAll(JNIEnv *env, jobject thiz, jobject predicate) { auto conversations = ptrToConvoInfo(env, thiz); jclass predicate_class = env->FindClass("kotlin/jvm/functions/Function1"); jmethodID predicate_call = env->GetMethodID(predicate_class, "invoke", "(Ljava/lang/Object;)Ljava/lang/Object;"); jclass bool_class = env->FindClass("java/lang/Boolean"); jfieldID bool_value = env->GetFieldID(bool_class, "value", "Z"); int removed = 0; for (auto it = conversations->begin(); it != conversations->end(); ) { auto result = env->CallObjectMethod(predicate, predicate_call, serialize_any(env, *it)); bool bool_result = env->GetBooleanField(result, bool_value); if (bool_result) { it = conversations->erase(it); removed++; } else { ++it; } } return removed; } extern "C" JNIEXPORT jint JNICALL Java_network_loki_messenger_libsession_1util_ConversationVolatileConfig_size(JNIEnv *env, jobject thiz) { auto config = ptrToConvoInfo(env, thiz); return (jint)config->size(); } extern "C" JNIEXPORT jboolean JNICALL Java_network_loki_messenger_libsession_1util_ConversationVolatileConfig_empty(JNIEnv *env, jobject thiz) { auto config = ptrToConvoInfo(env, thiz); return config->empty(); } extern "C" JNIEXPORT void JNICALL Java_network_loki_messenger_libsession_1util_ConversationVolatileConfig_set(JNIEnv *env, jobject thiz, jobject to_store) { auto convos = ptrToConvoInfo(env, thiz); jclass one_to_one = env->FindClass("network/loki/messenger/libsession_util/util/Conversation$OneToOne"); jclass open_group = env->FindClass("network/loki/messenger/libsession_util/util/Conversation$OpenGroup"); jclass legacy_closed_group = env->FindClass("network/loki/messenger/libsession_util/util/Conversation$LegacyClosedGroup"); jclass to_store_class = env->GetObjectClass(to_store); if (env->IsSameObject(to_store_class, one_to_one)) { // store as 1to1 convos->set(*deserialize_one_to_one(env, to_store)); } else if (env->IsSameObject(to_store_class,open_group)) { // store as open_group convos->set(*deserialize_open_group(env, to_store)); } else if (env->IsSameObject(to_store_class,legacy_closed_group)) { // store as legacy_closed_group convos->set(*deserialize_legacy_closed_group(env, to_store)); } } extern "C" JNIEXPORT jobject JNICALL Java_network_loki_messenger_libsession_1util_ConversationVolatileConfig_getOneToOne(JNIEnv *env, jobject thiz, jstring pub_key_hex) { auto convos = ptrToConvoInfo(env, thiz); auto param = env->GetStringUTFChars(pub_key_hex, nullptr); auto internal = convos->get_1to1(param); env->ReleaseStringUTFChars(pub_key_hex, param); if (internal) { return serialize_one_to_one(env, *internal); } return nullptr; } extern "C" JNIEXPORT jobject JNICALL Java_network_loki_messenger_libsession_1util_ConversationVolatileConfig_getOrConstructOneToOne( JNIEnv *env, jobject thiz, jstring pub_key_hex) { auto convos = ptrToConvoInfo(env, thiz); auto param = env->GetStringUTFChars(pub_key_hex, nullptr); auto internal = convos->get_or_construct_1to1(param); env->ReleaseStringUTFChars(pub_key_hex, param); return serialize_one_to_one(env, internal); } extern "C" JNIEXPORT jboolean JNICALL Java_network_loki_messenger_libsession_1util_ConversationVolatileConfig_eraseOneToOne(JNIEnv *env, jobject thiz, jstring pub_key_hex) { auto convos = ptrToConvoInfo(env, thiz); auto param = env->GetStringUTFChars(pub_key_hex, nullptr); auto result = convos->erase_1to1(param); env->ReleaseStringUTFChars(pub_key_hex, param); return result; } extern "C" JNIEXPORT jobject JNICALL Java_network_loki_messenger_libsession_1util_ConversationVolatileConfig_getOpenGroup__Ljava_lang_String_2Ljava_lang_String_2Ljava_lang_String_2( JNIEnv *env, jobject thiz, jstring base_url, jstring room, jstring pub_key_hex) { auto convos = ptrToConvoInfo(env, thiz); auto base_url_chars = env->GetStringUTFChars(base_url, nullptr); auto room_chars = env->GetStringUTFChars(room, nullptr); auto hex_chars = env->GetStringUTFChars(pub_key_hex, nullptr); auto open = convos->get_open(base_url_chars, room_chars, hex_chars); env->ReleaseStringUTFChars(base_url, base_url_chars); env->ReleaseStringUTFChars(room, room_chars); env->ReleaseStringUTFChars(pub_key_hex, hex_chars); if (open) { auto serialized = serialize_open_group(env, *open); return serialized; } return nullptr; } extern "C" JNIEXPORT jobject JNICALL Java_network_loki_messenger_libsession_1util_ConversationVolatileConfig_getOpenGroup__Ljava_lang_String_2Ljava_lang_String_2_3B( JNIEnv *env, jobject thiz, jstring base_url, jstring room, jbyteArray pub_key) { auto convos = ptrToConvoInfo(env, thiz); auto base_url_chars = env->GetStringUTFChars(base_url, nullptr); auto room_chars = env->GetStringUTFChars(room, nullptr); auto pub_key_ustring = util::ustring_from_bytes(env, pub_key); auto open = convos->get_open(base_url_chars, room_chars, pub_key_ustring); if (open) { auto serialized = serialize_open_group(env, *open); return serialized; } return nullptr; } extern "C" JNIEXPORT jobject JNICALL Java_network_loki_messenger_libsession_1util_ConversationVolatileConfig_getOrConstructOpenGroup__Ljava_lang_String_2Ljava_lang_String_2_3B( JNIEnv *env, jobject thiz, jstring base_url, jstring room, jbyteArray pub_key) { auto convos = ptrToConvoInfo(env, thiz); auto base_url_chars = env->GetStringUTFChars(base_url, nullptr); auto room_chars = env->GetStringUTFChars(room, nullptr); auto pub_key_ustring = util::ustring_from_bytes(env, pub_key); auto open = convos->get_or_construct_open(base_url_chars, room_chars, pub_key_ustring); auto serialized = serialize_open_group(env, open); return serialized; } extern "C" JNIEXPORT jobject JNICALL Java_network_loki_messenger_libsession_1util_ConversationVolatileConfig_getOrConstructOpenGroup__Ljava_lang_String_2Ljava_lang_String_2Ljava_lang_String_2( JNIEnv *env, jobject thiz, jstring base_url, jstring room, jstring pub_key_hex) { auto convos = ptrToConvoInfo(env, thiz); auto base_url_chars = env->GetStringUTFChars(base_url, nullptr); auto room_chars = env->GetStringUTFChars(room, nullptr); auto hex_chars = env->GetStringUTFChars(pub_key_hex, nullptr); auto open = convos->get_or_construct_open(base_url_chars, room_chars, hex_chars); env->ReleaseStringUTFChars(base_url, base_url_chars); env->ReleaseStringUTFChars(room, room_chars); env->ReleaseStringUTFChars(pub_key_hex, hex_chars); auto serialized = serialize_open_group(env, open); return serialized; } extern "C" JNIEXPORT jboolean JNICALL Java_network_loki_messenger_libsession_1util_ConversationVolatileConfig_eraseOpenGroup__Lnetwork_loki_messenger_libsession_1util_util_Conversation_OpenGroup_2(JNIEnv *env, jobject thiz, jobject open_group) { auto convos = ptrToConvoInfo(env, thiz); auto deserialized = deserialize_open_group(env, open_group); return convos->erase(*deserialized); } extern "C" JNIEXPORT jboolean JNICALL Java_network_loki_messenger_libsession_1util_ConversationVolatileConfig_eraseOpenGroup__Ljava_lang_String_2Ljava_lang_String_2Ljava_lang_String_2( JNIEnv *env, jobject thiz, jstring base_url, jstring room, jstring pub_key_hex) { auto convos = ptrToConvoInfo(env, thiz); auto base_url_chars = env->GetStringUTFChars(base_url, nullptr); auto room_chars = env->GetStringUTFChars(room, nullptr); auto hex_chars = env->GetStringUTFChars(pub_key_hex, nullptr); auto result = convos->erase_open(base_url_chars, room_chars, hex_chars); env->ReleaseStringUTFChars(base_url, base_url_chars); env->ReleaseStringUTFChars(room, room_chars); env->ReleaseStringUTFChars(pub_key_hex, hex_chars); return result; } extern "C" JNIEXPORT jboolean JNICALL Java_network_loki_messenger_libsession_1util_ConversationVolatileConfig_eraseOpenGroup__Ljava_lang_String_2Ljava_lang_String_2_3B( JNIEnv *env, jobject thiz, jstring base_url, jstring room, jbyteArray pub_key) { auto convos = ptrToConvoInfo(env, thiz); auto base_url_chars = env->GetStringUTFChars(base_url, nullptr); auto room_chars = env->GetStringUTFChars(room, nullptr); auto pub_key_bytes = util::ustring_from_bytes(env, pub_key); auto result = convos->erase_open(base_url_chars, room_chars, pub_key_bytes); env->ReleaseStringUTFChars(base_url, base_url_chars); env->ReleaseStringUTFChars(room, room_chars); return result; } extern "C" JNIEXPORT jobject JNICALL Java_network_loki_messenger_libsession_1util_ConversationVolatileConfig_getLegacyClosedGroup( JNIEnv *env, jobject thiz, jstring group_id) { auto convos = ptrToConvoInfo(env, thiz); auto id_chars = env->GetStringUTFChars(group_id, nullptr); auto lgc = convos->get_legacy_closed(id_chars); env->ReleaseStringUTFChars(group_id, id_chars); if (lgc) { auto serialized = serialize_legacy_group(env, *lgc); return serialized; } return nullptr; } extern "C" JNIEXPORT jobject JNICALL Java_network_loki_messenger_libsession_1util_ConversationVolatileConfig_getOrConstructLegacyClosedGroup( JNIEnv *env, jobject thiz, jstring group_id) { auto convos = ptrToConvoInfo(env, thiz); auto id_chars = env->GetStringUTFChars(group_id, nullptr); auto lgc = convos->get_or_construct_legacy_closed(id_chars); env->ReleaseStringUTFChars(group_id, id_chars); return serialize_legacy_group(env, lgc); } extern "C" JNIEXPORT jboolean JNICALL Java_network_loki_messenger_libsession_1util_ConversationVolatileConfig_eraseLegacyClosedGroup( JNIEnv *env, jobject thiz, jstring group_id) { auto convos = ptrToConvoInfo(env, thiz); auto id_chars = env->GetStringUTFChars(group_id, nullptr); auto result = convos->erase_legacy_closed(id_chars); env->ReleaseStringUTFChars(group_id, id_chars); return result; } extern "C" JNIEXPORT jboolean JNICALL Java_network_loki_messenger_libsession_1util_ConversationVolatileConfig_erase(JNIEnv *env, jobject thiz, jobject conversation) { auto convos = ptrToConvoInfo(env, thiz); auto deserialized = deserialize_any(env, conversation); if (deserialized == nullptr) return false; return convos->erase(*deserialized); }