Skip to content

Commit 2b3982d

Browse files
SessionHero01SessionHero01
authored andcommitted
Tidy up
1 parent 0d0e018 commit 2b3982d

File tree

14 files changed

+197
-292
lines changed

14 files changed

+197
-292
lines changed

library/src/main/cpp/config_base.cpp

Lines changed: 25 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -29,24 +29,17 @@ Java_network_loki_messenger_libsession_1util_ConfigBase_push(JNIEnv *env, jobjec
2929
return jni_utils::run_catching_cxx_exception_or_throws<jobject>(env, [=] {
3030
std::lock_guard lock{util::util_mutex_};
3131
auto config = ptrToConfigBase(env, thiz);
32-
auto push_tuple = config->push();
33-
auto to_push_str = std::get<1>(push_tuple);
34-
auto to_delete = std::get<2>(push_tuple);
32+
auto [seq_no, to_push, to_delete] = config->push();
33+
34+
jobject messages = jni_utils::jlist_from_collection(env, to_push, [](JNIEnv *env, const std::vector<unsigned char> &data) {
35+
return jni_utils::session_bytes_from_range(env, data);
36+
});
37+
38+
jobject obsoleteHashes = jni_utils::jstring_list_from_collection(env, to_delete);
3539

36-
jbyteArray returnByteArray = util::bytes_from_vector(env, to_push_str);
37-
jlong seqNo = std::get<0>(push_tuple);
3840
jclass returnObjectClass = env->FindClass("network/loki/messenger/libsession_util/util/ConfigPush");
39-
jclass stackClass = env->FindClass("java/util/Stack");
40-
jmethodID methodId = env->GetMethodID(returnObjectClass, "<init>", "([BJLjava/util/List;)V");
41-
jmethodID stack_init = env->GetMethodID(stackClass, "<init>", "()V");
42-
jobject our_stack = env->NewObject(stackClass, stack_init);
43-
jmethodID push_stack = env->GetMethodID(stackClass, "push", "(Ljava/lang/Object;)Ljava/lang/Object;");
44-
for (auto entry : to_delete) {
45-
auto entry_jstring = env->NewStringUTF(entry.data());
46-
env->CallObjectMethod(our_stack, push_stack, entry_jstring);
47-
}
48-
jobject returnObject = env->NewObject(returnObjectClass, methodId, returnByteArray, seqNo, our_stack);
49-
return returnObject;
41+
jmethodID methodId = env->GetMethodID(returnObjectClass, "<init>", "(Ljava/util/List;JLjava/util/List;)V");
42+
return env->NewObject(returnObjectClass, methodId, messages, static_cast<jlong>(seq_no), obsoleteHashes);
5043
});
5144
}
5245

@@ -75,12 +68,21 @@ Java_network_loki_messenger_libsession_1util_ConfigBase_encryptionDomain(JNIEnv
7568
JNIEXPORT void JNICALL
7669
Java_network_loki_messenger_libsession_1util_ConfigBase_confirmPushed(JNIEnv *env, jobject thiz,
7770
jlong seq_no,
78-
jstring new_hash_jstring) {
71+
jobjectArray hash_list) {
7972
std::lock_guard lock{util::util_mutex_};
8073
auto conf = ptrToConfigBase(env, thiz);
81-
auto new_hash = env->GetStringUTFChars(new_hash_jstring, nullptr);
82-
conf->confirm_pushed(seq_no, new_hash);
83-
env->ReleaseStringUTFChars(new_hash_jstring, new_hash);
74+
auto hash_list_size = env->GetArrayLength(hash_list);
75+
std::unordered_set<std::string> hashes(hash_list_size);
76+
77+
for (int i = 0; i < hash_list_size; i++) {
78+
auto hash_jstring = (jstring) env->GetObjectArrayElement(hash_list, i);
79+
auto hash = env->GetStringUTFChars(hash_jstring, nullptr);
80+
hashes.insert(hash);
81+
env->ReleaseStringUTFChars(hash_jstring, hash);
82+
env->DeleteLocalRef(hash_jstring);
83+
}
84+
85+
conf->confirm_pushed(seq_no, hashes);
8486
}
8587

8688
#pragma clang diagnostic push
@@ -98,9 +100,7 @@ Java_network_loki_messenger_libsession_1util_ConfigBase_merge___3Lkotlin_Pair_2(
98100
auto pair = extractHashAndData(env, jElement);
99101
configs.push_back(pair);
100102
}
101-
auto returned = conf->merge(configs);
102-
auto string_stack = util::build_string_stack(env, returned);
103-
return string_stack;
103+
return jni_utils::jstring_list_from_collection(env, conf->merge(configs));
104104
});
105105
}
106106

@@ -137,16 +137,8 @@ Java_network_loki_messenger_libsession_1util_ConfigBase_00024Companion_kindFor(J
137137

138138
extern "C"
139139
JNIEXPORT jobject JNICALL
140-
Java_network_loki_messenger_libsession_1util_ConfigBase_currentHashes(JNIEnv *env, jobject thiz) {
140+
Java_network_loki_messenger_libsession_1util_ConfigBase_activeHashes(JNIEnv *env, jobject thiz) {
141141
std::lock_guard lock{util::util_mutex_};
142142
auto conf = ptrToConfigBase(env, thiz);
143-
jclass stack = env->FindClass("java/util/Stack");
144-
jmethodID init = env->GetMethodID(stack, "<init>", "()V");
145-
jobject our_stack = env->NewObject(stack, init);
146-
jmethodID push = env->GetMethodID(stack, "push", "(Ljava/lang/Object;)Ljava/lang/Object;");
147-
auto vec = conf->current_hashes();
148-
for (std::string element: vec) {
149-
env->CallObjectMethod(our_stack, push, env->NewStringUTF(element.data()));
150-
}
151-
return our_stack;
143+
return jni_utils::jstring_list_from_collection(env, conf->active_hashes());
152144
}

library/src/main/cpp/contacts.cpp

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -69,14 +69,6 @@ Java_network_loki_messenger_libsession_1util_Contacts_all(JNIEnv *env, jobject t
6969
return jni_utils::run_catching_cxx_exception_or_throws<jobject>(env, [=] {
7070
std::lock_guard lock{util::util_mutex_};
7171
auto contacts = ptrToContacts(env, thiz);
72-
jclass stack = env->FindClass("java/util/Stack");
73-
jmethodID init = env->GetMethodID(stack, "<init>", "()V");
74-
jobject our_stack = env->NewObject(stack, init);
75-
jmethodID push = env->GetMethodID(stack, "push", "(Ljava/lang/Object;)Ljava/lang/Object;");
76-
for (const auto &contact: *contacts) {
77-
auto contact_obj = serialize_contact(env, contact);
78-
env->CallObjectMethod(our_stack, push, contact_obj);
79-
}
80-
return our_stack;
72+
return jni_utils::jlist_from_collection(env, *ptrToContacts(env, thiz), serialize_contact);
8173
});
8274
}

library/src/main/cpp/conversation.cpp

Lines changed: 11 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#include <jni.h>
22
#include "conversation.h"
3+
#include "jni_utils.h"
34

45

56
extern "C"
@@ -266,57 +267,35 @@ Java_network_loki_messenger_libsession_1util_ConversationVolatileConfig_all(JNIE
266267
jobject thiz) {
267268
std::lock_guard lock{util::util_mutex_};
268269
auto convos = ptrToConvoInfo(env, thiz);
269-
jclass stack = env->FindClass("java/util/Stack");
270-
jmethodID init = env->GetMethodID(stack, "<init>", "()V");
271-
jobject our_stack = env->NewObject(stack, init);
272-
jmethodID push = env->GetMethodID(stack, "push", "(Ljava/lang/Object;)Ljava/lang/Object;");
273-
for (const auto& convo : *convos) {
274-
auto contact_obj = serialize_any(env, convo);
275-
env->CallObjectMethod(our_stack, push, contact_obj);
276-
}
277-
return our_stack;
270+
271+
return jni_utils::jlist_from_collection(env, *convos, serialize_any);
278272
}
279273
extern "C"
280274
JNIEXPORT jobject JNICALL
281275
Java_network_loki_messenger_libsession_1util_ConversationVolatileConfig_allOneToOnes(JNIEnv *env,
282276
jobject thiz) {
283277
std::lock_guard lock{util::util_mutex_};
284278
auto convos = ptrToConvoInfo(env, thiz);
285-
jclass stack = env->FindClass("java/util/Stack");
286-
jmethodID init = env->GetMethodID(stack, "<init>", "()V");
287-
jobject our_stack = env->NewObject(stack, init);
288-
jmethodID push = env->GetMethodID(stack, "push", "(Ljava/lang/Object;)Ljava/lang/Object;");
289-
for (auto contact = convos->begin_1to1(); contact != convos->end(); ++contact)
290-
env->CallObjectMethod(our_stack, push, serialize_one_to_one(env, *contact));
291-
return our_stack;
279+
return jni_utils::jlist_from_iterator(env, convos->begin_1to1(), convos->end(),
280+
serialize_one_to_one);
292281
}
293282
extern "C"
294283
JNIEXPORT jobject JNICALL
295284
Java_network_loki_messenger_libsession_1util_ConversationVolatileConfig_allCommunities(JNIEnv *env,
296285
jobject thiz) {
297286
std::lock_guard lock{util::util_mutex_};
298287
auto convos = ptrToConvoInfo(env, thiz);
299-
jclass stack = env->FindClass("java/util/Stack");
300-
jmethodID init = env->GetMethodID(stack, "<init>", "()V");
301-
jobject our_stack = env->NewObject(stack, init);
302-
jmethodID push = env->GetMethodID(stack, "push", "(Ljava/lang/Object;)Ljava/lang/Object;");
303-
for (auto contact = convos->begin_communities(); contact != convos->end(); ++contact)
304-
env->CallObjectMethod(our_stack, push, serialize_open_group(env, *contact));
305-
return our_stack;
288+
return jni_utils::jlist_from_iterator(env, convos->begin_communities(), convos->end(),
289+
serialize_open_group);
306290
}
307291
extern "C"
308292
JNIEXPORT jobject JNICALL
309293
Java_network_loki_messenger_libsession_1util_ConversationVolatileConfig_allLegacyClosedGroups(
310294
JNIEnv *env, jobject thiz) {
311295
std::lock_guard lock{util::util_mutex_};
312296
auto convos = ptrToConvoInfo(env, thiz);
313-
jclass stack = env->FindClass("java/util/Stack");
314-
jmethodID init = env->GetMethodID(stack, "<init>", "()V");
315-
jobject our_stack = env->NewObject(stack, init);
316-
jmethodID push = env->GetMethodID(stack, "push", "(Ljava/lang/Object;)Ljava/lang/Object;");
317-
for (auto contact = convos->begin_legacy_groups(); contact != convos->end(); ++contact)
318-
env->CallObjectMethod(our_stack, push, serialize_legacy_group(env, *contact));
319-
return our_stack;
297+
return jni_utils::jlist_from_iterator(env, convos->begin_legacy_groups(), convos->end(),
298+
serialize_legacy_group);
320299
}
321300

322301
extern "C"
@@ -325,13 +304,8 @@ Java_network_loki_messenger_libsession_1util_ConversationVolatileConfig_allClose
325304
jobject thiz) {
326305
std::lock_guard lock{util::util_mutex_};
327306
auto convos = ptrToConvoInfo(env, thiz);
328-
jclass stack = env->FindClass("java/util/Stack");
329-
jmethodID init = env->GetMethodID(stack, "<init>", "()V");
330-
jobject our_stack = env->NewObject(stack, init);
331-
jmethodID push = env->GetMethodID(stack, "push", "(Ljava/lang/Object;)Ljava/lang/Object;");
332-
for (auto contact = convos->begin_groups(); contact != convos->end(); ++contact)
333-
env->CallObjectMethod(our_stack, push, serialize_closed_group(env, *contact));
334-
return our_stack;
307+
return jni_utils::jlist_from_iterator(env, convos->begin_groups(), convos->end(),
308+
serialize_closed_group);
335309
}
336310

337311
extern "C"

library/src/main/cpp/group_keys.cpp

Lines changed: 4 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -57,16 +57,7 @@ JNIEXPORT jobject JNICALL
5757
Java_network_loki_messenger_libsession_1util_GroupKeysConfig_groupKeys(JNIEnv *env, jobject thiz) {
5858
std::lock_guard lock{util::util_mutex_};
5959
auto config = ptrToKeys(env, thiz);
60-
auto keys = config->group_keys();
61-
jclass stack = env->FindClass("java/util/Stack");
62-
jmethodID init = env->GetMethodID(stack, "<init>", "()V");
63-
jobject our_stack = env->NewObject(stack, init);
64-
jmethodID push = env->GetMethodID(stack, "push", "(Ljava/lang/Object;)Ljava/lang/Object;");
65-
for (auto& key : keys) {
66-
auto key_bytes = util::bytes_from_span(env, key);
67-
env->CallObjectMethod(our_stack, push, key_bytes);
68-
}
69-
return our_stack;
60+
return jni_utils::jlist_from_collection(env, config->group_keys(), util::bytes_from_span);
7061
}
7162

7263
extern "C"
@@ -206,34 +197,16 @@ JNIEXPORT jobject JNICALL
206197
Java_network_loki_messenger_libsession_1util_GroupKeysConfig_keys(JNIEnv *env, jobject thiz) {
207198
std::lock_guard lock{util::util_mutex_};
208199
auto ptr = ptrToKeys(env, thiz);
209-
auto keys = ptr->group_keys();
210-
jclass stack = env->FindClass("java/util/Stack");
211-
jmethodID init = env->GetMethodID(stack, "<init>", "()V");
212-
jobject our_stack = env->NewObject(stack, init);
213-
jmethodID push = env->GetMethodID(stack, "push", "(Ljava/lang/Object;)Ljava/lang/Object;");
214-
for (auto& key : keys) {
215-
auto key_bytes = util::bytes_from_span(env, key);
216-
env->CallObjectMethod(our_stack, push, key_bytes);
217-
}
218-
return our_stack;
200+
return jni_utils::jlist_from_collection(env, ptr->group_keys(), util::bytes_from_span);
219201
}
220202

221203
extern "C"
222204
JNIEXPORT jobject JNICALL
223-
Java_network_loki_messenger_libsession_1util_GroupKeysConfig_currentHashes(JNIEnv *env,
205+
Java_network_loki_messenger_libsession_1util_GroupKeysConfig_activeHashes(JNIEnv *env,
224206
jobject thiz) {
225207
std::lock_guard lock{util::util_mutex_};
226208
auto ptr = ptrToKeys(env, thiz);
227-
auto existing = ptr->current_hashes();
228-
jclass stack = env->FindClass("java/util/Stack");
229-
jmethodID init = env->GetMethodID(stack, "<init>", "()V");
230-
jobject our_list = env->NewObject(stack, init);
231-
jmethodID push = env->GetMethodID(stack, "push", "(Ljava/lang/Object;)Ljava/lang/Object;");
232-
for (auto& hash : existing) {
233-
auto hash_bytes = env->NewStringUTF(hash.data());
234-
env->CallObjectMethod(our_list, push, hash_bytes);
235-
}
236-
return our_list;
209+
return jni_utils::jstring_list_from_collection(env, ptr->active_hashes());
237210
}
238211
extern "C"
239212
JNIEXPORT jbyteArray JNICALL

library/src/main/cpp/group_members.cpp

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -29,15 +29,7 @@ JNIEXPORT jobject JNICALL
2929
Java_network_loki_messenger_libsession_1util_GroupMembersConfig_all(JNIEnv *env, jobject thiz) {
3030
std::lock_guard lock{util::util_mutex_};
3131
auto config = ptrToMembers(env, thiz);
32-
jclass stack = env->FindClass("java/util/Stack");
33-
jmethodID init = env->GetMethodID(stack, "<init>", "()V");
34-
jobject our_stack = env->NewObject(stack, init);
35-
jmethodID push = env->GetMethodID(stack, "push", "(Ljava/lang/Object;)Ljava/lang/Object;");
36-
for (auto& member : *config) {
37-
auto member_obj = util::serialize_group_member(env, member);
38-
env->CallObjectMethod(our_stack, push, member_obj);
39-
}
40-
return our_stack;
32+
return jni_utils::jlist_from_collection(env, *config, util::serialize_group_member);
4133
}
4234

4335
extern "C"

library/src/main/cpp/jni_utils.h

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@
33

44
#include <jni.h>
55
#include <exception>
6+
#include <ranges>
7+
#include <type_traits>
8+
9+
#include "util.h"
610

711
namespace jni_utils {
812
/**
@@ -49,6 +53,43 @@ namespace jni_utils {
4953
return RetT();
5054
});
5155
}
56+
57+
template <typename IterBegin, typename IterEnd, typename ConvertItemFunc>
58+
jobject jlist_from_iterator(JNIEnv *env, IterBegin begin, IterEnd end, const ConvertItemFunc &func) {
59+
jclass list_clazz = env->FindClass("java/util/ArrayList");
60+
jmethodID init = env->GetMethodID(list_clazz, "<init>", "()V");
61+
jobject our_list = env->NewObject(list_clazz, init);
62+
jmethodID push = env->GetMethodID(list_clazz, "add", "(Ljava/lang/Object;)Z");
63+
64+
for (auto iter = begin; iter != end; ++iter) {
65+
jobject item_java = func(env, *iter);
66+
env->CallBooleanMethod(our_list, push, item_java);
67+
env->DeleteLocalRef(item_java);
68+
}
69+
70+
env->DeleteLocalRef(list_clazz);
71+
return our_list;
72+
}
73+
74+
template <typename Collection, typename ConvertItemFunc>
75+
jobject jlist_from_collection(JNIEnv *env, const Collection& obj, const ConvertItemFunc &func) {
76+
return jlist_from_iterator(env, obj.begin(), obj.end(), func);
77+
}
78+
79+
template <typename Collection>
80+
jobject jstring_list_from_collection(JNIEnv *env, const Collection& obj) {
81+
return jlist_from_collection(env, obj, util::jstringFromOptional);
82+
}
83+
84+
template <typename Collection>
85+
jobject session_bytes_from_range(JNIEnv *env, const Collection &obj) {
86+
jclass bytes_clazz = env->FindClass("network/loki/messenger/libsession_util/util/Bytes");
87+
jmethodID init = env->GetMethodID(bytes_clazz, "<init>", "([B)V");
88+
89+
auto bytes_array = env->NewByteArray(static_cast<jsize>(obj.size()));
90+
env->SetByteArrayRegion(bytes_array, 0, static_cast<jsize>(obj.size()), reinterpret_cast<const jbyte *>(obj.data()));
91+
return env->NewObject(bytes_clazz, init, bytes_array);
92+
}
5293
}
5394

5495
#endif //SESSION_ANDROID_JNI_UTILS_H

0 commit comments

Comments
 (0)