JNIEXPORT void JNICALL Java_com_fazecast_jSerialComm_SerialPort_retrievePortDetails()

in src/main/c/Posix/SerialPort_Posix.c [434:495]


JNIEXPORT void JNICALL Java_com_fazecast_jSerialComm_SerialPort_retrievePortDetails(JNIEnv *env, jobject obj)
{
	// Retrieve the serial port parameter fields
	jstring portNameJString = (jstring)(*env)->GetObjectField(env, obj, comPortField);
	if (checkJniError(env, __LINE__ - 1)) return;
	const char *portName = (*env)->GetStringUTFChars(env, portNameJString, NULL);
	if (checkJniError(env, __LINE__ - 1)) return;

	// Ensure that the serial port exists
	pthread_mutex_lock(&criticalSection);
	if (!portsEnumerated)
		enumeratePorts();
	serialPort *port = fetchPort(&serialPorts, portName);
	char continueRetrieval = (port != NULL);

	// Fill in the Java-side port details
	if (continueRetrieval)
	{
		(*env)->SetObjectField(env, obj, portDescriptionField, (*env)->NewStringUTF(env, port->portDescription));
		if (checkJniError(env, __LINE__ - 1)) continueRetrieval = 0;
	}
	if (continueRetrieval)
	{
		(*env)->SetObjectField(env, obj, friendlyNameField, (*env)->NewStringUTF(env, port->friendlyName));
		if (checkJniError(env, __LINE__ - 1)) continueRetrieval = 0;
	}
	if (continueRetrieval)
	{
		(*env)->SetObjectField(env, obj, portLocationField, (*env)->NewStringUTF(env, port->portLocation));
		if (checkJniError(env, __LINE__ - 1)) continueRetrieval = 0;
	}
	if (continueRetrieval)
	{
		(*env)->SetObjectField(env, obj, serialNumberField, (*env)->NewStringUTF(env, port->serialNumber));
		if (checkJniError(env, __LINE__ - 1)) continueRetrieval = 0;
	}
	if (continueRetrieval)
	{
		(*env)->SetObjectField(env, obj, manufacturerField, (*env)->NewStringUTF(env, port->manufacturer));
		if (checkJniError(env, __LINE__ - 1)) continueRetrieval = 0;
	}
	if (continueRetrieval)
	{
		(*env)->SetObjectField(env, obj, deviceDriverField, (*env)->NewStringUTF(env, port->deviceDriver));
		if (checkJniError(env, __LINE__ - 1)) continueRetrieval = 0;
	}
	if (continueRetrieval)
	{
		(*env)->SetIntField(env, obj, vendorIdField, port->vendorID);
		if (checkJniError(env, __LINE__ - 1)) continueRetrieval = 0;
	}
	if (continueRetrieval)
	{
		(*env)->SetIntField(env, obj, productIdField, port->productID);
		if (checkJniError(env, __LINE__ - 1)) continueRetrieval = 0;
	}

	// Release all JNI structures
	pthread_mutex_unlock(&criticalSection);
	(*env)->ReleaseStringUTFChars(env, portNameJString, portName);
	checkJniError(env, __LINE__ - 1);
}