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;
}