diff --git a/privmx-endpoint/src/main/cpp/modules/StreamApi.cpp b/privmx-endpoint/src/main/cpp/modules/StreamApi.cpp index 6cc1fbce..ffb08194 100644 --- a/privmx-endpoint/src/main/cpp/modules/StreamApi.cpp +++ b/privmx-endpoint/src/main/cpp/modules/StreamApi.cpp @@ -56,4 +56,99 @@ Java_com_simplito_java_privmx_1endpoint_modules_stream_StreamApi_deinit( e.what() ); } +} + +extern "C" +JNIEXPORT jobject JNICALL +Java_com_simplito_java_privmx_1endpoint_modules_stream_StreamApi_subscribeFor( + JNIEnv *env, + jobject thiz, + jobject subscription_queries +) { + JniContextUtils ctx(env); + if (ctx.nullCheck(subscription_queries, "Subscription queries")) { + return nullptr; + } + + jobject result; + ctx.callResultEndpointApi( + &result, + [&ctx, &thiz, &subscription_queries]() -> jobject { + + std::vector queries = jArrayToVector( + ctx, + ctx.jObject2jArray(subscription_queries), + jobject2string + ); + + std::vector subscription_ids_c = + getStreamApi(ctx, thiz)->subscribeFor(queries); + + return vectorTojArray( + ctx, + subscription_ids_c, + string2jobject + ); + } + ); + if (ctx->ExceptionCheck()) { + return nullptr; + } + return result; +} + +extern "C" +JNIEXPORT jstring JNICALL +Java_com_simplito_java_privmx_1endpoint_modules_stream_StreamApi_buildSubscriptionQuery( + JNIEnv *env, + jobject thiz, + jlong event_type, + jlong selector_type, + jstring selector_id +) { + JniContextUtils ctx(env); + if (ctx.nullCheck(selector_id, "SelectorID")) { + return nullptr; + } + + jstring result = nullptr; + ctx.callResultEndpointApi( + &result, + [&ctx, &thiz, &event_type, &selector_type, &selector_id]() { + std::string query_result_c = getStreamApi(ctx, thiz)->buildSubscriptionQuery( + static_cast(event_type), + static_cast(selector_type), + ctx.jString2string(selector_id) + ); + return ctx->NewStringUTF(query_result_c.c_str()); + } + ); + if (ctx->ExceptionCheck()) { + return nullptr; + } + return result; +} + +extern "C" +JNIEXPORT void JNICALL +Java_com_simplito_java_privmx_1endpoint_modules_stream_StreamApi_unsubscribeFrom( + JNIEnv *env, + jobject thiz, + jobject subscription_ids +) { + JniContextUtils ctx(env); + if (ctx.nullCheck(subscription_ids, "Subscription IDs")) { + return; + } + + ctx.callVoidEndpointApi([&ctx, &thiz, &subscription_ids]() { + auto subscription_ids_arr = ctx.jObject2jArray(subscription_ids); + auto subscription_ids_c = jArrayToVector( + ctx, + subscription_ids_arr, + jobject2string + ); + + getStreamApi(ctx, thiz)->unsubscribeFrom(subscription_ids_c); + }); } \ No newline at end of file diff --git a/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/model/events/eventSelectorTypes/StreamEventSelectorType.java b/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/model/events/eventSelectorTypes/StreamEventSelectorType.java new file mode 100644 index 00000000..8d487955 --- /dev/null +++ b/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/model/events/eventSelectorTypes/StreamEventSelectorType.java @@ -0,0 +1,7 @@ +package com.simplito.java.privmx_endpoint.model.events.eventSelectorTypes; + +public enum StreamEventSelectorType implements EventSelectorType{ + CONTEXT_ID, + STREAMROOM_ID, + STREAM_ID +} diff --git a/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/model/events/eventTypes/StreamEventType.java b/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/model/events/eventTypes/StreamEventType.java new file mode 100644 index 00000000..54f7f7ad --- /dev/null +++ b/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/model/events/eventTypes/StreamEventType.java @@ -0,0 +1,11 @@ +package com.simplito.java.privmx_endpoint.model.events.eventTypes; + +public enum StreamEventType implements EventType{ + STREAMROOM_CREATE, + STREAMROOM_UPDATE, + STREAMROOM_DELETE, + STREAM_JOIN, + STREAM_LEAVE, + STREAM_PUBLISH, + STREAM_UNPUBLISH +} diff --git a/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/StreamApi.java b/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/StreamApi.java index 6f7b512f..191a6df9 100644 --- a/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/StreamApi.java +++ b/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/StreamApi.java @@ -1,9 +1,12 @@ package com.simplito.java.privmx_endpoint.modules.stream; import com.simplito.java.privmx_endpoint.LibLoader; +import com.simplito.java.privmx_endpoint.model.events.eventSelectorTypes.StreamEventSelectorType; +import com.simplito.java.privmx_endpoint.model.events.eventTypes.StreamEventType; import com.simplito.java.privmx_endpoint.modules.core.Connection; import com.simplito.java.privmx_endpoint.modules.event.EventApi; +import java.util.List; import java.util.Objects; public class StreamApi implements AutoCloseable { @@ -23,6 +26,20 @@ public StreamApi(Connection connection, EventApi eventApi) throws IllegalStateEx this.api = init(connection, eventApi); } + public native List subscribeFor(List subscriptionQueries); + + public String buildSubscriptionQuery(StreamEventType eventType, StreamEventSelectorType selectorType, String selectorId) { + return buildSubscriptionQuery( + eventType.ordinal(), + selectorType.ordinal(), + selectorId + ); + } + + private native String buildSubscriptionQuery(long eventType, long selectorType, String selectorId); + + public native void unsubscribeFrom(List subscriptionIds); + @Override public void close() throws Exception { deinit();