STATUS KinesisVideoClientWrapper::putStreamFunc()

in src/JNI/com/amazonaws/kinesis/video/producer/jni/KinesisVideoClientWrapper.cpp [2114:2200]


STATUS KinesisVideoClientWrapper::putStreamFunc(UINT64 customData,
                                          PCHAR streamName,
                                          PCHAR containerType,
                                          UINT64 streamStartTime,
                                          BOOL absoluteFragmentTimestamp,
                                          BOOL ackRequired,
                                          PCHAR streamingEndpoint,
                                          PServiceCallContext pCallbackContext)
{
    DLOGS("TID 0x%016" PRIx64 " putStreamFunc called.", GETTID());

    KinesisVideoClientWrapper *pWrapper = FROM_WRAPPER_HANDLE(customData);
    CHECK(pWrapper != NULL);

    // Get the ENV from the JavaVM
    JNIEnv *env;
    BOOL detached = FALSE;
    STATUS retStatus = STATUS_SUCCESS;
    jstring jstrStreamName = NULL, jstrContainerType = NULL, jstrStreamingEndpoint = NULL;
    jbyteArray authByteArray = NULL;

    INT32 envState = pWrapper->mJvm->GetEnv((PVOID*) &env, JNI_VERSION_1_6);
    if (envState == JNI_EDETACHED) {
        ATTACH_CURRENT_THREAD_TO_JVM(env);

        // Store the detached so we can detach the thread after the call
        detached = TRUE;
    }

    // Call the Java func
    jstrStreamName = env->NewStringUTF(streamName);
    jstrContainerType = env->NewStringUTF(containerType);
    jstrStreamingEndpoint = env->NewStringUTF(streamingEndpoint);
    authByteArray = env->NewByteArray(pCallbackContext->pAuthInfo->size);
    if (jstrStreamName == NULL ||
            jstrContainerType == NULL ||
            jstrStreamingEndpoint == NULL ||
            authByteArray == NULL) {
        retStatus = STATUS_NOT_ENOUGH_MEMORY;
        goto CleanUp;
    }

    // Copy the bits into the managed array
    env->SetByteArrayRegion(authByteArray,
                            0,
                            pCallbackContext->pAuthInfo->size,
                            (const jbyte*) pCallbackContext->pAuthInfo->data);

    // Invoke the callback
    retStatus = env->CallIntMethod(pWrapper->mGlobalJniObjRef,
                                   pWrapper->mPutStreamMethodId,
                                   jstrStreamName,
                                   jstrContainerType,
                                   streamStartTime,
                                   absoluteFragmentTimestamp == TRUE,
                                   ackRequired == TRUE,
                                   jstrStreamingEndpoint,
                                   pCallbackContext->callAfter,
                                   pCallbackContext->timeout,
                                   authByteArray,
                                   pCallbackContext->pAuthInfo->type,
                                   pCallbackContext->customData
    );

    CHK_JVM_EXCEPTION(env);

CleanUp:

    if (jstrStreamName != NULL) {
        env->DeleteLocalRef(jstrStreamName);
    }

    if (jstrContainerType != NULL) {
        env->DeleteLocalRef(jstrContainerType);
    }

    if (authByteArray != NULL) {
        env->DeleteLocalRef(authByteArray);
    }

    // Detach the thread if we have attached it to JVM
    if (detached) {
        pWrapper->mJvm->DetachCurrentThread();
    }

    return retStatus;
}