diff --git a/jni-wrappers/privmx-endpoint/includes/privmx/endpoint/wrapper/parsers/parser.h b/jni-wrappers/privmx-endpoint/includes/privmx/endpoint/wrapper/parsers/parser.h index d5d85c62..fb03c443 100644 --- a/jni-wrappers/privmx-endpoint/includes/privmx/endpoint/wrapper/parsers/parser.h +++ b/jni-wrappers/privmx-endpoint/includes/privmx/endpoint/wrapper/parsers/parser.h @@ -54,6 +54,10 @@ privmx::endpoint::core::PagingQuery parsePagingQuery(JniContextUtils &ctx, jobje // java -> c++ +template +std::vector jArrayToVector(JniContextUtils &ctx, jobjectArray jArray, + std::function fun, bool acceptNullValues); + template std::vector jArrayToVector(JniContextUtils &ctx, jobjectArray jArray, std::function fun); @@ -64,7 +68,12 @@ std::string jobject2string(JniContextUtils &ctx, jobject jString); // c++ -> java template -jobject vectorTojArray(JniContextUtils &ctx, const std::vector &vector,F fun){ +jobject vectorTojArray( + JniContextUtils &ctx, + const std::vector &vector, + F fun, + bool acceptNullValues +) { jclass arrayListCls = ctx->FindClass("java/util/ArrayList"); jmethodID initMID = ctx->GetMethodID(arrayListCls, "", "()V"); jmethodID addToListMID = ctx->GetMethodID(arrayListCls, "add", "(Ljava/lang/Object;)Z"); @@ -73,16 +82,24 @@ jobject vectorTojArray(JniContextUtils &ctx, const std::vector &vector,F fun) for (const auto &item: vector) { jobject jItem = fun(ctx, item); + if (!acceptNullValues) { + if (ctx.nullCheck(jItem, "Array element")) {return nullptr;} + } + ctx->CallBooleanMethod(listObj, addToListMID, jItem); } - return listObj; } template -jobject pagingList2Java(JniContextUtils &ctx, privmx::endpoint::core::PagingList pagingList,F fun); +jobject vectorTojArray(JniContextUtils &ctx, const std::vector &vector, F fun) { + return vectorTojArray(ctx, vector, fun, true); +} + +template +jobject pagingList2Java(JniContextUtils &ctx, privmx::endpoint::core::PagingList pagingList, F fun); -jobject string2jobject(JniContextUtils &ctx,const std::string &cstring); -jobject long2jobject(JniContextUtils &ctx,const int64_t &clong); +jobject string2jobject(JniContextUtils &ctx, const std::string &cstring); +jobject long2jobject(JniContextUtils &ctx, const int64_t &clong); #endif //PRIVMX_POCKET_LIB_PARSER_H diff --git a/jni-wrappers/privmx-endpoint/src/cpp/modules/StreamApiLow.cpp b/jni-wrappers/privmx-endpoint/src/cpp/modules/StreamApiLow.cpp index 4812a4ae..5761c948 100644 --- a/jni-wrappers/privmx-endpoint/src/cpp/modules/StreamApiLow.cpp +++ b/jni-wrappers/privmx-endpoint/src/cpp/modules/StreamApiLow.cpp @@ -212,7 +212,7 @@ Java_com_simplito_java_privmx_1endpoint_modules_stream_StreamApiLow_listStreamRo jlong limit, jstring sort_order, jstring last_id, - jstring sort_by, // todo - use in this impl. + jstring sort_by, jstring query_as_json ) { JniContextUtils ctx(env); @@ -236,18 +236,6 @@ Java_com_simplito_java_privmx_1endpoint_modules_stream_StreamApiLow_listStreamRo &sort_by, &query_as_json ]() { - jclass pagingListCls = env->FindClass( - "com/simplito/java/privmx_endpoint/model/PagingList"); - jmethodID pagingListInitMID = env->GetMethodID( - pagingListCls, "", - "(Ljava/lang/Long;Ljava/util/List;)V"); - jclass arrayCls = env->FindClass("java/util/ArrayList"); - jmethodID initArrayMID = env->GetMethodID(arrayCls, - "", - "()V"); - jmethodID addToArrayMID = env->GetMethodID(arrayCls, - "add", - "(Ljava/lang/Object;)Z"); auto query = core::PagingQuery(); query.skip = skip; query.limit = limit; @@ -268,22 +256,14 @@ Java_com_simplito_java_privmx_1endpoint_modules_stream_StreamApiLow_listStreamRo query ) ); - jobject array = env->NewObject(arrayCls, initArrayMID); - for (auto &streamRoom_c: streamRooms_c.readItems) { - env->CallBooleanMethod(array, - addToArrayMID, - privmx::wrapper::streamRoom2Java( - ctx, - streamRoom_c - ) - ); - } - return ctx->NewObject( - pagingListCls, - pagingListInitMID, - ctx.long2jLong(streamRooms_c.totalAvailable), - array + + jobject array = pagingList2Java( + ctx, + streamRooms_c, + privmx::wrapper::streamRoom2Java ); + + return array; } ); if (ctx->ExceptionCheck()) { @@ -343,7 +323,6 @@ Java_com_simplito_java_privmx_1endpoint_modules_stream_StreamApiLow_createStream JNIEnv *env, jobject thiz, jstring stream_room_id - // todo - made changes in arguments ) { JniContextUtils ctx(env); if (ctx.nullCheck(stream_room_id, "Stream room ID")) @@ -372,7 +351,6 @@ Java_com_simplito_java_privmx_1endpoint_modules_stream_StreamApiLow_publishStrea JNIEnv *env, jobject thiz, jobject stream_handle - // todo - made changes in arguments ) { JniContextUtils ctx(env); if (ctx.nullCheck(stream_handle, "Stream Handle")) @@ -405,7 +383,7 @@ Java_com_simplito_java_privmx_1endpoint_modules_stream_StreamApiLow_joinStreamRo ) { JniContextUtils ctx(env); if (ctx.nullCheck(stream_room_id, "Stream room ID") || - ctx.nullCheck(web_rtc, "webRtc")) { + ctx.nullCheck(web_rtc, "webRtc")) { return; } @@ -434,21 +412,16 @@ Java_com_simplito_java_privmx_1endpoint_modules_stream_StreamApiLow_listStreams( jobject result; ctx.callResultEndpointApi(&result, [&ctx, &thiz, &env, &stream_room_id] { - jclass arrayCls = env->FindClass("java/util/ArrayList"); - jmethodID initArrayMID = env->GetMethodID(arrayCls, "", "()V"); - jmethodID addToArrayMID = env->GetMethodID(arrayCls, "add", "(Ljava/lang/Object;)Z"); - auto stream_infos_c = getStreamApi(ctx, thiz)->listStreams( ctx.jString2string(stream_room_id) ); - jobject array = env->NewObject(arrayCls, initArrayMID); - for (auto &info_c: stream_infos_c) { - env->CallBooleanMethod( - array, - addToArrayMID, - privmx::wrapper::streamInfo2Java(ctx, info_c) - ); - } + + jobject array = vectorTojArray( + ctx, + stream_infos_c, + privmx::wrapper::streamInfo2Java + ); + return array; }); if (ctx->ExceptionCheck()) { @@ -463,7 +436,6 @@ Java_com_simplito_java_privmx_1endpoint_modules_stream_StreamApiLow_unpublishStr JNIEnv *env, jobject thiz, jobject stream_handle - // todo - made changes in arguments ) { JniContextUtils ctx(env); if (ctx.nullCheck(stream_handle, "Stream Handle")) { @@ -483,7 +455,6 @@ Java_com_simplito_java_privmx_1endpoint_modules_stream_StreamApiLow_leaveStreamR JNIEnv *env, jobject thiz, jstring stream_room_id - // todo - made changes in arguments ) { JniContextUtils ctx(env); if (ctx.nullCheck(stream_room_id, "Stream Room ID")) { @@ -506,20 +477,12 @@ Java_com_simplito_java_privmx_1endpoint_modules_stream_StreamApiLow_getTurnCrede JniContextUtils ctx(env); jobject result; ctx.callResultEndpointApi(&result, [&ctx, &env, &thiz] { - jclass arrayCls = env->FindClass("java/util/ArrayList"); - jmethodID initArrayMID = env->GetMethodID(arrayCls, "", "()V"); - jmethodID addToArrayMID = env->GetMethodID(arrayCls, "add", "(Ljava/lang/Object;)Z"); - auto turnCredentialsVector = getStreamApi(ctx, thiz)->getTurnCredentials(); - jobject array = env->NewObject(arrayCls, initArrayMID); - for ( - auto &turnCredentials_c: turnCredentialsVector) { - env->CallBooleanMethod( - array, - addToArrayMID, - privmx::wrapper::turnCredentials2Java(ctx, turnCredentials_c) - ); - } + auto array = vectorTojArray( + ctx, + turnCredentialsVector, + privmx::wrapper::turnCredentials2Java + ); return array; }); @@ -535,37 +498,28 @@ Java_com_simplito_java_privmx_1endpoint_modules_stream_StreamApiLow_subscribeFor JNIEnv *env, jobject thiz, jobject subscription_queries - // todo - made changes in arguments ) { JniContextUtils ctx(env); jobject result; ctx.callResultEndpointApi(&result, [&ctx, &env, &thiz, &subscription_queries] { - jclass arrayListCls = env->FindClass("java/util/ArrayList"); - jmethodID initMID = env->GetMethodID(arrayListCls, "", "()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(); - - 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)); - } + std::vector subscription_queries_c = jArrayToVector( + ctx, + subscription_queries_arr, + jobject2string, + false + ); - jobject arrayList = env->NewObject(arrayListCls, initMID); auto subscription_ids_c = getStreamApi(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 - ); - } + auto arrayList = vectorTojArray( + ctx, + subscription_ids_c, + string2jobject + ); + return arrayList; }); @@ -581,9 +535,7 @@ Java_com_simplito_java_privmx_1endpoint_modules_stream_StreamApiLow_unsubscribeF JNIEnv *env, jobject thiz, jobject subscription_ids - // todo - made changes in arguments ) { -//TODO: Add nullchecks JniContextUtils ctx(env); if (ctx.nullCheck(subscription_ids, "Subscription ids")) { return; @@ -591,17 +543,12 @@ Java_com_simplito_java_privmx_1endpoint_modules_stream_StreamApiLow_unsubscribeF ctx.callVoidEndpointApi([&ctx, &thiz, &subscription_ids]() { auto subscription_ids_arr = ctx.jObject2jArray(subscription_ids); - auto subscription_ids_c = std::vector(); - - 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)); - } - + auto subscription_ids_c = jArrayToVector( + ctx, + subscription_ids_arr, + jobject2string, + false + ); getStreamApi(ctx, thiz)->unsubscribeFrom(subscription_ids_c); }); } @@ -645,10 +592,7 @@ Java_com_simplito_java_privmx_1endpoint_modules_stream_StreamApiLow_keyManagemen jobject thiz, jstring stream_room_id, jboolean disable - // todo - made changes in arguments - ) { -//TODO: Add nullchecks JniContextUtils ctx(env); if (ctx.nullCheck(stream_room_id, "Stream Room ID")) { return; @@ -694,27 +638,18 @@ Java_com_simplito_java_privmx_1endpoint_modules_stream_StreamApiLow_unsubscribeF ) { JniContextUtils ctx(env); if (ctx.nullCheck(stream_room_id, "Stream Room ID") || - ctx.nullCheck(subscriptions_to_remove, "Subscriptions to remove")) { + ctx.nullCheck(subscriptions_to_remove, "Subscriptions to remove")) { return; } ctx.callVoidEndpointApi([&ctx, &thiz, &stream_room_id, &subscriptions_to_remove]() { auto subscriptions_to_remove_arr = ctx.jObject2jArray(subscriptions_to_remove); - auto subscriptions_to_remove_c = std::vector(); - - int length = ctx->GetArrayLength(subscriptions_to_remove_arr); - for (int i = 0; i < length; i++) { - jobject arrayElement = ctx->GetObjectArrayElement(subscriptions_to_remove_arr, i); - if (ctx.nullCheck(arrayElement, "Subscriptions to remove array elements")) { - return; - } - subscriptions_to_remove_c.push_back( - parseStreamSubscription( - ctx, - arrayElement - ) - ); - } + auto subscriptions_to_remove_c = jArrayToVector( + ctx, + subscriptions_to_remove_arr, + parseStreamSubscription, + false + ); getStreamApi(ctx, thiz)->unsubscribeFromRemoteStreams( ctx.jString2string(stream_room_id), @@ -735,9 +670,9 @@ Java_com_simplito_java_privmx_1endpoint_modules_stream_StreamApiLow_modifyRemote ) { JniContextUtils ctx(env); if (ctx.nullCheck(stream_room_id, "Stream Room ID") || - ctx.nullCheck(subscriptions_to_add, "Subscriptions to add") || - ctx.nullCheck(subscriptions_to_add, "Subscriptions to remove") || - ctx.nullCheck(options, "Options")) { + ctx.nullCheck(subscriptions_to_add, "Subscriptions to add") || + ctx.nullCheck(subscriptions_to_add, "Subscriptions to remove") || + ctx.nullCheck(options, "Options")) { return; } @@ -745,38 +680,19 @@ Java_com_simplito_java_privmx_1endpoint_modules_stream_StreamApiLow_modifyRemote [&ctx, &thiz, &stream_room_id, &subscriptions_to_add, &subscriptions_to_remove, &options]() { auto subscriptions_to_add_arr = ctx.jObject2jArray(subscriptions_to_remove); auto subscriptions_to_remove_arr = ctx.jObject2jArray(subscriptions_to_remove); - auto subscriptions_to_add_c = std::vector(); - auto subscriptions_to_remove_c = std::vector(); - - int subscriptions_to_add_length = ctx->GetArrayLength(subscriptions_to_add_arr); - int subscriptions_to_remove_length = ctx->GetArrayLength( - subscriptions_to_remove_arr); - - for (int i = 0; i < subscriptions_to_add_length; i++) { - jobject arrayElement = ctx->GetObjectArrayElement(subscriptions_to_add_arr, i); - if (ctx.nullCheck(arrayElement, "Subscriptions to add array elements")) { - return; - } - subscriptions_to_add_c.push_back( - parseStreamSubscription( - ctx, - arrayElement - ) - ); - } - for (int i = 0; i < subscriptions_to_remove_length; i++) { - jobject arrayElement = ctx->GetObjectArrayElement(subscriptions_to_remove_arr, - i); - if (ctx.nullCheck(arrayElement, "Subscriptions to remove array elements")) { - return; - } - subscriptions_to_remove_c.push_back( - parseStreamSubscription( - ctx, - arrayElement - ) - ); - } + + auto subscriptions_to_add_c = jArrayToVector( + ctx, + subscriptions_to_add_arr, + parseStreamSubscription, + false + ); + auto subscriptions_to_remove_c = jArrayToVector( + ctx, + subscriptions_to_remove_arr, + parseStreamSubscription, + false + ); getStreamApi(ctx, thiz)->modifyRemoteStreamsSubscriptions( ctx.jString2string(stream_room_id), @@ -797,27 +713,18 @@ Java_com_simplito_java_privmx_1endpoint_modules_stream_StreamApiLow_subscribeToR ) { JniContextUtils ctx(env); if (ctx.nullCheck(stream_room_id, "Stream Room ID") || - ctx.nullCheck(subscriptions, "Subscriptions") || - ctx.nullCheck(options, "Options")) { + ctx.nullCheck(subscriptions, "Subscriptions") || + ctx.nullCheck(options, "Options")) { return; } ctx.callVoidEndpointApi([&ctx, &thiz, &stream_room_id, &subscriptions, &options]() { auto subscriptions_arr = ctx.jObject2jArray(subscriptions); - auto subscriptions_c = std::vector(); - - int length = ctx->GetArrayLength(subscriptions_arr); - for (int i = 0; i < length; i++) { - jobject arrayElement = ctx->GetObjectArrayElement(subscriptions_arr, i); - if (ctx.nullCheck(arrayElement, "Subscriptions array elements")) { - return; - } - subscriptions_c.push_back( - parseStreamSubscription( - ctx, - arrayElement - ) - ); - } + auto subscriptions_c = jArrayToVector( + ctx, + subscriptions_arr, + parseStreamSubscription, + false + ); getStreamApi(ctx, thiz)->subscribeToRemoteStreams( ctx.jString2string(stream_room_id), @@ -863,6 +770,7 @@ Java_com_simplito_java_privmx_1endpoint_modules_stream_StreamApiLow_updateStream } return result; } + extern "C" JNIEXPORT void JNICALL Java_com_simplito_java_privmx_1endpoint_modules_stream_StreamApiLow_acceptOfferOnReconfigure( @@ -877,7 +785,6 @@ Java_com_simplito_java_privmx_1endpoint_modules_stream_StreamApiLow_acceptOfferO } ctx.callVoidEndpointApi([&ctx, &thiz, &session_id, &sdp]() { - getStreamApi(ctx, thiz)->acceptOfferOnReconfigure( session_id, parseSdpWithTypeModel(ctx, sdp) diff --git a/jni-wrappers/privmx-endpoint/src/cpp/parsers/parser.cpp b/jni-wrappers/privmx-endpoint/src/cpp/parsers/parser.cpp index 724be9fd..a2a1c30d 100644 --- a/jni-wrappers/privmx-endpoint/src/cpp/parsers/parser.cpp +++ b/jni-wrappers/privmx-endpoint/src/cpp/parsers/parser.cpp @@ -909,17 +909,35 @@ template std::vector jArrayToVector( JniContextUtils &ctx, jobjectArray jArray, - std::function fun + std::function fun, + bool acceptNullValues ) { std::vector result; for (int i = 0; i < ctx->GetArrayLength(jArray); i++) { jobject element = ctx->GetObjectArrayElement(jArray, i); + + if (!acceptNullValues) { + if (ctx.nullCheck(element, "Array element")) { + return{}; + } + } + result.push_back(fun(ctx, element)); } + return result; } +template +std::vector jArrayToVector( + JniContextUtils &ctx, + jobjectArray jArray, + std::function fun +) { + return jArrayToVector(ctx, jArray, fun, true); +} + int64_t jobject2long(JniContextUtils &ctx, jobject jLong) { jclass longClass = ctx->FindClass("java/lang/Long"); jmethodID longValueMethod = ctx->GetMethodID(longClass, "longValue", "()J");