2
2
#include " util.h"
3
3
#include " jni_utils.h"
4
4
5
+ session::config::Contacts *ptrToContacts (JNIEnv *env, jobject obj) {
6
+ auto contactsClass = jni_utils::JavaLocalRef (env, env->FindClass (" network/loki/messenger/libsession_util/Contacts" ));
7
+ jfieldID pointerField = env->GetFieldID (contactsClass.get (), " pointer" , " J" );
8
+ return (session::config::Contacts *) env->GetLongField (obj, pointerField);
9
+ }
10
+
5
11
extern " C"
6
12
JNIEXPORT jobject JNICALL
7
13
Java_network_loki_messenger_libsession_1util_Contacts_get (JNIEnv *env, jobject thiz,
@@ -68,7 +74,170 @@ JNIEXPORT jobject JNICALL
68
74
Java_network_loki_messenger_libsession_1util_Contacts_all (JNIEnv *env, jobject thiz) {
69
75
return jni_utils::run_catching_cxx_exception_or_throws<jobject>(env, [=] {
70
76
std::lock_guard lock{util::util_mutex_};
71
- auto contacts = ptrToContacts (env, thiz);
72
77
return jni_utils::jlist_from_collection (env, *ptrToContacts (env, thiz), serialize_contact);
73
78
});
74
79
}
80
+
81
+ jobject serialize_contact (JNIEnv *env, session::config::contact_info info) {
82
+ auto contactClass = jni_utils::JavaLocalRef (env, env->FindClass (" network/loki/messenger/libsession_util/util/Contact" ));
83
+ jmethodID constructor = env->GetMethodID (contactClass.get (), " <init>" , " (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZZZLnetwork/loki/messenger/libsession_util/util/UserPic;JJJLnetwork/loki/messenger/libsession_util/util/ExpiryMode;)V" );
84
+ jobject returnObj = env->NewObject (contactClass.get (),
85
+ constructor,
86
+ jni_utils::JavaLocalRef (env, env->NewStringUTF (info.session_id .data ())).get (),
87
+ jni_utils::JavaLocalRef (env, env->NewStringUTF (info.name .data ())).get (),
88
+ jni_utils::JavaLocalRef (env, env->NewStringUTF (info.nickname .data ())).get (),
89
+ (jboolean) info.approved ,
90
+ (jboolean) info.approved_me ,
91
+ (jboolean) info.blocked ,
92
+ jni_utils::JavaLocalRef (env, util::serialize_user_pic (env, info.profile_picture )).get (),
93
+ (jlong) info.created ,
94
+ (jlong) (info.profile_updated .time_since_epoch ().count ()),
95
+ (jlong) info.priority ,
96
+ util::serialize_expiry (env, info.exp_mode , info.exp_timer ));
97
+ return returnObj;
98
+ }
99
+
100
+ session::config::contact_info deserialize_contact (JNIEnv *env, jobject info, session::config::Contacts *conf) {
101
+ jclass contactClass = env->FindClass (" network/loki/messenger/libsession_util/util/Contact" );
102
+
103
+ jfieldID getId, getName, getNick, getApproved, getApprovedMe, getBlocked, getUserPic, getPriority, getExpiry, getHidden, profileUpdatedField;
104
+ getId = env->GetFieldID (contactClass, " id" , " Ljava/lang/String;" );
105
+ getName = env->GetFieldID (contactClass, " name" , " Ljava/lang/String;" );
106
+ getNick = env->GetFieldID (contactClass, " nickname" , " Ljava/lang/String;" );
107
+ getApproved = env->GetFieldID (contactClass, " approved" , " Z" );
108
+ getApprovedMe = env->GetFieldID (contactClass, " approvedMe" , " Z" );
109
+ getBlocked = env->GetFieldID (contactClass, " blocked" , " Z" );
110
+ getUserPic = env->GetFieldID (contactClass, " profilePicture" ,
111
+ " Lnetwork/loki/messenger/libsession_util/util/UserPic;" );
112
+ getPriority = env->GetFieldID (contactClass, " priority" , " J" );
113
+ getExpiry = env->GetFieldID (contactClass, " expiryMode" , " Lnetwork/loki/messenger/libsession_util/util/ExpiryMode;" );
114
+ profileUpdatedField = env->GetFieldID (contactClass, " profileUpdatedEpochSeconds" , " J" );
115
+
116
+ jni_utils::JavaLocalRef account_id (env, static_cast <jstring>(env->GetObjectField (info, getId)));
117
+ jni_utils::JavaLocalRef name (env, static_cast <jstring>(env->GetObjectField (info, getName)));
118
+ jni_utils::JavaLocalRef nickname (env, static_cast <jstring>(env->GetObjectField (info, getNick)));
119
+ jni_utils::JavaLocalRef user_pic (env, env->GetObjectField (info, getUserPic));
120
+ jni_utils::JavaLocalRef expiry_mode (env, env->GetObjectField (info, getExpiry));
121
+
122
+ auto expiry_pair = util::deserialize_expiry (env, expiry_mode.get ());
123
+ auto profile_updated_seconds = env->GetLongField (info, profileUpdatedField);
124
+
125
+ auto contact_info = conf->get_or_construct (jni_utils::JavaStringRef (env, account_id.get ()).view ());
126
+ if (name.get ()) {
127
+ contact_info.name = jni_utils::JavaStringRef (env, name.get ()).view ();
128
+ }
129
+ if (nickname.get ()) {
130
+ contact_info.nickname = jni_utils::JavaStringRef (env, nickname.get ()).view ();
131
+ }
132
+ contact_info.approved = env->GetBooleanField (info, getApproved);
133
+ contact_info.approved_me = env->GetBooleanField (info, getApprovedMe);
134
+ contact_info.blocked = env->GetBooleanField (info, getBlocked);
135
+ contact_info.profile_updated = std::chrono::sys_seconds{std::chrono::seconds{profile_updated_seconds}};
136
+ if (user_pic.get () != nullptr ) {
137
+ contact_info.profile_picture = util::deserialize_user_pic (env, user_pic.get ());
138
+ }
139
+
140
+ contact_info.priority = env->GetLongField (info, getPriority);
141
+ contact_info.exp_mode = expiry_pair.first ;
142
+ contact_info.exp_timer = std::chrono::seconds (expiry_pair.second );
143
+
144
+ return contact_info;
145
+ }
146
+
147
+ jobject serialize_blinded_contact (JNIEnv *env, const session::config::blinded_contact_info &info) {
148
+ jni_utils::JavaLocalRef<jclass> clazz (env, env->FindClass (" network/loki/messenger/libsession_util/util/BlindedContact" ));
149
+ auto constructor = env->GetMethodID (clazz.get (), " <init>" , " (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;JLnetwork/loki/messenger/libsession_util/util/UserPic;)V" );
150
+
151
+ return env->NewObject (
152
+ clazz.get (),
153
+ constructor,
154
+ jni_utils::JavaLocalRef (env, env->NewStringUTF (info.session_id ().c_str ())).get (),
155
+ jni_utils::JavaLocalRef (env, env->NewStringUTF (info.comm .base_url ().data ())).get (),
156
+ jni_utils::JavaLocalRef (env, env->NewStringUTF (info.comm .pubkey_hex ().data ())).get (),
157
+ jni_utils::JavaLocalRef (env, env->NewStringUTF (info.name .c_str ())).get (),
158
+ (jlong) (info.created .time_since_epoch ().count ()),
159
+ jni_utils::JavaLocalRef (env, util::serialize_user_pic (env, info.profile_picture )).get ()
160
+ );
161
+ }
162
+
163
+ session::config::blinded_contact_info deserialize_blinded_contact (JNIEnv *env, jobject jInfo) {
164
+ jni_utils::JavaLocalRef<jclass> clazz (env, env->GetObjectClass (jInfo));
165
+ auto idField = env->GetFieldID (clazz.get (), " id" , " Ljava/lang/String;" );
166
+ auto communityServerField = env->GetFieldID (clazz.get (), " communityServer" , " Ljava/lang/String;" );
167
+ auto communityPubkeyField = env->GetFieldID (clazz.get (), " communityServerPubKeyHex" , " Ljava/lang/String;" );
168
+ auto nameField = env->GetFieldID (clazz.get (), " name" , " Ljava/lang/String;" );
169
+ auto createdEpochSecondsField = env->GetFieldID (clazz.get (), " createdEpochSeconds" , " J" );
170
+ auto profilePicField = env->GetFieldID (clazz.get (), " profilePic" , " Lnetwork/loki/messenger/libsession_util/util/UserPic;" );
171
+
172
+ session::config::blinded_contact_info info;
173
+ info.set_base_url (jni_utils::JavaStringRef (env, (jstring) env->GetObjectField (jInfo, communityServerField)).view ());
174
+ info.set_pubkey (jni_utils::JavaStringRef (env, (jstring) env->GetObjectField (jInfo, communityPubkeyField)).view ());
175
+ info.set_room (jni_utils::JavaStringRef (env, (jstring) env->GetObjectField (jInfo, idField)).view ());
176
+ info.created = std::chrono::sys_seconds{std::chrono::seconds{env->GetLongField (jInfo, createdEpochSecondsField)}};
177
+ info.profile_picture = util::deserialize_user_pic (env, jni_utils::JavaLocalRef (env, env->GetObjectField (jInfo, profilePicField)).get ());
178
+
179
+ return info;
180
+ }
181
+
182
+ extern " C"
183
+ JNIEXPORT jobject JNICALL
184
+ Java_network_loki_messenger_libsession_1util_Contacts_getOrConstructBlinded (JNIEnv *env,
185
+ jobject thiz,
186
+ jstring community_server_url,
187
+ jstring community_server_pub_key_hex,
188
+ jstring blinded_id) {
189
+ return serialize_blinded_contact (env, ptrToContacts (env, thiz)->get_or_construct_blinded (
190
+ jni_utils::JavaStringRef (env, community_server_url).view (),
191
+ jni_utils::JavaStringRef (env, community_server_pub_key_hex).view (),
192
+ jni_utils::JavaStringRef (env, blinded_id).view (),
193
+ false
194
+ ));
195
+ }
196
+
197
+ extern " C"
198
+ JNIEXPORT void JNICALL
199
+ Java_network_loki_messenger_libsession_1util_Contacts_setBlinded (JNIEnv *env, jobject thiz,
200
+ jobject contact) {
201
+ ptrToContacts (env, thiz)->set_blinded (
202
+ deserialize_blinded_contact (env, contact)
203
+ );
204
+ }
205
+
206
+ extern " C"
207
+ JNIEXPORT void JNICALL
208
+ Java_network_loki_messenger_libsession_1util_Contacts_eraseBlinded (JNIEnv *env, jobject thiz,
209
+ jstring community_server_url,
210
+ jstring blinded_id) {
211
+ ptrToContacts (env, thiz)->erase_blinded (
212
+ jni_utils::JavaStringRef (env, community_server_url).view (),
213
+ jni_utils::JavaStringRef (env, blinded_id).view (),
214
+ false ,
215
+ );
216
+ }
217
+
218
+ extern " C"
219
+ JNIEXPORT jobject JNICALL
220
+ Java_network_loki_messenger_libsession_1util_Contacts_allBlinded (JNIEnv *env, jobject thiz) {
221
+ return jni_utils::jlist_from_collection (
222
+ env,
223
+ ptrToContacts (env, thiz)->blinded (),
224
+ serialize_blinded_contact
225
+ );
226
+ }
227
+
228
+ extern " C"
229
+ JNIEXPORT jobject JNICALL
230
+ Java_network_loki_messenger_libsession_1util_Contacts_getBlinded (JNIEnv *env,
231
+ jobject thiz,
232
+ jstring blinded_id) {
233
+ auto result = ptrToContacts (env, thiz)->get_blinded (
234
+ jni_utils::JavaStringRef (env, blinded_id).view (),
235
+ false
236
+ );
237
+
238
+ if (result) {
239
+ return serialize_blinded_contact (env, *result);
240
+ } else {
241
+ return nullptr ;
242
+ }
243
+ }
0 commit comments