JNIEXPORT jint JNICALL Java_com_fazecast_jSerialComm_SerialPort_readBytes()

in src/main/c/Windows/SerialPort_Windows.c [1271:1318]


JNIEXPORT jint JNICALL Java_com_fazecast_jSerialComm_SerialPort_readBytes(JNIEnv *env, jobject obj, jlong serialPortPointer, jbyteArray buffer, jint bytesToRead, jint offset, jint timeoutMode, jint readTimeout)
{
	// Ensure that a positive number of bytes was passed in to read
	jsize bufferLength = (*env)->GetArrayLength(env, buffer);
	serialPort *port = (serialPort*)(intptr_t)serialPortPointer;
	if ((bytesToRead < 0) || (offset < 0) || (bufferLength < offset))
		return -1;

	// Fetch a pointer to the underlying data buffer
	if ((bytesToRead + offset) > bufferLength)
		bytesToRead = bufferLength - offset;
	jbyte *readBuffer = (*env)->GetByteArrayElements(env, buffer, NULL);
	if (checkJniError(env, __LINE__ - 1) || !readBuffer)
		return -1;

	// Create an asynchronous result structure
	OVERLAPPED overlappedStruct;
	memset(&overlappedStruct, 0, sizeof(OVERLAPPED));
	overlappedStruct.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
	if (overlappedStruct.hEvent == NULL)
	{
		port->errorNumber = GetLastError();
		port->errorLineNumber = __LINE__ - 4;
		CloseHandle(overlappedStruct.hEvent);
		(*env)->ReleaseByteArrayElements(env, buffer, readBuffer, JNI_ABORT);
		return -1;
	}

	// Read from the serial port
	BOOL result;
	DWORD numBytesRead = 0;
	if (((result = ReadFile(port->handle, readBuffer + offset, bytesToRead, NULL, &overlappedStruct)) == FALSE) && (GetLastError() != ERROR_IO_PENDING))
	{
		port->errorLineNumber = __LINE__ - 2;
		port->errorNumber = GetLastError();
	}
	else if ((result = GetOverlappedResult(port->handle, &overlappedStruct, &numBytesRead, TRUE)) == FALSE)
	{
		port->errorLineNumber = __LINE__ - 2;
		port->errorNumber = GetLastError();
	}

	// Return number of bytes read
	CloseHandle(overlappedStruct.hEvent);
	(*env)->ReleaseByteArrayElements(env, buffer, readBuffer, (result == TRUE) ? 0 : JNI_ABORT);
	checkJniError(env, __LINE__ - 1);
	return (result == TRUE) ? numBytesRead : -1;
}