/**
* Scripting support for JFTerm.<br>
* Language syntax:<br>
* Type "text"<br>
* Wait "text"<br>
* Sleep seconds<br>
* HitKey VK_key<br>
*<br>
* Example:<br>
* Wait ">"<br>
* Type "username"<br>
* HitKey VK_ENTER<br>
* Wait ">"<br>
* Type "password"<br>
* HitKey VK_ENTER<br>
*<br>
* Some VK_...: VK_ENTER, VK_TAB, VK_SPACE, etc.<br>
*/
import javaforce.*;
import java.lang.reflect.*;
import java.io.*;
import javax.swing.*;
public class Script {
private Script() {} //private ctor - must call load()
private String[] script;
private int pos = 0;
private int chpos = 0;
private boolean waiting = false;
private int waitsiz = 0;
private char buf[];
private int buflen = 0;
private String waitstr = null;
private void nextLine() {
pos++;
chpos = 0;
}
public void input(char ch, Buffer buffer) {
if (!waiting) return;
if (buflen == waitsiz) {
for(int a=0;a<buflen-1;a++) buf[a] = buf[a+1];
buf[buflen-1] = ch;
} else {
buf[buflen++] = ch;
}
if (buflen != waitsiz) return;
if (waitstr.equalsIgnoreCase(new String(buf))) {
waiting = false;
process(buffer);
}
}
/**
* Load and execute a script (*.scr)
*/
public static Script load(Buffer buffer) {
JFileChooser chooser = new JFileChooser();
chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
chooser.setMultiSelectionEnabled(false);
chooser.setCurrentDirectory(new File(JF.getCurrentPath()));
if (chooser.showOpenDialog(buffer) != JFileChooser.APPROVE_OPTION) return null;
Script ret = new Script();
try {
FileInputStream fis = new FileInputStream(chooser.getSelectedFile().getAbsolutePath());
int fs = fis.available();
if (fs < 1) return null;
byte data[] = new byte[fs];
if (fis.read(data) != fs) throw new Exception();
String str = new String(data);
str = str.replaceAll("\r", ""); //get rid of Windows junk
ret.script = str.split("\n");
} catch (Exception e) {
JF.showError("File Error", "Unable to open script file");
return null;
}
if (ret.process(buffer)) return null;
return ret;
}
private boolean isWS(char ch) {
if (ch == ' ') return true;
if (ch == 9) return true;
return false;
}
private String nextToken() {
String ret = "";
char ch;
boolean quote = false;
if (pos >= script.length) return "";
if (chpos >= script[pos].length()) {pos++; chpos = 0;}
if (pos >= script.length) return "";
try {
//skip leading whitespace
while (isWS(script[pos].charAt(chpos))) {
chpos++;
if (chpos >= script[pos].length()) {pos++; chpos = 0;}
if (pos >= script.length) return "";
}
while (true) {
ch = script[pos].charAt(chpos++);
if (!quote) {
if (ch == '#') throw new Exception(); //skip rest of line (comment)
if (isWS(ch)) return ret;
if (ch == '\"') {quote = true; continue;}
}
if (ch == '\"') return ret;
ret += ch;
}
} catch (Exception e) {
pos++;
chpos=0;
}
return ret;
}
public synchronized boolean process(Buffer buffer) {
String cmd = "", arg = "";
if (waiting) return false;
if (pos >= script.length) return true;
while (true) {
cmd = "";
while (cmd.length() == 0) {
if (pos >= script.length) return true;
cmd = nextToken();
}
arg = "";
while (arg.length() == 0) {
if (pos >= script.length) return true;
arg = nextToken();
}
if (cmd.equalsIgnoreCase("type")) {
buffer.output(arg.toCharArray());
continue;
}
if (cmd.equalsIgnoreCase("wait")) {
waitstr = arg;
waitsiz = waitstr.length();
buf = new char[waitsiz];
buflen = 0;
waiting = true;
return false;
}
if (cmd.equalsIgnoreCase("sleep")) {
JF.sleep(JF.atoi(arg) * 1000);
}
if (cmd.equalsIgnoreCase("hitkey")) {
try {
java.awt.event.KeyEvent ke = new java.awt.event.KeyEvent(buffer, 0, 0, 0, 0, ' ');
Class<?> c = ke.getClass();
Field f = c.getField(arg);
int keyCode = f.getInt(ke);
switch (keyCode) {
//case VK_...: buffer.keyPressed(new java.awt.event.KeyEvent(buffer, 0, 0, 0, keyCode, (char)keyCode));
default: buffer.output(new char[] {(char)keyCode});
}
} catch (Exception e) {
JF.showError("Bad Script", "HitKey : " + arg);
}
}
}
}
};