use of automenta.rdp.tools.SendEvent in project narchy by automenta.
the class Rdesktop method main.
/**
* @param args
* @throws OrderException
* @throws RdesktopException
*/
public static void main(String[] args) throws RdesktopException {
// Ensure that static variables are properly initialised
keep_running = true;
loggedon = false;
readytosend = false;
showTools = false;
mapFile = "en-us";
keyMapLocation = "";
toolFrame = null;
BasicConfigurator.configure();
logger.setLevel(Level.WARN);
Logger.getRootLogger().setLevel(Level.INFO);
// Attempt to run a native RDP Client
// RDPClientChooser Chooser = new RDPClientChooser();
/*
if (Chooser.RunNativeRDPClient(args)) {
if (!Common.underApplet)
System.exit(0);
}
*/
// Failed to run native client, drop back to Java client instead.
// parse arguments
int logonflags = Rdp.RDP_LOGON_NORMAL;
boolean fKdeHack = false;
int c;
String arg;
StringBuffer sb = new StringBuffer();
LongOpt[] alo = new LongOpt[15];
alo[0] = new LongOpt("debug_key", LongOpt.NO_ARGUMENT, null, 0);
alo[1] = new LongOpt("debug_hex", LongOpt.NO_ARGUMENT, null, 0);
alo[2] = new LongOpt("no_paste_hack", LongOpt.NO_ARGUMENT, null, 0);
alo[3] = new LongOpt("log4j_config", LongOpt.REQUIRED_ARGUMENT, sb, 0);
alo[4] = new LongOpt("packet_tools", LongOpt.NO_ARGUMENT, null, 0);
alo[5] = new LongOpt("quiet_alt", LongOpt.NO_ARGUMENT, sb, 0);
alo[6] = new LongOpt("no_remap_hash", LongOpt.NO_ARGUMENT, null, 0);
alo[7] = new LongOpt("no_encryption", LongOpt.NO_ARGUMENT, null, 0);
alo[8] = new LongOpt("use_rdp4", LongOpt.NO_ARGUMENT, null, 0);
alo[9] = new LongOpt("use_ssl", LongOpt.NO_ARGUMENT, null, 0);
alo[10] = new LongOpt("enable_menu", LongOpt.NO_ARGUMENT, null, 0);
alo[11] = new LongOpt("console", LongOpt.NO_ARGUMENT, null, 0);
alo[12] = new LongOpt("load_licence", LongOpt.NO_ARGUMENT, null, 0);
alo[13] = new LongOpt("save_licence", LongOpt.NO_ARGUMENT, null, 0);
alo[14] = new LongOpt("persistent_caching", LongOpt.NO_ARGUMENT, null, 0);
String progname = "properJavaRDP";
Getopt g = new Getopt("properJavaRDP", args, "bc:d:f::g:k:l:m:n:p:s:t:T:u:o:r:", alo);
ClipChannel clipChannel = new ClipChannel();
SoundChannel soundChannel = new SoundChannel();
DiskChannel diskChannel = new DiskChannel();
while ((c = g.getopt()) != -1) {
switch(c) {
case 0:
switch(g.getLongind()) {
case 0:
Options.debug_keyboard = true;
break;
case 1:
Options.debug_hexdump = true;
break;
case 2:
break;
case 3:
arg = g.getOptarg();
PropertyConfigurator.configure(arg);
logger.info("Log4j using config file " + arg);
break;
case 4:
showTools = true;
break;
case 5:
Options.altkey_quiet = true;
break;
case 6:
Options.remap_hash = false;
break;
case 7:
Options.packet_encryption = false;
break;
case 8:
Options.use_rdp5 = false;
// Options.server_bpp = 8;
Options.set_bpp(8);
break;
case 9:
Options.use_ssl = true;
break;
case 10:
Options.enable_menu = true;
break;
case 11:
Options.console_session = true;
break;
case 12:
Options.load_licence = true;
break;
case 13:
Options.save_licence = true;
break;
case 14:
Options.persistent_bitmap_caching = true;
break;
default:
usage();
}
break;
case 'o':
Options.set_bpp(Integer.parseInt(g.getOptarg()));
break;
case 'b':
Options.low_latency = false;
break;
case 'm':
mapFile = g.getOptarg();
break;
case 'c':
Options.directory = g.getOptarg();
break;
case 'd':
Options.domain = g.getOptarg();
break;
case 'f':
Dimension screen_size = Toolkit.getDefaultToolkit().getScreenSize();
// ensure width a multiple of 4
Options.width = screen_size.width & ~3;
Options.height = screen_size.height;
Options.fullscreen = true;
arg = g.getOptarg();
if (arg != null) {
if (arg.charAt(0) == 'l')
fKdeHack = true;
else {
System.err.println(progname + ": Invalid fullscreen option '" + arg + '\'');
usage();
}
}
break;
case 'g':
arg = g.getOptarg();
int cut = arg.indexOf('x', 0);
if (cut == -1) {
System.err.println(progname + ": Invalid geometry: " + arg);
usage();
}
Options.width = Integer.parseInt(arg.substring(0, cut)) & ~3;
Options.height = Integer.parseInt(arg.substring(cut + 1));
break;
case 'k':
arg = g.getOptarg();
// Options.keylayout = KeyLayout.strToCode(arg);
if (Options.keylayout == -1) {
System.err.println(progname + ": Invalid key layout: " + arg);
usage();
}
break;
case 'l':
arg = g.getOptarg();
switch(arg.charAt(0)) {
case 'd':
case 'D':
logger.setLevel(Level.DEBUG);
break;
case 'i':
case 'I':
logger.setLevel(Level.INFO);
break;
case 'w':
case 'W':
logger.setLevel(Level.WARN);
break;
case 'e':
case 'E':
logger.setLevel(Level.ERROR);
break;
case 'f':
case 'F':
logger.setLevel(Level.FATAL);
break;
default:
System.err.println(progname + ": Invalid debug level: " + arg.charAt(0));
usage();
}
break;
case 'n':
Options.hostname = g.getOptarg();
break;
case 'p':
Options.password = g.getOptarg();
logonflags |= Rdp.RDP_LOGON_AUTO;
break;
case 's':
Options.command = g.getOptarg();
break;
case 'u':
Options.username = g.getOptarg();
break;
case 't':
arg = g.getOptarg();
try {
Options.port = Integer.parseInt(arg);
} catch (NumberFormatException nex) {
System.err.println(progname + ": Invalid port number: " + arg);
usage();
}
break;
case 'T':
Options.windowTitle = g.getOptarg().replace('_', ' ');
break;
case 'r':
Options.licence_path = g.getOptarg();
break;
case '?':
default:
usage();
break;
}
}
if (fKdeHack) {
Options.height -= 46;
}
String server = null;
if (g.getOptind() < args.length) {
int colonat = args[args.length - 1].indexOf(':', 0);
if (colonat == -1) {
server = args[args.length - 1];
} else {
server = args[args.length - 1].substring(0, colonat);
Options.port = Integer.parseInt(args[args.length - 1].substring(colonat + 1));
}
} else {
System.err.println(progname + ": A server name is required!");
usage();
}
VChannels channels = new VChannels();
// Initialise all RDP5 channels
if (Options.use_rdp5) {
// TODO: implement all relevant channels
if (Options.map_clipboard) {
channels.register(clipChannel);
}
channels.register(soundChannel);
channels.register(diskChannel);
}
// Now do the startup...
logger.info("properJavaRDP version " + Version.version);
if (args.length == 0)
usage();
logger.info("Java version is " + System.getProperty("java.specification.version"));
String os = System.getProperty("os.name");
String osvers = System.getProperty("os.version");
if (os.equals("Windows 2000") || os.equals("Windows XP"))
Options.built_in_licence = true;
logger.info("Operating System is " + os + " version " + osvers);
if (os.startsWith("Linux"))
Constants.OS = Constants.LINUX;
else if (os.startsWith("Windows"))
Constants.OS = Constants.WINDOWS;
else if (os.startsWith("Mac"))
Constants.OS = Constants.MAC;
if (Constants.OS == Constants.MAC)
Options.caps_sends_up_and_down = false;
Rdp5 RdpLayer = null;
Common.rdp = RdpLayer;
RdesktopFrame window = new RdesktopFrame_Localised();
window.setClip(clipChannel);
// Configure a keyboard layout
KeyCode_FileBased keyMap = null;
try {
// logger.info("looking for: " + "/" + keyMapPath + mapFile);
InputStream istr = Rdesktop.class.getResourceAsStream('/' + keyMapPath + mapFile);
// logger.info("istr = " + istr);
if (istr == null) {
logger.debug("Loading keymap from filename");
keyMap = new KeyCode_FileBased_Localised(keyMapPath + mapFile);
} else {
logger.debug("Loading keymap from InputStream");
keyMap = new KeyCode_FileBased_Localised(istr);
}
if (istr != null)
istr.close();
Options.keylayout = keyMap.getMapCode();
} catch (Exception kmEx) {
String[] msg = { (kmEx.getClass() + ": " + kmEx.getMessage()) };
window.showErrorDialog(msg);
kmEx.printStackTrace();
Rdesktop.exit(0, null, null, true);
}
logger.debug("Registering keyboard...");
if (keyMap != null)
window.registerKeyboard(keyMap);
boolean[] deactivated = new boolean[1];
int[] ext_disc_reason = new int[1];
logger.debug("keep_running = " + keep_running);
while (keep_running) {
logger.debug("Initialising RDP layer...");
RdpLayer = new Rdp5(channels);
Common.rdp = RdpLayer;
logger.debug("Registering drawing surface...");
RdpLayer.registerDrawingSurface(window);
logger.debug("Registering comms layer...");
window.registerCommLayer(RdpLayer);
loggedon = false;
readytosend = false;
logger.info("Connecting to " + server + ':' + Options.port + " ...");
if (server.equalsIgnoreCase("localhost"))
server = "127.0.0.1";
if (RdpLayer != null) {
// Attempt to connect to server on port Options.port
try {
RdpLayer.connect(Options.username, InetAddress.getByName(server), logonflags, Options.domain, Options.password, Options.command, Options.directory);
// Remove to get rid of sendEvent tool
if (showTools) {
toolFrame = new SendEvent(RdpLayer);
toolFrame.show();
}
if (keep_running) {
/*
* By setting encryption to False here, we have an
* encrypted login packet but unencrypted transfer of
* other packets
*/
if (!Options.packet_encryption)
Options.encryption = false;
logger.info("Connection successful");
// now show window after licence negotiation
RdpLayer.mainLoop(deactivated, ext_disc_reason);
if (deactivated[0]) {
/* clean disconnect */
Rdesktop.exit(0, RdpLayer, window, true);
// return 0;
} else {
if (ext_disc_reason[0] == exDiscReasonAPIInitiatedDisconnect || ext_disc_reason[0] == exDiscReasonAPIInitiatedLogoff) {
/*
* not so clean disconnect, but nothing to worry
* about
*/
Rdesktop.exit(0, RdpLayer, window, true);
// return 0;
}
if (ext_disc_reason[0] >= 2) {
String reason = textDisconnectReason(ext_disc_reason[0]);
String[] msg = { "Connection terminated", reason };
window.showErrorDialog(msg);
logger.warn("Connection terminated: " + reason);
Rdesktop.exit(0, RdpLayer, window, true);
}
}
// exited main loop
keep_running = false;
if (!readytosend) {
// maybe the licence server was having a comms
// problem, retry?
String msg1 = "The terminal server disconnected before licence negotiation completed.";
String msg2 = "Possible cause: terminal server could not issue a licence.";
String[] msg = { msg1, msg2 };
logger.warn(msg1);
logger.warn(msg2);
window.showErrorDialog(msg);
}
}
// Remove to get rid of tool window
if (showTools)
toolFrame.dispose();
// End
} catch (ConnectionException e) {
String[] msg = { "Connection Exception", e.getMessage() };
window.showErrorDialog(msg);
Rdesktop.exit(0, RdpLayer, window, true);
} catch (UnknownHostException e) {
error(e, RdpLayer, window, true);
} catch (SocketException s) {
if (RdpLayer.isConnected()) {
logger.fatal(s.getClass().getName() + ' ' + s.getMessage());
s.printStackTrace();
error(s, RdpLayer, window, true);
Rdesktop.exit(0, RdpLayer, window, true);
}
} catch (RdesktopException e) {
String msg1 = e.getClass().getName();
String msg2 = e.getMessage();
logger.fatal(msg1 + ": " + msg2);
e.printStackTrace(System.err);
if (!readytosend) {
// maybe the licence server was having a comms
// problem, retry?
String[] msg = { "The terminal server reset connection before licence negotiation completed.", "Possible cause: terminal server could not connect to licence server.", "Retry?" };
boolean retry = window.showYesNoErrorDialog(msg);
if (!retry) {
logger.info("Selected not to retry.");
Rdesktop.exit(0, RdpLayer, window, true);
} else {
if (RdpLayer != null && RdpLayer.isConnected()) {
logger.info("Disconnecting ...");
RdpLayer.disconnect();
logger.info("Disconnected");
}
logger.info("Retrying connection...");
// retry
keep_running = true;
continue;
}
} else {
String[] msg = { e.getMessage() };
window.showErrorDialog(msg);
Rdesktop.exit(0, RdpLayer, window, true);
}
} catch (Exception e) {
logger.warn(e.getClass().getName() + ' ' + e.getMessage());
e.printStackTrace();
error(e, RdpLayer, window, true);
}
} else {
// closing bracket to if(!rdp==null)
logger.fatal("The communications layer could not be initiated!");
}
}
Rdesktop.exit(0, RdpLayer, window, true);
}
Aggregations