diff --git a/java/NativeCall.dll b/java/NativeCall.dll deleted file mode 100644 index 6e2cad1..0000000 Binary files a/java/NativeCall.dll and /dev/null differ diff --git a/java/lib/nativecall-0.4.1.jar b/java/lib/nativecall-0.4.1.jar deleted file mode 100644 index 7b89804..0000000 Binary files a/java/lib/nativecall-0.4.1.jar and /dev/null differ diff --git a/java/lib/nativeloader-200505172341.jar b/java/lib/nativeloader-200505172341.jar deleted file mode 100644 index b4aad60..0000000 Binary files a/java/lib/nativeloader-200505172341.jar and /dev/null differ diff --git a/java/mimis.dll b/java/mimis.dll new file mode 100644 index 0000000..8aeca74 Binary files /dev/null and b/java/mimis.dll differ diff --git a/java/src/mimis/Manager.java b/java/src/mimis/Manager.java index 9188c67..63f1b5a 100644 --- a/java/src/mimis/Manager.java +++ b/java/src/mimis/Manager.java @@ -16,7 +16,7 @@ import org.apache.commons.logging.LogFactory; public class Manager extends Worker { protected Log log = LogFactory.getLog(getClass()); protected static final long serialVersionUID = 1L; - protected static final int INTERVAL = 500; + protected static final int INTERVAL = 1000; protected T[] manageableArray; protected Map> buttonMap; diff --git a/java/src/mimis/Worker.java b/java/src/mimis/Worker.java index 5c83b6e..0229b30 100644 --- a/java/src/mimis/Worker.java +++ b/java/src/mimis/Worker.java @@ -14,6 +14,7 @@ public abstract class Worker implements Runnable { protected boolean run = false; protected boolean active = false; + protected int work = 0; public void start(boolean thread) { run = true; @@ -42,6 +43,7 @@ public abstract class Worker implements Runnable { synchronized (this) { notifyAll(); } + log.debug(String.format("%s: %d", getClass(), work)); } protected void sleep(int time) { @@ -86,6 +88,7 @@ public abstract class Worker implements Runnable { public final void run() { while (run) { if (active()) { + ++work; work(); } else { try { diff --git a/java/src/mimis/application/cmd/CMDApplication.java b/java/src/mimis/application/cmd/CMDApplication.java index c201ea7..456f4e8 100644 --- a/java/src/mimis/application/cmd/CMDApplication.java +++ b/java/src/mimis/application/cmd/CMDApplication.java @@ -6,8 +6,6 @@ import mimis.Application; import mimis.exception.worker.ActivateException; import mimis.exception.worker.DeactivateException; import mimis.util.Native; -import mimis.util.VBScript; - public abstract class CMDApplication extends Application { protected final static String REGISTRY = "HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths"; @@ -43,11 +41,7 @@ public abstract class CMDApplication extends Application { } public boolean active() { - try { - return active = VBScript.isRunning(program); - } catch (IOException e) { - return active = false; - } + return active = Native.isRunning(program); } public void deactivate() throws DeactivateException { diff --git a/java/src/mimis/application/cmd/windows/WindowsApplication.java b/java/src/mimis/application/cmd/windows/WindowsApplication.java index 529a653..58bc794 100644 --- a/java/src/mimis/application/cmd/windows/WindowsApplication.java +++ b/java/src/mimis/application/cmd/windows/WindowsApplication.java @@ -1,12 +1,9 @@ package mimis.application.cmd.windows; -import java.io.IOException; - import mimis.application.cmd.CMDApplication; import mimis.exception.worker.ActivateException; import mimis.exception.worker.DeactivateException; -import mimis.util.VBScript; -import mimis.util.Windows; +import mimis.util.Native; import mimis.value.Command; import mimis.value.Key; import mimis.value.Type; @@ -15,61 +12,64 @@ public abstract class WindowsApplication extends CMDApplication { protected final static int TERMINATE_SLEEP = 500; protected final static int START_SLEEP = 500; - protected String name; + public static final int WM_CLOSE = 0x0010; + public static final int WM_COMMAND = 0x0111; + public static final int WM_APPCOMMAND = 0x0319; + public static final int WM_USER = 0x0400; + public static final int MAPVK_VK_TO_VSC = 0; + + protected String window; protected Process process; protected int handle; - public WindowsApplication(String program, String title, String name) { + public WindowsApplication(String program, String title, String window) { super(program, title); - this.name = name; - handle = -1; + this.window = window; + handle = 0; } public void activate() throws ActivateException { super.activate(); - handle = Windows.findWindow(name, null); + handle = Native.getHandle(window); if (handle < 1) { sleep(START_SLEEP); - handle = Windows.findWindow(name, null); + handle = Native.getHandle(window); } active = handle > 0; - if (handle < 1) { + if (!active) { throw new ActivateException(); } } public boolean active() { if (!active) { - handle = Windows.findWindow(name, null); + handle = Native.getHandle(window); } return super.active(); } public void deactivate() throws DeactivateException { - try { - VBScript.terminate(program); - } catch (IOException e) { - log.error(e); + if (!Native.terminate(program)) { throw new DeactivateException(); } } protected void command(Command command) { - Windows.sendMessage(handle, Windows.WM_APPCOMMAND, handle, command.getCode() << 16); + Native.sendMessage(handle, WM_APPCOMMAND, handle, command.getCode() << 16); } protected void command(int command) { - Windows.sendMessage(handle, Windows.WM_COMMAND, command, 0); + Native.sendMessage(handle, WM_COMMAND, command, 0); } protected int user(int wParam, int lParam) { - return Windows.sendMessage(handle, Windows.WM_USER, wParam, lParam); + return Native.sendMessage(handle, WM_USER, wParam, lParam); //return Windows.sendMessage(handle, Windows.WM_USER + wParam, 0, 0); } protected void key(Type type, int code) { - int scanCode = Windows.mapVirtualKey(code, Windows.MAPVK_VK_TO_VSC); - Windows.postMessage(handle, type.getCode(), code, 1 | (scanCode << 16)); + int scanCode = Native.mapVirtualKey(code, MAPVK_VK_TO_VSC); + Native.postMessage(handle, type.getCode(), code, 1 | (scanCode << 16)); } protected void key(Type type, char character) { diff --git a/java/src/mimis/application/cmd/windows/gomplayer/GomPlayerApplication.java b/java/src/mimis/application/cmd/windows/gomplayer/GomPlayerApplication.java index d9a58f1..b00ba00 100644 --- a/java/src/mimis/application/cmd/windows/gomplayer/GomPlayerApplication.java +++ b/java/src/mimis/application/cmd/windows/gomplayer/GomPlayerApplication.java @@ -10,7 +10,7 @@ import mimis.value.Amount; public class GomPlayerApplication extends WindowsApplication { protected final static String PROGRAM = "GOM.exe"; protected final static String TITLE = "GOM Player"; - protected final static String NAME = "GomPlayer1.x"; + protected final static String WINDOW = "GomPlayer1.x"; protected static final int VOLUME_SLEEP = 100; protected static final int SEEK_SLEEP = 100; @@ -19,7 +19,7 @@ public class GomPlayerApplication extends WindowsApplication { protected SeekWorker seekWorker; public GomPlayerApplication() { - super(PROGRAM, TITLE, NAME); + super(PROGRAM, TITLE, WINDOW); volumeWorker = new VolumeWorker(); seekWorker = new SeekWorker(); } diff --git a/java/src/mimis/application/cmd/windows/winamp/WinampApplication.java b/java/src/mimis/application/cmd/windows/winamp/WinampApplication.java index 81a5501..fd08351 100644 --- a/java/src/mimis/application/cmd/windows/winamp/WinampApplication.java +++ b/java/src/mimis/application/cmd/windows/winamp/WinampApplication.java @@ -9,12 +9,12 @@ import mimis.value.Action; public class WinampApplication extends WindowsApplication { protected final static String PROGRAM = "winamp.exe"; protected final static String TITLE = "Winamp"; - protected final static String NAME = "Winamp v1.x"; + protected final static String WINDOW = "Winamp v1.x"; protected final static int STATUS_PLAYING = 1; protected final static int STATUS_PAUSED = 3; protected final static int STATUS_STOPPED = 0; - + protected final static int IPC_ISPLAYING = 104; protected final static int IPC_GETOUTPUTTIME = 105; protected final static int IPC_SETVOLUME = 122; @@ -40,9 +40,9 @@ public class WinampApplication extends WindowsApplication { protected SeekWorker seekWorker; protected double volume; protected boolean muted; - + public WinampApplication() { - super(PROGRAM, TITLE, NAME); + super(PROGRAM, TITLE, WINDOW); volume = getVolume(); muted = volume == 0; volumeWorker = new VolumeWorker(); diff --git a/java/src/mimis/application/cmd/windows/wmp/WMPApplication.java b/java/src/mimis/application/cmd/windows/wmp/WMPApplication.java index 95c86c7..d821e2f 100644 --- a/java/src/mimis/application/cmd/windows/wmp/WMPApplication.java +++ b/java/src/mimis/application/cmd/windows/wmp/WMPApplication.java @@ -9,14 +9,14 @@ import mimis.value.Action; public class WMPApplication extends WindowsApplication { protected final static String PROGRAM = "wmplayer.exe"; protected final static String TITLE = "Windows Media Player"; - protected final static String NAME = "WMPlayerApp"; + protected final static String WINDOW = "WMPlayerApp"; protected static final int VOLUME_SLEEP = 120; protected VolumeWorker volumeWorker; public WMPApplication() { - super(PROGRAM, TITLE, NAME); + super(PROGRAM, TITLE, WINDOW); volumeWorker = new VolumeWorker(); } diff --git a/java/src/mimis/application/itunes/iTunesApplication.java b/java/src/mimis/application/itunes/iTunesApplication.java index 9bc04e3..707848d 100644 --- a/java/src/mimis/application/itunes/iTunesApplication.java +++ b/java/src/mimis/application/itunes/iTunesApplication.java @@ -1,12 +1,10 @@ package mimis.application.itunes; -import java.io.IOException; - import mimis.Application; import mimis.Worker; import mimis.exception.worker.ActivateException; import mimis.exception.worker.DeactivateException; -import mimis.util.VBScript; +import mimis.util.Native; import mimis.value.Action; import com.dt.iTunesController.ITCOMDisabledReason; @@ -48,16 +46,12 @@ public class iTunesApplication extends Application implements iTunesEventsInterf } public boolean active() { - try { - if (!active && !quiting && VBScript.isRunning(PROGRAM)) { - try { - activate(); - } catch (ActivateException e) { - log.error(e); - } + if (!active && !quiting && Native.isRunning(PROGRAM)) { + try { + activate(); + } catch (ActivateException e) { + log.error(e); } - } catch (IOException e) { - log.error(e); } try { iTunes.getMute(); diff --git a/java/src/mimis/application/mpc/MPCApplication.java b/java/src/mimis/application/mpc/MPCApplication.java index 70fc821..b711574 100644 --- a/java/src/mimis/application/mpc/MPCApplication.java +++ b/java/src/mimis/application/mpc/MPCApplication.java @@ -9,7 +9,7 @@ import mimis.value.Action; public class MPCApplication extends WindowsApplication { protected final static String PROGRAM = "mpc-hc.exe"; protected final static String TITLE = "Media Player Classic"; - protected final static String NAME = "MediaPlayerClassicW"; + protected final static String WINDOW = "MediaPlayerClassicW"; protected static final int VOLUME_SLEEP = 50; protected static final int SEEK_SLEEP = 50; @@ -18,7 +18,7 @@ public class MPCApplication extends WindowsApplication { protected SeekWorker seekWorker; public MPCApplication() { - super(PROGRAM, TITLE, NAME); + super(PROGRAM, TITLE, WINDOW); volumeWorker = new VolumeWorker(); seekWorker = new SeekWorker(); } diff --git a/java/src/mimis/application/vlc/VLCApplication.java b/java/src/mimis/application/vlc/VLCApplication.java index 73f0a11..230ec27 100644 --- a/java/src/mimis/application/vlc/VLCApplication.java +++ b/java/src/mimis/application/vlc/VLCApplication.java @@ -12,7 +12,6 @@ import mimis.application.cmd.CMDApplication; import mimis.exception.worker.ActivateException; import mimis.exception.worker.DeactivateException; import mimis.util.Native; -import mimis.util.VBScript; import mimis.value.Action; import mimis.value.Amount; @@ -41,7 +40,7 @@ public class VLCApplication extends CMDApplication { volumeWorker = new VolumeWorker(); seekWorker = new SeekWorker(); } - + public String getPath() { Pattern pattern = Pattern.compile("\"([^\"]+)\""); Matcher matcher = pattern.matcher(Native.getValue(REGISTRY)); @@ -66,11 +65,7 @@ public class VLCApplication extends CMDApplication { super.stop(); volumeWorker.stop(); seekWorker.stop(); - try { - VBScript.terminate(program); - } catch (IOException e) { - log.error(e); - } + Native.terminate(program); } public void begin(Action action) { diff --git a/java/src/mimis/device/lirc/LircDevice.java b/java/src/mimis/device/lirc/LircDevice.java index f0704b3..6a51699 100644 --- a/java/src/mimis/device/lirc/LircDevice.java +++ b/java/src/mimis/device/lirc/LircDevice.java @@ -1,6 +1,5 @@ package mimis.device.lirc; -import java.io.IOException; import java.util.HashMap; import mimis.Button; @@ -12,7 +11,7 @@ import mimis.exception.worker.DeactivateException; import mimis.sequence.state.Press; import mimis.sequence.state.Release; import mimis.util.Multiplexer; -import mimis.util.VBScript; +import mimis.util.Native; import mimis.util.multiplexer.SignalListener; import mimis.value.Signal; @@ -56,16 +55,12 @@ public class LircDevice extends Device implements LircButtonListener, SignalList log.error(e); } } else if (!active) { - try { - if (VBScript.isRunning(PROGRAM)) { - try { - activate(); - } catch (ActivateException e) { - log.error(e); - } + if (Native.isRunning(PROGRAM)) { + try { + activate(); + } catch (ActivateException e) { + log.error(e); } - } catch (IOException e) { - log.error(e); } } return active; diff --git a/java/src/mimis/device/wiimote/WiimoteDevice.java b/java/src/mimis/device/wiimote/WiimoteDevice.java index 885a97a..d689685 100644 --- a/java/src/mimis/device/wiimote/WiimoteDevice.java +++ b/java/src/mimis/device/wiimote/WiimoteDevice.java @@ -44,7 +44,7 @@ public class WiimoteDevice extends Device implements GestureListener { public WiimoteDevice() { super(TITLE); eventMapCycle = new WiimoteEventMapCycle(); - //wiimoteDiscovery = new WiimoteDiscovery(this); + wiimoteDiscovery = new WiimoteDiscovery(this); gestureDevice = new GestureDevice(); gestureDevice.add(this); gestureId = 0; @@ -53,7 +53,7 @@ public class WiimoteDevice extends Device implements GestureListener { /* Worker */ public void activate() throws ActivateException { - //connect(); + connect(); try { wiimote = wiimoteService.getDevice(this); ledWorker.activate(); @@ -65,15 +65,15 @@ public class WiimoteDevice extends Device implements GestureListener { super.activate(); } - /*public boolean active() { + public boolean active() { if (wiimote != null) { - /*if (!ledWorker.active()) { + if (!ledWorker.active()) { try { ledWorker.activate(); } catch (ActivateException e) { log.error(e); } - }* + } connected = false; wiimote.getStatus(); synchronized (this) { @@ -93,16 +93,16 @@ public class WiimoteDevice extends Device implements GestureListener { } } return active; - }*/ + } public void stop() { super.stop(); ledWorker.stop(); /*if (wiimote != null) { disconnect(); - } - wiimoteService.exit();*/ - //wiimoteDiscovery.stop(); + }*/ + wiimoteService.exit(); + wiimoteDiscovery.stop(); } /* Events */ @@ -170,7 +170,7 @@ public class WiimoteDevice extends Device implements GestureListener { } } - /*public void connected() { + public void connected() { try { wiimote = wiimoteService.getDevice(this); try { @@ -181,20 +181,20 @@ public class WiimoteDevice extends Device implements GestureListener { } catch (DeviceNotFoundException e) { log.error(e); } - }*/ + } - /*public void disconnect() { + public void disconnect() { wiimote.disconnect(); wiimote = null; - }*/ + } - /*public void disconnected() { + public void disconnected() { try { wiimoteDiscovery.activate(); } catch (ActivateException e) { log.error(e); } - }*/ + } /* Listeners */ public void onButtonsEvent(WiimoteButtonsEvent event) { @@ -222,7 +222,7 @@ public class WiimoteDevice extends Device implements GestureListener { System.out.printf("id #%d, prob %.0f%%, valid %b\n", event.getId(), 100 * event.getProbability(), event.isValid()); } } - + class LedWorker extends Worker { protected ArrayCycle ledCycle; diff --git a/java/src/mimis/device/wiimote/WiimoteDiscovery.java b/java/src/mimis/device/wiimote/WiimoteDiscovery.java index 5e4f8e9..e6412ce 100644 --- a/java/src/mimis/device/wiimote/WiimoteDiscovery.java +++ b/java/src/mimis/device/wiimote/WiimoteDiscovery.java @@ -14,6 +14,7 @@ public class WiimoteDiscovery extends Worker { public WiimoteDiscovery(WiimoteDevice wiimoteDevice) { this.wiimoteDevice = wiimoteDevice; + disconnect = true; } protected boolean connect() { @@ -53,7 +54,6 @@ public class WiimoteDiscovery extends Worker { public void activate() throws ActivateException { super.activate(); - disconnect = true; } public void deactivate() throws DeactivateException { diff --git a/java/src/mimis/util/Native.java b/java/src/mimis/util/Native.java index 2dab37a..548110f 100644 --- a/java/src/mimis/util/Native.java +++ b/java/src/mimis/util/Native.java @@ -1,48 +1,44 @@ package mimis.util; import java.io.IOException; -import java.util.InputMismatchException; import java.util.Map; import java.util.NoSuchElementException; import java.util.Scanner; public class Native { - public static int getHandle(String title) throws IOException { - String command = String.format("list.exe w"); - Process process = Runtime.getRuntime().exec(command); - Scanner scanner = new Scanner(process.getInputStream()); - scanner.nextLine(); - while (scanner.hasNextLine()) { - Scanner line = new Scanner(scanner.nextLine()); - line.useDelimiter("\t"); - try { - int handle = line.nextInt(); - line.nextInt(); - if (line.hasNext() && line.next().equals(title)) { - return handle; - } - } catch (InputMismatchException e) {} - } - return -1; + static { + System.loadLibrary("mimis"); } - public static String getProgram(int processId) throws IOException { - String command = String.format("list.exe p"); - Process process = Runtime.getRuntime().exec(command); - Scanner scanner = new Scanner(process.getInputStream()); - scanner.nextLine(); - while (scanner.hasNextLine()) { - Scanner line = new Scanner(scanner.nextLine()); - line.useDelimiter("\t"); + public void start() { + /*int handle = getHandle("Winamp v1.x"); + System.out.println(handle); + sendMessage(handle, WindowsApplication.WM_CLOSE, 0, 0); + /*/ + while (true) {//Winamp v1.x + System.out.println(isRunning("winamp.exe")); + //System.out.println(new Native().terminate("winamp.exe")); + //System.out.println(new Native().running("wmplayer.exe")); try { - if (line.nextInt() == processId) { - return line.next(); - } - } catch (InputMismatchException e) {} + Thread.sleep(500); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } } - return null; } + public static void main(String[] args) { + new Native().start(); + } + + public native static int getHandle(String window); + public native static int sendMessage(int handle, int message, int wParam, int lParam); + public native static int postMessage(int handle, int message, int wParam, int lParam); + public static native int mapVirtualKey(int code, int type); + public native static boolean isRunning(String program); + public native static boolean terminate(String program); + public static String getValue(String key, String name) { String command = String.format("reg query \"%s\"", key); try { diff --git a/java/src/mimis/util/VBScript.java b/java/src/mimis/util/VBScript.java deleted file mode 100644 index b54dd26..0000000 --- a/java/src/mimis/util/VBScript.java +++ /dev/null @@ -1,59 +0,0 @@ -package mimis.util; - -import java.io.BufferedReader; -import java.io.File; -import java.io.FileWriter; -import java.io.IOException; -import java.io.InputStreamReader; - -public class VBScript { - public static boolean isRunning(String program) throws IOException { - boolean found = false; - File file = File.createTempFile("vbsutils", ".vbs"); - FileWriter fileWriter = new FileWriter(file); - fileWriter.write(String.format( - "Set WshShell = WScript.CreateObject(\"WScript.Shell\")\n" - + "Set locator = CreateObject(\"WbemScripting.SWbemLocator\")\n" - + "Set service = locator.ConnectServer()\n" - + "Set processes = service.ExecQuery _\n" - + " (\"select * from Win32_Process where name='%s'\")\n" - + "For Each process in processes\n" - + "wscript.echo process.Name\n" - + "Next\n" - + "Set WSHShell = Nothing\n", program)); - fileWriter.close(); - Process process = Runtime.getRuntime().exec("cscript //NoLogo " + file.getPath()); - InputStreamReader inputStreamReader = new InputStreamReader(process.getInputStream()); - BufferedReader input = new BufferedReader(inputStreamReader); - String line = input.readLine(); - found = line != null && line.equals(program); - input.close(); - try { - process.waitFor(); - } catch (InterruptedException e) {} - file.delete(); - return found; - } - - public static void terminate(String program) throws IOException { - File file = File.createTempFile("vbsutils", ".vbs"); - file.deleteOnExit(); - FileWriter fileWriter = new FileWriter(file); - fileWriter.write(String.format( - "Set WshShell = WScript.CreateObject(\"WScript.Shell\")\n" - + "Set locator = CreateObject(\"WbemScripting.SWbemLocator\")\n" - + "Set service = locator.ConnectServer()\n" - + "Set processes = service.ExecQuery _\n" - + " (\"select * from Win32_Process where name='%s'\")\n" - + "For Each process in processes\n" - + "process.Terminate()\n" - + "Next\n" - + "Set WSHShell = Nothing\n", program)); - fileWriter.close(); - Process process = Runtime.getRuntime().exec("cscript //NoLogo " + file.getPath()); - try { - process.waitFor(); - } catch (InterruptedException e) {} - file.delete(); - } -} diff --git a/java/src/mimis/util/Windows.java b/java/src/mimis/util/Windows.java deleted file mode 100644 index d5b05b0..0000000 --- a/java/src/mimis/util/Windows.java +++ /dev/null @@ -1,44 +0,0 @@ -package mimis.util; - -import com.eaio.nativecall.IntCall; -import com.eaio.nativecall.NativeCall; - -public class Windows { - public static final int WM_COMMAND = 0x0111; - public static final int WM_APPCOMMAND = 0x0319; - public static final int MAPVK_VK_TO_VSC = 0; - public static final int WM_USER = 0x0400; - - protected static IntCall findWindow; - protected static IntCall sendMessage; - protected static IntCall postMessage; - protected static IntCall mapVirtualKey; - - static { - try { - NativeCall.init(); - findWindow = new IntCall("user32", "FindWindowA"); - sendMessage = new IntCall("user32", "SendMessageA"); - postMessage = new IntCall("user32", "PostMessageA"); - mapVirtualKey = new IntCall("user32", "MapVirtualKeyA"); - } catch (Exception e) { - e.printStackTrace(); - } - } - - public static int findWindow(String className, String windowName) { - return findWindow.executeCall(new Object[] {className, windowName}); - } - - public static int postMessage(int handle, int message, int wParam, int lParam) { - return postMessage.executeCall(new Object[] {handle, message, wParam, lParam}); - } - - public static int sendMessage(int handle, int message, int wParam, int lParam) { - return sendMessage.executeCall(new Object[] {handle, message, wParam, lParam}); - } - - public static int mapVirtualKey(int code, int mapType) { - return mapVirtualKey.executeCall(new Object[] {code, 0}); - } -}