JNIEXPORT jint JNICALL Java_com_fazecast_jSerialComm_SerialPort_writeBytes()

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