Search in sources :

Example 1 with KeyCode_FileBased

use of net.propero.rdp.keymapping.KeyCode_FileBased in project narchy by automenta.

the class Rdesktop method RDPwindow.

public static RdesktopFrame RDPwindow(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.INFO);
    // Attempt to run a native RDP Client
    RDPClientChooser Chooser = new RDPClientChooser();
    if (RDPClientChooser.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();
    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;
                    // 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;
            // 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;
    }
    VChannels channels = new VChannels();
    final String[] server = { null };
    if (g.getOptind() < args.length) {
        int colonat = args[args.length - 1].indexOf(':', 0);
        if (colonat == -1) {
            server[0] = args[args.length - 1];
        } else {
            server[0] = 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();
    }
    // 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();
    String java = System.getProperty("java.specification.version");
    logger.info("Java version is {}", java);
    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 {} version {}", os, 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;
    RdesktopFrame window = new RdesktopFrame_Localised();
    int finalLogonflags = logonflags;
    new Thread(() -> {
        Rdp5 RdpLayer = null;
        Common.rdp = RdpLayer;
        window.setClip(clipChannel);
        // Configure a keyboard layout
        KeyCode_FileBased keyMap = null;
        try {
            // logger.info("looking for: " + "/" + keyMapPath + mapFile);
            InputStream istr = Rdesktop.class.getClassLoader().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[0], Options.port);
            if (server[0].equalsIgnoreCase("localhost"))
                server[0] = "127.0.0.1";
            if (RdpLayer != null) {
                // Attempt to connect to server on port Options.port
                try {
                    RdpLayer.connect(Options.username, InetAddress.getByName(server[0]), finalLogonflags, 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.error("{}" + ' ' + "{}", 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.error("{}: {}", 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.error("The communications layer could not be initiated!");
            }
        }
        Rdesktop.exit(0, RdpLayer, window, true);
    }).start();
    return window;
}
Also used : SocketException(java.net.SocketException) SendEvent(net.propero.rdp.tools.SendEvent) Getopt(gnu.getopt.Getopt) KeyCode_FileBased(net.propero.rdp.keymapping.KeyCode_FileBased) ClipChannel(net.propero.rdp.rdp5.cliprdr.ClipChannel) SoundChannel(net.propero.rdp.rdp5.snd.SoundChannel) UnknownHostException(java.net.UnknownHostException) InputStream(java.io.InputStream) UnknownHostException(java.net.UnknownHostException) SocketException(java.net.SocketException) Rdp5(net.propero.rdp.rdp5.Rdp5) LongOpt(gnu.getopt.LongOpt) VChannels(net.propero.rdp.rdp5.VChannels)

Aggregations

Getopt (gnu.getopt.Getopt)1 LongOpt (gnu.getopt.LongOpt)1 InputStream (java.io.InputStream)1 SocketException (java.net.SocketException)1 UnknownHostException (java.net.UnknownHostException)1 KeyCode_FileBased (net.propero.rdp.keymapping.KeyCode_FileBased)1 Rdp5 (net.propero.rdp.rdp5.Rdp5)1 VChannels (net.propero.rdp.rdp5.VChannels)1 ClipChannel (net.propero.rdp.rdp5.cliprdr.ClipChannel)1 SoundChannel (net.propero.rdp.rdp5.snd.SoundChannel)1 SendEvent (net.propero.rdp.tools.SendEvent)1