59 lines
1.6 KiB
Java
59 lines
1.6 KiB
Java
package com.limelight.binding.input.evdev;
|
|
|
|
import java.io.IOException;
|
|
import java.io.InputStream;
|
|
import java.nio.ByteBuffer;
|
|
import java.nio.ByteOrder;
|
|
|
|
import com.limelight.LimeLog;
|
|
|
|
public class EvdevReader {
|
|
private static void readAll(InputStream in, ByteBuffer bb) throws IOException {
|
|
byte[] buf = bb.array();
|
|
int ret;
|
|
int offset = 0;
|
|
|
|
while (offset < buf.length) {
|
|
ret = in.read(buf, offset, buf.length-offset);
|
|
if (ret <= 0) {
|
|
throw new IOException("Read failed: "+ret);
|
|
}
|
|
|
|
offset += ret;
|
|
}
|
|
}
|
|
|
|
// Takes a byte buffer to use to read the output into.
|
|
// This buffer MUST be in native byte order and at least
|
|
// EVDEV_MAX_EVENT_SIZE bytes long.
|
|
public static EvdevEvent read(InputStream input) throws IOException {
|
|
ByteBuffer bb;
|
|
int packetLength;
|
|
|
|
// Read the packet length
|
|
bb = ByteBuffer.allocate(4).order(ByteOrder.nativeOrder());
|
|
readAll(input, bb);
|
|
packetLength = bb.getInt();
|
|
|
|
if (packetLength < EvdevEvent.EVDEV_MIN_EVENT_SIZE) {
|
|
LimeLog.warning("Short read: "+packetLength);
|
|
return null;
|
|
}
|
|
|
|
// Read the rest of the packet
|
|
bb = ByteBuffer.allocate(packetLength).order(ByteOrder.nativeOrder());
|
|
readAll(input, bb);
|
|
|
|
// Throw away the time stamp
|
|
if (packetLength == EvdevEvent.EVDEV_MAX_EVENT_SIZE) {
|
|
bb.getLong();
|
|
bb.getLong();
|
|
} else {
|
|
bb.getInt();
|
|
bb.getInt();
|
|
}
|
|
|
|
return new EvdevEvent(bb.getShort(), bb.getShort(), bb.getInt());
|
|
}
|
|
}
|