in src/main/c/Windows/SerialPort_Windows.c [1320:1367]
JNIEXPORT jint JNICALL Java_com_fazecast_jSerialComm_SerialPort_writeBytes(JNIEnv *env, jobject obj, jlong serialPortPointer, jbyteArray buffer, jint bytesToWrite, jint offset, jint timeoutMode)
{
// Ensure that a positive number of bytes was passed in to write
serialPort *port = (serialPort*)(intptr_t)serialPortPointer;
if ((bytesToWrite < 0) || (offset < 0))
return -1;
// Fetch a pointer to the underlying data buffer
jsize bufferLength = (*env)->GetArrayLength(env, buffer);
if ((bytesToWrite + offset) > bufferLength)
bytesToWrite = bufferLength - offset;
jbyte *writeBuffer = (*env)->GetByteArrayElements(env, buffer, NULL);
if (checkJniError(env, __LINE__ - 1) || !writeBuffer)
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, writeBuffer, JNI_ABORT);
return -1;
}
// Write to the serial port
BOOL result;
DWORD numBytesWritten = 0;
if (((result = WriteFile(port->handle, writeBuffer + offset, bytesToWrite, NULL, &overlappedStruct)) == FALSE) && (GetLastError() != ERROR_IO_PENDING))
{
port->errorLineNumber = __LINE__ - 2;
port->errorNumber = GetLastError();
}
else if ((result = GetOverlappedResult(port->handle, &overlappedStruct, &numBytesWritten, TRUE)) == FALSE)
{
port->errorLineNumber = __LINE__ - 2;
port->errorNumber = GetLastError();
}
// Return number of bytes written
CloseHandle(overlappedStruct.hEvent);
(*env)->ReleaseByteArrayElements(env, buffer, writeBuffer, JNI_ABORT);
checkJniError(env, __LINE__ - 1);
return (result == TRUE) ? numBytesWritten : -1;
}