Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
9031453
feat: add EventType enum for thread
Doominika Aug 4, 2025
2bd1100
feat: add EventType enum for store
Doominika Aug 4, 2025
5334369
feat: add EventType enum for inbox
Doominika Aug 4, 2025
23c40f8
feat: add EventType enum for kvdb
Doominika Aug 4, 2025
9394377
feat: add EventSelectorType enum for store
Doominika Aug 4, 2025
f94a799
feat: add EventSelectorType enum for thread
Doominika Aug 4, 2025
809fc3f
feat: add EventSelectorType enum for inbox
Doominika Aug 4, 2025
5406dec
feat: add EventSelectorType enum for kvdb
Doominika Aug 4, 2025
eca0006
feat: add EventSelectorType enum for event
Doominika Aug 4, 2025
e873311
fix: use proper variables when calling java methods in jni
Doominika Aug 4, 2025
0f7365a
feat: add EventSelectorType enum for event
Doominika Aug 4, 2025
d388194
refactor: change jni parsers for EventTypes and EventSelectorTypes
Doominika Aug 4, 2025
28783f0
refactor: create EventType interface and use it in EventType classes
Doominika Aug 4, 2025
ea0e292
refactor: create EventSelectorType interface and use it in EventSelec…
Doominika Aug 4, 2025
d19c6dd
refactor: remove unnecessary enums
Doominika Aug 4, 2025
114993e
chore: rename custom event selector type
Doominika Aug 7, 2025
37c714a
chore: remove unnecessary parsers
Doominika Aug 8, 2025
0e896a5
feat(privmx-endpoint): Implement new event subscription methods (#73)
Doominika Aug 19, 2025
ab4b137
docs: add descriptions to EventSelectorTypes
Doominika Aug 28, 2025
bb787b0
docs: add descriptions to EventTypes
Doominika Aug 28, 2025
36e10d5
fix: check if subscriptionIds array has null elements in unsubscribe …
Doominika Aug 25, 2025
61c2522
feat(privmx-endpoint): Add new event types for containers (#87)
Doominika Sep 5, 2025
4e4bdcd
docs(privmx-endpoint): add category and group tags to EventType and E…
djenczewski Sep 8, 2025
35f413f
docs(privmx-endpoint): add descriptions for Selector types and Event …
djenczewski Sep 8, 2025
0400219
docs(privmx-endpoint): fix category and groups tags for selector and …
djenczewski Sep 8, 2025
004917e
Merge branch 'feat/implement-2.6' into feat/implement-builders-and-en…
djenczewski Sep 8, 2025
54567ef
docs(privmx-endpoint): fix comment in EventSelectorType classes
djenczewski Sep 9, 2025
6aab312
docs(privmx-endpoint): fix eventType description in buildSubscription…
djenczewski Sep 9, 2025
56f9b34
docs(privmx-endpoint): fix unsubscribeFrom methods description
djenczewski Sep 9, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
116 changes: 90 additions & 26 deletions privmx-endpoint/src/main/cpp/modules/EventApi.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -106,47 +106,111 @@ Java_com_simplito_java_privmx_1endpoint_modules_event_EventApi_emitEvent(
}

extern "C"
JNIEXPORT void JNICALL
Java_com_simplito_java_privmx_1endpoint_modules_event_EventApi_subscribeForCustomEvents(
JNIEXPORT jobject JNICALL
Java_com_simplito_java_privmx_1endpoint_modules_event_EventApi_subscribeFor(
JNIEnv *env,
jobject thiz,
jstring context_id,
jstring channel_name
jobject subscription_queries
) {
JniContextUtils ctx(env);

if (ctx.nullCheck(context_id, "Context ID") ||
ctx.nullCheck(channel_name, "Channel name")) {
return;
if (ctx.nullCheck(subscription_queries, "Subscription queries")) {
return nullptr;
}

ctx.callVoidEndpointApi([&ctx, &thiz, &context_id, &channel_name]() {
getEventApi(ctx, thiz)->subscribeForCustomEvents(
ctx.jString2string(context_id),
ctx.jString2string(channel_name)
);
});
jobject result = nullptr;
ctx.callResultEndpointApi<jobject>(
&result,
[&ctx, &env, &thiz, &subscription_queries]() {
jclass arrayListCls = env->FindClass("java/util/ArrayList");
jmethodID initMID = env->GetMethodID(arrayListCls, "<init>", "()V");
jmethodID addToListMID = env->GetMethodID(arrayListCls, "add", "(Ljava/lang/Object;)Z");

auto subscription_queries_arr = ctx.jObject2jArray(subscription_queries);
auto subscription_queries_c = std::vector<std::string>();

int length = ctx->GetArrayLength(subscription_queries_arr);
for (int i = 0; i < length; i++) {
jobject arrayElement = ctx->GetObjectArrayElement(subscription_queries_arr, i);
subscription_queries_c.push_back(ctx.jString2string((jstring) arrayElement));
}

jobject arrayList = env->NewObject(arrayListCls, initMID);
auto subscription_ids_c = getEventApi(ctx, thiz)->
subscribeFor(subscription_queries_c);

for (auto &id_str : subscription_ids_c) {
jstring java_id_str = ctx->NewStringUTF(id_str.c_str());
env->CallBooleanMethod(arrayList, addToListMID, java_id_str);
}
return arrayList;
}
);
if (ctx->ExceptionCheck()) {
return nullptr;
}
return result;
}


extern "C"
JNIEXPORT void JNICALL
Java_com_simplito_java_privmx_1endpoint_modules_event_EventApi_unsubscribeFromCustomEvents(
Java_com_simplito_java_privmx_1endpoint_modules_event_EventApi_unsubscribeFrom(
JNIEnv *env,
jobject thiz,
jstring context_id,
jstring channel_name
jobject subscription_ids
) {
JniContextUtils ctx(env);

if (ctx.nullCheck(context_id, "Context ID") ||
ctx.nullCheck(channel_name, "Channel name")) {
if (ctx.nullCheck(subscription_ids, "Subscription IDs")) {
return;
}

ctx.callVoidEndpointApi([&ctx, &thiz, &context_id, &channel_name]() {
getEventApi(ctx, thiz)->unsubscribeFromCustomEvents(
ctx.jString2string(context_id),
ctx.jString2string(channel_name)
);
ctx.callVoidEndpointApi([&ctx, &env, &thiz, &subscription_ids]() {
auto subscription_ids_arr = ctx.jObject2jArray(subscription_ids);
auto subscription_ids_c = std::vector<std::string>();

int length = ctx->GetArrayLength(subscription_ids_arr);
for (int i = 0; i < length; i++) {
jobject arrayElement = ctx->GetObjectArrayElement(subscription_ids_arr, i);
if (ctx.nullCheck(arrayElement, "Subscription ids array elements")) {
return;
}
subscription_ids_c.push_back(ctx.jString2string((jstring) arrayElement));
}

getEventApi(ctx, thiz)->unsubscribeFrom(subscription_ids_c);
});
}
}


extern "C"
JNIEXPORT jstring JNICALL
Java_com_simplito_java_privmx_1endpoint_modules_event_EventApi_buildSubscriptionQuery(
JNIEnv *env,
jobject thiz,
jstring channel_name,
jlong selector_type,
jstring selector_id
) {
JniContextUtils ctx(env);
if (ctx.nullCheck(channel_name, "ChannelName") ||
ctx.nullCheck(selector_id, "SelectorID")) {
return nullptr;
}

jstring result = nullptr;
ctx.callResultEndpointApi<jstring>(
&result,
[&ctx, &env, &thiz, &channel_name, &selector_type, &selector_id]() {
std::string query_result_c = getEventApi(ctx, thiz)->buildSubscriptionQuery(
ctx.jString2string(channel_name),
static_cast<event::EventSelectorType>(selector_type),
ctx.jString2string(selector_id)
);
return ctx->NewStringUTF(query_result_c.c_str());
}
);
if (ctx->ExceptionCheck()) {
return nullptr;
}
return result;
}
119 changes: 85 additions & 34 deletions privmx-endpoint/src/main/cpp/modules/InboxApi.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -652,8 +652,8 @@ Java_com_simplito_java_privmx_1endpoint_modules_inbox_InboxApi_closeFile(
&result,
[&ctx, &thiz, &file_handle]() {
return ctx->NewStringUTF(
getInboxApi(ctx, thiz)->closeFile(file_handle)
.c_str()
getInboxApi(ctx, thiz)->
closeFile(file_handle).c_str()
);
});
if (ctx->ExceptionCheck()) {
Expand All @@ -663,58 +663,109 @@ Java_com_simplito_java_privmx_1endpoint_modules_inbox_InboxApi_closeFile(
}

extern "C"
JNIEXPORT void JNICALL
Java_com_simplito_java_privmx_1endpoint_modules_inbox_InboxApi_subscribeForInboxEvents(
JNIEXPORT jobject JNICALL
Java_com_simplito_java_privmx_1endpoint_modules_inbox_InboxApi_subscribeFor(
JNIEnv *env,
jobject thiz
jobject thiz,
jobject subscription_queries
) {
JniContextUtils ctx(env);
ctx.callVoidEndpointApi([&ctx, &thiz]() {
getInboxApi(ctx, thiz)->subscribeForInboxEvents();
});
}
if (ctx.nullCheck(subscription_queries, "Subscription queries")) {
return nullptr;
}

extern "C"
JNIEXPORT void JNICALL
Java_com_simplito_java_privmx_1endpoint_modules_inbox_InboxApi_unsubscribeFromInboxEvents(
JNIEnv *env,
jobject thiz
) {
JniContextUtils ctx(env);
ctx.callVoidEndpointApi([&ctx, &thiz]() {
getInboxApi(ctx, thiz)->unsubscribeFromInboxEvents();
});
jobject result = nullptr;
ctx.callResultEndpointApi<jobject>(
&result,
[&ctx, &env, &thiz, &subscription_queries]() {
jclass arrayListCls = env->FindClass("java/util/ArrayList");
jmethodID initMID = env->GetMethodID(arrayListCls, "<init>", "()V");
jmethodID addToListMID = env->GetMethodID(arrayListCls, "add", "(Ljava/lang/Object;)Z");

auto subscription_queries_arr = ctx.jObject2jArray(subscription_queries);
auto subscription_queries_c = std::vector<std::string>();

int length = ctx->GetArrayLength(subscription_queries_arr);
for (int i = 0; i < length; i++) {
jobject arrayElement = ctx->GetObjectArrayElement(subscription_queries_arr, i);
subscription_queries_c.push_back(ctx.jString2string((jstring) arrayElement));
}

auto subscription_ids_c = getInboxApi(ctx, thiz)->subscribeFor(
subscription_queries_c);
jobject arrayList = env->NewObject(arrayListCls, initMID);

for (auto &id_str : subscription_ids_c) {
jstring java_id_str = ctx->NewStringUTF(id_str.c_str());
env->CallBooleanMethod(arrayList, addToListMID, java_id_str);
}
return arrayList;
}
);
if (ctx->ExceptionCheck()) {
return nullptr;
}
return result;
}

extern "C"
JNIEXPORT void JNICALL
Java_com_simplito_java_privmx_1endpoint_modules_inbox_InboxApi_subscribeForEntryEvents(
Java_com_simplito_java_privmx_1endpoint_modules_inbox_InboxApi_unsubscribeFrom(
JNIEnv *env,
jobject thiz,
jstring inbox_id
jobject subscription_ids
) {
JniContextUtils ctx(env);
if (ctx.nullCheck(inbox_id, "Inbox ID")) {
if (ctx.nullCheck(subscription_ids, "Subscription IDs")) {
return;
}
ctx.callVoidEndpointApi([&ctx, &thiz, &inbox_id]() {
getInboxApi(ctx, thiz)->subscribeForEntryEvents(
ctx.jString2string(inbox_id)
);

ctx.callVoidEndpointApi([&ctx, &env, &thiz, &subscription_ids]() {
auto subscription_ids_arr = ctx.jObject2jArray(subscription_ids);
auto subscription_ids_c = std::vector<std::string>();

int length = ctx->GetArrayLength(subscription_ids_arr);
for (int i = 0; i < length; i++) {
jobject arrayElement = ctx->GetObjectArrayElement(subscription_ids_arr, i);
if (ctx.nullCheck(arrayElement, "Subscription ids array elements")) {
return;
}
subscription_ids_c.push_back(ctx.jString2string((jstring) arrayElement));
}

getInboxApi(ctx, thiz)->unsubscribeFrom(subscription_ids_c);
});
}


extern "C"
JNIEXPORT void JNICALL
Java_com_simplito_java_privmx_1endpoint_modules_inbox_InboxApi_unsubscribeFromEntryEvents(
JNIEXPORT jstring JNICALL
Java_com_simplito_java_privmx_1endpoint_modules_inbox_InboxApi_buildSubscriptionQuery(
JNIEnv *env,
jobject thiz,
jstring inbox_id
jlong event_type,
jlong selector_type,
jstring selector_id
) {
JniContextUtils ctx(env);
ctx.callVoidEndpointApi([&ctx, &thiz, &inbox_id]() {
getInboxApi(ctx, thiz)->unsubscribeFromEntryEvents(
ctx.jString2string(inbox_id)
);
});
if (ctx.nullCheck(selector_id, "Selector ID")) {
return nullptr;
}

jstring result = nullptr;
ctx.callResultEndpointApi<jstring>(
&result,
[&ctx, &env, &thiz, &event_type, &selector_type, &selector_id]() {
std::string query_result_c = getInboxApi(ctx, thiz)->buildSubscriptionQuery(
static_cast<inbox::EventType>(event_type),
static_cast<inbox::EventSelectorType>(selector_type),
ctx.jString2string(selector_id)
);
return ctx->NewStringUTF(query_result_c.c_str());
}
);
if (ctx->ExceptionCheck()) {
return nullptr;
}
return result;
}
Loading