view src/viewer_swing/java/com/glavsoft/viewer/TreeViewer.java @ 377:877008c86e85

Add direct option
author innparusu
date Mon, 31 Aug 2015 17:04:36 +0900
parents 1e4285df9afb
children ea324e42bc78
line wrap: on
line source

package com.glavsoft.viewer;

import com.glavsoft.viewer.swing.SwingViewerWindow;
import jp.ac.u_ryukyu.treevnc.VncProxyService;

import java.io.FileNotFoundException;
import java.io.PrintStream;
import java.net.SocketException;
import java.net.UnknownHostException;

public class TreeViewer {
    private boolean treeProxy;
    private boolean viewer;
    private boolean cui = false;
    private int width; 
    private int height;
    private int fixingSizeWidth;
    private int fixingSizeHeight;
    private String hostName = null;
    private String logFileName = null;
    private boolean noConnection = false;
    private boolean permitChangeScreen = true;
    private boolean showTree = false;
    private boolean checkDelay = false;
    private boolean addSerialNum = false;
    private boolean fixingSizeDisplay = false;
    private boolean logFile = false;
    private boolean filterSingleDisplay = false;
    private boolean direct = false;


    public static void main(String[] args) throws SocketException, UnknownHostException {
        new TreeViewer().vncStart(args);
    }

    private void vncStart(String[] args) throws SocketException, UnknownHostException {
        modeSelect(args);
        if(logFile) {
            PrintStream out = null;
            try {
                out = new PrintStream(logFileName + ".txt");
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
            System.setOut(out);
        }
        if (treeProxy && !viewer) {
            // start treeManager only ( -p flag )
            VncProxyService vps = new VncProxyService();
            if(fixingSizeDisplay)
                setFixingSizeDisplay(vps);
            rootStart(args,vps);
            return;
        }
        if (viewer) {
            ViewerInterface v = cui ? new CuiViewer() : new Viewer();
            setWidthAndHeight(v);
//            if(filterSingleDisplay)
            if(fixingSizeDisplay)
                setFixingSizeDisplay(v);
            if (treeProxy) {
                if (hostName != null) {
                    if (direct) {
                        rootStart(args, new VncProxyService());
                    } else {
                        // send whereToConnect
                        v.startTreeViewer(hostName, cui);
                    }
                }
                // this viewer also works as tree root ( display mode -d flag )
                // start with no connection waiting server change request
                rootStart(args, v);
            } else {
                v.startTreeViewer(hostName,cui);
            }
        }
    }

    public void rootStart(String[] args, ViewerInterface v) throws SocketException, UnknownHostException {
        v.setNoConnection(noConnection);  // should we accept host name here?
        v.proxyStart(args, hostName, width, height, showTree, checkDelay, addSerialNum, fixingSizeDisplay, filterSingleDisplay);
        v.getRfb().setHasViewer(viewer);
        if (!permitChangeScreen) v.getRfb().setPermitChangeScreen(false);
        v.getRfb().getAcceptThread().waitForShutdown();
    }

    private void modeSelect(String[] args) {
        viewer = true; // default
        for (int i = 0; i < args.length; i++) {
            if ("-p".equals(args[i]) || "-r".equals(args[i])) {
                // no display. behave as root.
                // relay rfb update to clients.
                treeProxy = true;
                viewer = false;
            } else if ("-d".equals(args[i])) {
                // behave as root with display.
                // use this on main display such as large tv.
                noConnection = true;
                treeProxy = true;
                viewer = true;
            } else if ("--cui".equals(args[i])) {
                // use cui viewer 
                cui = true;
            } else if ("-v".equals(args[i]) || "-c".equals(args[i])) {
                // behave as client.
                // open display and connect to some tree node.
                viewer = true;
            } else if ("--version".equals(args[i])) {
                System.out.println("version :" + Viewer.ver());
                System.exit(0);
            } else if ("-ns".equals(args[i])) {
                permitChangeScreen = false;
            } else if ("--noScreenChange".equals(args[i])) {
                permitChangeScreen = false;
            } else if ("--fixSize".equals(args[i])) {
                // retina display too large for TreeVNC.
                // restrict display size.
                fixingSizeWidth = Integer.parseInt(args[++i]);
                fixingSizeHeight = Integer.parseInt(args[++i]);
                fixingSizeDisplay = true;
            } else if ("--filterSingleDisplay".equals(args[i])) {
                // retina display too large for TreeVNC.
                // restrict display size.
                filterSingleDisplay = true;
            } else if ("--width".equals(args[i])) {
                width = Integer.parseInt(args[i+1]);
                i++;
            } else if ("--height".equals(args[i])) {
                height = Integer.parseInt(args[i+1]);
                i++;
            } else if ("--host".equals(args[i])) {
                hostName = args[++i];
                treeProxy = true;
            } else if ("--direct".equals(args[i])) {
                // direct connect without whereToConnect message
                // use is --host
                direct = true;
            } else if ("--showTree".equals(args[i])) {
                // show Tree node.
                showTree = true;
            } else if ("--checkDelay".equals(args[i])) {
                // check flow of data delay.
                checkDelay = true;
            } else if ("--addSerialNum".equals(args[i])) {
                // add data serial number.
                addSerialNum = true;
            } else if ("--logFile".equals(args[i])) {
                // add log file.
                logFile = true;
                try {
                    this.logFileName = args[++i];
                } catch (ArrayIndexOutOfBoundsException e) {
                    // not input file name.
                    System.out.println("Please put the log file name. If you do not put file name, set file name logFile.txt");
                }
                if (logFileName == null) {
                    logFileName = "logFile";
                } else if ("-".equals(logFileName.substring(0,1))) {
                    // not input file name.
                    // to continue to add option.
                    System.out.println("Please put the log file name. If you do not put file name, set file name logFile.txt");
                    logFileName = "logFile";
                    i++;
                } else {
                    i++;
                }
            } else {
                System.out.println("(default) TreeVNCClient\n"
                        + "-v or -c:                View shared screen.\n"
                        + "-p:                      (proxy) Share my screen and behave as tree root.\n"
                        + "-ns --noScreenChange:    Viewers cannot change screen to thiers (default permite screen change)\n"
                        + "-d:                      Show shared screen and behave as tree root.\n"
                        + "-r:                      Connect to fix to specified host and port.\n"
                        + "--host hostname:         Set host name.\n"
                        + "--retina:                Limit screen size for very large display.\n"
                        + "--width w:               Set display width.\n"
                        + "--height h:              Set display height.\n"
                        + "--showTree:              Show connected tree node.\n"
                        + "--checkDelay:            Check speed flow of data each node.\n"
                        + "--logFile logFileName:   Set log file name.\n"
                        + "--filterSingleDisplay:   Share single display (case of use multi display).\n"
                        + "--fixingSize w h:        Fix share screen size.\n"
                        + "--addSerialNum:          Check lost data.\n");
                System.exit(0);
            }
        }
    }

    public void setWidthAndHeight(ViewerInterface v) {
        if(width != 0 || height != 0) {
            v.setWidth(width);
            v.setHeight(height);
        }
    }

    public void setFixingSizeDisplay(ViewerInterface v) {
        v.setFixingSize(fixingSizeWidth, fixingSizeHeight);
    }

    private boolean isInteger(String num) {
        try {
            Integer.parseInt(num);
            return true;
        } catch (NumberFormatException e) {
            return false;
        }
    }
}