/**
* Created : May 31, 2012
*
* @author pquiring
*/
import javaforce.*;
import javaforce.jni.*;
import javaforce.jni.lnx.*;
import javaforce.utils.*;
public class DeviceMonitor extends Thread implements ShellProcessListener {
private StringBuilder output = new StringBuilder();;
private LnxPty pty;
public void run() {
LnxPty.init();
// NOTE : udevadm requires a tty to operate ???
if (true) {
pty = LnxPty.exec("udevadm", new String[] {"udevadm", "monitor", "--kernel", null}, LnxPty.makeEnvironment());
new Thread() {
public void run() {
byte data[] = new byte[1024];
while (true) {
int len = pty.read(data);
if (len > 0) shellProcessOutput(new String(data, 0, len));
}
}
}.start();
} else {
//does NOT work for some reason
ShellProcess sp = new ShellProcess();
sp.addListener(this);
sp.keepOutput(false);
sp.run(new String[] {"udevadm", "monitor", "--kernel"}, false);
}
}
private static String quote(String str) {
return "\"" + str + "\"";
}
public void shellProcessOutput(String string) {
output.append(string.replaceAll("\r", "")); //remove \r ??? is this a MS app?
while (true) {
int idx = output.indexOf("\n");
if (idx == -1) return;
String msg = output.substring(0, idx);
output.delete(0, idx+1);
if (msg.endsWith("(drm)")) {
Startup.jbusClient.broadcast("org.jflinux.jdesktop.", "videoChanged", quote("udev"));
Startup.jbusClient.broadcast("org.jflinux.jconfig.", "videoChanged", quote("udev"));
}
if (msg.endsWith("(power_supply)")) {
Startup.jbusClient.broadcast("org.jflinux.jdesktop.", "powerChanged", "");
}
if (msg.endsWith("(block)")) {
//could be an audio cd-rom inserted
//KERNEL [time.stamp] change /devices/.../block/sr0 (block)
idx = msg.lastIndexOf("/");
String dev = msg.substring(idx+1);
idx = dev.indexOf(" ");
dev = dev.substring(0, idx);
if (dev.startsWith("sr")) {
Startup.autoMounter.mount("/dev/" + dev);
}
}
}
}
}