Skip to content
Merged
Show file tree
Hide file tree
Changes from 6 commits
Commits
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
109 changes: 109 additions & 0 deletions privmx-endpoint/src/main/cpp/modules/Connection.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
#include "../utils.hpp"
#include "../parser.h"
#include "../exceptions.h"
using namespace privmx::endpoint;

privmx::endpoint::core::Connection *getConnection(JNIEnv *env, jobject thiz) {
JniContextUtils ctx(env);
Expand Down Expand Up @@ -315,4 +316,112 @@ Java_com_simplito_java_privmx_1endpoint_modules_core_Connection_getContextUsers(
return nullptr;
}
return result;
}

extern "C"
JNIEXPORT jobject JNICALL
Java_com_simplito_java_privmx_1endpoint_modules_core_Connection_subscribeFor(
JNIEnv *env,
jobject thiz,
jobject subscription_queries
) {
JniContextUtils ctx(env);
if (ctx.nullCheck(subscription_queries, "Subscription queries")) {
return nullptr;
}

jobject result;
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>();

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

auto subscription_ids_c = getConnection(env, thiz)->subscribeFor(
subscription_queries_c);

jobject array = env->NewObject(arrayListCls, initMID);
for (auto &id: subscription_ids_c) {
ctx->CallBooleanMethod(
array,
addToListMID,
ctx->NewStringUTF(id.c_str())
);
}
return array;
}
);
if (ctx->ExceptionCheck()) {
return nullptr;
}
return result;
}

extern "C"
JNIEXPORT void JNICALL
Java_com_simplito_java_privmx_1endpoint_modules_core_Connection_unsubscribeFrom(
JNIEnv *env,
jobject thiz,
jobject subscription_ids
) {
JniContextUtils ctx(env);
if (ctx.nullCheck(subscription_ids, "Subscription IDs")) {
return;
}

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

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

getConnection(env, thiz)->unsubscribeFrom(subscription_ids_c);
}
);
}

extern "C"
JNIEXPORT jstring JNICALL
Java_com_simplito_java_privmx_1endpoint_modules_core_Connection_buildSubscriptionQuery(
JNIEnv *env,
jobject thiz,
jlong event_type,
jlong selector_type,
jstring selector_id
) {
JniContextUtils ctx(env);
if (ctx.nullCheck(selector_id, "Selector ID")) {
return nullptr;
}

jstring result;
ctx.callResultEndpointApi<jstring>(
&result,
[&ctx, &env, &thiz, &event_type, &selector_type, &selector_id]() {
auto result = getConnection(env, thiz)->buildSubscriptionQuery(
static_cast<core::EventType>(event_type),
static_cast<core::EventSelectorType>(selector_type),
ctx.jString2string(selector_id)
);
return ctx->NewStringUTF(result.c_str());
}
);
if (ctx->ExceptionCheck()) {
return nullptr;
}
return result;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.simplito.java.privmx_endpoint.model.events.eventSelectorTypes;

import com.simplito.java.privmx_endpoint.model.events.eventTypes.ConnectionEventType;

/**
* The scope or area of the event you want to listen (subscribe) for.
* Defines where the event specified by {@link ConnectionEventType} happened.
*
* @category core
* @group EventSelectorTypes
*/
public enum ConnectionEventSelectorType implements EventSelectorType {
CONTEXT_ID
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.simplito.java.privmx_endpoint.model.events.eventTypes;

/**
* The type of event you want to listen (subscribe) for.
* Determines kind of action performed on a Connection.
*
* @category core
* @group EventTypes
*/
public enum ConnectionEventType implements EventType{
USER_ADD,
USER_REMOVE,
USER_STATUS
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@
import com.simplito.java.privmx_endpoint.model.PKIVerificationOptions;
import com.simplito.java.privmx_endpoint.model.PagingList;
import com.simplito.java.privmx_endpoint.model.UserInfo;
import com.simplito.java.privmx_endpoint.model.events.eventSelectorTypes.ConnectionEventSelectorType;
import com.simplito.java.privmx_endpoint.model.events.eventTypes.ConnectionEventType;
import com.simplito.java.privmx_endpoint.model.exceptions.NativeException;
import com.simplito.java.privmx_endpoint.model.exceptions.PrivmxException;

Expand Down Expand Up @@ -258,6 +260,34 @@ public PagingList<Context> listContexts(long skip, long limit, String sortOrder,
*/
public native void setUserVerifier(UserVerifierInterface userVerifier) throws IllegalStateException, PrivmxException, NativeException;

/**
* Subscribe for the Context events on the given subscription query.
*
* @param subscriptionQueries List of queries
* @return List of subscriptionIds in matching order to subscriptionQueries
*/
public native List<String> subscribeFor(List<String> subscriptionQueries);

/**
* Unsubscribe from events for the given subscriptionId.
*
* @param subscriptionIds List of subscriptionId
*/
public native void unsubscribeFrom(List<String> subscriptionIds);

/**
* Generate subscription Query for the Context events.
*
* @param eventType Type of event which you listen for
* @param selectorType Scope on which you listen for events
* @param selectorId ID of the selector
*/
public String buildSubscriptionQuery(ConnectionEventType eventType, ConnectionEventSelectorType selectorType, String selectorId) {
return buildSubscriptionQuery((long) eventType.ordinal(), (long) selectorType.ordinal(), selectorId);
}

private native String buildSubscriptionQuery(long eventType, long selectorType, String selectorId);

/**
* If there is an active connection then it
* disconnects from PrivMX Bridge and frees memory making this instance not reusable.
Expand Down