changeset 17:23b3df33b4c5

delete myVncProxy
author Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
date Fri, 13 Jan 2012 13:43:33 +0900
parents 92f984b47b7a
children 8e58ebe352ad
files src/myVncProxy/CuiMyVncClient.java src/myVncProxy/CuiVncCanvas.java src/myVncProxy/EchoClient.java src/myVncProxy/EchoClient.java.orig src/myVncProxy/EchoClient.java~ src/myVncProxy/InterfaceForViewer.java src/myVncProxy/IpV6.java src/myVncProxy/MyVncClient.java src/myVncProxy/MyVncClient.java.orig src/myVncProxy/MyVncClient.java~ src/myVncProxy/OptionNoFrame.java src/myVncProxy/WaitReply.java
diffstat 12 files changed, 0 insertions(+), 8277 deletions(-) [+]
line wrap: on
line diff
--- a/src/myVncProxy/CuiMyVncClient.java	Fri Jan 13 13:41:30 2012 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1074 +0,0 @@
-package myVncProxy;
-
-import java.awt.*;
-import java.awt.event.*;
-import java.io.*;
-import java.net.*;
-import java.nio.ByteBuffer;
-import java.util.Random;
-
-import myVncProxy.AcceptThread;
-import myVncProxy.OptionsNoFrame;
-
-
-public class CuiMyVncClient implements InterfaceForViewer {
-
-
-	String[] mainArgs;
-	String username;
-
-	// RfbProto rfb;
-	MyRfbProto rfb;
-	Thread rfbThread;
-	Thread accThread;
-	Thread clientThread;
-
-	Frame vncFrame;
-	Container vncContainer;
-	ScrollPane desktopScrollPane;
-	GridBagLayout gridbag;
-	ButtonPanel buttonPanel;
-	Label connStatusLabel;
-	CuiVncCanvas vc;
-	// OptionsFrame options;
-	OptionsNoFrame options;
-	ClipboardFrame clipboard;
-	RecordingFrame rec;
-
-	// Control session recording.
-	Object recordingSync;
-	String sessionFileName;
-	boolean recordingActive;
-	boolean recordingStatusChanged;
-	String cursorUpdatesDef;
-	String eightBitColorsDef;
-
-	// Variables read from parameter values.
-	String socketFactory;
-	String host;
-	int port;
-	String passwordParam;
-	boolean showControls;
-	boolean offerRelogin;
-	boolean showOfflineDesktop;
-	int deferScreenUpdates;
-	int deferCursorUpdates;
-	int deferUpdateRequests;
-	int debugStatsExcludeUpdates;
-	int debugStatsMeasureUpdates;
-
-	private static final long serialVersionUID = 1L;
-	boolean inAnApplet = true;
-	boolean inSeparateFrame = false;
-	Socket clientSocket = null;
-	String parent, treenum;
-	private String leaderflag;
-	boolean runflag = false;
-	boolean first = true;
-
-	EchoClient echoValue;
-	int echoPort;
-	String pHost;
-
-	public static void main(String[] argv) {
-		CuiMyVncClient v = new CuiMyVncClient();
-		v.echoValue = null;
-		v.runClient(argv, v);
-
-	}
-
-	private void runClient(String[] argv, CuiMyVncClient v) {
-		mainArgs = argv;
-		
-		if (mainArgs.length > 0)
-			pHost = mainArgs[0];
-		else
-			pHost = "cls080.ie.u-ryukyu.ac.jp";
-		if (mainArgs.length > 1)
-			port = Integer.parseInt(mainArgs[1]);
-		else
-			port = 5999;
-
-		v.init();
-		v.start_threads();
-
-	}
-	
-	
-	void checkArgs(String[] argv) {
-		if (argv.length > 3) {
-			username = argv[3];
-		} else if (argv.length < 2) {
-			System.out.println("Please enter argv");
-			System.out.println("hostname(IPaddress) port password");
-			System.exit(0);
-		} else {
-			username = argv[0];
-		}
-	}
-
-	//
-	// init()
-	//
-
-	public void init() {
-
-		Random rnd = new Random();
-		long ran = rnd.nextInt(5000);
-		try {
-			Thread.sleep(ran);
-		} catch (InterruptedException e) {
-			e.printStackTrace();
-		}
-		
-		readParameters();
-		//readParameters(value);
-
-		options = new OptionsNoFrame(this);
-		recordingSync = new Object();
-
-		sessionFileName = null;
-		recordingActive = false;
-		recordingStatusChanged = false;
-		cursorUpdatesDef = null;
-		eightBitColorsDef = null;
-
-		/*
-		 * try { connectAndAuthenticate(); } catch (NoRouteToHostException e) {
-		 * fatalError("Network error: no route to server: " + host, e); } catch
-		 * (UnknownHostException e) {
-		 * fatalError("Network error: server name unknown: " + host, e); } catch
-		 * (ConnectException e) {
-		 * fatalError("Network error: could not connect to server: " + host +
-		 * ":" + port, e); } catch (Exception e) { }
-		 */
-		rfbThread = new Thread(this);
-
-	}
-
-	//
-	// run() - executed by the rfbThread to deal with the RFB socket.
-	//
-
-	public void start_threads() {
-		rfbThread.start();
-	}
-
-	public void run() {
-
-		try {
-			if (first) {
-				connectAndAuthenticate();
-				accThread = new Thread(new AcceptThread(rfb, 5999));
-				accThread.start();
-				first = false;
-			}else {
-				reConnectAndAuthenticate();
-			}
-			doProtocolInitialisation();
-
-			vc = new CuiVncCanvas(this, 0, 0);
-			vc.updateFramebufferSize();
-
-		} catch (IOException e) {
-			
-			System.out.println("Socket error");
-			// parent no find
-			Random rnd = new Random();
-			long ran = rnd.nextInt(5000) + 5000;
-			System.out.println(ran);
-			// 親がいない場合の処理はここに書く!!!!
-			/**
-			 * this while reconnection
-			 */
-
-			int counter = 0;
-
-			/*
-  			vncFrame.setVisible(false); 
-			 vncFrame.dispose();
-*/			 
-			while (true) {
-				/**
-				 * if my last node case reconnectoion stop
-				 */
-
-				echoValue = new EchoClient(echoValue, this);
-				try {
-					Thread.sleep(ran);
-				} catch (InterruptedException e1) {
-					e1.printStackTrace();
-				}
-
-				if (counter >= 3) {
-					echoValue.openport();
-					echoValue.notfoundParent();
-				}
-
-				echoValue.openport();
-				// runflag = echo.losthost();
-				if (echoValue.losthost()) {
-					break;
-				}
-				counter++;
-			}
-			// System.exit(0);
-		}catch (Exception e) {
-			System.out.println(e);
-			System.exit(0);
-		}
-		try{
-			
-			processNormalProtocol();// main loop
-
-		} catch (NoRouteToHostException e) {
-			fatalError("Network error: no route to server: " + host, e);
-		} catch (UnknownHostException e) {
-			fatalError("Network error: server name unknown: " + host, e);
-		} catch (ConnectException e) {
-			fatalError("Network error: could not connect to server: " + host
-					+ ":" + port, e);
-		} catch (EOFException e) {
-
-			if (leaderflag != null) {
-				while (true) {
-					echoValue = new EchoClient(echoValue, this);
-					echoValue.openport();
-					// runflag = echo.losthost();
-					if (echoValue.losthost()) {
-						break;
-					}
-				}
-			} else {
-				if (showOfflineDesktop) {
-					e.printStackTrace();
-					System.out
-							.println("Network error: remote side closed connection");
-					if (vc != null) {
-						vc.enableInput(false);
-					}
-					if (rfb != null && !rfb.closed())
-						rfb.close();
-					if (showControls && buttonPanel != null) {
-						buttonPanel.disableButtonsOnDisconnect();
-					}
-				} else {
-					fatalError("Network error: remote side closed connection",
-							e);
-				}
-			}
-		} catch (IOException e) {
-			String str = e.getMessage();
-			if (str != null && str.length() != 0) {
-				fatalError("Network Error: " + str, e);
-			} else {
-				fatalError(e.toString(), e);
-			}
-		} catch (Exception e) {
-			String str = e.getMessage();
-			if (str != null && str.length() != 0) {
-				fatalError("Error: " + str, e);
-			} else {
-				fatalError(e.toString(), e);
-			}
-		}
-
-	}
-
-	//
-	// Process RFB socket messages.
-	// If the rfbThread is being stopped, ignore any exceptions,
-	// otherwise rethrow the exception so it can be handled.
-	//
-
-	void processNormalProtocol() throws Exception {
-		try {
-			vc.processNormalProtocol();// main loop
-		} catch (Exception e) {
-			if (rfbThread == null) {
-				System.out.println("Ignoring RFB socket exceptions"
-						+ " because applet is stopping");
-			} else {
-				throw e;
-			}
-		}
-	}
-
-	//
-	// Connect to the RFB server and authenticate the user.
-	//
-
-	void connectAndAuthenticate() throws Exception {
-		showConnectionStatus("Initializing...");
-
-		showConnectionStatus("Connecting to " + host + ", port " + port + "...");
-
-		// rfb = new RfbProto(host, port, this);
-		rfb = new MyRfbProto(pHost, port, this);
-
-		showConnectionStatus("Connected to server");
-
-		rfb.readVersionMsg();
-		showConnectionStatus("RFB server supports protocol version "
-				+ rfb.serverMajor + "." + rfb.serverMinor);
-
-		rfb.writeVersionMsg();
-		showConnectionStatus("Using RFB protocol version " + rfb.clientMajor
-				+ "." + rfb.clientMinor);
-
-
-		if (rfb.serverMinor == 855) {
-			/*
-			 * if connect to proxy, userEchoPortFlag is true. 
-			 * if connect to client, userEchoPortFlag is false.
-			 */
-			boolean useEchoPortFlag = rfb.readProxyFlag();
-
-			if (useEchoPortFlag) {
-				byte[] b = new byte[4];
-				b = rfb.readEchoPort();
-				echoPort = castByteInt(b);
-
-				InetAddress addr = InetAddress.getByName(pHost);
-				String h = new String(addr.getHostAddress());
-
-				getParentName();
-				if (!(h.equals(host))) {
-					rfb.changeParent(host, port);
-					rfb.readVersionMsg();
-					rfb.writeVersionMsg();
-					boolean flag = rfb.readProxyFlag();
-				}
-			}
-		}	
-		
-		int secType = rfb.negotiateSecurity();
-		int authType;
-		if (secType == RfbProto.SecTypeTight) {
-			showConnectionStatus("Enabling TightVNC protocol extensions");
-			rfb.setupTunneling();
-			authType = rfb.negotiateAuthenticationTight();
-		} else {
-			authType = secType;
-		}
-
-		switch (authType) {
-		case RfbProto.AuthNone:
-			showConnectionStatus("No authentication needed");
-			rfb.authenticateNone();
-			break;
-		case RfbProto.AuthVNC:
-			showConnectionStatus("Performing standard VNC authentication");
-			if (passwordParam != null) {
-				rfb.authenticateVNC(passwordParam);
-			} else {
-				String pw = askPassword();
-				rfb.authenticateVNC(pw);
-			}
-			break;
-		default:
-			throw new Exception("Unknown authentication scheme " + authType);
-		}
-	}
-
-
-
-	void reConnectAndAuthenticate() throws Exception {
-		showConnectionStatus("Initializing...");
-
-		showConnectionStatus("Connecting to " + host + ", port " + port + "...");
-
-		rfb.changeParent(host, port);
-
-		showConnectionStatus("Connected to server");
-
-		rfb.readVersionMsg();
-		showConnectionStatus("RFB server supports protocol version "
-				+ rfb.serverMajor + "." + rfb.serverMinor);
-
-		rfb.writeVersionMsg();
-		showConnectionStatus("Using RFB protocol version " + rfb.clientMajor
-				+ "." + rfb.clientMinor);
-
-		if (rfb.serverMinor == 855) {
-			boolean useEchoPortFlag = rfb.readProxyFlag();
-			if (useEchoPortFlag) {
-				byte[] b = new byte[4];
-				b = rfb.readEchoPort();
-				echoPort = castByteInt(b);
-
-				InetAddress addr = InetAddress.getByName(pHost);
-				String h = new String(addr.getHostAddress());
-
-				getParentName();
-				if (!(h.equals(host))) {
-					rfb.changeParent(host, port);
-					rfb.readVersionMsg();
-					rfb.writeVersionMsg();
-					boolean flag = rfb.readProxyFlag();
-				}
-			}
-		}	
-		
-		int secType = rfb.negotiateSecurity();
-		int authType;
-		if (secType == RfbProto.SecTypeTight) {
-			showConnectionStatus("Enabling TightVNC protocol extensions");
-			rfb.setupTunneling();
-			authType = rfb.negotiateAuthenticationTight();
-		} else {
-			authType = secType;
-		}
-
-		switch (authType) {
-		case RfbProto.AuthNone:
-			showConnectionStatus("No authentication needed");
-			rfb.authenticateNone();
-			break;
-		case RfbProto.AuthVNC:
-			showConnectionStatus("Performing standard VNC authentication");
-			if (passwordParam != null) {
-				rfb.authenticateVNC(passwordParam);
-			} else {
-				String pw = askPassword();
-				rfb.authenticateVNC(pw);
-			}
-			break;
-		default:
-			throw new Exception("Unknown authentication scheme " + authType);
-		}
-	}	
-
-	//
-	// Show a message describing the connection status.
-	// To hide the connection status label, use (msg == null).
-	//
-
-	void showConnectionStatus(String msg) {
-		System.out.println(msg);
-	}
-
-	//
-	// Show an authentication panel.
-	//
-
-	String askPassword() throws Exception {
-		/*
-		 * showConnectionStatus(null); AuthPanel authPanel = new
-		 * AuthPanel(this);
-		 * 
-		 * GridBagConstraints gbc = new GridBagConstraints(); gbc.gridwidth =
-		 * GridBagConstraints.REMAINDER; gbc.anchor =
-		 * GridBagConstraints.NORTHWEST; gbc.weightx = 1.0; gbc.weighty = 1.0;
-		 * gbc.ipadx = 100; gbc.ipady = 50; gridbag.setConstraints(authPanel,
-		 * gbc); vncContainer.add(authPanel);
-		 * 
-		 * 
-		 * authPanel.moveFocusToDefaultField(); vncContainer.remove(authPanel);
-		 */
-		showConnectionStatus("ask password...");
-		String pw = mainArgs[2];
-		return pw;
-	}
-
-	//
-	// Do the rest of the protocol initialisation.
-	//
-
-	void doProtocolInitialisation() throws IOException {
-		rfb.writeClientInit();
-		rfb.readServerInit();
-
-		System.out.println("Desktop name is " + rfb.desktopName);
-		System.out.println("Desktop size is " + rfb.framebufferWidth + " x "
-				+ rfb.framebufferHeight);
-
-		setEncodings();
-
-		// showConnectionStatus(null);
-	}
-
-	//
-	// Send current encoding list to the RFB server.
-	//
-
-	int[] encodingsSaved;
-	int nEncodingsSaved;
-
-	void setEncodings() {
-		setEncodings(false);
-	}
-
-	void autoSelectEncodings() {
-		setEncodings(true);
-	}
-
-	void setEncodings(boolean autoSelectOnly) {
-		if (options == null || rfb == null || !rfb.inNormalProtocol)
-			return;
-
-		int preferredEncoding = options.preferredEncoding;
-		if (preferredEncoding == -1) {
-			long kbitsPerSecond = rfb.kbitsPerSecond();
-			if (nEncodingsSaved < 1) {
-				// Choose Tight or ZRLE encoding for the very first update.
-				System.out.println("Using Tight/ZRLE encodings");
-				preferredEncoding = RfbProto.EncodingTight;
-			} else if (kbitsPerSecond > 2000
-					&& encodingsSaved[0] != RfbProto.EncodingHextile) {
-				// Switch to Hextile if the connection speed is above 2Mbps.
-				System.out.println("Throughput " + kbitsPerSecond
-						+ " kbit/s - changing to Hextile encoding");
-				preferredEncoding = RfbProto.EncodingHextile;
-			} else if (kbitsPerSecond < 1000
-					&& encodingsSaved[0] != RfbProto.EncodingTight) {
-				// Switch to Tight/ZRLE if the connection speed is below 1Mbps.
-				System.out.println("Throughput " + kbitsPerSecond
-						+ " kbit/s - changing to Tight/ZRLE encodings");
-				preferredEncoding = RfbProto.EncodingTight;
-			} else {
-				// Don't change the encoder.
-				if (autoSelectOnly)
-					return;
-				preferredEncoding = encodingsSaved[0];
-			}
-		} else {
-			// Auto encoder selection is not enabled.
-			if (autoSelectOnly)
-				return;
-		}
-
-		int[] encodings = new int[20];
-		int nEncodings = 0;
-
-		encodings[nEncodings++] = preferredEncoding;
-		if (options.useCopyRect) {
-			encodings[nEncodings++] = RfbProto.EncodingCopyRect;
-		}
-		if (preferredEncoding != RfbProto.EncodingTight) {
-			encodings[nEncodings++] = RfbProto.EncodingTight;
-		}
-		if (preferredEncoding != RfbProto.EncodingZRLE) {
-			encodings[nEncodings++] = RfbProto.EncodingZRLE;
-		}
-		if (preferredEncoding != RfbProto.EncodingHextile) {
-			encodings[nEncodings++] = RfbProto.EncodingHextile;
-		}
-		if (preferredEncoding != RfbProto.EncodingZlib) {
-			encodings[nEncodings++] = RfbProto.EncodingZlib;
-		}
-		/*
-		 * if (preferredEncoding != RfbProto.EncodingCoRRE) {
-		 * encodings[nEncodings++] = RfbProto.EncodingCoRRE; } if
-		 * (preferredEncoding != RfbProto.EncodingRRE) { encodings[nEncodings++]
-		 * = RfbProto.EncodingRRE; }
-		 * 
-		 * if (options.compressLevel >= 0 && options.compressLevel <= 9) {
-		 * encodings[nEncodings++] = RfbProto.EncodingCompressLevel0 +
-		 * options.compressLevel; } if (options.jpegQuality >= 0 &&
-		 * options.jpegQuality <= 9) { encodings[nEncodings++] =
-		 * RfbProto.EncodingQualityLevel0 + options.jpegQuality; } if
-		 * (options.requestCursorUpdates) { encodings[nEncodings++] =
-		 * RfbProto.EncodingXCursor; encodings[nEncodings++] =
-		 * RfbProto.EncodingRichCursor; if (!options.ignoreCursorUpdates)
-		 * encodings[nEncodings++] = RfbProto.EncodingPointerPos; }
-		 */
-
-		encodings[nEncodings++] = RfbProto.EncodingLastRect;
-		encodings[nEncodings++] = RfbProto.EncodingNewFBSize;
-
-		boolean encodingsWereChanged = false;
-		if (nEncodings != nEncodingsSaved) {
-			encodingsWereChanged = true;
-		} else {
-			for (int i = 0; i < nEncodings; i++) {
-				if (encodings[i] != encodingsSaved[i]) {
-					encodingsWereChanged = true;
-					break;
-				}
-			}
-		}
-
-		if (encodingsWereChanged) {
-			try {
-				// rfb.writeSetEncodings(encodings, nEncodings);
-				if (vc != null) {
-					vc.softCursorFree();
-				}
-			} catch (Exception e) {
-				e.printStackTrace();
-			}
-			encodingsSaved = encodings;
-			nEncodingsSaved = nEncodings;
-		}
-	}
-
-	//
-	// setCutText() - send the given cut text to the RFB server.
-	//
-
-	void setCutText(String text) {
-		try {
-			if (rfb != null && rfb.inNormalProtocol) {
-				rfb.writeClientCutText(text);
-			}
-		} catch (Exception e) {
-			e.printStackTrace();
-		}
-	}
-
-	//
-	// Order change in session recording status. To stop recording, pass
-	// null in place of the fname argument.
-	//
-
-	void setRecordingStatus(String fname) {
-		synchronized (recordingSync) {
-			sessionFileName = fname;
-			recordingStatusChanged = true;
-		}
-	}
-
-	//
-	// Start or stop session recording. Returns true if this method call
-	// causes recording of a new session.
-	//
-
-	boolean checkRecordingStatus() throws IOException {
-		synchronized (recordingSync) {
-			if (recordingStatusChanged) {
-				recordingStatusChanged = false;
-				if (sessionFileName != null) {
-					startRecording();
-					return true;
-				} else {
-					stopRecording();
-				}
-			}
-		}
-		return false;
-	}
-
-	//
-	// Start session recording.
-	//
-
-	protected void startRecording() throws IOException {
-		synchronized (recordingSync) {
-			if (!recordingActive) {
-				// Save settings to restore them after recording the session.
-				cursorUpdatesDef = options.choices[options.cursorUpdatesIndex]
-						.getSelectedItem();
-				eightBitColorsDef = options.choices[options.eightBitColorsIndex]
-						.getSelectedItem();
-				// Set options to values suitable for recording.
-				options.choices[options.cursorUpdatesIndex].select("Disable");
-				options.choices[options.cursorUpdatesIndex].setEnabled(false);
-				options.setEncodings();
-				options.choices[options.eightBitColorsIndex].select("No");
-				options.choices[options.eightBitColorsIndex].setEnabled(false);
-				options.setColorFormat();
-			} else {
-				rfb.closeSession();
-			}
-
-			System.out.println("Recording the session in " + sessionFileName);
-			rfb.startSession(sessionFileName);
-			recordingActive = true;
-		}
-	}
-
-	//
-	// Stop session recording.
-	//
-
-	protected void stopRecording() throws IOException {
-		synchronized (recordingSync) {
-			if (recordingActive) {
-				// Restore options.
-				options.choices[options.cursorUpdatesIndex]
-						.select(cursorUpdatesDef);
-				options.choices[options.cursorUpdatesIndex].setEnabled(true);
-				options.setEncodings();
-				options.choices[options.eightBitColorsIndex]
-						.select(eightBitColorsDef);
-				options.choices[options.eightBitColorsIndex].setEnabled(true);
-				options.setColorFormat();
-
-				rfb.closeSession();
-				System.out.println("Session recording stopped.");
-			}
-			sessionFileName = null;
-			recordingActive = false;
-		}
-	}
-
-	//
-	// readParameters() - read parameters from the html source or from the
-	// command line. On the command line, the arguments are just a sequence of
-	// param_name/param_value pairs where the names and values correspond to
-	// those expected in the html applet tag source.
-	//
-
-	void readParameters() {
-	/*
-		 * host = readParameter("HOST", !inAnApplet);
-		 * 
-		 * if (host == null) { host = getCodeBase().getHost(); if
-		 * (host.equals("")) { fatalError("HOST parameter not specified"); } }
-		 * 
-		 * port = readIntParameter("PORT", 5550);
-		 */
-
-		// Read "ENCPASSWORD" or "PASSWORD" parameter if specified.
-		// readPasswordParameters();
-
-		String str;
-		if (inAnApplet) {
-			str = readParameter("Open New Window", false);
-			if (str != null && str.equalsIgnoreCase("Yes"))
-				inSeparateFrame = true;
-		}
-
-		// "Show Controls" set to "No" disables button panel.
-		showControls = true;
-		str = readParameter("Show Controls", false);
-		if (str != null && str.equalsIgnoreCase("No"))
-			showControls = false;
-
-		// "Offer Relogin" set to "No" disables "Login again" and "Close
-		// window" buttons under error messages in applet mode.
-		offerRelogin = true;
-		str = readParameter("Offer Relogin", false);
-		if (str != null && str.equalsIgnoreCase("No"))
-			offerRelogin = false;
-
-		// Do we continue showing desktop on remote disconnect?
-		showOfflineDesktop = false;
-		str = readParameter("Show Offline Desktop", false);
-		if (str != null && str.equalsIgnoreCase("Yes"))
-			showOfflineDesktop = true;
-
-		// Fine tuning options.
-		deferScreenUpdates = readIntParameter("Defer screen updates", 20);
-		deferCursorUpdates = readIntParameter("Defer cursor updates", 10);
-		deferUpdateRequests = readIntParameter("Defer update requests", 0);
-
-		// Debugging options.
-		debugStatsExcludeUpdates = readIntParameter("DEBUG_XU", 0);
-		debugStatsMeasureUpdates = readIntParameter("DEBUG_CU", 0);
-
-		// SocketFactory.
-		socketFactory = readParameter("SocketFactory", false);
-	}
-
-	//
-	// Read password parameters. If an "ENCPASSWORD" parameter is set,
-	// then decrypt the password into the passwordParam string. Otherwise,
-	// try to read the "PASSWORD" parameter directly to passwordParam.
-	//
-
-	private void readPasswordParameters() {
-		String encPasswordParam = readParameter("ENCPASSWORD", false);
-
-		if (encPasswordParam == null) {
-			passwordParam = readParameter("PASSWORD", false);
-		} else {
-			// ENCPASSWORD is hexascii-encoded. Decode.
-			byte[] pw = { 0, 0, 0, 0, 0, 0, 0, 0 };
-			int len = encPasswordParam.length() / 2;
-			if (len > 8)
-				len = 8;
-			for (int i = 0; i < len; i++) {
-				String hex = encPasswordParam.substring(i * 2, i * 2 + 2);
-				Integer x = new Integer(Integer.parseInt(hex, 16));
-				pw[i] = x.byteValue();
-			}
-			// Decrypt the password.
-			byte[] key = { 23, 82, 107, 6, 35, 78, 88, 7 };
-			DesCipher des = new DesCipher(key);
-			des.decrypt(pw, 0, pw, 0);
-			passwordParam = new String(pw);
-
-		}
-	}
-
-	public String readParameter(String name, boolean required) {
-		for (int i = 0; i < mainArgs.length; i += 2) {
-			if (mainArgs[i].equalsIgnoreCase(name)) {
-				try {
-					return mainArgs[i + 1];
-				} catch (Exception e) {
-					if (required) {
-						fatalError(name + " parameter not specified");
-					}
-					return null;
-				}
-			}
-		}
-		if (required) {
-			fatalError(name + " parameter not specified");
-		}
-		return null;
-	}
-
-	int readIntParameter(String name, int defaultValue) {
-		String str = readParameter(name, false);
-		int result = defaultValue;
-		if (str != null) {
-			try {
-				result = Integer.parseInt(str);
-			} catch (NumberFormatException e) {
-			}
-		}
-		return result;
-	}
-
-	//
-	// disconnect() - close connection to server.
-	//
-
-	synchronized public void disconnect() {
-		System.out.println("Disconnecting");
-
-		if (vc != null) {
-			double sec = (System.currentTimeMillis() - vc.statStartTime) / 1000.0;
-			double rate = Math.round(vc.statNumUpdates / sec * 100) / 100.0;
-			int nRealRects = vc.statNumPixelRects;
-			int nPseudoRects = vc.statNumTotalRects - vc.statNumPixelRects;
-			System.out.println("Updates received: " + vc.statNumUpdates + " ("
-					+ nRealRects + " rectangles + " + nPseudoRects
-					+ " pseudo), " + rate + " updates/sec");
-			int numRectsOther = nRealRects - vc.statNumRectsTight
-					- vc.statNumRectsZRLE - vc.statNumRectsHextile
-					- vc.statNumRectsRaw - vc.statNumRectsCopy;
-			System.out.println("Rectangles:" + " Tight=" + vc.statNumRectsTight
-					+ "(JPEG=" + vc.statNumRectsTightJPEG + ") ZRLE="
-					+ vc.statNumRectsZRLE + " Hextile="
-					+ vc.statNumRectsHextile + " Raw=" + vc.statNumRectsRaw
-					+ " CopyRect=" + vc.statNumRectsCopy + " other="
-					+ numRectsOther);
-
-			int raw = vc.statNumBytesDecoded;
-			int compressed = vc.statNumBytesEncoded;
-			if (compressed > 0) {
-				double ratio = Math.round((double) raw / compressed * 1000) / 1000.0;
-				System.out.println("Pixel data: " + vc.statNumBytesDecoded
-						+ " bytes, " + vc.statNumBytesEncoded
-						+ " compressed, ratio " + ratio);
-			}
-		}
-
-		if (rfb != null && !rfb.closed())
-			rfb.close();
-		// options.dispose();
-		clipboard.dispose();
-		if (rec != null)
-			rec.dispose();
-
-		System.exit(0);
-
-	}
-
-	//
-	// fatalError() - print out a fatal error message.
-	// FIXME: Do we really need two versions of the fatalError() method?
-	//
-
-	synchronized public void fatalError(String str) {
-		System.out.println(str);
-		System.exit(1);
-	}
-
-	synchronized public void fatalError(String str, Exception e) {
-
-		if (rfb != null && rfb.closed()) {
-			// Not necessary to show error message if the error was caused
-			// by I/O problems after the rfb.close() method call.
-			System.out.println("RFB thread finished");
-			return;
-		}
-
-		System.out.println(str);
-		e.printStackTrace();
-
-		if (rfb != null)
-			rfb.close();
-
-		System.exit(1);
-
-	}
-
-	//
-	// Show message text and optionally "Relogin" and "Close" buttons.
-	//
-
-	void showMessage(String msg) {
-		vncContainer.removeAll();
-
-		Label errLabel = new Label(msg, Label.CENTER);
-		errLabel.setFont(new Font("Helvetica", Font.PLAIN, 12));
-
-		if (offerRelogin) {
-			/*
-			 * Panel gridPanel = new Panel(new GridLayout(0, 1)); Panel
-			 * outerPanel = new Panel(new FlowLayout(FlowLayout.LEFT));
-			 * outerPanel.add(gridPanel); vncContainer.setLayout(new
-			 * FlowLayout(FlowLayout.LEFT, 30, 16));
-			 * vncContainer.add(outerPanel); Panel textPanel = new Panel(new
-			 * FlowLayout(FlowLayout.CENTER)); textPanel.add(errLabel);
-			 * gridPanel.add(textPanel); gridPanel.add(new ReloginPanel(this));
-			 */
-		} else {
-			/*
-			 * vncContainer.setLayout(new FlowLayout(FlowLayout.LEFT, 30, 30));
-			 * vncContainer.add(errLabel);
-			 */
-		}
-
-	}
-
-	//
-	// Stop the applet.
-	// Main applet thread will terminate on first exception
-	// after seeing that rfbThread has been set to null.
-	//
-
-	public void stop() {
-		System.out.println("Stopping applet");
-		rfbThread = null;
-	}
-
-	//
-	// This method is called before the applet is destroyed.
-	//
-
-	public void destroy() {
-		System.out.println("Destroying applet");
-
-		vncContainer.removeAll();
-		// options.dispose();
-		clipboard.dispose();
-		if (rec != null)
-			rec.dispose();
-		if (rfb != null && !rfb.closed())
-			rfb.close();
-	}
-
-	//
-	// Start/stop receiving mouse events.
-	//
-
-	public void enableInput(boolean enable) {
-		vc.enableInput(enable);
-	}
-
-	//
-	// Close application properly on window close event.
-	//
-
-	public void windowClosing(WindowEvent evt) {
-		System.out.println("Closing window");
-		if (rfb != null)
-			disconnect();
-
-		vncContainer.hide();
-
-	}
-
-	//
-	// Ignore window events we're not interested in.
-	//
-
-	public void windowActivated(WindowEvent evt) {
-	}
-
-	public void windowDeactivated(WindowEvent evt) {
-	}
-
-	public void windowOpened(WindowEvent evt) {
-	}
-
-	public void windowClosed(WindowEvent evt) {
-	}
-
-	public void windowIconified(WindowEvent evt) {
-	}
-
-	public void windowDeiconified(WindowEvent evt) {
-	}
-
-	public void setClientSocket(Socket sock) {
-		clientSocket = sock;
-	}
-
-	public void start() {
-
-	}
-	public void close() {
-		rfb.close();
-	}
-	public void getParentName() {
-		if (echoValue == null) {
-
-			if (clientSocket == null) {
-				String pHost;
-				if (mainArgs.length > 0)
-					pHost = mainArgs[0];
-				else
-					pHost = "cls080.ie.u-ryukyu.ac.jp";
-//				echo = new EchoClient(pHost, this);
-				echoValue = new EchoClient(pHost, this, echoPort);
-				echoValue.openport();
-
-				echoValue = echoValue.requestHostName("1");
-			} else {
-				echoValue = new EchoClient();
-				echoValue = echoValue.Interruption(clientSocket);
-			}
-		}	
-
-		// proxyからの返信で接続先を決定する
-		host = echoValue.responseLine;
-		parent = echoValue.parent;
-		if (echoValue.treenum != null) {
-			treenum = echoValue.treenum;
-		} else {
-			treenum = echoValue.treenum;
-		}
-		if (echoValue.leaderflag != null) {
-			leaderflag = echoValue.leaderflag;
-		} else {
-			leaderflag = echoValue.leaderflag;
-		}
-		System.out.println("Parent =" + parent);
-		System.out.println("mynumber =" + treenum);
-		System.out.println("connect host =" + host);
-		System.out.println("leaderflag(boolean) = " + leaderflag);
-
-//		port = 5999;		
-		
-	}
-	public void setEchoValue(EchoClient value) {
-		this.echoValue = value;
-	}	
-
-	
-	int castByteInt(byte[] b) {
-		ByteBuffer bb = ByteBuffer.wrap(b);
-		int echoValue = bb.getInt();
-		return echoValue;
-	}
-	public Image getScreenImage() {
-		return vc.rawPixelsImage;
-	}
-
-	public void writeScreenData(byte[] b, String imageFormat) {
-		try{
-			vc.drawBufferedImage(b);
-		}catch(IOException e){
-			e.printStackTrace();
-		}
-	}
-	
-}
--- a/src/myVncProxy/CuiVncCanvas.java	Fri Jan 13 13:41:30 2012 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1955 +0,0 @@
-package myVncProxy;
-import java.awt.*;
-import java.awt.event.*;
-import java.awt.image.*;
-import java.io.*;
-import java.lang.*;
-import java.nio.ByteBuffer;
-import java.util.zip.*;
-
-import java.net.Socket;
-
-import javax.imageio.ImageIO;
-
-//
-//VncCanvas is a subclass of Canvas which draws a VNC desktop on it.
-//
-
-class CuiVncCanvas extends Canvas implements KeyListener, MouseListener,
-		MouseMotionListener {
-
-	CuiMyVncClient viewer;
-	MyRfbProto rfb;
-	ColorModel cm8, cm24;
-	Color[] colors;
-	int bytesPixel;
-
-	int maxWidth = 0, maxHeight = 0;
-	int scalingFactor;
-	int scaledWidth, scaledHeight;
-
-//	Image memImage;
-	BufferedImage memImage;
-	Graphics memGraphics;
-
-	Image rawPixelsImage;
-//	BufferedImage rawPixelsImage;
-	BufferedImage bimg;
-
-	MemoryImageSource pixelsSource;
-	byte[] pixels8;
-	int[] pixels24;
-
-	// Update statistics.
-	long statStartTime; // time on first framebufferUpdateRequest
-	int statNumUpdates; // counter for FramebufferUpdate messages
-	int statNumTotalRects; // rectangles in FramebufferUpdate messages
-	int statNumPixelRects; // the same, but excluding pseudo-rectangles
-	int statNumRectsTight; // Tight-encoded rectangles (including JPEG)
-	int statNumRectsTightJPEG; // JPEG-compressed Tight-encoded rectangles
-	int statNumRectsZRLE; // ZRLE-encoded rectangles
-	int statNumRectsHextile; // Hextile-encoded rectangles
-	int statNumRectsRaw; // Raw-encoded rectangles
-	int statNumRectsCopy; // CopyRect rectangles
-	int statNumBytesEncoded; // number of bytes in updates, as received
-	int statNumBytesDecoded; // number of bytes, as if Raw encoding was used
-
-	// ZRLE encoder's data.
-	byte[] zrleBuf;
-	int zrleBufLen = 0;
-	byte[] zrleTilePixels8;
-	int[] zrleTilePixels24;
-	ZlibInStream zrleInStream;
-	boolean zrleRecWarningShown = false;
-
-	// Zlib encoder's data.
-	byte[] zlibBuf;
-	int zlibBufLen = 0;
-	Inflater zlibInflater;
-
-	// Tight encoder's data.
-	final static int tightZlibBufferSize = 512;
-	Inflater[] tightInflaters;
-
-	// Since JPEG images are loaded asynchronously, we have to remember
-	// their position in the framebuffer. Also, this jpegRect object is
-	// used for synchronization between the rfbThread and a JVM's thread
-	// which decodes and loads JPEG images.
-	Rectangle jpegRect;
-
-	// True if we process keyboard and mouse events.
-	boolean inputEnabled;
-	private int b = 0;
-	
-
-	
-	//
-	// The constructors.
-	//
-
-	public CuiVncCanvas(CuiMyVncClient v, int maxWidth_, int maxHeight_)
-			throws IOException {
-
-		viewer = v;
-		maxWidth = maxWidth_;
-		maxHeight = maxHeight_;
-
-		rfb = viewer.rfb;
-		
-		tightInflaters = new Inflater[4];
-
-		cm8 = new DirectColorModel(8, 7, (7 << 3), (3 << 6));
-		cm24 = new DirectColorModel(24, 0xFF0000, 0x00FF00, 0x0000FF);
-
-		colors = new Color[256];
-		for (int i = 0; i < 256; i++)
-			colors[i] = new Color(cm8.getRGB(i));
-
-//		setPixelFormat();
-
-		inputEnabled = false;
-		// Keyboard listener is enabled even in view-only mode, to catch
-		// 'r' or 'R' key presses used to request screen update.
-		addKeyListener(this);
-	}
-
-	public CuiVncCanvas(CuiMyVncClient v) throws IOException {
-		this(v, 0, 0);
-	}
-
-	//
-	// Callback methods to determine geometry of our Component.
-	//
-
-	public Dimension getPreferredSize() {
-		return new Dimension(scaledWidth, scaledHeight);
-	}
-
-	public Dimension getMinimumSize() {
-		return new Dimension(scaledWidth, scaledHeight);
-	}
-
-	public Dimension getMaximumSize() {
-		return new Dimension(scaledWidth, scaledHeight);
-	}
-
-	//
-	// All painting is performed here.
-	//
-
-	public void update(Graphics g) {
-		paint(g);
-	}
-
-	public void paint(Graphics g) {
-		synchronized (memImage) {
-			if (rfb.framebufferWidth == scaledWidth) {
-				g.drawImage(memImage, 0, 0, null);
-			} else {
-				paintScaledFrameBuffer(g);
-			}
-		}
-		if (showSoftCursor) {
-			int x0 = cursorX - hotX, y0 = cursorY - hotY;
-			Rectangle r = new Rectangle(x0, y0, cursorWidth, cursorHeight);
-			if (r.intersects(g.getClipBounds())) {
-				g.drawImage(softCursor, x0, y0, null);
-			}
-		}
-	}
-
-	public void paintScaledFrameBuffer(Graphics g) {
-		g.drawImage(memImage, 0, 0, scaledWidth, scaledHeight, null);
-	}
-
-	//
-	// Override the ImageObserver interface method to handle drawing of
-	// JPEG-encoded data.
-	//
-
-	public boolean imageUpdate(Image img, int infoflags, int x, int y,
-			int width, int height) {
-		if ((infoflags & (ALLBITS | ABORT)) == 0) {
-			return true; // We need more image data.
-		} else {
-			// If the whole image is available, draw it now.
-			if ((infoflags & ALLBITS) != 0) {
-				if (jpegRect != null) {
-					synchronized (jpegRect) {
-						memGraphics
-								.drawImage(img, jpegRect.x, jpegRect.y, null);
-						scheduleRepaint(jpegRect.x, jpegRect.y, jpegRect.width,
-								jpegRect.height);
-						jpegRect.notify();
-					}
-				}
-			}
-			return false; // All image data was processed.
-		}
-	}
-
-	//
-	// Start/stop receiving mouse events. Keyboard events are received
-	// even in view-only mode, because we want to map the 'r' key to the
-	// screen refreshing function.
-	//
-
-	public synchronized void enableInput(boolean enable) {
-		if (enable && !inputEnabled) {
-			inputEnabled = true;
-			addMouseListener(this);
-			addMouseMotionListener(this);
-			if (viewer.showControls) {
-				viewer.buttonPanel.enableRemoteAccessControls(true);
-			}
-			createSoftCursor(); // scaled cursor
-		} else if (!enable && inputEnabled) {
-			inputEnabled = false;
-			removeMouseListener(this);
-			removeMouseMotionListener(this);
-			if (viewer.showControls) {
-				viewer.buttonPanel.enableRemoteAccessControls(false);
-			}
-			createSoftCursor(); // non-scaled cursor
-		}
-	}
-
-	public void setPixelFormat() throws IOException {
-/*
-		if (viewer.options.eightBitColors) {
-			rfb.writeSetPixelFormat(8, 8, false, true, 7, 7, 3, 0, 3, 6);
-			bytesPixel = 1;
-		} else {
-			rfb.writeSetPixelFormat(32, 24, false, true, 255, 255, 255, 16, 8,
-					0);
-			bytesPixel = 4;
-		}
-*/
-		updateFramebufferSize();
-	}
-
-	void updateFramebufferSize() {
-
-		// Useful shortcuts.
-		int fbWidth = rfb.framebufferWidth;
-		int fbHeight = rfb.framebufferHeight;
-
-		// Calculate scaling factor for auto scaling.
-		if (maxWidth > 0 && maxHeight > 0) {
-			int f1 = maxWidth * 100 / fbWidth;
-			int f2 = maxHeight * 100 / fbHeight;
-			scalingFactor = Math.min(f1, f2);
-			if (scalingFactor > 100)
-				scalingFactor = 100;
-			System.out.println("Scaling desktop at " + scalingFactor + "%");
-		}
-
-		// Update scaled framebuffer geometry.
-		scaledWidth = (fbWidth * scalingFactor + 50) / 100;
-		scaledHeight = (fbHeight * scalingFactor + 50) / 100;
-
-		// Create new off-screen image either if it does not exist, or if
-		// its geometry should be changed. It's not necessary to replace
-		// existing image if only pixel format should be changed.
-/*
-		if (memImage == null) {
-			memImage = viewer.vncContainer.createImage(fbWidth, fbHeight);
-			memGraphics = memImage.getGraphics();
-		} else if (memImage.getWidth(null) != fbWidth
-				|| memImage.getHeight(null) != fbHeight) {
-			synchronized (memImage) {
-				memImage = viewer.vncContainer.createImage(fbWidth, fbHeight);
-				memGraphics = memImage.getGraphics();
-			}
-		}
-*/
-		memImage = new BufferedImage(rfb.framebufferWidth, rfb.framebufferHeight, BufferedImage.TYPE_INT_RGB );
-		memGraphics = memImage.getGraphics();
-		
-		// Images with raw pixels should be re-allocated on every change
-		// of geometry or pixel format.
-		if (bytesPixel == 1) {
-
-			pixels24 = null;
-			pixels8 = new byte[fbWidth * fbHeight];
-
-			pixelsSource = new MemoryImageSource(fbWidth, fbHeight, cm8,
-					pixels8, 0, fbWidth);
-
-			zrleTilePixels24 = null;
-			zrleTilePixels8 = new byte[64 * 64];
-
-		} else {
-
-			pixels8 = null;
-			pixels24 = new int[fbWidth * fbHeight];
-
-			pixelsSource = new MemoryImageSource(fbWidth, fbHeight, cm24,
-					pixels24, 0, fbWidth);
-
-			zrleTilePixels8 = null;
-			zrleTilePixels24 = new int[64 * 64];
-
-		}
-		pixelsSource.setAnimated(true);
-		rawPixelsImage = Toolkit.getDefaultToolkit().createImage(pixelsSource);
-//		rawPixelsImage = (BufferedImage) Toolkit.getDefaultToolkit().createImage(pixelsSource);
-		
-	}
-
-	void resizeDesktopFrame() {
-		setSize(scaledWidth, scaledHeight);
-
-		// FIXME: Find a better way to determine correct size of a
-		// ScrollPane. -- const
-		Insets insets = viewer.desktopScrollPane.getInsets();
-		viewer.desktopScrollPane.setSize(
-				scaledWidth + 2 * Math.min(insets.left, insets.right),
-				scaledHeight + 2 * Math.min(insets.top, insets.bottom));
-
-		viewer.vncFrame.pack();
-
-		// Try to limit the frame size to the screen size.
-
-		Dimension screenSize = viewer.vncFrame.getToolkit().getScreenSize();
-		Dimension frameSize = viewer.vncFrame.getSize();
-		Dimension newSize = frameSize;
-
-		// Reduce Screen Size by 30 pixels in each direction;
-		// This is a (poor) attempt to account for
-		// 1) Menu bar on Macintosh (should really also account for
-		// Dock on OSX). Usually 22px on top of screen.
-		// 2) Taxkbar on Windows (usually about 28 px on bottom)
-		// 3) Other obstructions.
-
-		screenSize.height -= 30;
-		screenSize.width -= 30;
-
-		boolean needToResizeFrame = false;
-		if (frameSize.height > screenSize.height) {
-			newSize.height = screenSize.height;
-			needToResizeFrame = true;
-		}
-		if (frameSize.width > screenSize.width) {
-			newSize.width = screenSize.width;
-			needToResizeFrame = true;
-		}
-		if (needToResizeFrame) {
-			viewer.vncFrame.setSize(newSize);
-		}
-
-		viewer.desktopScrollPane.doLayout();
-	}
-
-	//
-	// processNormalProtocol() - executed by the rfbThread to deal with the
-	// RFB socket.
-	//
-
-	public void processNormalProtocol() throws Exception {
-
-		// Start/stop session recording if necessary.
-		viewer.checkRecordingStatus();
-		
-		rfb.writeFramebufferUpdateRequest(0, 0, rfb.framebufferWidth,
-				rfb.framebufferHeight, false);
-
-		resetStats();
-		boolean statsRestarted = false;
-
-		//
-		// main dispatch loop
-		//
-		
-		long count = 0;
-		while (true) {
-//			System.out.println("\ncount=" + count);
-			
-			count++;
-			
-			/**
-			 *  read Data from parents and send Data to Client.
-			 */
-			rfb.sendDataToClient();
-
-			long numBytesRead = rfb.getNumBytesRead();
-			
-			// Read message type from the server. 
-			int msgType = rfb.readServerMessageType();
-
-			// Process the message depending on its type.
-			switch (msgType) {
-			case MyRfbProto.SpeedCheckMillis:
-				rfb.readSpeedCheck();
-
-				break;
-			case MyRfbProto.WriteJpegData:
-				byte[] b = rfb.readJpegData();
-				drawBufferedImage(b);
-				break;
-			case RfbProto.FramebufferUpdate:
-
-				if (statNumUpdates == viewer.debugStatsExcludeUpdates
-						&& !statsRestarted) {
-					resetStats();
-					statsRestarted = true;
-				} else if (statNumUpdates == viewer.debugStatsMeasureUpdates
-						&& statsRestarted) {
-					viewer.disconnect();
-				}
-
-				rfb.readFramebufferUpdate();
-				statNumUpdates++;
-
-				boolean cursorPosReceived = false;
-
-				for (int i = 0; i < rfb.updateNRects; i++) {
-
-					rfb.readFramebufferUpdateRectHdr();
-					statNumTotalRects++;
-					int rx = rfb.updateRectX, ry = rfb.updateRectY;
-					int rw = rfb.updateRectW, rh = rfb.updateRectH;
-
-					if (rfb.updateRectEncoding == rfb.EncodingLastRect)
-						break;
-
-					if (rfb.updateRectEncoding == rfb.EncodingNewFBSize) {
-						rfb.setFramebufferSize(rw, rh);
-						updateFramebufferSize();
-						break;
-					}
-
-					if (rfb.updateRectEncoding == rfb.EncodingXCursor
-							|| rfb.updateRectEncoding == rfb.EncodingRichCursor) {
-						handleCursorShapeUpdate(rfb.updateRectEncoding, rx, ry,
-								rw, rh);
-						continue;
-					}
-
-					if (rfb.updateRectEncoding == rfb.EncodingPointerPos) {
-						softCursorMove(rx, ry);
-						cursorPosReceived = true;
-						continue;
-					}
-
-					long numBytesReadBefore = rfb.getNumBytesRead();
-
-					rfb.startTiming();
-
-					switch (rfb.updateRectEncoding) {
-					case RfbProto.EncodingRaw:
-						statNumRectsRaw++;
-						handleRawRect(rx, ry, rw, rh);
-						break;
-					case RfbProto.EncodingCopyRect:
-						statNumRectsCopy++;
-						handleCopyRect(rx, ry, rw, rh);
-						break;
-					case RfbProto.EncodingRRE:
-						handleRRERect(rx, ry, rw, rh);
-						break;
-					case RfbProto.EncodingCoRRE:
-						handleCoRRERect(rx, ry, rw, rh);
-						break;
-					case RfbProto.EncodingHextile:
-						statNumRectsHextile++;
-						handleHextileRect(rx, ry, rw, rh);
-						break;
-					case RfbProto.EncodingZRLE:
-						statNumRectsZRLE++;
-						handleZRLERect(rx, ry, rw, rh);
-						break;
-					case RfbProto.EncodingZRLEE:
-						statNumRectsZRLE++;
-						handleZRLERect(rx, ry, rw, rh);
-						break;
-					case RfbProto.EncodingZlib:
-						handleZlibRect(rx, ry, rw, rh);
-						break;
-					case RfbProto.EncodingTight:
-						statNumRectsTight++;
-						handleTightRect(rx, ry, rw, rh);
-						break;
-					default:
-						throw new Exception("Unknown RFB rectangle encoding "
-								+ rfb.updateRectEncoding);
-					}
-
-					rfb.stopTiming();
-					
-					long kbitsPerSecond = rfb.kbitsPerSecond();
-//					System.out.println("kbitsPerSecond = " + kbitsPerSecond);
-
-					statNumPixelRects++;
-					statNumBytesDecoded += rw * rh * bytesPixel;
-					statNumBytesEncoded += (int) (rfb.getNumBytesRead() - numBytesReadBefore);
-				}
-
-				boolean fullUpdateNeeded = false;
-
-				// Start/stop session recording if necessary. Request full
-				// update if a new session file was opened.
-				if (viewer.checkRecordingStatus())
-					fullUpdateNeeded = true;
-
-				// Defer framebuffer update request if necessary. But wake up
-				// immediately on keyboard or mouse event. Also, don't sleep
-				// if there is some data to receive, or if the last update
-				// included a PointerPos message.
-				if (viewer.deferUpdateRequests > 0 && rfb.available() == 0
-						&& !cursorPosReceived) {
-					synchronized (rfb) {
-						try {
-							rfb.wait(viewer.deferUpdateRequests);
-						} catch (InterruptedException e) {
-						}
-					}
-				}
-
-				viewer.autoSelectEncodings();
-
-				// Before requesting framebuffer update, check if the pixel
-				// format should be changed.
-/*
-				if (viewer.options.eightBitColors != (bytesPixel == 1)) {
-					// Pixel format should be changed.
-					setPixelFormat();
-					fullUpdateNeeded = true;
-				}
-*/
-				// Request framebuffer update if needed.
-				int w = rfb.framebufferWidth;
-				int h = rfb.framebufferHeight;
-				rfb.writeFramebufferUpdateRequest(0, 0, w, h, !fullUpdateNeeded);
-
-				break;
-
-			case RfbProto.SetColourMapEntries:
-				throw new Exception("Can't handle SetColourMapEntries message");
-
-			case RfbProto.Bell:
-				Toolkit.getDefaultToolkit().beep();
-				break;
-
-			case RfbProto.ServerCutText:
-				String s = rfb.readServerCutText();
-				viewer.clipboard.setCutText(s);
-				break;
-
-			default:
-				throw new Exception("Unknown RFB message type " + msgType);
-			}
-
-			int bufSize = (int)(rfb.getNumBytesRead() - numBytesRead);
-//			System.out.println("bufSize="+bufSize);
-//			rfb.bufResetSend(bufSize);
-
-
-
-			if(rfb.createBimgFlag){
-//				bimg = createBufferedImage(rawPixelsImage);
-				bimg = createBufferedImage(memImage);
-				//bimg(BufferedImage) -> rfb.pngBytes(byte[])
-				rfb.createPngBytes(bimg);
-				rfb.sendPngImage();	
-				rfb.createBimgFlag = false;
-			}
-
-			
-/*
-			boolean result = false;
-			try{
-				result = ImageIO.write(bimg, "png", new File("sample.png"));
-			}catch(Exception e){
-				e.printStackTrace();
-				result = false;
-			}
-*/
-		}
-	}
-
-	//
-	// Handle a raw rectangle. The second form with paint==false is used
-	// by the Hextile decoder for raw-encoded tiles.
-	//
-
-	void handleRawRect(int x, int y, int w, int h) throws IOException {
-		handleRawRect(x, y, w, h, true);
-	}
-
-	void handleRawRect(int x, int y, int w, int h, boolean paint)
-			throws IOException {
-
-		if (bytesPixel == 1) {
-			for (int dy = y; dy < y + h; dy++) {
-				rfb.readFully(pixels8, dy * rfb.framebufferWidth + x, w);
-				if (rfb.rec != null) {
-					rfb.rec.write(pixels8, dy * rfb.framebufferWidth + x, w);
-				}
-			}
-		} else {
-			byte[] buf = new byte[w * 4];
-			int i, offset;
-			for (int dy = y; dy < y + h; dy++) {
-				rfb.readFully(buf);
-				if (rfb.rec != null) {
-					rfb.rec.write(buf);
-				}
-				
-				 offset = dy * rfb.framebufferWidth + x; 
-				 for (i = 0; i < w; i++) {
-					 pixels24[offset + i] = (buf[i * 4 + 2] & 0xFF) << 16 |
-					 						(buf[i * 4 + 1] & 0xFF) << 8 | 
-					 						(buf[i * 4] & 0xFF); 
-				 }
-				
-			}
-		}
-
-		handleUpdatedPixels(x, y, w, h);
-//		if (paint) scheduleRepaint(x, y, w, h);
-
-	}
-
-	//
-	// Handle a CopyRect rectangle.
-	//
-
-	void handleCopyRect(int x, int y, int w, int h) throws IOException {
-
-		rfb.readCopyRect();
-		memGraphics.copyArea(rfb.copyRectSrcX, rfb.copyRectSrcY, w, h, x
-				- rfb.copyRectSrcX, y - rfb.copyRectSrcY);
-
-		scheduleRepaint(x, y, w, h);
-	}
-
-	//
-	// Handle an RRE-encoded rectangle.
-	//
-
-	void handleRRERect(int x, int y, int w, int h) throws IOException {
-
-		int nSubrects = rfb.readU32();
-
-		byte[] bg_buf = new byte[bytesPixel];
-		rfb.readFully(bg_buf);
-		Color pixel;
-		if (bytesPixel == 1) {
-			pixel = colors[bg_buf[0] & 0xFF];
-		} else {
-			pixel = new Color(bg_buf[2] & 0xFF, bg_buf[1] & 0xFF,
-					bg_buf[0] & 0xFF);
-		}
-		memGraphics.setColor(pixel);
-		memGraphics.fillRect(x, y, w, h);
-
-		byte[] buf = new byte[nSubrects * (bytesPixel + 8)];
-		rfb.readFully(buf);
-		DataInputStream ds = new DataInputStream(new ByteArrayInputStream(buf));
-
-		if (rfb.rec != null) {
-			rfb.rec.writeIntBE(nSubrects);
-			rfb.rec.write(bg_buf);
-			rfb.rec.write(buf);
-		}
-
-		int sx, sy, sw, sh;
-
-		for (int j = 0; j < nSubrects; j++) {
-			if (bytesPixel == 1) {
-				pixel = colors[ds.readUnsignedByte()];
-			} else {
-				ds.skip(4);
-				pixel = new Color(buf[j * 12 + 2] & 0xFF,
-						buf[j * 12 + 1] & 0xFF, buf[j * 12] & 0xFF);
-			}
-			sx = x + ds.readUnsignedShort();
-			sy = y + ds.readUnsignedShort();
-			sw = ds.readUnsignedShort();
-			sh = ds.readUnsignedShort();
-
-			memGraphics.setColor(pixel);
-			memGraphics.fillRect(sx, sy, sw, sh);
-		}
-
-		scheduleRepaint(x, y, w, h);
-	}
-
-	//
-	// Handle a CoRRE-encoded rectangle.
-	//
-
-	void handleCoRRERect(int x, int y, int w, int h) throws IOException {
-		int nSubrects = rfb.readU32();
-
-		byte[] bg_buf = new byte[bytesPixel];
-		rfb.readFully(bg_buf);
-		Color pixel;
-		if (bytesPixel == 1) {
-			pixel = colors[bg_buf[0] & 0xFF];
-		} else {
-			pixel = new Color(bg_buf[2] & 0xFF, bg_buf[1] & 0xFF,
-					bg_buf[0] & 0xFF);
-		}
-		memGraphics.setColor(pixel);
-		memGraphics.fillRect(x, y, w, h);
-
-		byte[] buf = new byte[nSubrects * (bytesPixel + 4)];
-		rfb.readFully(buf);
-
-		if (rfb.rec != null) {
-			rfb.rec.writeIntBE(nSubrects);
-			rfb.rec.write(bg_buf);
-			rfb.rec.write(buf);
-		}
-
-		int sx, sy, sw, sh;
-		int i = 0;
-
-		for (int j = 0; j < nSubrects; j++) {
-			if (bytesPixel == 1) {
-				pixel = colors[buf[i++] & 0xFF];
-			} else {
-				pixel = new Color(buf[i + 2] & 0xFF, buf[i + 1] & 0xFF,
-						buf[i] & 0xFF);
-				i += 4;
-			}
-			sx = x + (buf[i++] & 0xFF);
-			sy = y + (buf[i++] & 0xFF);
-			sw = buf[i++] & 0xFF;
-			sh = buf[i++] & 0xFF;
-
-			memGraphics.setColor(pixel);
-			memGraphics.fillRect(sx, sy, sw, sh);
-		}
-
-		scheduleRepaint(x, y, w, h);
-	}
-
-	//
-	// Handle a Hextile-encoded rectangle.
-	//
-
-	// These colors should be kept between handleHextileSubrect() calls.
-	private Color hextile_bg, hextile_fg;
-
-	void handleHextileRect(int x, int y, int w, int h) throws IOException {
-
-		hextile_bg = new Color(0);
-		hextile_fg = new Color(0);
-
-		for (int ty = y; ty < y + h; ty += 16) {
-			int th = 16;
-			if (y + h - ty < 16)
-				th = y + h - ty;
-
-			for (int tx = x; tx < x + w; tx += 16) {
-				int tw = 16;
-				if (x + w - tx < 16)
-					tw = x + w - tx;
-
-				handleHextileSubrect(tx, ty, tw, th);
-			}
-
-			// Finished with a row of tiles, now let's show it.
-			scheduleRepaint(x, y, w, h);
-		}
-	}
-
-	//
-	// Handle one tile in the Hextile-encoded data.
-	//
-
-	void handleHextileSubrect(int tx, int ty, int tw, int th)
-			throws IOException {
-
-		int subencoding = rfb.readU8();
-		if (rfb.rec != null) {
-			rfb.rec.writeByte(subencoding);
-		}
-
-		// Is it a raw-encoded sub-rectangle?
-		if ((subencoding & rfb.HextileRaw) != 0) {
-			handleRawRect(tx, ty, tw, th, false);
-			return;
-		}
-
-		// Read and draw the background if specified.
-		byte[] cbuf = new byte[bytesPixel];
-		if ((subencoding & rfb.HextileBackgroundSpecified) != 0) {
-			rfb.readFully(cbuf);
-			if (bytesPixel == 1) {
-				hextile_bg = colors[cbuf[0] & 0xFF];
-			} else {
-				hextile_bg = new Color(cbuf[2] & 0xFF, cbuf[1] & 0xFF,
-						cbuf[0] & 0xFF);
-			}
-			if (rfb.rec != null) {
-				rfb.rec.write(cbuf);
-			}
-		}
-		memGraphics.setColor(hextile_bg);
-		memGraphics.fillRect(tx, ty, tw, th);
-
-		// Read the foreground color if specified.
-		if ((subencoding & rfb.HextileForegroundSpecified) != 0) {
-			rfb.readFully(cbuf);
-			if (bytesPixel == 1) {
-				hextile_fg = colors[cbuf[0] & 0xFF];
-			} else {
-				hextile_fg = new Color(cbuf[2] & 0xFF, cbuf[1] & 0xFF,
-						cbuf[0] & 0xFF);
-			}
-			if (rfb.rec != null) {
-				rfb.rec.write(cbuf);
-			}
-		}
-
-		// Done with this tile if there is no sub-rectangles.
-		if ((subencoding & rfb.HextileAnySubrects) == 0)
-			return;
-
-		int nSubrects = rfb.readU8();
-		int bufsize = nSubrects * 2;
-		if ((subencoding & rfb.HextileSubrectsColoured) != 0) {
-			bufsize += nSubrects * bytesPixel;
-		}
-		byte[] buf = new byte[bufsize];
-		rfb.readFully(buf);
-		if (rfb.rec != null) {
-			rfb.rec.writeByte(nSubrects);
-			rfb.rec.write(buf);
-		}
-
-		int b1, b2, sx, sy, sw, sh;
-		int i = 0;
-
-		if ((subencoding & rfb.HextileSubrectsColoured) == 0) {
-
-			// Sub-rectangles are all of the same color.
-			memGraphics.setColor(hextile_fg);
-			for (int j = 0; j < nSubrects; j++) {
-				b1 = buf[i++] & 0xFF;
-				b2 = buf[i++] & 0xFF;
-				sx = tx + (b1 >> 4);
-				sy = ty + (b1 & 0xf);
-				sw = (b2 >> 4) + 1;
-				sh = (b2 & 0xf) + 1;
-				memGraphics.fillRect(sx, sy, sw, sh);
-			}
-		} else if (bytesPixel == 1) {
-
-			// BGR233 (8-bit color) version for colored sub-rectangles.
-			for (int j = 0; j < nSubrects; j++) {
-				hextile_fg = colors[buf[i++] & 0xFF];
-				b1 = buf[i++] & 0xFF;
-				b2 = buf[i++] & 0xFF;
-				sx = tx + (b1 >> 4);
-				sy = ty + (b1 & 0xf);
-				sw = (b2 >> 4) + 1;
-				sh = (b2 & 0xf) + 1;
-				memGraphics.setColor(hextile_fg);
-				memGraphics.fillRect(sx, sy, sw, sh);
-			}
-
-		} else {
-
-			// Full-color (24-bit) version for colored sub-rectangles.
-			for (int j = 0; j < nSubrects; j++) {
-				hextile_fg = new Color(buf[i + 2] & 0xFF, buf[i + 1] & 0xFF,
-						buf[i] & 0xFF);
-				i += 4;
-				b1 = buf[i++] & 0xFF;
-				b2 = buf[i++] & 0xFF;
-				sx = tx + (b1 >> 4);
-				sy = ty + (b1 & 0xf);
-				sw = (b2 >> 4) + 1;
-				sh = (b2 & 0xf) + 1;
-				memGraphics.setColor(hextile_fg);
-				memGraphics.fillRect(sx, sy, sw, sh);
-			}
-
-		}
-	}
-
-	//
-	// Handle a ZRLE-encoded rectangle.
-	//
-	// FIXME: Currently, session recording is not fully supported for ZRLE.
-	//
-
-	void handleZRLERect(int x, int y, int w, int h) throws Exception {
-		if (rfb.updateRectEncoding==RfbProto.EncodingZRLEE) zrleInStream = null;
-
-		if (zrleInStream == null)
-			zrleInStream = new ZlibInStream();
-
-		int nBytes = rfb.readU32();
-		if (nBytes > 64 * 1024 * 1024)
-			throw new Exception("ZRLE decoder: illegal compressed data size");
-
-		if (zrleBuf == null || zrleBufLen < nBytes) {
-			zrleBufLen = nBytes + 4096;
-			zrleBuf = new byte[zrleBufLen];
-		}
-
-		// FIXME: Do not wait for all the data before decompression.
-		rfb.readFully(zrleBuf, 0, nBytes);
-
-		if (rfb.rec != null) {
-			if (rfb.recordFromBeginning) {
-				rfb.rec.writeIntBE(nBytes);
-				rfb.rec.write(zrleBuf, 0, nBytes);
-			} else if (!zrleRecWarningShown) {
-				System.out.println("Warning: ZRLE session can be recorded"
-						+ " only from the beginning");
-				System.out.println("Warning: Recorded file may be corrupted");
-				zrleRecWarningShown = true;
-			}
-
-		}
-
-		zrleInStream.setUnderlying(new MemInStream(zrleBuf, 0, nBytes), nBytes);
-
-		for (int ty = y; ty < y + h; ty += 64) {
-
-			int th = Math.min(y + h - ty, 64);
-
-			for (int tx = x; tx < x + w; tx += 64) {
-
-				int tw = Math.min(x + w - tx, 64);
-
-				int mode = zrleInStream.readU8();
-				boolean rle = (mode & 128) != 0;
-				int palSize = mode & 127;
-				int[] palette = new int[128];
-
-				readZrlePalette(palette, palSize);
-
-				if (palSize == 1) {
-					int pix = palette[0];
-					Color c = (bytesPixel == 1) ? colors[pix] : new Color(
-							0xFF000000 | pix);
-					memGraphics.setColor(c);
-					memGraphics.fillRect(tx, ty, tw, th);
-					continue;
-				}
-
-				if (!rle) {
-					if (palSize == 0) {
-						readZrleRawPixels(tw, th);
-					} else {
-						readZrlePackedPixels(tw, th, palette, palSize);
-					}
-				} else {
-					if (palSize == 0) {
-						readZrlePlainRLEPixels(tw, th);
-					} else {
-						readZrlePackedRLEPixels(tw, th, palette);
-					}
-				}
-				handleUpdatedZrleTile(tx, ty, tw, th);
-			}
-		}
-
-		zrleInStream.reset();
-
-		scheduleRepaint(x, y, w, h);
-	}
-
-	int readPixel(InStream is) throws Exception {
-		int pix;
-
-		if (bytesPixel == 1) {
-
-			pix = is.readU8();
-		} else {
-			int p1 = is.readU8();
-			int p2 = is.readU8();
-			int p3 = is.readU8();
-			pix = (p3 & 0xFF) << 16 | (p2 & 0xFF) << 8 | (p1 & 0xFF);
-		}
-		return pix;
-	}
-
-	void readPixels(InStream is, int[] dst, int count) throws Exception {
-		int pix;
-		if (bytesPixel == 1) {
-			byte[] buf = new byte[count];
-			is.readBytes(buf, 0, count);
-			for (int i = 0; i < count; i++) {
-				dst[i] = (int) buf[i] & 0xFF;
-			}
-		} else {
-			byte[] buf = new byte[count * 3];
-			is.readBytes(buf, 0, count * 3);
-			for (int i = 0; i < count; i++) {
-				dst[i] = ((buf[i * 3 + 2] & 0xFF) << 16
-						| (buf[i * 3 + 1] & 0xFF) << 8 | (buf[i * 3] & 0xFF));
-			}
-		}
-	}
-
-	void readZrlePalette(int[] palette, int palSize) throws Exception {
-		readPixels(zrleInStream, palette, palSize);
-	}
-
-	void readZrleRawPixels(int tw, int th) throws Exception {
-		if (bytesPixel == 1) {
-			zrleInStream.readBytes(zrleTilePixels8, 0, tw * th);
-		} else {
-			readPixels(zrleInStream, zrleTilePixels24, tw * th); // /
-		}
-	}
-
-	void readZrlePackedPixels(int tw, int th, int[] palette, int palSize)
-			throws Exception {
-
-		int bppp = ((palSize > 16) ? 8 : ((palSize > 4) ? 4
-				: ((palSize > 2) ? 2 : 1)));
-		int ptr = 0;
-
-		for (int i = 0; i < th; i++) {
-			int eol = ptr + tw;
-			int b = 0;
-			int nbits = 0;
-
-			while (ptr < eol) {
-				if (nbits == 0) {
-					b = zrleInStream.readU8();
-					nbits = 8;
-				}
-				nbits -= bppp;
-				int index = (b >> nbits) & ((1 << bppp) - 1) & 127;
-				if (bytesPixel == 1) {
-					zrleTilePixels8[ptr++] = (byte) palette[index];
-				} else {
-					zrleTilePixels24[ptr++] = palette[index];
-				}
-			}
-		}
-	}
-
-	void readZrlePlainRLEPixels(int tw, int th) throws Exception {
-		int ptr = 0;
-		int end = ptr + tw * th;
-		while (ptr < end) {
-			int pix = readPixel(zrleInStream);
-			int len = 1;
-			int b;
-			do {
-				b = zrleInStream.readU8();
-				len += b;
-			} while (b == 255);
-
-			if (!(len <= end - ptr))
-				throw new Exception("ZRLE decoder: assertion failed"
-						+ " (len <= end-ptr)");
-
-			if (bytesPixel == 1) {
-				while (len-- > 0)
-					zrleTilePixels8[ptr++] = (byte) pix;
-			} else {
-				while (len-- > 0)
-					zrleTilePixels24[ptr++] = pix;
-			}
-		}
-	}
-
-	void readZrlePackedRLEPixels(int tw, int th, int[] palette)
-			throws Exception {
-
-		int ptr = 0;
-		int end = ptr + tw * th;
-		while (ptr < end) {
-			int index = zrleInStream.readU8();
-			int len = 1;
-			if ((index & 128) != 0) {
-				int b;
-				do {
-					b = zrleInStream.readU8();
-					len += b;
-				} while (b == 255);
-
-				if (!(len <= end - ptr))
-					throw new Exception("ZRLE decoder: assertion failed"
-							+ " (len <= end - ptr)");
-			}
-
-			index &= 127;
-			int pix = palette[index];
-
-			if (bytesPixel == 1) {
-				while (len-- > 0)
-					zrleTilePixels8[ptr++] = (byte) pix;
-			} else {
-				while (len-- > 0)
-					zrleTilePixels24[ptr++] = pix;
-			}
-		}
-	}
-
-	//
-	// Copy pixels from zrleTilePixels8 or zrleTilePixels24, then update.
-	//
-
-	void handleUpdatedZrleTile(int x, int y, int w, int h) {
-		Object src, dst;
-		if (bytesPixel == 1) {
-			src = zrleTilePixels8;
-			dst = pixels8;
-		} else {
-			src = zrleTilePixels24;
-			dst = pixels24;
-		}
-		int offsetSrc = 0;
-		int offsetDst = (y * rfb.framebufferWidth + x);
-		for (int j = 0; j < h; j++) {
-			System.arraycopy(src, offsetSrc, dst, offsetDst, w);
-			offsetSrc += w;
-			offsetDst += rfb.framebufferWidth;
-		}
-		handleUpdatedPixels(x, y, w, h);
-	}
-
-	//
-	// Handle a Zlib-encoded rectangle.
-	//
-
-	void handleZlibRect(int x, int y, int w, int h) throws Exception {
-
-		int nBytes = rfb.readU32();
-
-		if (zlibBuf == null || zlibBufLen < nBytes) {
-			zlibBufLen = nBytes * 2;
-			zlibBuf = new byte[zlibBufLen];
-		}
-
-		rfb.readFully(zlibBuf, 0, nBytes);
-
-		if (rfb.rec != null && rfb.recordFromBeginning) {
-			rfb.rec.writeIntBE(nBytes);
-			rfb.rec.write(zlibBuf, 0, nBytes);
-		}
-
-		if (zlibInflater == null) {
-			zlibInflater = new Inflater();
-		}
-		zlibInflater.setInput(zlibBuf, 0, nBytes);
-
-		if (bytesPixel == 1) {
-			for (int dy = y; dy < y + h; dy++) {
-				zlibInflater.inflate(pixels8, dy * rfb.framebufferWidth + x, w);
-				if (rfb.rec != null && !rfb.recordFromBeginning)
-					rfb.rec.write(pixels8, dy * rfb.framebufferWidth + x, w);
-			}
-		} else {
-			byte[] buf = new byte[w * 4];
-			int i, offset;
-			for (int dy = y; dy < y + h; dy++) {
-				zlibInflater.inflate(buf);
-				offset = dy * rfb.framebufferWidth + x;
-				for (i = 0; i < w; i++) {
-					pixels24[offset + i] = (buf[i * 4 + 2] & 0xFF) << 16
-							| (buf[i * 4 + 1] & 0xFF) << 8
-							| (buf[i * 4] & 0xFF);
-				}
-				if (rfb.rec != null && !rfb.recordFromBeginning)
-					rfb.rec.write(buf);
-			}
-		}
-
-		handleUpdatedPixels(x, y, w, h);
-		scheduleRepaint(x, y, w, h);
-	}
-
-	//
-	// Handle a Tight-encoded rectangle.
-	//
-
-	void handleTightRect(int x, int y, int w, int h) throws Exception {
-
-		int comp_ctl = rfb.readU8();
-		if (rfb.rec != null) {
-			if (rfb.recordFromBeginning || comp_ctl == (rfb.TightFill << 4)
-					|| comp_ctl == (rfb.TightJpeg << 4)) {
-				// Send data exactly as received.
-				rfb.rec.writeByte(comp_ctl);
-			} else {
-				// Tell the decoder to flush each of the four zlib streams.
-				rfb.rec.writeByte(comp_ctl | 0x0F);
-			}
-		}
-
-		// Flush zlib streams if we are told by the server to do so.
-		for (int stream_id = 0; stream_id < 4; stream_id++) {
-			if ((comp_ctl & 1) != 0 && tightInflaters[stream_id] != null) {
-				tightInflaters[stream_id] = null;
-			}
-			comp_ctl >>= 1;
-		}
-
-		// Check correctness of subencoding value.
-		if (comp_ctl > rfb.TightMaxSubencoding) {
-			throw new Exception("Incorrect tight subencoding: " + comp_ctl);
-		}
-
-		// Handle solid-color rectangles.
-		if (comp_ctl == rfb.TightFill) {
-
-			if (bytesPixel == 1) {
-				int idx = rfb.readU8();
-				memGraphics.setColor(colors[idx]);
-				if (rfb.rec != null) {
-					rfb.rec.writeByte(idx);
-				}
-			} else {
-				byte[] buf = new byte[3];
-				rfb.readFully(buf);
-				if (rfb.rec != null) {
-					rfb.rec.write(buf);
-				}
-				Color bg = new Color(0xFF000000 | (buf[0] & 0xFF) << 16
-						| (buf[1] & 0xFF) << 8 | (buf[2] & 0xFF));
-				memGraphics.setColor(bg);
-			}
-			memGraphics.fillRect(x, y, w, h);
-			scheduleRepaint(x, y, w, h);
-			return;
-
-		}
-
-		if (comp_ctl == rfb.TightJpeg) {
-
-			statNumRectsTightJPEG++;
-
-			// Read JPEG data.
-			byte[] jpegData = new byte[rfb.readCompactLen()];
-			rfb.readFully(jpegData);
-			if (rfb.rec != null) {
-				if (!rfb.recordFromBeginning) {
-					rfb.recordCompactLen(jpegData.length);
-				}
-				rfb.rec.write(jpegData);
-			}
-
-			// Create an Image object from the JPEG data.
-			Image jpegImage = Toolkit.getDefaultToolkit().createImage(jpegData);
-
-			// Remember the rectangle where the image should be drawn.
-			jpegRect = new Rectangle(x, y, w, h);
-
-			// Let the imageUpdate() method do the actual drawing, here just
-			// wait until the image is fully loaded and drawn.
-			synchronized (jpegRect) {
-				Toolkit.getDefaultToolkit().prepareImage(jpegImage, -1, -1,
-						this);
-				try {
-					// Wait no longer than three seconds.
-					jpegRect.wait(3000);
-				} catch (InterruptedException e) {
-					throw new Exception("Interrupted while decoding JPEG image");
-				}
-			}
-
-			// Done, jpegRect is not needed any more.
-			jpegRect = null;
-			return;
-
-		}
-
-		// Read filter id and parameters.
-		int numColors = 0, rowSize = w;
-		byte[] palette8 = new byte[2];
-		int[] palette24 = new int[256];
-		boolean useGradient = false;
-		if ((comp_ctl & rfb.TightExplicitFilter) != 0) {
-			int filter_id = rfb.readU8();
-			if (rfb.rec != null) {
-				rfb.rec.writeByte(filter_id);
-			}
-			if (filter_id == rfb.TightFilterPalette) {
-				numColors = rfb.readU8() + 1;
-				if (rfb.rec != null) {
-					rfb.rec.writeByte(numColors - 1);
-				}
-				if (bytesPixel == 1) {
-					if (numColors != 2) {
-						throw new Exception("Incorrect tight palette size: "
-								+ numColors);
-					}
-					rfb.readFully(palette8);
-					if (rfb.rec != null) {
-						rfb.rec.write(palette8);
-					}
-				} else {
-					byte[] buf = new byte[numColors * 3];
-					rfb.readFully(buf);
-					if (rfb.rec != null) {
-						rfb.rec.write(buf);
-					}
-					for (int i = 0; i < numColors; i++) {
-						palette24[i] = ((buf[i * 3] & 0xFF) << 16
-								| (buf[i * 3 + 1] & 0xFF) << 8 | (buf[i * 3 + 2] & 0xFF));
-					}
-				}
-				if (numColors == 2)
-					rowSize = (w + 7) / 8;
-			} else if (filter_id == rfb.TightFilterGradient) {
-				useGradient = true;
-			} else if (filter_id != rfb.TightFilterCopy) {
-				throw new Exception("Incorrect tight filter id: " + filter_id);
-			}
-		}
-		if (numColors == 0 && bytesPixel == 4)
-			rowSize *= 3;
-
-		// Read, optionally uncompress and decode data.
-		int dataSize = h * rowSize;
-		if (dataSize < rfb.TightMinToCompress) {
-			// Data size is small - not compressed with zlib.
-			if (numColors != 0) {
-				// Indexed colors.
-				byte[] indexedData = new byte[dataSize];
-				rfb.readFully(indexedData);
-				if (rfb.rec != null) {
-					rfb.rec.write(indexedData);
-				}
-				if (numColors == 2) {
-					// Two colors.
-					if (bytesPixel == 1) {
-						decodeMonoData(x, y, w, h, indexedData, palette8);
-					} else {
-						decodeMonoData(x, y, w, h, indexedData, palette24);
-					}
-				} else {
-					// 3..255 colors (assuming bytesPixel == 4).
-					int i = 0;
-					for (int dy = y; dy < y + h; dy++) {
-						for (int dx = x; dx < x + w; dx++) {
-							pixels24[dy * rfb.framebufferWidth + dx] = palette24[indexedData[i++] & 0xFF];
-						}
-					}
-				}
-			} else if (useGradient) {
-				// "Gradient"-processed data
-				byte[] buf = new byte[w * h * 3];
-				rfb.readFully(buf);
-				if (rfb.rec != null) {
-					rfb.rec.write(buf);
-				}
-				decodeGradientData(x, y, w, h, buf);
-			} else {
-				// Raw truecolor data.
-				if (bytesPixel == 1) {
-					for (int dy = y; dy < y + h; dy++) {
-						rfb.readFully(pixels8, dy * rfb.framebufferWidth + x, w);
-						if (rfb.rec != null) {
-							rfb.rec.write(pixels8, dy * rfb.framebufferWidth
-									+ x, w);
-						}
-					}
-				} else {
-					byte[] buf = new byte[w * 3];
-					int i, offset;
-					for (int dy = y; dy < y + h; dy++) {
-						rfb.readFully(buf);
-						if (rfb.rec != null) {
-							rfb.rec.write(buf);
-						}
-						offset = dy * rfb.framebufferWidth + x;
-						for (i = 0; i < w; i++) {
-							pixels24[offset + i] = (buf[i * 3] & 0xFF) << 16
-									| (buf[i * 3 + 1] & 0xFF) << 8
-									| (buf[i * 3 + 2] & 0xFF);
-						}
-					}
-				}
-			}
-		} else {
-			// Data was compressed with zlib.
-			int zlibDataLen = rfb.readCompactLen();
-			byte[] zlibData = new byte[zlibDataLen];
-			rfb.readFully(zlibData);
-			if (rfb.rec != null && rfb.recordFromBeginning) {
-				rfb.rec.write(zlibData);
-			}
-			int stream_id = comp_ctl & 0x03;
-			if (tightInflaters[stream_id] == null) {
-				tightInflaters[stream_id] = new Inflater();
-			}
-			Inflater myInflater = tightInflaters[stream_id];
-			myInflater.setInput(zlibData);
-			byte[] buf = new byte[dataSize];
-			myInflater.inflate(buf);
-			if (rfb.rec != null && !rfb.recordFromBeginning) {
-				rfb.recordCompressedData(buf);
-			}
-
-			if (numColors != 0) {
-				// Indexed colors.
-				if (numColors == 2) {
-					// Two colors.
-					if (bytesPixel == 1) {
-						decodeMonoData(x, y, w, h, buf, palette8);
-					} else {
-						decodeMonoData(x, y, w, h, buf, palette24);
-					}
-				} else {
-					// More than two colors (assuming bytesPixel == 4).
-					int i = 0;
-					for (int dy = y; dy < y + h; dy++) {
-						for (int dx = x; dx < x + w; dx++) {
-							pixels24[dy * rfb.framebufferWidth + dx] = palette24[buf[i++] & 0xFF];
-						}
-					}
-				}
-			} else if (useGradient) {
-				// Compressed "Gradient"-filtered data (assuming bytesPixel ==
-				// 4).
-				decodeGradientData(x, y, w, h, buf);
-			} else {
-				// Compressed truecolor data.
-				if (bytesPixel == 1) {
-					int destOffset = y * rfb.framebufferWidth + x;
-					for (int dy = 0; dy < h; dy++) {
-						System.arraycopy(buf, dy * w, pixels8, destOffset, w);
-						destOffset += rfb.framebufferWidth;
-					}
-				} else {
-					int srcOffset = 0;
-					int destOffset, i;
-					for (int dy = 0; dy < h; dy++) {
-						myInflater.inflate(buf);
-						destOffset = (y + dy) * rfb.framebufferWidth + x;
-						for (i = 0; i < w; i++) {
-							pixels24[destOffset + i] = (buf[srcOffset] & 0xFF) << 16
-									| (buf[srcOffset + 1] & 0xFF) << 8
-									| (buf[srcOffset + 2] & 0xFF);
-							srcOffset += 3;
-						}
-					}
-				}
-			}
-		}
-
-		handleUpdatedPixels(x, y, w, h);
-		scheduleRepaint(x, y, w, h);
-	}
-
-	//
-	// Decode 1bpp-encoded bi-color rectangle (8-bit and 24-bit versions).
-	//
-
-	void decodeMonoData(int x, int y, int w, int h, byte[] src, byte[] palette) {
-
-		int dx, dy, n;
-		int i = y * rfb.framebufferWidth + x;
-		int rowBytes = (w + 7) / 8;
-		byte b;
-
-		for (dy = 0; dy < h; dy++) {
-			for (dx = 0; dx < w / 8; dx++) {
-				b = src[dy * rowBytes + dx];
-				for (n = 7; n >= 0; n--)
-					pixels8[i++] = palette[b >> n & 1];
-			}
-			for (n = 7; n >= 8 - w % 8; n--) {
-				pixels8[i++] = palette[src[dy * rowBytes + dx] >> n & 1];
-			}
-			i += (rfb.framebufferWidth - w);
-		}
-	}
-
-	void decodeMonoData(int x, int y, int w, int h, byte[] src, int[] palette) {
-
-		int dx, dy, n;
-		int i = y * rfb.framebufferWidth + x;
-		int rowBytes = (w + 7) / 8;
-		byte b;
-
-		for (dy = 0; dy < h; dy++) {
-			for (dx = 0; dx < w / 8; dx++) {
-				b = src[dy * rowBytes + dx];
-				for (n = 7; n >= 0; n--)
-					pixels24[i++] = palette[b >> n & 1];
-			}
-			for (n = 7; n >= 8 - w % 8; n--) {
-				pixels24[i++] = palette[src[dy * rowBytes + dx] >> n & 1];
-			}
-			i += (rfb.framebufferWidth - w);
-		}
-	}
-
-	//
-	// Decode data processed with the "Gradient" filter.
-	//
-
-	void decodeGradientData(int x, int y, int w, int h, byte[] buf) {
-
-		int dx, dy, c;
-		byte[] prevRow = new byte[w * 3];
-		byte[] thisRow = new byte[w * 3];
-		byte[] pix = new byte[3];
-		int[] est = new int[3];
-
-		int offset = y * rfb.framebufferWidth + x;
-
-		for (dy = 0; dy < h; dy++) {
-
-			/* First pixel in a row */
-			for (c = 0; c < 3; c++) {
-				pix[c] = (byte) (prevRow[c] + buf[dy * w * 3 + c]);
-				thisRow[c] = pix[c];
-			}
-			pixels24[offset++] = (pix[0] & 0xFF) << 16 | (pix[1] & 0xFF) << 8
-					| (pix[2] & 0xFF);
-
-			/* Remaining pixels of a row */
-			for (dx = 1; dx < w; dx++) {
-				for (c = 0; c < 3; c++) {
-					est[c] = ((prevRow[dx * 3 + c] & 0xFF) + (pix[c] & 0xFF) - (prevRow[(dx - 1)
-							* 3 + c] & 0xFF));
-					if (est[c] > 0xFF) {
-						est[c] = 0xFF;
-					} else if (est[c] < 0x00) {
-						est[c] = 0x00;
-					}
-					pix[c] = (byte) (est[c] + buf[(dy * w + dx) * 3 + c]);
-					thisRow[dx * 3 + c] = pix[c];
-				}
-				pixels24[offset++] = (pix[0] & 0xFF) << 16
-						| (pix[1] & 0xFF) << 8 | (pix[2] & 0xFF);
-			}
-
-			System.arraycopy(thisRow, 0, prevRow, 0, w * 3);
-			offset += (rfb.framebufferWidth - w);
-		}
-	}
-
-	//
-	// Display newly updated area of pixels.
-	//
-
-	void handleUpdatedPixels(int x, int y, int w, int h) {
-
-		// Draw updated pixels of the off-screen image.
-		
-		pixelsSource.newPixels(x, y, w, h);
-		memGraphics.setClip(x, y, w, h);
-		memGraphics.drawImage(rawPixelsImage, 0, 0, null);
-		memGraphics.setClip(0, 0, rfb.framebufferWidth, rfb.framebufferHeight);
-
-	}
-
-	//
-	// Tell JVM to repaint specified desktop area.
-	//
-
-	void scheduleRepaint(int x, int y, int w, int h) {
-		// Request repaint, deferred if necessary.
-		if (rfb.framebufferWidth == scaledWidth) {
-			repaint(viewer.deferScreenUpdates, x, y, w, h);
-		} else {
-			int sx = x * scalingFactor / 100;
-			int sy = y * scalingFactor / 100;
-			int sw = ((x + w) * scalingFactor + 49) / 100 - sx + 1;
-			int sh = ((y + h) * scalingFactor + 49) / 100 - sy + 1;
-			repaint(viewer.deferScreenUpdates, sx, sy, sw, sh);
-		}
-	}
-
-	//
-	// Handle events.
-	//
-
-	public void keyPressed(KeyEvent evt) {
-		processLocalKeyEvent(evt);
-	}
-
-	public void keyReleased(KeyEvent evt) {
-		processLocalKeyEvent(evt);
-	}
-
-	public void keyTyped(KeyEvent evt) {
-		evt.consume();
-	}
-
-	public void mousePressed(MouseEvent evt) {
-		processLocalMouseEvent(evt, false);
-	}
-
-	public void mouseReleased(MouseEvent evt) {
-		processLocalMouseEvent(evt, false);
-	}
-
-	public void mouseMoved(MouseEvent evt) {
-		processLocalMouseEvent(evt, true);
-	}
-
-	public void mouseDragged(MouseEvent evt) {
-		processLocalMouseEvent(evt, true);
-	}
-
-	public void processLocalKeyEvent(KeyEvent evt) {
-		if (viewer.rfb != null && rfb.inNormalProtocol) {
-			if (!inputEnabled) {
-				if ((evt.getKeyChar() == 'r' || evt.getKeyChar() == 'R')
-						&& evt.getID() == KeyEvent.KEY_PRESSED) {
-					// Request screen update.
-					try {
-						rfb.writeFramebufferUpdateRequest(0, 0,
-								rfb.framebufferWidth, rfb.framebufferHeight,
-								false);
-					} catch (IOException e) {
-						e.printStackTrace();
-					}
-				}
-			} else {
-				// Input enabled.
-				synchronized (rfb) {
-					try {
-						rfb.writeKeyEvent(evt);
-					} catch (Exception e) {
-						e.printStackTrace();
-					}
-					rfb.notify();
-				}
-			}
-		}
-		// Don't ever pass keyboard events to AWT for default processing.
-		// Otherwise, pressing Tab would switch focus to ButtonPanel etc.
-		evt.consume();
-	}
-
-	public void processLocalMouseEvent(MouseEvent evt, boolean moved) {
-		if (viewer.rfb != null && rfb.inNormalProtocol) {
-			if (moved) {
-				softCursorMove(evt.getX(), evt.getY());
-			}
-			if (rfb.framebufferWidth != scaledWidth) {
-				int sx = (evt.getX() * 100 + scalingFactor / 2) / scalingFactor;
-				int sy = (evt.getY() * 100 + scalingFactor / 2) / scalingFactor;
-				evt.translatePoint(sx - evt.getX(), sy - evt.getY());
-			}
-			synchronized (rfb) {
-				try {
-					rfb.writePointerEvent(evt);
-				} catch (Exception e) {
-					e.printStackTrace();
-				}
-				rfb.notify();
-			}
-		}
-	}
-
-	//
-	// Ignored events.
-	//
-
-	public void mouseClicked(MouseEvent evt) {
-	}
-
-	public void mouseEntered(MouseEvent evt) {
-	}
-
-	public void mouseExited(MouseEvent evt) {
-	}
-
-	//
-	// Reset update statistics.
-	//
-
-	void resetStats() {
-		statStartTime = System.currentTimeMillis();
-		statNumUpdates = 0;
-		statNumTotalRects = 0;
-		statNumPixelRects = 0;
-		statNumRectsTight = 0;
-		statNumRectsTightJPEG = 0;
-		statNumRectsZRLE = 0;
-		statNumRectsHextile = 0;
-		statNumRectsRaw = 0;
-		statNumRectsCopy = 0;
-		statNumBytesEncoded = 0;
-		statNumBytesDecoded = 0;
-	}
-
-	// ////////////////////////////////////////////////////////////////
-	//
-	// Handle cursor shape updates (XCursor and RichCursor encodings).
-	//
-
-	boolean showSoftCursor = false;
-
-	MemoryImageSource softCursorSource;
-	Image softCursor;
-
-	int cursorX = 0, cursorY = 0;
-	int cursorWidth, cursorHeight;
-	int origCursorWidth, origCursorHeight;
-	int hotX, hotY;
-	int origHotX, origHotY;
-
-	//
-	// Handle cursor shape update (XCursor and RichCursor encodings).
-	//
-
-	synchronized void handleCursorShapeUpdate(int encodingType, int xhot,
-			int yhot, int width, int height) throws IOException {
-
-		softCursorFree();
-
-		if (width * height == 0)
-			return;
-
-		// Ignore cursor shape data if requested by user.
-		if (viewer.options.ignoreCursorUpdates) {
-			int bytesPerRow = (width + 7) / 8;
-			int bytesMaskData = bytesPerRow * height;
-
-			if (encodingType == rfb.EncodingXCursor) {
-				rfb.skipBytes(6 + bytesMaskData * 2);
-			} else {
-				// rfb.EncodingRichCursor
-				rfb.skipBytes(width * height * bytesPixel + bytesMaskData);
-			}
-			return;
-		}
-
-		// Decode cursor pixel data.
-		softCursorSource = decodeCursorShape(encodingType, width, height);
-
-		// Set original (non-scaled) cursor dimensions.
-		origCursorWidth = width;
-		origCursorHeight = height;
-		origHotX = xhot;
-		origHotY = yhot;
-
-		// Create off-screen cursor image.
-		createSoftCursor();
-
-		// Show the cursor.
-		showSoftCursor = true;
-		repaint(viewer.deferCursorUpdates, cursorX - hotX, cursorY - hotY,
-				cursorWidth, cursorHeight);
-	}
-
-	//
-	// decodeCursorShape(). Decode cursor pixel data and return
-	// corresponding MemoryImageSource instance.
-	//
-
-	synchronized MemoryImageSource decodeCursorShape(int encodingType,
-			int width, int height) throws IOException {
-
-		int bytesPerRow = (width + 7) / 8;
-		int bytesMaskData = bytesPerRow * height;
-
-		int[] softCursorPixels = new int[width * height];
-
-		if (encodingType == rfb.EncodingXCursor) {
-
-			// Read foreground and background colors of the cursor.
-			byte[] rgb = new byte[6];
-			rfb.readFully(rgb);
-			int[] colors = {
-					(0xFF000000 | (rgb[3] & 0xFF) << 16 | (rgb[4] & 0xFF) << 8 | (rgb[5] & 0xFF)),
-					(0xFF000000 | (rgb[0] & 0xFF) << 16 | (rgb[1] & 0xFF) << 8 | (rgb[2] & 0xFF)) };
-
-			// Read pixel and mask data.
-			byte[] pixBuf = new byte[bytesMaskData];
-			rfb.readFully(pixBuf);
-			byte[] maskBuf = new byte[bytesMaskData];
-			rfb.readFully(maskBuf);
-
-			// Decode pixel data into softCursorPixels[].
-			byte pixByte, maskByte;
-			int x, y, n, result;
-			int i = 0;
-			for (y = 0; y < height; y++) {
-				for (x = 0; x < width / 8; x++) {
-					pixByte = pixBuf[y * bytesPerRow + x];
-					maskByte = maskBuf[y * bytesPerRow + x];
-					for (n = 7; n >= 0; n--) {
-						if ((maskByte >> n & 1) != 0) {
-							result = colors[pixByte >> n & 1];
-						} else {
-							result = 0; // Transparent pixel
-						}
-						softCursorPixels[i++] = result;
-					}
-				}
-				for (n = 7; n >= 8 - width % 8; n--) {
-					if ((maskBuf[y * bytesPerRow + x] >> n & 1) != 0) {
-						result = colors[pixBuf[y * bytesPerRow + x] >> n & 1];
-					} else {
-						result = 0; // Transparent pixel
-					}
-					softCursorPixels[i++] = result;
-				}
-			}
-
-		} else {
-			// encodingType == rfb.EncodingRichCursor
-
-			// Read pixel and mask data.
-			byte[] pixBuf = new byte[width * height * bytesPixel];
-			rfb.readFully(pixBuf);
-			byte[] maskBuf = new byte[bytesMaskData];
-			rfb.readFully(maskBuf);
-
-			// Decode pixel data into softCursorPixels[].
-			byte pixByte, maskByte;
-			int x, y, n, result;
-			int i = 0;
-			for (y = 0; y < height; y++) {
-				for (x = 0; x < width / 8; x++) {
-					maskByte = maskBuf[y * bytesPerRow + x];
-					for (n = 7; n >= 0; n--) {
-						if ((maskByte >> n & 1) != 0) {
-							if (bytesPixel == 1) {
-								result = cm8.getRGB(pixBuf[i]);
-							} else {
-								result = 0xFF000000
-										| (pixBuf[i * 4 + 2] & 0xFF) << 16
-										| (pixBuf[i * 4 + 1] & 0xFF) << 8
-										| (pixBuf[i * 4] & 0xFF);
-							}
-						} else {
-							result = 0; // Transparent pixel
-						}
-						softCursorPixels[i++] = result;
-					}
-				}
-				for (n = 7; n >= 8 - width % 8; n--) {
-					if ((maskBuf[y * bytesPerRow + x] >> n & 1) != 0) {
-						if (bytesPixel == 1) {
-							result = cm8.getRGB(pixBuf[i]);
-						} else {
-							result = 0xFF000000
-									| (pixBuf[i * 4 + 2] & 0xFF) << 16
-									| (pixBuf[i * 4 + 1] & 0xFF) << 8
-									| (pixBuf[i * 4] & 0xFF);
-						}
-					} else {
-						result = 0; // Transparent pixel
-					}
-					softCursorPixels[i++] = result;
-				}
-			}
-
-		}
-
-		return new MemoryImageSource(width, height, softCursorPixels, 0, width);
-	}
-
-	//
-	// createSoftCursor(). Assign softCursor new Image (scaled if necessary).
-	// Uses softCursorSource as a source for new cursor image.
-	//
-
-	synchronized void createSoftCursor() {
-
-		if (softCursorSource == null)
-			return;
-
-		int scaleCursor = viewer.options.scaleCursor;
-		if (scaleCursor == 0 || !inputEnabled)
-			scaleCursor = 100;
-
-		// Save original cursor coordinates.
-		int x = cursorX - hotX;
-		int y = cursorY - hotY;
-		int w = cursorWidth;
-		int h = cursorHeight;
-
-		cursorWidth = (origCursorWidth * scaleCursor + 50) / 100;
-		cursorHeight = (origCursorHeight * scaleCursor + 50) / 100;
-		hotX = (origHotX * scaleCursor + 50) / 100;
-		hotY = (origHotY * scaleCursor + 50) / 100;
-		softCursor = Toolkit.getDefaultToolkit().createImage(softCursorSource);
-
-		if (scaleCursor != 100) {
-			softCursor = softCursor.getScaledInstance(cursorWidth,
-					cursorHeight, Image.SCALE_SMOOTH);
-		}
-
-		if (showSoftCursor) {
-			// Compute screen area to update.
-			x = Math.min(x, cursorX - hotX);
-			y = Math.min(y, cursorY - hotY);
-			w = Math.max(w, cursorWidth);
-			h = Math.max(h, cursorHeight);
-
-			repaint(viewer.deferCursorUpdates, x, y, w, h);
-		}
-	}
-
-	//
-	// softCursorMove(). Moves soft cursor into a particular location.
-	//
-
-	synchronized void softCursorMove(int x, int y) {
-		int oldX = cursorX;
-		int oldY = cursorY;
-		cursorX = x;
-		cursorY = y;
-		if (showSoftCursor) {
-			repaint(viewer.deferCursorUpdates, oldX - hotX, oldY - hotY,
-					cursorWidth, cursorHeight);
-			repaint(viewer.deferCursorUpdates, cursorX - hotX, cursorY - hotY,
-					cursorWidth, cursorHeight);
-		}
-	}
-
-	//
-	// softCursorFree(). Remove soft cursor, dispose resources.
-	//
-
-	synchronized void softCursorFree() {
-		if (showSoftCursor) {
-			showSoftCursor = false;
-			softCursor = null;
-			softCursorSource = null;
-
-			repaint(viewer.deferCursorUpdates, cursorX - hotX, cursorY - hotY,
-					cursorWidth, cursorHeight);
-		}
-	}
-
-	BufferedImage createBufferedImage(Image img){
-		BufferedImage bimg = new BufferedImage(img.getWidth(null), img.getHeight(null), BufferedImage.TYPE_INT_RGB  );
-
-		Graphics g = bimg.getGraphics();
-		g.drawImage(img, 0, 0, null);
-		g.dispose();
-		return bimg;
-	}
-	
-	byte[] getBytes(BufferedImage img)throws IOException { 
-		byte[] b = getImageBytes(img, "raw");
-		return b;
-	}
-	
-	byte[] getImageBytes(BufferedImage image, String imageFormat) throws IOException {
-		ByteArrayOutputStream bos = new ByteArrayOutputStream();
-		BufferedOutputStream os = new BufferedOutputStream(bos);
-		image.flush();
-		ImageIO.write(image, imageFormat, os);
-		os.flush();
-		os.close();
-		return bos.toByteArray();
-	}
-	
-	void drawBufferedImage(byte[] b) throws IOException{
-		BufferedImage bimg = ImageIO.read(new ByteArrayInputStream(b));
-//		ImageIO.write(bimg, "jpeg", new File("sample.jpeg"));
-		memGraphics.setClip(0,0, rfb.framebufferWidth, rfb.framebufferHeight );
-		memGraphics.drawImage( bimg, 0,0, null);
-		scheduleRepaint(0, 0, rfb.framebufferWidth, rfb.framebufferHeight );
-	}
-	
-	
-}
--- a/src/myVncProxy/EchoClient.java	Fri Jan 13 13:41:30 2012 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,288 +0,0 @@
-package myVncProxy;
-
-import java.io.*;
-import java.net.*;
-
-import myVncProxy.MulticastQueue.Client;
-
-
-
-public class EchoClient {
-	private String name;
-	private BufferedReader is = null;
-	private DataOutputStream os = null;
-	private Socket echoSocket = null;
-	private boolean runflag = false;
-	private WaitReply waitReply;
-	private Socket clientSocket = null;
-//	MyVncClient client;
-	private InterfaceForViewer client;
-	private int echoPort = 9999;
-	private IpV6 ipV6;
-	private MyVncClient checkMove;
-	private VncViewer vncV;
-	String responseLine;
-	String parent;// 親の番号
-	String treenum;// 自分の番号
-	String leaderflag;// リーダフラグ
-	//boolean passflag;
-	
-
-	// WaitReplyに自分自身を渡している
-	public EchoClient() {
-	}
-
-	
-	public EchoClient(EchoClient echo) {
-		this.name = echo.name;
-		this.leaderflag= echo.leaderflag;
-		this.parent = echo.parent;
-		this.treenum = echo.treenum;
-		this.client = echo.client;
-		this.waitReply = echo.waitReply;
-		checkMove = (MyVncClient)echo.client;
-	}
-	// VncViewerから引数をもらってきてproxy役を認識する
-	public EchoClient(String name,MyVncClient client) {
-		this.client = client;
-		this.name = name;
-	}
-
-	public EchoClient(String name,MyVncClient client, int echoPort) {
-		this.client = client;
-		this.name = name;
-		this.echoPort = echoPort;
-	}
-	
-	
-	
-	public EchoClient(EchoClient echo,MyVncClient client) {
-		this.client = client;
-		this.name = echo.name;
-		leaderflag = echo.leaderflag;
-		parent = echo.parent;
-		treenum = echo.treenum;
-		waitReply = echo.waitReply;
-	}
-
-	public EchoClient(String name,CuiMyVncClient client) {
-		this.client = client;
-		this.name = name;
-	}
-	
-	public EchoClient(String name,CuiMyVncClient client, int echoPort) {
-		this.client = client;
-		this.name = name;
-		this.echoPort = echoPort;
-	}
-
-	public EchoClient(EchoClient echo,CuiMyVncClient client) {
-		this.client = client;
-		this.name = echo.name;
-		leaderflag = echo.leaderflag;
-		parent = echo.parent;
-		treenum = echo.treenum;
-	}
-
-	// void hostn(String args){
-	void openport() {
-		try {
-			if (name != null) {
-				echoSocket = new Socket(name, echoPort);
-			} else {
-				echoSocket = new Socket("133.13.48.18", echoPort);
-			}
-			os = new DataOutputStream(echoSocket.getOutputStream());
-			is = new BufferedReader(new InputStreamReader(echoSocket.getInputStream()));
-		} catch (UnknownHostException e) {
-			System.err.println("Don't know about host: localhost");
-		} catch (IOException e) {
-			System.out.println(name + " Connection Faild");
-			System.exit(0);
-		}
-	}
-
-	/**
-	 * @param args
-	 *            select connect port 
-	 * @return
-	 */
-	EchoClient requestHostName(String args) {
-		// サーバーにメッセージを送る
-		if (echoSocket != null && os != null && is != null) {
-			try {
-				
-				InetAddress addr = InetAddress.getLocalHost();
-				String add = new String(addr.getHostAddress());
-				//add = getIpV6();
-				
-				os.writeBytes(add + "\n");
-				os.writeBytes(args + "\n");
-				getProxyData(is);
-
-				streamClose();
-			} catch (UnknownHostException e) {
-				System.err.println("Trying to connect to unknown host: " + e);
-			} catch (IOException e) {
-				System.err.println("IOException: " + e);
-			}
-			waitReply = new WaitReply(treenum,client);
-			waitReply.start();
-		}
-		return this;
-	}
-
-	
-	/**
-	 * Call at lost host 
-	 */
-	boolean losthost() {
-		if (echoSocket != null && os != null && is != null) {
-			try {
-				if(runflag){
-					return true;
-				}
-				sendDataProxy();
-				String checkRepetition = getProxyData2(is);				
-				if(checkRepetition.equals("stop")){
-					return true;
-				}				
-				//if(!(checkRepetition.equals("skip")) || "1".equals(leaderflag)) {
-				if(!(waitReply.checkPath())) {
-					Thread.sleep(1000);
-					reConnectionMain(echoSocket);
-					streamClose();
-				}				
-				//Thread.sleep(1000);
-				/*
-				if(!(checkMove.vncFrame.isShowing())&&"skip".equals(checkRepetition)) {
-					openport();
-					notfoundParent();					
-				}				
-				*/
-			} catch (UnknownHostException e) {
-				System.err.println("Trying to connect to unknown host: " + e);
-			} catch (IOException e) {				
-				return false;			
-			} catch (InterruptedException e) {
-				e.printStackTrace();
-
-			} catch (NullPointerException e) {
-				openport();
-				System.out.println("notFoundParents");
-				notfoundParent();
-			}
-		}
-		return true;
-	}
-	
-	boolean notfoundParent() {
-		if (echoSocket != null && os != null && is != null) {
-			runflag = true;
-			try {
-				sendDataProxy("2", parent,null);
-				getProxyData(is);
-				reConnectionMain(echoSocket);
-				streamClose();
-			} catch (UnknownHostException e) {
-				System.err.println("Trying to connect to unknown host: " + e);
-			} catch (IOException e) {
-				System.err.println("IOException: " + e);
-			}
-		}
-		return true;
-	}
-
-	
-	EchoClient Interruption(Socket _clientSocket) {
-		clientSocket = _clientSocket;
-		BufferedReader lostis = null;//あとで修正する
-
-
-		try {
-			lostis = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
-				getProxyData(lostis);
-				clientSocket.close();// WaitReplyのacceptを終了させる
-		} catch (IOException e) {
-			System.out.println(e);
-		}
-		return this;
-	}
-	
-	void getProxyData(BufferedReader is) throws IOException {
-		if ((responseLine = is.readLine()) != null) {
-			System.out.println("Server: " + responseLine);
-		}
-		if ((parent = is.readLine()) != null) {
-			System.out.println("parent: " + parent);
-		}
-		if ((treenum = is.readLine()) != null) {
-			System.out.println("treenum: " + treenum);
-		}
-		if ((leaderflag = is.readLine()) != null) {
-			System.out.println("leaderflag: " + leaderflag);
-		}
-	}
-	
-	String getProxyData2(BufferedReader is) throws IOException {
-		String checkRepetition;
-		if ((responseLine = is.readLine()) != null) {
-			System.out.println("Server: " + responseLine);
-		}
-		if ((parent = is.readLine()) != null) {
-			System.out.println("parent: " + parent);
-		}
-		if ((checkRepetition = is.readLine()) != null) {
-			System.out.println("checkRepetition: " + checkRepetition);
-		}
-		return checkRepetition;
-	}
-	
-	void reConnectionMain(Socket echoSocket) {
-		client.close();
-		client.setClientSocket(echoSocket);
-		client.init();
-		client.setEchoValue(this);
-		client.getParentName();
-		client.start_threads();
-		client.start();
-	}
-	
-	void streamClose() throws IOException {
-		os.close();
-		is.close();
-		echoSocket.close();
-	}
-	
-	void sendDataProxy() {
-		if ("1".equals(leaderflag)) {
-			sendDataProxy("1",parent,treenum);
-		} else {
-			sendDataProxy("3",parent,treenum);
-		}
-	}
-	
-	void sendDataProxy(String type,String num,String treenum) {
-		try {
-			if(treenum!=null) {
-				os.writeBytes(type + "\n");
-				os.writeBytes(num + "\n");
-				os.writeBytes(treenum + "\n");
-			} else {
-				os.writeBytes(type + "\n");
-				os.writeBytes(num + "\n");
-			}
-
-		} catch (UnknownHostException e) {
-			System.err.println("Trying to connect to unknown host: " + e);
-		} catch (IOException e) {
-			System.err.println("IOException: " + e);
-		}
-	}
-	
-	String getIpV6() {
-		ipV6 = new IpV6();
-		ipV6.getInterface();
-		return ipV6.getV6();
-	}
-}
\ No newline at end of file
--- a/src/myVncProxy/EchoClient.java.orig	Fri Jan 13 13:41:30 2012 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,369 +0,0 @@
-package myVncClient;
-
-import java.io.*;
-import java.net.*;
-
-import myVncClient.MulticastQueue.Client;
-
-
-public class EchoClient {
-	private String name;
-	private BufferedReader is = null;
-	private DataOutputStream os = null;
-	private Socket echoSocket = null;
-	private boolean runflag = false;
-	private WaitReply waitReply;
-	private Socket clientSocket = null;
-//	MyVncClient client;
-	private InterfaceForViewer client;
-	private int echoPort = 9999;
-	MyVncClient checkMove;
-	VncViewer vncV;
-	String responseLine;
-	String parent;// 親の番号
-	String treenum;// 自分の番号
-	String leaderflag;// リーダフラグ
-	boolean passflag;
-	
-
-	// WaitReplyに自分自身を渡している
-	public EchoClient() {
-	}
-
-	// VncViewerから引数をもらってきてproxy役を認識する
-	public EchoClient(String name,MyVncClient client) {
-		this.client = client;
-		this.name = name;
-	}
-
-	public EchoClient(String name,MyVncClient client, int echoPort) {
-		this.client = client;
-		this.name = name;
-		this.echoPort = echoPort;
-	}
-	
-	
-	
-	public EchoClient(EchoClient echo,MyVncClient client) {
-		this.client = client;
-		this.name = echo.name;
-		leaderflag = echo.leaderflag;
-		parent = echo.parent;
-		treenum = echo.treenum;
-		waitReply = echo.waitReply;
-	}
-
-	public EchoClient(String name,CuiMyVncClient client) {
-		this.client = client;
-		this.name = name;
-	}
-	
-	public EchoClient(String name,CuiMyVncClient client, int echoPort) {
-		this.client = client;
-		this.name = name;
-		this.echoPort = echoPort;
-	}
-
-	public EchoClient(EchoClient echo,CuiMyVncClient client) {
-		this.client = client;
-		this.name = echo.name;
-		leaderflag = echo.leaderflag;
-		parent = echo.parent;
-		treenum = echo.treenum;
-	}
-
-	// void hostn(String args){
-	void openport() {
-		//  ソケットや入出力用のストリームの宣言
-		/*
-		Random rnd = new Random();
-		long ran = rnd.nextInt(1000) + 1000;
-*/
-		// ポート9999番に接続
-		try {
-			if (name != null) {
-				echoSocket = new Socket(name, echoPort);
-			} else {
-				echoSocket = new Socket("133.13.48.18", echoPort);
-			}
-			os = new DataOutputStream(echoSocket.getOutputStream());
-			is = new BufferedReader(new InputStreamReader(echoSocket.getInputStream()));
-		} catch (UnknownHostException e) {
-			System.err.println("Don't know about host: localhost");
-		} catch (IOException e) {
-			System.out.println(name + " への接続に失敗しました");
-			System.exit(0);
-		}
-	}
-
-	/**
-	 * @param args
-	 *            select connect port 
-	 * @return
-	 */
-	EchoClient hostn(String args) {
-		// サーバーにメッセージを送る
-		if (echoSocket != null && os != null && is != null) {
-			try {
-				// ip情報を取得する
-				InetAddress addr = InetAddress.getLocalHost();
-				// System.out.println(addr.getHostAddress());
-				String add = new String(addr.getHostAddress());
-
-				// メッセージを送ります
-				os.writeBytes(add + "\n");
-				os.writeBytes(args + "\n");
-
-				if ((responseLine = is.readLine()) != null) {
-					System.out.println("Server: " + responseLine);
-				}
-				if ((parent = is.readLine()) != null) {
-					System.out.println("parent: " + parent);
-				}
-				if ((treenum = is.readLine()) != null) {
-					System.out.println("treenum: " + treenum);
-				}
-				if ((leaderflag = is.readLine()) != null) {
-					System.out.println("leaderflag: " + leaderflag);
-				}
-
-				// 開いたソケットなどをクローズ
-				os.close();
-				is.close();
-				echoSocket.close();
-			} catch (UnknownHostException e) {
-				System.err.println("Trying to connect to unknown host: " + e);
-			} catch (IOException e) {
-				System.err.println("IOException: " + e);
-
-			}
-
-			waitReply = new WaitReply(treenum,client);
-			waitReply.start();
-
-		}
-		return this;
-	}
-
-	
-	/**
-	 * Call at lost host 
-	 */
-	boolean losthost() {
-		String checkRepetition; 
-		if (echoSocket != null && os != null && is != null) {
-			try {
-				if(runflag){
-					return true;
-				}
-				// echoSocketの情報を呼び出す
-				if ("1".equals(leaderflag)) {
-					senddataProxy("1",parent,treenum);
-				} else {
-					senddataProxy("3",parent,treenum);
-				}
-
-				if ((responseLine = is.readLine()) != null) {
-					System.out.println("Server: " + responseLine);
-				}
-				if ((parent = is.readLine()) != null) {
-					System.out.println("parent: " + parent);
-				}
-				if ((checkRepetition = is.readLine()) != null) {
-					System.out.println("checkRepetition: " + checkRepetition);
-				}
-				if(checkRepetition.equals("stop")){
-					return true;
-				}
-					
-				/**     
-				 * if ((value.treenum = is.readLine()) != null) {
-				 * System.out.println("treenum: " + value.treenum); }
-				 */
-				
-<<<<<<< local
-				if(!(checkRepetition.equals("skip")) || "1".equals(leaderflag)) {
-=======
-				if(!(checkRepetition.equals("skip"))) {
->>>>>>> other
-					Thread.sleep(1000);
-					client.init();
-					client.setEchoValue(this);
-					client.getParentName();
-					client.start_threads();
-					client.start();
-					//				MyVncClient.main(this);
-
-					// 開いたソケットなどをクローズ
-					os.close();
-					is.close();
-					echoSocket.close();
-					//runflag = true;
-				}
-<<<<<<< local
-				/*
-				Thread.sleep(1000);
-				if(checkRepetition.equals("skip") &&!(waitReply.passflag)) {
-					openport();
-					notfoundParent();					
-				}*/
-				
-=======
-
->>>>>>> other
-			} catch (UnknownHostException e) {
-				System.err.println("Trying to connect to unknown host: " + e);
-			} catch (IOException e) {
-				
-				return false;
-				
-				/*
-				while (true) {
-					
-					try {
-						Thread.sleep(1000);
-						System.out.println("once connection proxy");
-					} catch (InterruptedException e1) {
-						e1.printStackTrace();
-					}
-					
-					openport();
-					losthost();
-					System.out.println("faild in this area");
-					System.err.println("IOException: " + e);
-					
-					if(runflag == true){
-						break;
-					}				
-				}
-				*/
-			} 
-			catch (InterruptedException e) {
-				e.printStackTrace();
-			}
-
-		}
-		return true;
-	}
-	
-	boolean notfoundParent() {
-		if (echoSocket != null && os != null && is != null) {
-			runflag = true;
-			try {
-				senddataProxy("2", parent,null);
-
-				if ((responseLine = is.readLine()) != null) {
-					System.out.println("Server: " + responseLine);
-				}
-				if ((parent = is.readLine()) != null) {
-					System.out.println("parent: " + parent);
-				}
-				if ((treenum = is.readLine()) != null) {
-					System.out.println("treenum: " + treenum);
-				}
-				if ((leaderflag = is.readLine()) != null) {
-					System.out.println("leaderflag: " + leaderflag);
-				}
-				client.init();
-				client.setEchoValue(this);
-				client.getParentName();
-				client.start_threads();
-				client.start();
-				os.close();
-				is.close();
-				echoSocket.close();
-			} catch (UnknownHostException e) {
-				System.err.println("Trying to connect to unknown host: " + e);
-			} catch (IOException e) {
-				System.err.println("IOException: " + e);
-			}
-		}
-		return true;
-	}
-/*
-	void lostchild() {
-
-		// ßSystem.out.println(name);
-		if (echoSocket != null && os != null && is != null) {
-			try {
-
-				// echoSocketなどの情報を呼び出す(追加)
-
-				// 自分の番号を報告
-				os.writeBytes("4\n");
-				os.writeBytes(treenum + "\n");
-
-				os.close();
-				is.close();
-				echoSocket.close();
-
-			} catch (UnknownHostException e) {
-				System.err.println("Trying to connect to unknown host: " + e);
-			} catch (IOException e) {
-				System.err.println("IOException: " + e);
-			}
-		}
-	}
-*/
-	EchoClient Interruption(Socket _clientSocket) {
-		clientSocket = _clientSocket;
-		BufferedReader lostis = null;//あとで修正する
-
-
-		try {
-			lostis = new BufferedReader(new InputStreamReader(
-					clientSocket.getInputStream()));
-			// while (true){
-			// line = lostis.readLine();
-			// System.out.println(line);
-
-			try {
-				if ((responseLine = lostis.readLine()) != null) {
-					System.out.println("newServer: " + responseLine);
-				}
-				if ((parent = lostis.readLine()) != null) {
-					System.out.println("newtparent: " + parent);
-				}
-				if ((treenum = lostis.readLine()) != null) {
-					System.out.println("newtreenum: " + treenum);
-				}
-				if ((leaderflag = lostis.readLine()) != null) {
-					System.out.println("newreaderflag: " + leaderflag);
-				}
-
-			} catch (UnknownHostException e) {
-				System.err.println("Trying to connect to unknown host: " + e);
-			} catch (IOException e) {
-				System.err.println("IOException: " + e);
-			}
-
-			// }
-		} catch (IOException e) {
-			System.out.println(e);
-		}
-		try {
-			clientSocket.close();// WaitReplyのacceptを終了させる
-		} catch (IOException e) {
-			System.out.println(e);
-		}
-		return this;
-	}
-	
-	void senddataProxy(String type,String num,String treenum) {
-		try {
-			if(treenum!=null) {
-				os.writeBytes(type + "\n");
-				os.writeBytes(num + "\n");
-				os.writeBytes(treenum + "\n");
-			} else {
-				os.writeBytes(type + "\n");
-				os.writeBytes(num + "\n");
-			}
-
-		} catch (UnknownHostException e) {
-			System.err.println("Trying to connect to unknown host: " + e);
-		} catch (IOException e) {
-			System.err.println("IOException: " + e);
-		}
-	}
-}
\ No newline at end of file
--- a/src/myVncProxy/EchoClient.java~	Fri Jan 13 13:41:30 2012 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,369 +0,0 @@
-package myVncClient;
-
-import java.io.*;
-import java.net.*;
-
-import myVncClient.MulticastQueue.Client;
-
-
-public class EchoClient {
-	private String name;
-	private BufferedReader is = null;
-	private DataOutputStream os = null;
-	private Socket echoSocket = null;
-	private boolean runflag = false;
-	private WaitReply waitReply;
-	private Socket clientSocket = null;
-//	MyVncClient client;
-	private InterfaceForViewer client;
-	private int echoPort = 9999;
-	MyVncClient checkMove;
-	VncViewer vncV;
-	String responseLine;
-	String parent;// 親の番号
-	String treenum;// 自分の番号
-	String leaderflag;// リーダフラグ
-	boolean passflag;
-	
-
-	// WaitReplyに自分自身を渡している
-	public EchoClient() {
-	}
-
-	// VncViewerから引数をもらってきてproxy役を認識する
-	public EchoClient(String name,MyVncClient client) {
-		this.client = client;
-		this.name = name;
-	}
-
-	public EchoClient(String name,MyVncClient client, int echoPort) {
-		this.client = client;
-		this.name = name;
-		this.echoPort = echoPort;
-	}
-	
-	
-	
-	public EchoClient(EchoClient echo,MyVncClient client) {
-		this.client = client;
-		this.name = echo.name;
-		leaderflag = echo.leaderflag;
-		parent = echo.parent;
-		treenum = echo.treenum;
-		waitReply = echo.waitReply;
-	}
-
-	public EchoClient(String name,CuiMyVncClient client) {
-		this.client = client;
-		this.name = name;
-	}
-	
-	public EchoClient(String name,CuiMyVncClient client, int echoPort) {
-		this.client = client;
-		this.name = name;
-		this.echoPort = echoPort;
-	}
-
-	public EchoClient(EchoClient echo,CuiMyVncClient client) {
-		this.client = client;
-		this.name = echo.name;
-		leaderflag = echo.leaderflag;
-		parent = echo.parent;
-		treenum = echo.treenum;
-	}
-
-	// void hostn(String args){
-	void openport() {
-		//  ソケットや入出力用のストリームの宣言
-		/*
-		Random rnd = new Random();
-		long ran = rnd.nextInt(1000) + 1000;
-*/
-		// ポート9999番に接続
-		try {
-			if (name != null) {
-				echoSocket = new Socket(name, echoPort);
-			} else {
-				echoSocket = new Socket("133.13.48.18", echoPort);
-			}
-			os = new DataOutputStream(echoSocket.getOutputStream());
-			is = new BufferedReader(new InputStreamReader(echoSocket.getInputStream()));
-		} catch (UnknownHostException e) {
-			System.err.println("Don't know about host: localhost");
-		} catch (IOException e) {
-			System.out.println(name + " への接続に失敗しました");
-			System.exit(0);
-		}
-	}
-
-	/**
-	 * @param args
-	 *            select connect port 
-	 * @return
-	 */
-	EchoClient hostn(String args) {
-		// サーバーにメッセージを送る
-		if (echoSocket != null && os != null && is != null) {
-			try {
-				// ip情報を取得する
-				InetAddress addr = InetAddress.getLocalHost();
-				// System.out.println(addr.getHostAddress());
-				String add = new String(addr.getHostAddress());
-
-				// メッセージを送ります
-				os.writeBytes(add + "\n");
-				os.writeBytes(args + "\n");
-
-				if ((responseLine = is.readLine()) != null) {
-					System.out.println("Server: " + responseLine);
-				}
-				if ((parent = is.readLine()) != null) {
-					System.out.println("parent: " + parent);
-				}
-				if ((treenum = is.readLine()) != null) {
-					System.out.println("treenum: " + treenum);
-				}
-				if ((leaderflag = is.readLine()) != null) {
-					System.out.println("leaderflag: " + leaderflag);
-				}
-
-				// 開いたソケットなどをクローズ
-				os.close();
-				is.close();
-				echoSocket.close();
-			} catch (UnknownHostException e) {
-				System.err.println("Trying to connect to unknown host: " + e);
-			} catch (IOException e) {
-				System.err.println("IOException: " + e);
-
-			}
-
-			waitReply = new WaitReply(treenum,client);
-			waitReply.start();
-
-		}
-		return this;
-	}
-
-	
-	/**
-	 * Call at lost host 
-	 */
-	boolean losthost() {
-		String checkRepetition; 
-		if (echoSocket != null && os != null && is != null) {
-			try {
-				if(runflag){
-					return true;
-				}
-				// echoSocketの情報を呼び出す
-				if ("1".equals(leaderflag)) {
-					senddataProxy("1",parent,treenum);
-				} else {
-					senddataProxy("3",parent,treenum);
-				}
-
-				if ((responseLine = is.readLine()) != null) {
-					System.out.println("Server: " + responseLine);
-				}
-				if ((parent = is.readLine()) != null) {
-					System.out.println("parent: " + parent);
-				}
-				if ((checkRepetition = is.readLine()) != null) {
-					System.out.println("checkRepetition: " + checkRepetition);
-				}
-				if(checkRepetition.equals("stop")){
-					return true;
-				}
-					
-				/**     
-				 * if ((value.treenum = is.readLine()) != null) {
-				 * System.out.println("treenum: " + value.treenum); }
-				 */
-				
-<<<<<<< local
-				if(!(checkRepetition.equals("skip")) || "1".equals(leaderflag)) {
-=======
-				if(!(checkRepetition.equals("skip"))) {
->>>>>>> other
-					Thread.sleep(1000);
-					client.init();
-					client.setEchoValue(this);
-					client.getParentName();
-					client.start_threads();
-					client.start();
-					//				MyVncClient.main(this);
-
-					// 開いたソケットなどをクローズ
-					os.close();
-					is.close();
-					echoSocket.close();
-					//runflag = true;
-				}
-<<<<<<< local
-				/*
-				Thread.sleep(1000);
-				if(checkRepetition.equals("skip") &&!(waitReply.passflag)) {
-					openport();
-					notfoundParent();					
-				}*/
-				
-=======
-
->>>>>>> other
-			} catch (UnknownHostException e) {
-				System.err.println("Trying to connect to unknown host: " + e);
-			} catch (IOException e) {
-				
-				return false;
-				
-				/*
-				while (true) {
-					
-					try {
-						Thread.sleep(1000);
-						System.out.println("once connection proxy");
-					} catch (InterruptedException e1) {
-						e1.printStackTrace();
-					}
-					
-					openport();
-					losthost();
-					System.out.println("faild in this area");
-					System.err.println("IOException: " + e);
-					
-					if(runflag == true){
-						break;
-					}				
-				}
-				*/
-			} 
-			catch (InterruptedException e) {
-				e.printStackTrace();
-			}
-
-		}
-		return true;
-	}
-	
-	boolean notfoundParent() {
-		if (echoSocket != null && os != null && is != null) {
-			runflag = true;
-			try {
-				senddataProxy("2", parent,null);
-
-				if ((responseLine = is.readLine()) != null) {
-					System.out.println("Server: " + responseLine);
-				}
-				if ((parent = is.readLine()) != null) {
-					System.out.println("parent: " + parent);
-				}
-				if ((treenum = is.readLine()) != null) {
-					System.out.println("treenum: " + treenum);
-				}
-				if ((leaderflag = is.readLine()) != null) {
-					System.out.println("leaderflag: " + leaderflag);
-				}
-				client.init();
-				client.setEchoValue(this);
-				client.getParentName();
-				client.start_threads();
-				client.start();
-				os.close();
-				is.close();
-				echoSocket.close();
-			} catch (UnknownHostException e) {
-				System.err.println("Trying to connect to unknown host: " + e);
-			} catch (IOException e) {
-				System.err.println("IOException: " + e);
-			}
-		}
-		return true;
-	}
-/*
-	void lostchild() {
-
-		// ßSystem.out.println(name);
-		if (echoSocket != null && os != null && is != null) {
-			try {
-
-				// echoSocketなどの情報を呼び出す(追加)
-
-				// 自分の番号を報告
-				os.writeBytes("4\n");
-				os.writeBytes(treenum + "\n");
-
-				os.close();
-				is.close();
-				echoSocket.close();
-
-			} catch (UnknownHostException e) {
-				System.err.println("Trying to connect to unknown host: " + e);
-			} catch (IOException e) {
-				System.err.println("IOException: " + e);
-			}
-		}
-	}
-*/
-	EchoClient Interruption(Socket _clientSocket) {
-		clientSocket = _clientSocket;
-		BufferedReader lostis = null;//あとで修正する
-
-
-		try {
-			lostis = new BufferedReader(new InputStreamReader(
-					clientSocket.getInputStream()));
-			// while (true){
-			// line = lostis.readLine();
-			// System.out.println(line);
-
-			try {
-				if ((responseLine = lostis.readLine()) != null) {
-					System.out.println("newServer: " + responseLine);
-				}
-				if ((parent = lostis.readLine()) != null) {
-					System.out.println("newtparent: " + parent);
-				}
-				if ((treenum = lostis.readLine()) != null) {
-					System.out.println("newtreenum: " + treenum);
-				}
-				if ((leaderflag = lostis.readLine()) != null) {
-					System.out.println("newreaderflag: " + leaderflag);
-				}
-
-			} catch (UnknownHostException e) {
-				System.err.println("Trying to connect to unknown host: " + e);
-			} catch (IOException e) {
-				System.err.println("IOException: " + e);
-			}
-
-			// }
-		} catch (IOException e) {
-			System.out.println(e);
-		}
-		try {
-			clientSocket.close();// WaitReplyのacceptを終了させる
-		} catch (IOException e) {
-			System.out.println(e);
-		}
-		return this;
-	}
-	
-	void senddataProxy(String type,String num,String treenum) {
-		try {
-			if(treenum!=null) {
-				os.writeBytes(type + "\n");
-				os.writeBytes(num + "\n");
-				os.writeBytes(treenum + "\n");
-			} else {
-				os.writeBytes(type + "\n");
-				os.writeBytes(num + "\n");
-			}
-
-		} catch (UnknownHostException e) {
-			System.err.println("Trying to connect to unknown host: " + e);
-		} catch (IOException e) {
-			System.err.println("IOException: " + e);
-		}
-	}
-}
\ No newline at end of file
--- a/src/myVncProxy/InterfaceForViewer.java	Fri Jan 13 13:41:30 2012 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,31 +0,0 @@
-package myVncProxy;
-
-import java.awt.Image;
-import java.net.Socket;
-
-public interface InterfaceForViewer extends java.lang.Runnable{
-
-	public void init();
-	public void start_threads();
-	public void start();
-	
-	public void setEchoValue(EchoClient value);
-	public String readParameter(String name, boolean required);
-	
-	public void getParentName();
-	// synchronized
-	public void disconnect();
-	public void fatalError(String str);
-	public void fatalError(String str, Exception e);
-
-	
-	public void destroy();
-	
-	public void enableInput(boolean enable);
-	
-
-	public void setClientSocket(Socket sock);
-	public void close();
-	public Image getScreenImage();
-	public void writeScreenData(byte[] b, String imageFormat);
-}
--- a/src/myVncProxy/IpV6.java	Fri Jan 13 13:41:30 2012 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,78 +0,0 @@
-package myVncProxy;
-
-import java.net.InetAddress;
-import java.net.NetworkInterface;
-import java.net.SocketException;
-import java.util.ArrayList;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.net.Inet6Address;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-public class IpV6 {
-	private HashMap<NetworkInterface, ArrayList<InetAddress>> interfaceMap;
-
-	public IpV6() {
-		interfaceMap = new HashMap<NetworkInterface, ArrayList<InetAddress>>();
-	}
-
-	public void getInterface() {
-		interfaceMap.clear();
-		try {
-			Enumeration<NetworkInterface> iList = NetworkInterface
-					.getNetworkInterfaces();
-			if (iList == null) {
-				System.out.println("notfound interface");
-			} else {
-				while (iList.hasMoreElements()) {
-					NetworkInterface iface = iList.nextElement();
-					Enumeration<InetAddress> addrList = iface
-							.getInetAddresses();
-					if (!addrList.hasMoreElements())
-						continue;
-					ArrayList<InetAddress> iaddress = new ArrayList<InetAddress>();
-					while (addrList.hasMoreElements())
-						iaddress.add(addrList.nextElement());
-					interfaceMap.put(iface, iaddress);
-				}
-			}
-		} catch (SocketException se) {
-			System.out.println("Error getting network interfaces: "
-					+ se.getMessage());
-		}
-	}
-
-	public boolean match(String name) {
-		Pattern pattern = Pattern.compile("lo.*");
-		Matcher matcher = pattern.matcher(name);
-		return matcher.matches();
-	}
-
-	public String getV6() {
-		boolean flag = false;
-		String name = null;
-		for (NetworkInterface n : interfaceMap.keySet()) {
-			if (!(match(n.getName()))) {
-				for (InetAddress a : interfaceMap.get(n)) {
-					if (a instanceof Inet6Address && !(flag)) {
-						System.out.println(a.getHostAddress());
-						flag = true;
-						name = a.getHostAddress();
-					}
-				}
-			}
-		}
-		return name;
-	}
-
-	public HashMap<NetworkInterface, ArrayList<InetAddress>> getInetfaceMap() {
-		return interfaceMap;
-	}
-
-	public void setInterfaceMap(
-			HashMap<NetworkInterface, ArrayList<InetAddress>> interfaceMap) {
-		this.interfaceMap = interfaceMap;
-	}
-
-}
--- a/src/myVncProxy/MyVncClient.java	Fri Jan 13 13:41:30 2012 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1256 +0,0 @@
-package myVncProxy;
-
-import java.awt.*;
-import java.awt.event.*;
-import java.awt.image.BufferedImage;
-import java.io.*;
-import java.net.*;
-import java.util.Random;
-
-import java.nio.ByteBuffer;
-
-public class MyVncClient extends VncViewer implements InterfaceForViewer,
-		java.lang.Runnable, WindowListener {
-
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = 1L;
-	private boolean inAnApplet = true;
-	private boolean inSeparateFrame = false;
-	private Socket clientSocket = null;
-	private String parent, treenum;
-	private String leaderflag;
-	private boolean runflag = false;
-	private boolean first = true;
-
-	private EchoClient echoValue;		
-	private int echoPort;
-	private String pHost;
-	//private TextBox getHost;
-	private GetBroadCast getBcast;
-	private Thread runBcast;
-	private BroadCast bCast;
-
-	//
-	// main() is called when run as a java program from the command line.
-	// It simply runs the applet inside a newly-created frame.
-	//
-
-	public void treeVncClient(String[] argv) {
-		MyVncClient v = new MyVncClient();
-		v.echoValue = null;
-		v.runClient(argv);
-	}
-
-	private void runClient(String[] argv) {
-		mainArgs = argv;
-		System.out.println(mainArgs.length);
-		inAnApplet = false;
-		inSeparateFrame = true;
-		if(mainArgs.length == 0) {
-			bCast = new BroadCast("who");
-			bCast.createSocket();
-			bCast.sendData();
-			getBcast = new GetBroadCast();
-			runBcast = new Thread(getBcast);
-			runBcast.start();
-		}
-		
-		try {
-			Thread.sleep(1000);
-		} catch (InterruptedException e) {
-			e.printStackTrace();
-		}
-		if(mainArgs.length == 0)
-			getBcast.setStopFlag(true);
-
-		if (mainArgs.length > 0)
-			pHost = mainArgs[0];
-		else {
-			pHost = getBcast.text.getAddress();
-		}
-			
-			
-			//pHost = "cls080.ie.u-ryukyu.ac.jp";
-		if (mainArgs.length > 1)
-			port = Integer.parseInt(mainArgs[1]);
-		else {
-			port = Integer.parseInt(getBcast.text.getPort());
-			getBcast.socketClose();
-//			port = 5999;
-		}
-		init();
-		start_threads();
-		start();
-	}
-
-	//
-	// init()
-	//
-
-	public void init() {
-
-		readParameters();
-
-		refApplet = this;
-
-		if (inSeparateFrame) {
-			vncFrame = new Frame("TightVNC");
-			if (!inAnApplet) {
-				vncFrame.add("Center", this);
-			}
-			vncContainer = vncFrame;
-		} else {
-			vncContainer = this;
-		}
-
-		recordingSync = new Object();
-
-		options = new OptionsFrame(this);
-		clipboard = new ClipboardFrame(this);
-		if (RecordingFrame.checkSecurity())
-			rec = new RecordingFrame(this);
-
-		sessionFileName = null;
-		recordingActive = false;
-		recordingStatusChanged = false;
-		cursorUpdatesDef = null;
-		eightBitColorsDef = null;
-
-		if (inSeparateFrame)
-			vncFrame.addWindowListener(this);
-
-		rfbThread = new Thread(this);
-	}
-
-	public void update(Graphics g) {
-	}
-
-	//
-	// run() - executed by the rfbThread to deal with the RFB socket.
-	//
-
-	public void start_threads() {
-		rfbThread.start();
-	}
-
-	public void run() {
-
-		gridbag = new GridBagLayout();
-		vncContainer.setLayout(gridbag);
-
-		GridBagConstraints gbc = new GridBagConstraints();
-		gbc.gridwidth = GridBagConstraints.REMAINDER;
-		gbc.anchor = GridBagConstraints.NORTHWEST;
-
-		if (showControls) {
-			buttonPanel = new ButtonPanel(this);
-			gridbag.setConstraints(buttonPanel, gbc);
-			vncContainer.add(buttonPanel);
-		}
-
-		try {
-
-			if (first) {
-				connectAndAuthenticate();
-				accThread = new Thread(new AcceptThread(rfb, 5999));
-				accThread.start();
-				first = false;
-			} else {
-				System.out.println("reConnectAndAuthenticate() ");
-				reConnectAndAuthenticate();
-				//accThread = new Thread(new AcceptThread(rfb, 5999));
-				//accThread.start();
-			}
-
-			doProtocolInitialisation();
-
-			createCanvas(0, 0);
-
-			// rfb.readPngData();
-			// vc.drawFirstImage();
-
-		} catch (IOException e) {
-			try {
-				rfb.sock.close();
-
-			} catch (IOException e2) {
-				e2.printStackTrace();
-			}
-			System.out.println("Socket error");
-			// parent no find
-			Random rnd = new Random();
-			long ran = rnd.nextInt(3000) + 3000;
-			System.out.println(ran);
-			// 親がいない場合の処理はここに書く!!!!
-			/**
-			 * this while reconnection
-			 */
-
-			int counter = 0;
-			vncFrame.setVisible(false);
-			vncFrame.dispose();
-
-			while (true) {
-				/**
-				 * if my last node case reconnectoion stop
-				 */
-
-				echoValue = new EchoClient(echoValue, this);
-				// echoValue = new EchoClient(echoValue);
-
-				try {
-					Thread.sleep(ran);
-				} catch (InterruptedException e1) {
-					e1.printStackTrace();
-				}
-
-				if (counter >= 3) {
-					echoValue.openport();
-					echoValue.notfoundParent();
-				}
-
-				echoValue.openport();
-				/*
-				if(echoValue.notfoundParent()) {
-					break;
-				}
-				*/
-				// runflag = echo.losthost();
-				
-				
-				if (echoValue.losthost()) {
-					break;
-				}
-				
-				counter++;
-			}
-
-			// System.exit(0);
-		} catch (Exception e) {
-			System.out.println(e);
-			System.exit(0);
-		}
-
-		gbc.weightx = 1.0;
-		gbc.weighty = 1.0;
-
-		if (inSeparateFrame) {
-
-			// Create a panel which itself is resizeable and can hold
-			// non-resizeable VncCanvas component at the top left corner.
-			Panel canvasPanel = new Panel();
-			canvasPanel.setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0));
-			canvasPanel.add(vc);
-
-			// Create a ScrollPane which will hold a panel with VncCanvas
-			// inside.
-			desktopScrollPane = new ScrollPane(ScrollPane.SCROLLBARS_AS_NEEDED);
-			gbc.fill = GridBagConstraints.BOTH;
-			gridbag.setConstraints(desktopScrollPane, gbc);
-			desktopScrollPane.add(canvasPanel);
-
-			// Finally, add our ScrollPane to the Frame window.
-			vncFrame.add(desktopScrollPane);
-			vncFrame.setTitle(rfb.desktopName);
-			vncFrame.pack();
-			vc.resizeDesktopFrame();
-
-		} else {
-
-			// Just add the VncCanvas component to the Applet.
-			gridbag.setConstraints(vc, gbc);
-			add(vc);
-			validate();
-
-		}
-
-		try {
-			if (showControls)
-				buttonPanel.enableButtons();
-
-			moveFocusToDesktop();
-
-			processNormalProtocol();// main loop
-
-		} catch (NoRouteToHostException e) {
-			fatalError("Network error: no route to server: " + host, e);
-		} catch (UnknownHostException e) {
-			fatalError("Network error: server name unknown: " + host, e);
-		} catch (ConnectException e) {
-			fatalError("Network error: could not connect to server: " + host
-					+ ":" + port, e);
-		} catch (EOFException e) {
-
-			vncFrame.setVisible(false);
-			vncFrame.dispose();
-			// num4
-			if (leaderflag != null) {
-				while (true) {
-					// echoValue = new EchoClient(echoValue, this);
-					echoValue = new EchoClient(echoValue);
-					echoValue.openport();
-					// runflag = echo.losthost();
-					if (echoValue.losthost()) {
-						break;
-					}
-				}
-			} else {
-
-				if (showOfflineDesktop) {
-					e.printStackTrace();
-					System.out
-							.println("Network error: remote side closed connection");
-					if (vc != null) {
-						vc.enableInput(false);
-					}
-					if (inSeparateFrame) {
-						vncFrame.setTitle(rfb.desktopName + " [disconnected]");
-					}
-					if (rfb != null && !rfb.closed())
-						rfb.close();
-					if (showControls && buttonPanel != null) {
-						buttonPanel.disableButtonsOnDisconnect();
-						if (inSeparateFrame) {
-							vncFrame.pack();
-						} else {
-							validate();
-						}
-					}
-				} else {
-					fatalError("Network error: remote side closed connection",
-							e);
-				}
-			}
-		} catch (IOException e) {
-			String str = e.getMessage();
-			if (str != null && str.length() != 0) {
-				fatalError("Network Error: " + str, e);
-			} else {
-				fatalError(e.toString(), e);
-			}
-		} catch (Exception e) {
-			String str = e.getMessage();
-			if (str != null && str.length() != 0) {
-				fatalError("Error: " + str, e);
-			} else {
-				fatalError(e.toString(), e);
-			}
-		}
-
-	}
-
-	//
-	// Create a VncCanvas instance.
-	//
-
-	void createCanvas(int maxWidth, int maxHeight) throws IOException {
-		// Determine if Java 2D API is available and use a special
-		// version of VncCanvas if it is present.
-		vc = null;
-		try {
-			// This throws ClassNotFoundException if there is no Java 2D API.
-			Class cl = Class.forName("java.awt.Graphics2D");
-			// If we could load Graphics2D class, then we can use VncCanvas2D.
-			cl = Class.forName("VncCanvas2");
-			Class[] argClasses = { this.getClass(), Integer.TYPE, Integer.TYPE };
-			java.lang.reflect.Constructor cstr = cl.getConstructor(argClasses);
-			Object[] argObjects = { this, new Integer(maxWidth),
-					new Integer(maxHeight) };
-			vc = (VncCanvas) cstr.newInstance(argObjects);
-		} catch (Exception e) {
-			System.out.println("Warning: Java 2D API is not available");
-		}
-
-		// If we failed to create VncCanvas2D, use old VncCanvas.
-		if (vc == null)
-			vc = new VncCanvas(this, maxWidth, maxHeight);
-	}
-
-	//
-	// Process RFB socket messages.
-	// If the rfbThread is being stopped, ignore any exceptions,
-	// otherwise rethrow the exception so it can be handled.
-	//
-
-	void processNormalProtocol() throws Exception {
-		try {
-			vc.processNormalProtocol();// main loop
-		} catch (Exception e) {
-			if (rfbThread == null) {
-				System.out.println("Ignoring RFB socket exceptions"
-						+ " because applet is stopping");
-			} else {
-				throw e;
-			}
-		}
-	}
-
-	//
-	// Connect to the RFB server and authenticate the user.
-	//
-
-	void connectAndAuthenticate() throws Exception {
-
-		showConnectionStatus("Initializing...");
-		if (inSeparateFrame) {
-			vncFrame.pack();
-			vncFrame.setVisible(true);
-		} else {
-			validate();
-		}
-
-		showConnectionStatus("Connecting to " + host + ", port " + port + "...");
-
-		rfb = new MyRfbProto(pHost, port, this);
-		showConnectionStatus("Connected to server");
-
-		rfb.readVersionMsg();
-		showConnectionStatus("RFB server supports protocol version "
-				+ rfb.serverMajor + "." + rfb.serverMinor);
-
-		rfb.writeVersionMsg();
-		showConnectionStatus("Using RFB protocol version " + rfb.clientMajor
-				+ "." + rfb.clientMinor);
-
-		if (rfb.serverMinor == 855) {
-			/*
-			 * if connect to proxy, userEchoPortFlag is true. 
-			 * if connect to client, userEchoPortFlag is false.
-			 */
-			boolean useEchoPortFlag = rfb.readProxyFlag();
-			if (useEchoPortFlag) {
-				byte[] b = new byte[4];
-				b = rfb.readEchoPort();
-				echoPort = castByteInt(b);
-
-
-				InetAddress addr = InetAddress.getByName(pHost);
-				String h = new String(addr.getHostAddress());
-
-				getParentName();
-				if (!(h.equals(host))) {
-					rfb.changeParent(host, port);
-					rfb.readVersionMsg();
-					rfb.writeVersionMsg();
-					boolean flag = rfb.readProxyFlag();					
-				}
-			}
-		}
-
-		int secType = rfb.negotiateSecurity();
-		int authType;
-		if (secType == RfbProto.SecTypeTight) {
-			showConnectionStatus("Enabling TightVNC protocol extensions");
-			rfb.setupTunneling();
-			authType = rfb.negotiateAuthenticationTight();
-		} else {
-			authType = secType;
-		}
-
-		switch (authType) {
-		case RfbProto.AuthNone:
-			showConnectionStatus("No authentication needed");
-			rfb.authenticateNone();
-			break;
-		case RfbProto.AuthVNC:
-			showConnectionStatus("Performing standard VNC authentication");
-			if (passwordParam != null) {
-				rfb.authenticateVNC(passwordParam);
-			} else {
-				String pw = askPassword();
-				rfb.authenticateVNC(pw);
-			}
-			break;
-		default:
-			throw new Exception("Unknown authentication scheme " + authType);
-		}
-	}
-
-	void reConnectAndAuthenticate() throws Exception {
-
-		showConnectionStatus("Initializing...");
-
-		if (inSeparateFrame) {
-			vncFrame.pack();
-			vncFrame.setVisible(true);
-		} else {
-			validate();
-		}
-
-		showConnectionStatus("Connecting to " + host + ", port " + port + "...");
-
-		rfb.changeParent(host, port);
-
-		showConnectionStatus("Connected to server");
-
-		rfb.readVersionMsg();
-		showConnectionStatus("RFB server supports protocol version "
-				+ rfb.serverMajor + "." + rfb.serverMinor);
-
-		rfb.writeVersionMsg();
-		showConnectionStatus("Using RFB protocol version " + rfb.clientMajor
-				+ "." + rfb.clientMinor);
-
-		if (rfb.serverMinor == 855) {
-			boolean useEchoPortFlag = rfb.readProxyFlag();
-			if (useEchoPortFlag) {
-				byte[] b = new byte[4];
-				b = rfb.readEchoPort();
-				echoPort = castByteInt(b);
-
-				InetAddress addr = InetAddress.getByName(pHost);
-				String h = new String(addr.getHostAddress());
-
-				getParentName();
-				if (!(h.equals(host))) {
-					rfb.changeParent(host, port);
-					rfb.readVersionMsg();
-					rfb.writeVersionMsg();
-					boolean flag = rfb.readProxyFlag();
-				}
-			}
-		}
-		int secType = rfb.negotiateSecurity();
-		int authType;
-		if (secType == RfbProto.SecTypeTight) {
-			showConnectionStatus("Enabling TightVNC protocol extensions");
-			rfb.setupTunneling();
-			authType = rfb.negotiateAuthenticationTight();
-		} else {
-			authType = secType;
-		}
-
-		switch (authType) {
-		case RfbProto.AuthNone:
-			showConnectionStatus("No authentication needed");
-			rfb.authenticateNone();
-			break;
-		case RfbProto.AuthVNC:
-			showConnectionStatus("Performing standard VNC authentication");
-			if (passwordParam != null) {
-				rfb.authenticateVNC(passwordParam);
-			} else {
-				String pw = askPassword();
-				rfb.authenticateVNC(pw);
-			}
-			break;
-		default:
-			throw new Exception("Unknown authentication scheme " + authType);
-		}
-	}
-
-	//
-	// Show a message describing the connection status.
-	// To hide the connection status label, use (msg == null).
-	//
-
-	void showConnectionStatus(String msg) {
-		if (msg == null) {
-			if (vncContainer.isAncestorOf(connStatusLabel)) {
-				vncContainer.remove(connStatusLabel);
-			}
-			return;
-		}
-
-		System.out.println(msg);
-
-		if (connStatusLabel == null) {
-			connStatusLabel = new Label("Status: " + msg);
-			connStatusLabel.setFont(new Font("Helvetica", Font.PLAIN, 12));
-		} else {
-			connStatusLabel.setText("Status: " + msg);
-		}
-
-		if (!vncContainer.isAncestorOf(connStatusLabel)) {
-			GridBagConstraints gbc = new GridBagConstraints();
-			gbc.gridwidth = GridBagConstraints.REMAINDER;
-			gbc.fill = GridBagConstraints.HORIZONTAL;
-			gbc.anchor = GridBagConstraints.NORTHWEST;
-			gbc.weightx = 1.0;
-			gbc.weighty = 1.0;
-			gbc.insets = new Insets(20, 30, 20, 30);
-			gridbag.setConstraints(connStatusLabel, gbc);
-			vncContainer.add(connStatusLabel);
-		}
-
-		if (inSeparateFrame) {
-			vncFrame.pack();
-		} else {
-			validate();
-		}
-	}
-
-	//
-	// Show an authentication panel.
-	//
-
-	String askPassword() throws Exception {
-		showConnectionStatus(null);
-
-		AuthPanel authPanel = new AuthPanel(this);
-
-		GridBagConstraints gbc = new GridBagConstraints();
-		gbc.gridwidth = GridBagConstraints.REMAINDER;
-		gbc.anchor = GridBagConstraints.NORTHWEST;
-		gbc.weightx = 1.0;
-		gbc.weighty = 1.0;
-		gbc.ipadx = 100;
-		gbc.ipady = 50;
-		gridbag.setConstraints(authPanel, gbc);
-		vncContainer.add(authPanel);
-
-		if (inSeparateFrame) {
-			vncFrame.pack();
-		} else {
-			validate();
-		}
-
-		authPanel.moveFocusToDefaultField();
-		String pw = authPanel.getPassword();
-		vncContainer.remove(authPanel);
-		return pw;
-	}
-
-	//
-	// Do the rest of the protocol initialisation.
-	//
-
-	void doProtocolInitialisation() throws IOException {
-		rfb.writeClientInit();
-		rfb.readServerInit();
-
-		System.out.println("Desktop name is " + rfb.desktopName);
-		System.out.println("Desktop size is " + rfb.framebufferWidth + " x "
-				+ rfb.framebufferHeight);
-
-		setEncodings();
-
-		showConnectionStatus(null);
-	}
-
-	//
-	// Send current encoding list to the RFB server.
-	//
-
-	int[] encodingsSaved;
-	int nEncodingsSaved;
-
-	void setEncodings() {
-		setEncodings(false);
-	}
-
-	void autoSelectEncodings() {
-		setEncodings(true);
-	}
-
-	void setEncodings(boolean autoSelectOnly) {
-		if (options == null || rfb == null || !rfb.inNormalProtocol)
-			return;
-
-		int preferredEncoding = options.preferredEncoding;
-		if (preferredEncoding == -1) {
-			long kbitsPerSecond = rfb.kbitsPerSecond();
-			if (nEncodingsSaved < 1) {
-				// Choose Tight or ZRLE encoding for the very first update.
-				System.out.println("Using Tight/ZRLE encodings");
-				preferredEncoding = RfbProto.EncodingTight;
-			} else if (kbitsPerSecond > 2000
-					&& encodingsSaved[0] != RfbProto.EncodingHextile) {
-				// Switch to Hextile if the connection speed is above 2Mbps.
-				System.out.println("Throughput " + kbitsPerSecond
-						+ " kbit/s - changing to Hextile encoding");
-				preferredEncoding = RfbProto.EncodingHextile;
-			} else if (kbitsPerSecond < 1000
-					&& encodingsSaved[0] != RfbProto.EncodingTight) {
-				// Switch to Tight/ZRLE if the connection speed is below 1Mbps.
-				System.out.println("Throughput " + kbitsPerSecond
-						+ " kbit/s - changing to Tight/ZRLE encodings");
-				preferredEncoding = RfbProto.EncodingTight;
-			} else {
-				// Don't change the encoder.
-				if (autoSelectOnly)
-					return;
-				preferredEncoding = encodingsSaved[0];
-			}
-		} else {
-			// Auto encoder selection is not enabled.
-			if (autoSelectOnly)
-				return;
-		}
-
-		int[] encodings = new int[20];
-		int nEncodings = 0;
-
-		encodings[nEncodings++] = preferredEncoding;
-		if (options.useCopyRect) {
-			encodings[nEncodings++] = RfbProto.EncodingCopyRect;
-		}
-
-		if (preferredEncoding != RfbProto.EncodingTight) {
-			encodings[nEncodings++] = RfbProto.EncodingTight;
-		}
-		if (preferredEncoding != RfbProto.EncodingZRLE) {
-			encodings[nEncodings++] = RfbProto.EncodingZRLE;
-		}
-		if (preferredEncoding != RfbProto.EncodingHextile) {
-			encodings[nEncodings++] = RfbProto.EncodingHextile;
-		}
-		if (preferredEncoding != RfbProto.EncodingZlib) {
-			encodings[nEncodings++] = RfbProto.EncodingZlib;
-		}
-		if (preferredEncoding != RfbProto.EncodingCoRRE) {
-			encodings[nEncodings++] = RfbProto.EncodingCoRRE;
-		}
-		if (preferredEncoding != RfbProto.EncodingRRE) {
-			encodings[nEncodings++] = RfbProto.EncodingRRE;
-		}
-
-		if (options.compressLevel >= 0 && options.compressLevel <= 9) {
-			encodings[nEncodings++] = RfbProto.EncodingCompressLevel0
-					+ options.compressLevel;
-		}
-		if (options.jpegQuality >= 0 && options.jpegQuality <= 9) {
-			encodings[nEncodings++] = RfbProto.EncodingQualityLevel0
-					+ options.jpegQuality;
-		}
-
-		if (options.requestCursorUpdates) {
-			encodings[nEncodings++] = RfbProto.EncodingXCursor;
-			encodings[nEncodings++] = RfbProto.EncodingRichCursor;
-			if (!options.ignoreCursorUpdates)
-				encodings[nEncodings++] = RfbProto.EncodingPointerPos;
-		}
-
-		encodings[nEncodings++] = RfbProto.EncodingLastRect;
-		encodings[nEncodings++] = RfbProto.EncodingNewFBSize;
-
-		boolean encodingsWereChanged = false;
-		if (nEncodings != nEncodingsSaved) {
-			encodingsWereChanged = true;
-		} else {
-			for (int i = 0; i < nEncodings; i++) {
-				if (encodings[i] != encodingsSaved[i]) {
-					encodingsWereChanged = true;
-					break;
-				}
-			}
-		}
-
-		if (encodingsWereChanged) {
-			try {
-				rfb.writeSetEncodings(encodings, nEncodings);
-				if (vc != null) {
-					vc.softCursorFree();
-				}
-			} catch (Exception e) {
-				e.printStackTrace();
-			}
-			encodingsSaved = encodings;
-			nEncodingsSaved = nEncodings;
-		}
-	}
-
-	//
-	// setCutText() - send the given cut text to the RFB server.
-	//
-
-	void setCutText(String text) {
-		try {
-			if (rfb != null && rfb.inNormalProtocol) {
-				rfb.writeClientCutText(text);
-			}
-		} catch (Exception e) {
-			e.printStackTrace();
-		}
-	}
-
-	//
-	// Order change in session recording status. To stop recording, pass
-	// null in place of the fname argument.
-	//
-
-	void setRecordingStatus(String fname) {
-		synchronized (recordingSync) {
-			sessionFileName = fname;
-			recordingStatusChanged = true;
-		}
-	}
-
-	//
-	// Start or stop session recording. Returns true if this method call
-	// causes recording of a new session.
-	//
-
-	boolean checkRecordingStatus() throws IOException {
-		synchronized (recordingSync) {
-			if (recordingStatusChanged) {
-				recordingStatusChanged = false;
-				if (sessionFileName != null) {
-					startRecording();
-					return true;
-				} else {
-					stopRecording();
-				}
-			}
-		}
-		return false;
-	}
-
-	//
-	// Start session recording.
-	//
-
-	protected void startRecording() throws IOException {
-		synchronized (recordingSync) {
-			if (!recordingActive) {
-				// Save settings to restore them after recording the session.
-				cursorUpdatesDef = options.choices[options.cursorUpdatesIndex]
-						.getSelectedItem();
-				eightBitColorsDef = options.choices[options.eightBitColorsIndex]
-						.getSelectedItem();
-				// Set options to values suitable for recording.
-				options.choices[options.cursorUpdatesIndex].select("Disable");
-				options.choices[options.cursorUpdatesIndex].setEnabled(false);
-				options.setEncodings();
-				options.choices[options.eightBitColorsIndex].select("No");
-				options.choices[options.eightBitColorsIndex].setEnabled(false);
-				options.setColorFormat();
-			} else {
-				rfb.closeSession();
-			}
-
-			System.out.println("Recording the session in " + sessionFileName);
-			rfb.startSession(sessionFileName);
-			recordingActive = true;
-		}
-	}
-
-	//
-	// Stop session recording.
-	//
-
-	protected void stopRecording() throws IOException {
-		synchronized (recordingSync) {
-			if (recordingActive) {
-				// Restore options.
-				options.choices[options.cursorUpdatesIndex]
-						.select(cursorUpdatesDef);
-				options.choices[options.cursorUpdatesIndex].setEnabled(true);
-				options.setEncodings();
-				options.choices[options.eightBitColorsIndex]
-						.select(eightBitColorsDef);
-				options.choices[options.eightBitColorsIndex].setEnabled(true);
-				options.setColorFormat();
-
-				rfb.closeSession();
-				System.out.println("Session recording stopped.");
-			}
-			sessionFileName = null;
-			recordingActive = false;
-		}
-	}
-
-	/**
-	 * readParameters() - read parameters from the html source or from the
-	 * command line. On the command line, the arguments are just a sequence of
-	 * param_name/param_value pairs where the names and values correspond to
-	 * those expected in the html applet tag source.
-	 */
-
-	void readParameters() {
-		/*
-		 * host = readParameter("HOST", !inAnApplet);
-		 * 
-		 * if (host == null) { host = getCodeBase().getHost(); if
-		 * (host.equals("")) { fatalError("HOST parameter not specified"); } }
-		 * 
-		 * port = readIntParameter("PORT", 5550);
-		 */
-
-		// Read "ENCPASSWORD" or "PASSWORD" parameter if specified.
-		readPasswordParameters();
-
-		String str;
-		if (inAnApplet) {
-			str = readParameter("Open New Window", false);
-			if (str != null && str.equalsIgnoreCase("Yes"))
-				inSeparateFrame = true;
-		}
-
-		// "Show Controls" set to "No" disables button panel.
-		showControls = true;
-		str = readParameter("Show Controls", false);
-		if (str != null && str.equalsIgnoreCase("No"))
-			showControls = false;
-
-		// "Offer Relogin" set to "No" disables "Login again" and "Close
-		// window" buttons under error messages in applet mode.
-		offerRelogin = true;
-		str = readParameter("Offer Relogin", false);
-		if (str != null && str.equalsIgnoreCase("No"))
-			offerRelogin = false;
-
-		// Do we continue showing desktop on remote disconnect?
-		showOfflineDesktop = false;
-		str = readParameter("Show Offline Desktop", false);
-		if (str != null && str.equalsIgnoreCase("Yes"))
-			showOfflineDesktop = true;
-
-		// Fine tuning options.
-		deferScreenUpdates = readIntParameter("Defer screen updates", 20);
-		deferCursorUpdates = readIntParameter("Defer cursor updates", 10);
-		deferUpdateRequests = readIntParameter("Defer update requests", 0);
-
-		// Debugging options.
-		debugStatsExcludeUpdates = readIntParameter("DEBUG_XU", 0);
-		debugStatsMeasureUpdates = readIntParameter("DEBUG_CU", 0);
-
-		// SocketFactory.
-		socketFactory = readParameter("SocketFactory", false);
-	}
-
-	//
-	// Read password parameters. If an "ENCPASSWORD" parameter is set,
-	// then decrypt the password into the passwordParam string. Otherwise,
-	// try to read the "PASSWORD" parameter directly to passwordParam.
-	//
-
-	private void readPasswordParameters() {
-		String encPasswordParam = readParameter("ENCPASSWORD", false);
-		if (encPasswordParam == null) {
-			passwordParam = readParameter("PASSWORD", false);
-
-		} else {
-			// ENCPASSWORD is hexascii-encoded. Decode.
-			byte[] pw = { 0, 0, 0, 0, 0, 0, 0, 0 };
-			int len = encPasswordParam.length() / 2;
-			if (len > 8)
-				len = 8;
-			for (int i = 0; i < len; i++) {
-				String hex = encPasswordParam.substring(i * 2, i * 2 + 2);
-				Integer x = new Integer(Integer.parseInt(hex, 16));
-				pw[i] = x.byteValue();
-			}
-			// Decrypt the password.
-			byte[] key = { 23, 82, 107, 6, 35, 78, 88, 7 };
-			DesCipher des = new DesCipher(key);
-			des.decrypt(pw, 0, pw, 0);
-			passwordParam = new String(pw);
-
-		}
-	}
-
-	public String readParameter(String name, boolean required) {
-		if (inAnApplet) {
-			String s = getParameter(name);
-			if ((s == null) && required) {
-				fatalError(name + " parameter not specified");
-			}
-			return s;
-		}
-		/*
-		 * for (int i = 0; i < mainArgs.length; i += 2) { if
-		 * (mainArgs[i].equalsIgnoreCase(name)) { try { return mainArgs[i + 1];
-		 * } catch (Exception e) { if (required) { fatalError(name +
-		 * " parameter not specified"); } return null; } } }
-		 */
-		if (required) {
-			fatalError(name + " parameter not specified");
-		}
-		return null;
-	}
-
-	int readIntParameter(String name, int defaultValue) {
-		String str = readParameter(name, false);
-		int result = defaultValue;
-		if (str != null) {
-			try {
-				result = Integer.parseInt(str);
-			} catch (NumberFormatException e) {
-			}
-		}
-		return result;
-	}
-
-	//
-	// moveFocusToDesktop() - move keyboard focus either to VncCanvas.
-	//
-
-	void moveFocusToDesktop() {
-		if (vncContainer != null) {
-			if (vc != null && vncContainer.isAncestorOf(vc))
-				vc.requestFocus();
-		}
-	}
-
-	//
-	// disconnect() - close connection to server.
-	//
-
-	synchronized public void disconnect() {
-		System.out.println("Disconnecting");
-
-		if (vc != null) {
-			double sec = (System.currentTimeMillis() - vc.statStartTime) / 1000.0;
-			double rate = Math.round(vc.statNumUpdates / sec * 100) / 100.0;
-			int nRealRects = vc.statNumPixelRects;
-			int nPseudoRects = vc.statNumTotalRects - vc.statNumPixelRects;
-			System.out.println("Updates received: " + vc.statNumUpdates + " ("
-					+ nRealRects + " rectangles + " + nPseudoRects
-					+ " pseudo), " + rate + " updates/sec");
-			int numRectsOther = nRealRects - vc.statNumRectsTight
-					- vc.statNumRectsZRLE - vc.statNumRectsHextile
-					- vc.statNumRectsRaw - vc.statNumRectsCopy;
-			System.out.println("Rectangles:" + " Tight=" + vc.statNumRectsTight
-					+ "(JPEG=" + vc.statNumRectsTightJPEG + ") ZRLE="
-					+ vc.statNumRectsZRLE + " Hextile="
-					+ vc.statNumRectsHextile + " Raw=" + vc.statNumRectsRaw
-					+ " CopyRect=" + vc.statNumRectsCopy + " other="
-					+ numRectsOther);
-
-			int raw = vc.statNumBytesDecoded;
-			int compressed = vc.statNumBytesEncoded;
-			if (compressed > 0) {
-				double ratio = Math.round((double) raw / compressed * 1000) / 1000.0;
-				System.out.println("Pixel data: " + vc.statNumBytesDecoded
-						+ " bytes, " + vc.statNumBytesEncoded
-						+ " compressed, ratio " + ratio);
-			}
-		}
-
-		if (rfb != null && !rfb.closed())
-			rfb.close();
-		options.dispose();
-		clipboard.dispose();
-		if (rec != null)
-			rec.dispose();
-
-		if (inAnApplet) {
-			showMessage("Disconnected");
-		} else {
-			System.exit(0);
-		}
-	}
-
-	//
-	// fatalError() - print out a fatal error message.
-	// FIXME: Do we really need two versions of the fatalError() method?
-	//
-
-	synchronized public void fatalError(String str) {
-		System.out.println(str);
-
-		if (inAnApplet) {
-			// vncContainer null, applet not inited,
-			// can not present the error to the user.
-			Thread.currentThread().stop();
-		} else {
-			System.exit(1);
-		}
-	}
-
-	synchronized public void fatalError(String str, Exception e) {
-
-		if (rfb != null && rfb.closed()) {
-			// Not necessary to show error message if the error was caused
-			// by I/O problems after the rfb.close() method call.
-			System.out.println("RFB thread finished");
-			return;
-		}
-
-		System.out.println(str);
-		e.printStackTrace();
-
-		if (rfb != null)
-			rfb.close();
-
-		if (inAnApplet) {
-			showMessage(str);
-		} else {
-			System.exit(1);
-		}
-	}
-
-	//
-	// Show message text and optionally "Relogin" and "Close" buttons.
-	//
-
-	void showMessage(String msg) {
-		vncContainer.removeAll();
-
-		Label errLabel = new Label(msg, Label.CENTER);
-		errLabel.setFont(new Font("Helvetica", Font.PLAIN, 12));
-
-		if (offerRelogin) {
-
-			Panel gridPanel = new Panel(new GridLayout(0, 1));
-			Panel outerPanel = new Panel(new FlowLayout(FlowLayout.LEFT));
-			outerPanel.add(gridPanel);
-			vncContainer.setLayout(new FlowLayout(FlowLayout.LEFT, 30, 16));
-			vncContainer.add(outerPanel);
-			Panel textPanel = new Panel(new FlowLayout(FlowLayout.CENTER));
-			textPanel.add(errLabel);
-			gridPanel.add(textPanel);
-			gridPanel.add(new ReloginPanel(this));
-
-		} else {
-
-			vncContainer.setLayout(new FlowLayout(FlowLayout.LEFT, 30, 30));
-			vncContainer.add(errLabel);
-
-		}
-
-		if (inSeparateFrame) {
-			vncFrame.pack();
-		} else {
-			validate();
-		}
-	}
-
-	//
-	// Stop the applet.
-	// Main applet thread will terminate on first exception
-	// after seeing that rfbThread has been set to null.
-	//
-
-	public void stop() {
-		System.out.println("Stopping applet");
-		rfbThread = null;
-	}
-
-	//
-	// This method is called before the applet is destroyed.
-	//
-
-	public void destroy() {
-		System.out.println("Destroying applet");
-
-		vncContainer.removeAll();
-		options.dispose();
-		clipboard.dispose();
-		if (rec != null)
-			rec.dispose();
-		if (rfb != null && !rfb.closed())
-			rfb.close();
-		if (inSeparateFrame)
-			vncFrame.dispose();
-	}
-
-	//
-	// Start/stop receiving mouse events.
-	//
-
-	public void enableInput(boolean enable) {
-		vc.enableInput(enable);
-	}
-
-	//
-	// Close application properly on window close event.
-	//
-
-	public void windowClosing(WindowEvent evt) {
-		System.out.println("Closing window");
-		if (rfb != null)
-			disconnect();
-
-		vncContainer.hide();
-
-		if (!inAnApplet) {
-			System.exit(0);
-		}
-	}
-
-	//
-	// Ignore window events we're not interested in.
-	//
-
-	public void windowActivated(WindowEvent evt) {
-	}
-
-	public void windowDeactivated(WindowEvent evt) {
-	}
-
-	public void windowOpened(WindowEvent evt) {
-	}
-
-	public void windowClosed(WindowEvent evt) {
-	}
-
-	public void windowIconified(WindowEvent evt) {
-	}
-
-	public void windowDeiconified(WindowEvent evt) {
-	}
-
-	public void getParentName() {
-		if (echoValue == null) {
-
-			if (clientSocket == null) {
-
-				// echo = new EchoClient(pHost, this);
-				echoValue = new EchoClient(pHost, this, echoPort);
-				echoValue.openport();
-
-				echoValue = echoValue.requestHostName("1");
-			} else {
-				echoValue = new EchoClient();
-				echoValue = echoValue.Interruption(clientSocket);
-			}
-		}
-		// proxyからの返信で接続先を決定する
-		host = echoValue.responseLine;
-		parent = echoValue.parent;
-		if (echoValue.treenum != null) {
-			treenum = echoValue.treenum;
-		} else {
-			treenum = echoValue.treenum;
-		}
-		if (echoValue.leaderflag != null) {
-			leaderflag = echoValue.leaderflag;
-		} else {
-			leaderflag = echoValue.leaderflag;
-		}
-		System.out.println("Parent =" + parent);
-		System.out.println("mynumber =" + treenum);
-		System.out.println("connect host =" + host);
-		System.out.println("leaderflag(boolean) = " + leaderflag);
-
-	}
-
-	public void setEchoValue(EchoClient value) {
-		this.echoValue = value;
-	}
-
-	int castByteInt(byte[] b) {
-		ByteBuffer bb = ByteBuffer.wrap(b);
-		int value = bb.getInt();
-		return value;
-	}
-
-	public void setClientSocket(Socket sock) {
-		clientSocket = sock;
-	}
-
-	public void close() {
-		rfb.close();
-		vncFrame.setVisible(false);
-		vncFrame.dispose();
-	}
-
-	@Override
-	public Image getScreenImage() {
-//		return vc.memImage;
-		return vc.rawPixelsImage;
-	}
-	
-	public void writeScreenData(byte[] b, String imageFormat) {
-		try{
-			vc.drawBufferedImage(b);
-		}catch(IOException e){
-			e.printStackTrace();
-		}
-	}
-
-}
--- a/src/myVncProxy/MyVncClient.java.orig	Fri Jan 13 13:41:30 2012 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1220 +0,0 @@
-package myVncClient;
-
-import java.awt.*;
-import java.awt.event.*;
-import java.awt.image.BufferedImage;
-import java.io.*;
-import java.net.*;
-import java.util.Random;
-
-import java.nio.ByteBuffer;
-
-public class MyVncClient extends VncViewer implements InterfaceForViewer,
-		java.lang.Runnable, WindowListener {
-
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = 1L;
-	boolean inAnApplet = true;
-	boolean inSeparateFrame = false;
-	Socket clientSocket = null;
-	String parent, treenum;
-	private String leaderflag;
-	boolean runflag = false;
-	boolean first = true;
-
-	EchoClient echoValue;
-	int echoPort;
-	String pHost;
-
-	//
-	// main() is called when run as a java program from the command line.
-	// It simply runs the applet inside a newly-created frame.
-	//
-
-	public static void main(String[] argv) {
-		MyVncClient v = new MyVncClient();
-		v.echoValue = null;
-		v.runClient(argv);
-	}
-
-	private void runClient(String[] argv) {
-		mainArgs = argv;
-		inAnApplet = false;
-		inSeparateFrame = true;
-
-		if (mainArgs.length > 0)
-			pHost = mainArgs[0];
-		else
-			pHost = "cls080.ie.u-ryukyu.ac.jp";
-		if (mainArgs.length > 1)
-			port = Integer.parseInt(mainArgs[1]);
-		else
-			port = 5999;
-
-		init();
-		start_threads();
-		start();
-	}
-
-	//
-	// init()
-	//
-
-	public void init() {
-
-		readParameters();
-
-		refApplet = this;
-
-		if (inSeparateFrame) {
-			vncFrame = new Frame("TightVNC");
-			if (!inAnApplet) {
-				vncFrame.add("Center", this);
-			}
-			vncContainer = vncFrame;
-		} else {
-			vncContainer = this;
-		}
-
-		recordingSync = new Object();
-
-		options = new OptionsFrame(this);
-		clipboard = new ClipboardFrame(this);
-		if (RecordingFrame.checkSecurity())
-			rec = new RecordingFrame(this);
-
-		sessionFileName = null;
-		recordingActive = false;
-		recordingStatusChanged = false;
-		cursorUpdatesDef = null;
-		eightBitColorsDef = null;
-
-		if (inSeparateFrame)
-			vncFrame.addWindowListener(this);
-
-		rfbThread = new Thread(this);
-	}
-
-	public void update(Graphics g) {
-	}
-
-	//
-	// run() - executed by the rfbThread to deal with the RFB socket.
-	//
-
-	public void start_threads() {
-		rfbThread.start();
-	}
-
-	public void run() {
-
-		gridbag = new GridBagLayout();
-		vncContainer.setLayout(gridbag);
-
-		GridBagConstraints gbc = new GridBagConstraints();
-		gbc.gridwidth = GridBagConstraints.REMAINDER;
-		gbc.anchor = GridBagConstraints.NORTHWEST;
-
-		if (showControls) {
-			buttonPanel = new ButtonPanel(this);
-			gridbag.setConstraints(buttonPanel, gbc);
-			vncContainer.add(buttonPanel);
-		}
-
-		try {
-
-			if (first) {
-				connectAndAuthenticate();
-				accThread = new Thread(new AcceptThread(rfb, 5999));
-				accThread.start();
-				first = false;
-			} else {
-				System.out.println("reConnectAndAuthenticate() ");
-				reConnectAndAuthenticate();
-				accThread = new Thread(new AcceptThread(rfb, 5999));
-				accThread.start();
-			}
-
-			doProtocolInitialisation();
-
-			createCanvas(0, 0);
-
-			// rfb.readPngData();
-			// vc.drawFirstImage();
-
-		} catch (IOException e) {
-			try {
-				rfb.sock.close();
-
-			} catch (IOException e2) {
-				e2.printStackTrace();
-			}
-			System.out.println("Socket error");
-			// parent no find
-			Random rnd = new Random();
-			long ran = rnd.nextInt(5000) + 5000;
-			System.out.println(ran);
-			// 親がいない場合の処理はここに書く!!!!
-			/**
-			 * this while reconnection
-			 */
-
-			int counter = 0;
-			vncFrame.setVisible(false);
-			vncFrame.dispose();
-
-			while (true) {
-				/**
-				 * if my last node case reconnectoion stop
-				 */
-
-				echoValue = new EchoClient(echoValue, this);
-				// echoValue = new EchoClient(echoValue);
-
-				try {
-					Thread.sleep(ran);
-				} catch (InterruptedException e1) {
-					e1.printStackTrace();
-				}
-
-				if (counter >= 4) {
-					echoValue.openport();
-					echoValue.notfoundParent();
-				}
-
-				echoValue.openport();
-				// runflag = echo.losthost();
-				if (echoValue.losthost()) {
-					break;
-				}
-				counter++;
-			}
-
-			// System.exit(0);
-		} catch (Exception e) {
-			System.out.println(e);
-			System.exit(0);
-		}
-
-		gbc.weightx = 1.0;
-		gbc.weighty = 1.0;
-
-		if (inSeparateFrame) {
-
-			// Create a panel which itself is resizeable and can hold
-			// non-resizeable VncCanvas component at the top left corner.
-			Panel canvasPanel = new Panel();
-			canvasPanel.setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0));
-			canvasPanel.add(vc);
-
-			// Create a ScrollPane which will hold a panel with VncCanvas
-			// inside.
-			desktopScrollPane = new ScrollPane(ScrollPane.SCROLLBARS_AS_NEEDED);
-			gbc.fill = GridBagConstraints.BOTH;
-			gridbag.setConstraints(desktopScrollPane, gbc);
-			desktopScrollPane.add(canvasPanel);
-
-			// Finally, add our ScrollPane to the Frame window.
-			vncFrame.add(desktopScrollPane);
-			vncFrame.setTitle(rfb.desktopName);
-			vncFrame.pack();
-			vc.resizeDesktopFrame();
-
-		} else {
-
-			// Just add the VncCanvas component to the Applet.
-			gridbag.setConstraints(vc, gbc);
-			add(vc);
-			validate();
-
-		}
-
-		try {
-			if (showControls)
-				buttonPanel.enableButtons();
-
-			moveFocusToDesktop();
-
-			processNormalProtocol();// main loop
-
-		} catch (NoRouteToHostException e) {
-			fatalError("Network error: no route to server: " + host, e);
-		} catch (UnknownHostException e) {
-			fatalError("Network error: server name unknown: " + host, e);
-		} catch (ConnectException e) {
-			fatalError("Network error: could not connect to server: " + host
-					+ ":" + port, e);
-		} catch (EOFException e) {
-
-			vncFrame.setVisible(false);
-			vncFrame.dispose();
-			// num4
-			if (leaderflag != null) {
-				while (true) {
-					// echoValue = new EchoClient(echoValue, this);
-					echoValue = new EchoClient(echoValue);
-					echoValue.openport();
-					// runflag = echo.losthost();
-					if (echoValue.losthost()) {
-						break;
-					}
-				}
-			} else {
-
-				if (showOfflineDesktop) {
-					e.printStackTrace();
-					System.out
-							.println("Network error: remote side closed connection");
-					if (vc != null) {
-						vc.enableInput(false);
-					}
-					if (inSeparateFrame) {
-						vncFrame.setTitle(rfb.desktopName + " [disconnected]");
-					}
-					if (rfb != null && !rfb.closed())
-						rfb.close();
-					if (showControls && buttonPanel != null) {
-						buttonPanel.disableButtonsOnDisconnect();
-						if (inSeparateFrame) {
-							vncFrame.pack();
-						} else {
-							validate();
-						}
-					}
-				} else {
-					fatalError("Network error: remote side closed connection",
-							e);
-				}
-			}
-		} catch (IOException e) {
-			String str = e.getMessage();
-			if (str != null && str.length() != 0) {
-				fatalError("Network Error: " + str, e);
-			} else {
-				fatalError(e.toString(), e);
-			}
-		} catch (Exception e) {
-			String str = e.getMessage();
-			if (str != null && str.length() != 0) {
-				fatalError("Error: " + str, e);
-			} else {
-				fatalError(e.toString(), e);
-			}
-		}
-
-	}
-
-	//
-	// Create a VncCanvas instance.
-	//
-
-	void createCanvas(int maxWidth, int maxHeight) throws IOException {
-		// Determine if Java 2D API is available and use a special
-		// version of VncCanvas if it is present.
-		vc = null;
-		try {
-			// This throws ClassNotFoundException if there is no Java 2D API.
-			Class cl = Class.forName("java.awt.Graphics2D");
-			// If we could load Graphics2D class, then we can use VncCanvas2D.
-			cl = Class.forName("VncCanvas2");
-			Class[] argClasses = { this.getClass(), Integer.TYPE, Integer.TYPE };
-			java.lang.reflect.Constructor cstr = cl.getConstructor(argClasses);
-			Object[] argObjects = { this, new Integer(maxWidth),
-					new Integer(maxHeight) };
-			vc = (VncCanvas) cstr.newInstance(argObjects);
-		} catch (Exception e) {
-			System.out.println("Warning: Java 2D API is not available");
-		}
-
-		// If we failed to create VncCanvas2D, use old VncCanvas.
-		if (vc == null)
-			vc = new VncCanvas(this, maxWidth, maxHeight);
-	}
-
-	//
-	// Process RFB socket messages.
-	// If the rfbThread is being stopped, ignore any exceptions,
-	// otherwise rethrow the exception so it can be handled.
-	//
-
-	void processNormalProtocol() throws Exception {
-		try {
-			vc.processNormalProtocol();// main loop
-		} catch (Exception e) {
-			if (rfbThread == null) {
-				System.out.println("Ignoring RFB socket exceptions"
-						+ " because applet is stopping");
-			} else {
-				throw e;
-			}
-		}
-	}
-
-	//
-	// Connect to the RFB server and authenticate the user.
-	//
-
-	void connectAndAuthenticate() throws Exception {
-
-		showConnectionStatus("Initializing...");
-		if (inSeparateFrame) {
-			vncFrame.pack();
-			vncFrame.setVisible(true);
-		} else {
-			validate();
-		}
-
-		showConnectionStatus("Connecting to " + host + ", port " + port + "...");
-
-		rfb = new MyRfbProto(pHost, port, this);
-		showConnectionStatus("Connected to server");
-
-		rfb.readVersionMsg();
-		showConnectionStatus("RFB server supports protocol version "
-				+ rfb.serverMajor + "." + rfb.serverMinor);
-
-		rfb.writeVersionMsg();
-		showConnectionStatus("Using RFB protocol version " + rfb.clientMajor
-				+ "." + rfb.clientMinor);
-
-		if (rfb.serverMinor == 855) {
-			/*
-			 * if connect to proxy, userEchoPortFlag is true. 
-			 * if connect to client, userEchoPortFlag is false.
-			 */
-			boolean useEchoPortFlag = rfb.readProxyFlag();
-			if (useEchoPortFlag) {
-				byte[] b = new byte[4];
-				b = rfb.readEchoPort();
-				echoPort = castByteInt(b);
-
-				InetAddress addr = InetAddress.getByName(pHost);
-				String h = new String(addr.getHostAddress());
-
-				getParentName();
-				if (!(h.equals(host))) {
-					rfb.changeParent(host, port);
-					rfb.readVersionMsg();
-					rfb.writeVersionMsg();
-					boolean flag = rfb.readProxyFlag();					
-				}
-			}
-		}
-
-		int secType = rfb.negotiateSecurity();
-		int authType;
-		if (secType == RfbProto.SecTypeTight) {
-			showConnectionStatus("Enabling TightVNC protocol extensions");
-			rfb.setupTunneling();
-			authType = rfb.negotiateAuthenticationTight();
-		} else {
-			authType = secType;
-		}
-
-		switch (authType) {
-		case RfbProto.AuthNone:
-			showConnectionStatus("No authentication needed");
-			rfb.authenticateNone();
-			break;
-		case RfbProto.AuthVNC:
-			showConnectionStatus("Performing standard VNC authentication");
-			if (passwordParam != null) {
-				rfb.authenticateVNC(passwordParam);
-			} else {
-				String pw = askPassword();
-				rfb.authenticateVNC(pw);
-			}
-			break;
-		default:
-			throw new Exception("Unknown authentication scheme " + authType);
-		}
-	}
-
-	void reConnectAndAuthenticate() throws Exception {
-
-		showConnectionStatus("Initializing...");
-
-		if (inSeparateFrame) {
-			vncFrame.pack();
-			vncFrame.setVisible(true);
-		} else {
-			validate();
-		}
-
-		showConnectionStatus("Connecting to " + host + ", port " + port + "...");
-
-		rfb.changeParent(host, port);
-
-		showConnectionStatus("Connected to server");
-
-		rfb.readVersionMsg();
-		showConnectionStatus("RFB server supports protocol version "
-				+ rfb.serverMajor + "." + rfb.serverMinor);
-
-		rfb.writeVersionMsg();
-		showConnectionStatus("Using RFB protocol version " + rfb.clientMajor
-				+ "." + rfb.clientMinor);
-
-		if (rfb.serverMinor == 855) {
-			boolean useEchoPortFlag = rfb.readProxyFlag();
-			if (useEchoPortFlag) {
-				byte[] b = new byte[4];
-				b = rfb.readEchoPort();
-				echoPort = castByteInt(b);
-
-				InetAddress addr = InetAddress.getByName(pHost);
-				String h = new String(addr.getHostAddress());
-
-				getParentName();
-				if (!(h.equals(host))) {
-					rfb.changeParent(host, port);
-					rfb.readVersionMsg();
-					rfb.writeVersionMsg();
-					boolean flag = rfb.readProxyFlag();
-				}
-			}
-		}
-		int secType = rfb.negotiateSecurity();
-		int authType;
-		if (secType == RfbProto.SecTypeTight) {
-			showConnectionStatus("Enabling TightVNC protocol extensions");
-			rfb.setupTunneling();
-			authType = rfb.negotiateAuthenticationTight();
-		} else {
-			authType = secType;
-		}
-
-		switch (authType) {
-		case RfbProto.AuthNone:
-			showConnectionStatus("No authentication needed");
-			rfb.authenticateNone();
-			break;
-		case RfbProto.AuthVNC:
-			showConnectionStatus("Performing standard VNC authentication");
-			if (passwordParam != null) {
-				rfb.authenticateVNC(passwordParam);
-			} else {
-				String pw = askPassword();
-				rfb.authenticateVNC(pw);
-			}
-			break;
-		default:
-			throw new Exception("Unknown authentication scheme " + authType);
-		}
-	}
-
-	//
-	// Show a message describing the connection status.
-	// To hide the connection status label, use (msg == null).
-	//
-
-	void showConnectionStatus(String msg) {
-		if (msg == null) {
-			if (vncContainer.isAncestorOf(connStatusLabel)) {
-				vncContainer.remove(connStatusLabel);
-			}
-			return;
-		}
-
-		System.out.println(msg);
-
-		if (connStatusLabel == null) {
-			connStatusLabel = new Label("Status: " + msg);
-			connStatusLabel.setFont(new Font("Helvetica", Font.PLAIN, 12));
-		} else {
-			connStatusLabel.setText("Status: " + msg);
-		}
-
-		if (!vncContainer.isAncestorOf(connStatusLabel)) {
-			GridBagConstraints gbc = new GridBagConstraints();
-			gbc.gridwidth = GridBagConstraints.REMAINDER;
-			gbc.fill = GridBagConstraints.HORIZONTAL;
-			gbc.anchor = GridBagConstraints.NORTHWEST;
-			gbc.weightx = 1.0;
-			gbc.weighty = 1.0;
-			gbc.insets = new Insets(20, 30, 20, 30);
-			gridbag.setConstraints(connStatusLabel, gbc);
-			vncContainer.add(connStatusLabel);
-		}
-
-		if (inSeparateFrame) {
-			vncFrame.pack();
-		} else {
-			validate();
-		}
-	}
-
-	//
-	// Show an authentication panel.
-	//
-
-	String askPassword() throws Exception {
-		showConnectionStatus(null);
-
-		AuthPanel authPanel = new AuthPanel(this);
-
-		GridBagConstraints gbc = new GridBagConstraints();
-		gbc.gridwidth = GridBagConstraints.REMAINDER;
-		gbc.anchor = GridBagConstraints.NORTHWEST;
-		gbc.weightx = 1.0;
-		gbc.weighty = 1.0;
-		gbc.ipadx = 100;
-		gbc.ipady = 50;
-		gridbag.setConstraints(authPanel, gbc);
-		vncContainer.add(authPanel);
-
-		if (inSeparateFrame) {
-			vncFrame.pack();
-		} else {
-			validate();
-		}
-
-		authPanel.moveFocusToDefaultField();
-		String pw = authPanel.getPassword();
-		vncContainer.remove(authPanel);
-		return pw;
-	}
-
-	//
-	// Do the rest of the protocol initialisation.
-	//
-
-	void doProtocolInitialisation() throws IOException {
-		rfb.writeClientInit();
-		rfb.readServerInit();
-
-		System.out.println("Desktop name is " + rfb.desktopName);
-		System.out.println("Desktop size is " + rfb.framebufferWidth + " x "
-				+ rfb.framebufferHeight);
-
-		setEncodings();
-
-		showConnectionStatus(null);
-	}
-
-	//
-	// Send current encoding list to the RFB server.
-	//
-
-	int[] encodingsSaved;
-	int nEncodingsSaved;
-
-	void setEncodings() {
-		setEncodings(false);
-	}
-
-	void autoSelectEncodings() {
-		setEncodings(true);
-	}
-
-	void setEncodings(boolean autoSelectOnly) {
-		if (options == null || rfb == null || !rfb.inNormalProtocol)
-			return;
-
-		int preferredEncoding = options.preferredEncoding;
-		if (preferredEncoding == -1) {
-			long kbitsPerSecond = rfb.kbitsPerSecond();
-			if (nEncodingsSaved < 1) {
-				// Choose Tight or ZRLE encoding for the very first update.
-				System.out.println("Using Tight/ZRLE encodings");
-				preferredEncoding = RfbProto.EncodingTight;
-			} else if (kbitsPerSecond > 2000
-					&& encodingsSaved[0] != RfbProto.EncodingHextile) {
-				// Switch to Hextile if the connection speed is above 2Mbps.
-				System.out.println("Throughput " + kbitsPerSecond
-						+ " kbit/s - changing to Hextile encoding");
-				preferredEncoding = RfbProto.EncodingHextile;
-			} else if (kbitsPerSecond < 1000
-					&& encodingsSaved[0] != RfbProto.EncodingTight) {
-				// Switch to Tight/ZRLE if the connection speed is below 1Mbps.
-				System.out.println("Throughput " + kbitsPerSecond
-						+ " kbit/s - changing to Tight/ZRLE encodings");
-				preferredEncoding = RfbProto.EncodingTight;
-			} else {
-				// Don't change the encoder.
-				if (autoSelectOnly)
-					return;
-				preferredEncoding = encodingsSaved[0];
-			}
-		} else {
-			// Auto encoder selection is not enabled.
-			if (autoSelectOnly)
-				return;
-		}
-
-		int[] encodings = new int[20];
-		int nEncodings = 0;
-
-		encodings[nEncodings++] = preferredEncoding;
-		if (options.useCopyRect) {
-			encodings[nEncodings++] = RfbProto.EncodingCopyRect;
-		}
-
-		if (preferredEncoding != RfbProto.EncodingTight) {
-			encodings[nEncodings++] = RfbProto.EncodingTight;
-		}
-		if (preferredEncoding != RfbProto.EncodingZRLE) {
-			encodings[nEncodings++] = RfbProto.EncodingZRLE;
-		}
-		if (preferredEncoding != RfbProto.EncodingHextile) {
-			encodings[nEncodings++] = RfbProto.EncodingHextile;
-		}
-		if (preferredEncoding != RfbProto.EncodingZlib) {
-			encodings[nEncodings++] = RfbProto.EncodingZlib;
-		}
-		if (preferredEncoding != RfbProto.EncodingCoRRE) {
-			encodings[nEncodings++] = RfbProto.EncodingCoRRE;
-		}
-		if (preferredEncoding != RfbProto.EncodingRRE) {
-			encodings[nEncodings++] = RfbProto.EncodingRRE;
-		}
-
-		if (options.compressLevel >= 0 && options.compressLevel <= 9) {
-			encodings[nEncodings++] = RfbProto.EncodingCompressLevel0
-					+ options.compressLevel;
-		}
-		if (options.jpegQuality >= 0 && options.jpegQuality <= 9) {
-			encodings[nEncodings++] = RfbProto.EncodingQualityLevel0
-					+ options.jpegQuality;
-		}
-
-		if (options.requestCursorUpdates) {
-			encodings[nEncodings++] = RfbProto.EncodingXCursor;
-			encodings[nEncodings++] = RfbProto.EncodingRichCursor;
-			if (!options.ignoreCursorUpdates)
-				encodings[nEncodings++] = RfbProto.EncodingPointerPos;
-		}
-
-		encodings[nEncodings++] = RfbProto.EncodingLastRect;
-		encodings[nEncodings++] = RfbProto.EncodingNewFBSize;
-
-		boolean encodingsWereChanged = false;
-		if (nEncodings != nEncodingsSaved) {
-			encodingsWereChanged = true;
-		} else {
-			for (int i = 0; i < nEncodings; i++) {
-				if (encodings[i] != encodingsSaved[i]) {
-					encodingsWereChanged = true;
-					break;
-				}
-			}
-		}
-
-		if (encodingsWereChanged) {
-			try {
-				rfb.writeSetEncodings(encodings, nEncodings);
-				if (vc != null) {
-					vc.softCursorFree();
-				}
-			} catch (Exception e) {
-				e.printStackTrace();
-			}
-			encodingsSaved = encodings;
-			nEncodingsSaved = nEncodings;
-		}
-	}
-
-	//
-	// setCutText() - send the given cut text to the RFB server.
-	//
-
-	void setCutText(String text) {
-		try {
-			if (rfb != null && rfb.inNormalProtocol) {
-				rfb.writeClientCutText(text);
-			}
-		} catch (Exception e) {
-			e.printStackTrace();
-		}
-	}
-
-	//
-	// Order change in session recording status. To stop recording, pass
-	// null in place of the fname argument.
-	//
-
-	void setRecordingStatus(String fname) {
-		synchronized (recordingSync) {
-			sessionFileName = fname;
-			recordingStatusChanged = true;
-		}
-	}
-
-	//
-	// Start or stop session recording. Returns true if this method call
-	// causes recording of a new session.
-	//
-
-	boolean checkRecordingStatus() throws IOException {
-		synchronized (recordingSync) {
-			if (recordingStatusChanged) {
-				recordingStatusChanged = false;
-				if (sessionFileName != null) {
-					startRecording();
-					return true;
-				} else {
-					stopRecording();
-				}
-			}
-		}
-		return false;
-	}
-
-	//
-	// Start session recording.
-	//
-
-	protected void startRecording() throws IOException {
-		synchronized (recordingSync) {
-			if (!recordingActive) {
-				// Save settings to restore them after recording the session.
-				cursorUpdatesDef = options.choices[options.cursorUpdatesIndex]
-						.getSelectedItem();
-				eightBitColorsDef = options.choices[options.eightBitColorsIndex]
-						.getSelectedItem();
-				// Set options to values suitable for recording.
-				options.choices[options.cursorUpdatesIndex].select("Disable");
-				options.choices[options.cursorUpdatesIndex].setEnabled(false);
-				options.setEncodings();
-				options.choices[options.eightBitColorsIndex].select("No");
-				options.choices[options.eightBitColorsIndex].setEnabled(false);
-				options.setColorFormat();
-			} else {
-				rfb.closeSession();
-			}
-
-			System.out.println("Recording the session in " + sessionFileName);
-			rfb.startSession(sessionFileName);
-			recordingActive = true;
-		}
-	}
-
-	//
-	// Stop session recording.
-	//
-
-	protected void stopRecording() throws IOException {
-		synchronized (recordingSync) {
-			if (recordingActive) {
-				// Restore options.
-				options.choices[options.cursorUpdatesIndex]
-						.select(cursorUpdatesDef);
-				options.choices[options.cursorUpdatesIndex].setEnabled(true);
-				options.setEncodings();
-				options.choices[options.eightBitColorsIndex]
-						.select(eightBitColorsDef);
-				options.choices[options.eightBitColorsIndex].setEnabled(true);
-				options.setColorFormat();
-
-				rfb.closeSession();
-				System.out.println("Session recording stopped.");
-			}
-			sessionFileName = null;
-			recordingActive = false;
-		}
-	}
-
-	/**
-	 * readParameters() - read parameters from the html source or from the
-	 * command line. On the command line, the arguments are just a sequence of
-	 * param_name/param_value pairs where the names and values correspond to
-	 * those expected in the html applet tag source.
-	 */
-
-	void readParameters() {
-		/*
-		 * host = readParameter("HOST", !inAnApplet);
-		 * 
-		 * if (host == null) { host = getCodeBase().getHost(); if
-		 * (host.equals("")) { fatalError("HOST parameter not specified"); } }
-		 * 
-		 * port = readIntParameter("PORT", 5550);
-		 */
-
-		// Read "ENCPASSWORD" or "PASSWORD" parameter if specified.
-		readPasswordParameters();
-
-		String str;
-		if (inAnApplet) {
-			str = readParameter("Open New Window", false);
-			if (str != null && str.equalsIgnoreCase("Yes"))
-				inSeparateFrame = true;
-		}
-
-		// "Show Controls" set to "No" disables button panel.
-		showControls = true;
-		str = readParameter("Show Controls", false);
-		if (str != null && str.equalsIgnoreCase("No"))
-			showControls = false;
-
-		// "Offer Relogin" set to "No" disables "Login again" and "Close
-		// window" buttons under error messages in applet mode.
-		offerRelogin = true;
-		str = readParameter("Offer Relogin", false);
-		if (str != null && str.equalsIgnoreCase("No"))
-			offerRelogin = false;
-
-		// Do we continue showing desktop on remote disconnect?
-		showOfflineDesktop = false;
-		str = readParameter("Show Offline Desktop", false);
-		if (str != null && str.equalsIgnoreCase("Yes"))
-			showOfflineDesktop = true;
-
-		// Fine tuning options.
-		deferScreenUpdates = readIntParameter("Defer screen updates", 20);
-		deferCursorUpdates = readIntParameter("Defer cursor updates", 10);
-		deferUpdateRequests = readIntParameter("Defer update requests", 0);
-
-		// Debugging options.
-		debugStatsExcludeUpdates = readIntParameter("DEBUG_XU", 0);
-		debugStatsMeasureUpdates = readIntParameter("DEBUG_CU", 0);
-
-		// SocketFactory.
-		socketFactory = readParameter("SocketFactory", false);
-	}
-
-	//
-	// Read password parameters. If an "ENCPASSWORD" parameter is set,
-	// then decrypt the password into the passwordParam string. Otherwise,
-	// try to read the "PASSWORD" parameter directly to passwordParam.
-	//
-
-	private void readPasswordParameters() {
-		String encPasswordParam = readParameter("ENCPASSWORD", false);
-		if (encPasswordParam == null) {
-			passwordParam = readParameter("PASSWORD", false);
-
-		} else {
-			// ENCPASSWORD is hexascii-encoded. Decode.
-			byte[] pw = { 0, 0, 0, 0, 0, 0, 0, 0 };
-			int len = encPasswordParam.length() / 2;
-			if (len > 8)
-				len = 8;
-			for (int i = 0; i < len; i++) {
-				String hex = encPasswordParam.substring(i * 2, i * 2 + 2);
-				Integer x = new Integer(Integer.parseInt(hex, 16));
-				pw[i] = x.byteValue();
-			}
-			// Decrypt the password.
-			byte[] key = { 23, 82, 107, 6, 35, 78, 88, 7 };
-			DesCipher des = new DesCipher(key);
-			des.decrypt(pw, 0, pw, 0);
-			passwordParam = new String(pw);
-
-		}
-	}
-
-	public String readParameter(String name, boolean required) {
-		if (inAnApplet) {
-			String s = getParameter(name);
-			if ((s == null) && required) {
-				fatalError(name + " parameter not specified");
-			}
-			return s;
-		}
-		/*
-		 * for (int i = 0; i < mainArgs.length; i += 2) { if
-		 * (mainArgs[i].equalsIgnoreCase(name)) { try { return mainArgs[i + 1];
-		 * } catch (Exception e) { if (required) { fatalError(name +
-		 * " parameter not specified"); } return null; } } }
-		 */
-		if (required) {
-			fatalError(name + " parameter not specified");
-		}
-		return null;
-	}
-
-	int readIntParameter(String name, int defaultValue) {
-		String str = readParameter(name, false);
-		int result = defaultValue;
-		if (str != null) {
-			try {
-				result = Integer.parseInt(str);
-			} catch (NumberFormatException e) {
-			}
-		}
-		return result;
-	}
-
-	//
-	// moveFocusToDesktop() - move keyboard focus either to VncCanvas.
-	//
-
-	void moveFocusToDesktop() {
-		if (vncContainer != null) {
-			if (vc != null && vncContainer.isAncestorOf(vc))
-				vc.requestFocus();
-		}
-	}
-
-	//
-	// disconnect() - close connection to server.
-	//
-
-	synchronized public void disconnect() {
-		System.out.println("Disconnecting");
-
-		if (vc != null) {
-			double sec = (System.currentTimeMillis() - vc.statStartTime) / 1000.0;
-			double rate = Math.round(vc.statNumUpdates / sec * 100) / 100.0;
-			int nRealRects = vc.statNumPixelRects;
-			int nPseudoRects = vc.statNumTotalRects - vc.statNumPixelRects;
-			System.out.println("Updates received: " + vc.statNumUpdates + " ("
-					+ nRealRects + " rectangles + " + nPseudoRects
-					+ " pseudo), " + rate + " updates/sec");
-			int numRectsOther = nRealRects - vc.statNumRectsTight
-					- vc.statNumRectsZRLE - vc.statNumRectsHextile
-					- vc.statNumRectsRaw - vc.statNumRectsCopy;
-			System.out.println("Rectangles:" + " Tight=" + vc.statNumRectsTight
-					+ "(JPEG=" + vc.statNumRectsTightJPEG + ") ZRLE="
-					+ vc.statNumRectsZRLE + " Hextile="
-					+ vc.statNumRectsHextile + " Raw=" + vc.statNumRectsRaw
-					+ " CopyRect=" + vc.statNumRectsCopy + " other="
-					+ numRectsOther);
-
-			int raw = vc.statNumBytesDecoded;
-			int compressed = vc.statNumBytesEncoded;
-			if (compressed > 0) {
-				double ratio = Math.round((double) raw / compressed * 1000) / 1000.0;
-				System.out.println("Pixel data: " + vc.statNumBytesDecoded
-						+ " bytes, " + vc.statNumBytesEncoded
-						+ " compressed, ratio " + ratio);
-			}
-		}
-
-		if (rfb != null && !rfb.closed())
-			rfb.close();
-		options.dispose();
-		clipboard.dispose();
-		if (rec != null)
-			rec.dispose();
-
-		if (inAnApplet) {
-			showMessage("Disconnected");
-		} else {
-			System.exit(0);
-		}
-	}
-
-	//
-	// fatalError() - print out a fatal error message.
-	// FIXME: Do we really need two versions of the fatalError() method?
-	//
-
-	synchronized public void fatalError(String str) {
-		System.out.println(str);
-
-		if (inAnApplet) {
-			// vncContainer null, applet not inited,
-			// can not present the error to the user.
-			Thread.currentThread().stop();
-		} else {
-			System.exit(1);
-		}
-	}
-
-	synchronized public void fatalError(String str, Exception e) {
-
-		if (rfb != null && rfb.closed()) {
-			// Not necessary to show error message if the error was caused
-			// by I/O problems after the rfb.close() method call.
-			System.out.println("RFB thread finished");
-			return;
-		}
-
-		System.out.println(str);
-		e.printStackTrace();
-
-		if (rfb != null)
-			rfb.close();
-
-		if (inAnApplet) {
-			showMessage(str);
-		} else {
-			System.exit(1);
-		}
-	}
-
-	//
-	// Show message text and optionally "Relogin" and "Close" buttons.
-	//
-
-	void showMessage(String msg) {
-		vncContainer.removeAll();
-
-		Label errLabel = new Label(msg, Label.CENTER);
-		errLabel.setFont(new Font("Helvetica", Font.PLAIN, 12));
-
-		if (offerRelogin) {
-
-			Panel gridPanel = new Panel(new GridLayout(0, 1));
-			Panel outerPanel = new Panel(new FlowLayout(FlowLayout.LEFT));
-			outerPanel.add(gridPanel);
-			vncContainer.setLayout(new FlowLayout(FlowLayout.LEFT, 30, 16));
-			vncContainer.add(outerPanel);
-			Panel textPanel = new Panel(new FlowLayout(FlowLayout.CENTER));
-			textPanel.add(errLabel);
-			gridPanel.add(textPanel);
-			gridPanel.add(new ReloginPanel(this));
-
-		} else {
-
-			vncContainer.setLayout(new FlowLayout(FlowLayout.LEFT, 30, 30));
-			vncContainer.add(errLabel);
-
-		}
-
-		if (inSeparateFrame) {
-			vncFrame.pack();
-		} else {
-			validate();
-		}
-	}
-
-	//
-	// Stop the applet.
-	// Main applet thread will terminate on first exception
-	// after seeing that rfbThread has been set to null.
-	//
-
-	public void stop() {
-		System.out.println("Stopping applet");
-		rfbThread = null;
-	}
-
-	//
-	// This method is called before the applet is destroyed.
-	//
-
-	public void destroy() {
-		System.out.println("Destroying applet");
-
-		vncContainer.removeAll();
-		options.dispose();
-		clipboard.dispose();
-		if (rec != null)
-			rec.dispose();
-		if (rfb != null && !rfb.closed())
-			rfb.close();
-		if (inSeparateFrame)
-			vncFrame.dispose();
-	}
-
-	//
-	// Start/stop receiving mouse events.
-	//
-
-	public void enableInput(boolean enable) {
-		vc.enableInput(enable);
-	}
-
-	//
-	// Close application properly on window close event.
-	//
-
-	public void windowClosing(WindowEvent evt) {
-		System.out.println("Closing window");
-		if (rfb != null)
-			disconnect();
-
-		vncContainer.hide();
-
-		if (!inAnApplet) {
-			System.exit(0);
-		}
-	}
-
-	//
-	// Ignore window events we're not interested in.
-	//
-
-	public void windowActivated(WindowEvent evt) {
-	}
-
-	public void windowDeactivated(WindowEvent evt) {
-	}
-
-	public void windowOpened(WindowEvent evt) {
-	}
-
-	public void windowClosed(WindowEvent evt) {
-	}
-
-	public void windowIconified(WindowEvent evt) {
-	}
-
-	public void windowDeiconified(WindowEvent evt) {
-	}
-
-	public void getParentName() {
-		if (echoValue == null) {
-
-			if (clientSocket == null) {
-
-				// echo = new EchoClient(pHost, this);
-				echoValue = new EchoClient(pHost, this, echoPort);
-				echoValue.openport();
-
-				echoValue = echoValue.requestHostName("1");
-			} else {
-				echoValue = new EchoClient();
-				echoValue = echoValue.Interruption(clientSocket);
-			}
-		}
-		// proxyからの返信で接続先を決定する
-		host = echoValue.responseLine;
-		parent = echoValue.parent;
-		if (echoValue.treenum != null) {
-			treenum = echoValue.treenum;
-		} else {
-			treenum = echoValue.treenum;
-		}
-		if (echoValue.leaderflag != null) {
-			leaderflag = echoValue.leaderflag;
-		} else {
-			leaderflag = echoValue.leaderflag;
-		}
-		System.out.println("Parent =" + parent);
-		System.out.println("mynumber =" + treenum);
-		System.out.println("connect host =" + host);
-		System.out.println("leaderflag(boolean) = " + leaderflag);
-
-	}
-
-	public void setEchoValue(EchoClient value) {
-		this.echoValue = value;
-	}
-
-	int castByteInt(byte[] b) {
-		ByteBuffer bb = ByteBuffer.wrap(b);
-		int value = bb.getInt();
-		return value;
-	}
-
-	public void setClientSocket(Socket sock) {
-		clientSocket = sock;
-	}
-
-	public void close() {
-		rfb.close();
-		vncFrame.setVisible(false);
-		vncFrame.dispose();
-	}
-
-	@Override
-	public Image getScreenImage() {
-//		return vc.memImage;
-		return vc.rawPixelsImage;
-	}
-	
-	public void writeScreenData(byte[] b, String imageFormat) {
-		try{
-			vc.drawBufferedImage(b);
-		}catch(IOException e){
-			e.printStackTrace();
-		}
-	}
-
-}
--- a/src/myVncProxy/MyVncClient.java~	Fri Jan 13 13:41:30 2012 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1240 +0,0 @@
-package myVncClient;
-
-import java.awt.*;
-import java.awt.event.*;
-import java.awt.image.BufferedImage;
-import java.io.*;
-import java.net.*;
-import java.util.Random;
-
-import java.nio.ByteBuffer;
-
-public class MyVncClient extends VncViewer implements InterfaceForViewer,
-		java.lang.Runnable, WindowListener {
-
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = 1L;
-	boolean inAnApplet = true;
-	boolean inSeparateFrame = false;
-	Socket clientSocket = null;
-	String parent, treenum;
-	private String leaderflag;
-	boolean runflag = false;
-	boolean first = true;
-
-	EchoClient echoValue;
-	int echoPort;
-	String pHost;
-	TextBox getHost;	
-
-	//
-	// main() is called when run as a java program from the command line.
-	// It simply runs the applet inside a newly-created frame.
-	//
-
-	public static void main(String[] argv) {
-		MyVncClient v = new MyVncClient();
-		v.echoValue = null;
-		v.runClient(argv);
-	}
-
-	private void runClient(String[] argv) {
-		mainArgs = argv;
-		inAnApplet = false;
-		inSeparateFrame = true;
-		getHost = new TextBox();
-
-		if (mainArgs.length > 0)
-			pHost = mainArgs[0];
-		else {
-			getHost.ipRegister();
-			pHost = getHost.getAddress();
-		}
-			
-			
-			//pHost = "cls080.ie.u-ryukyu.ac.jp";
-		if (mainArgs.length > 1)
-			port = Integer.parseInt(mainArgs[1]);
-		else
-<<<<<<< local
-			port = 5999;
-
-=======
-			port = Integer.parseInt(getHost.getPort());
-			//port = 5999;
-		
->>>>>>> other
-		init();
-		start_threads();
-		start();
-	}
-
-	//
-	// init()
-	//
-
-	public void init() {
-
-		readParameters();
-
-		refApplet = this;
-
-		if (inSeparateFrame) {
-			vncFrame = new Frame("TightVNC");
-			if (!inAnApplet) {
-				vncFrame.add("Center", this);
-			}
-			vncContainer = vncFrame;
-		} else {
-			vncContainer = this;
-		}
-
-		recordingSync = new Object();
-
-		options = new OptionsFrame(this);
-		clipboard = new ClipboardFrame(this);
-		if (RecordingFrame.checkSecurity())
-			rec = new RecordingFrame(this);
-
-		sessionFileName = null;
-		recordingActive = false;
-		recordingStatusChanged = false;
-		cursorUpdatesDef = null;
-		eightBitColorsDef = null;
-
-		if (inSeparateFrame)
-			vncFrame.addWindowListener(this);
-
-		rfbThread = new Thread(this);
-	}
-
-	public void update(Graphics g) {
-	}
-
-	//
-	// run() - executed by the rfbThread to deal with the RFB socket.
-	//
-
-	public void start_threads() {
-		rfbThread.start();
-	}
-
-	public void run() {
-
-		gridbag = new GridBagLayout();
-		vncContainer.setLayout(gridbag);
-
-		GridBagConstraints gbc = new GridBagConstraints();
-		gbc.gridwidth = GridBagConstraints.REMAINDER;
-		gbc.anchor = GridBagConstraints.NORTHWEST;
-
-		if (showControls) {
-			buttonPanel = new ButtonPanel(this);
-			gridbag.setConstraints(buttonPanel, gbc);
-			vncContainer.add(buttonPanel);
-		}
-
-		try {
-
-			if (first) {
-				connectAndAuthenticate();
-				accThread = new Thread(new AcceptThread(rfb, 5999));
-				accThread.start();
-				first = false;
-			} else {
-				System.out.println("reConnectAndAuthenticate() ");
-				reConnectAndAuthenticate();
-				//accThread = new Thread(new AcceptThread(rfb, 5999));
-				//accThread.start();
-			}
-
-			doProtocolInitialisation();
-
-			createCanvas(0, 0);
-
-			// rfb.readPngData();
-			// vc.drawFirstImage();
-
-		} catch (IOException e) {
-			try {
-				rfb.sock.close();
-
-			} catch (IOException e2) {
-				e2.printStackTrace();
-			}
-			System.out.println("Socket error");
-			// parent no find
-			Random rnd = new Random();
-			long ran = rnd.nextInt(3000) + 3000;
-			System.out.println(ran);
-			// 親がいない場合の処理はここに書く!!!!
-			/**
-			 * this while reconnection
-			 */
-
-			int counter = 0;
-			vncFrame.setVisible(false);
-			vncFrame.dispose();
-
-			while (true) {
-				/**
-				 * if my last node case reconnectoion stop
-				 */
-
-				echoValue = new EchoClient(echoValue, this);
-				// echoValue = new EchoClient(echoValue);
-
-				try {
-					Thread.sleep(ran);
-				} catch (InterruptedException e1) {
-					e1.printStackTrace();
-				}
-
-				if (counter >= 6) {
-					echoValue.openport();
-					echoValue.notfoundParent();
-				}
-
-				echoValue.openport();
-				// runflag = echo.losthost();
-				if (echoValue.losthost()) {
-					break;
-				}
-				counter++;
-			}
-
-			// System.exit(0);
-		} catch (Exception e) {
-			System.out.println(e);
-			System.exit(0);
-		}
-
-		gbc.weightx = 1.0;
-		gbc.weighty = 1.0;
-
-		if (inSeparateFrame) {
-
-			// Create a panel which itself is resizeable and can hold
-			// non-resizeable VncCanvas component at the top left corner.
-			Panel canvasPanel = new Panel();
-			canvasPanel.setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0));
-			canvasPanel.add(vc);
-
-			// Create a ScrollPane which will hold a panel with VncCanvas
-			// inside.
-			desktopScrollPane = new ScrollPane(ScrollPane.SCROLLBARS_AS_NEEDED);
-			gbc.fill = GridBagConstraints.BOTH;
-			gridbag.setConstraints(desktopScrollPane, gbc);
-			desktopScrollPane.add(canvasPanel);
-
-			// Finally, add our ScrollPane to the Frame window.
-			vncFrame.add(desktopScrollPane);
-			vncFrame.setTitle(rfb.desktopName);
-			vncFrame.pack();
-			vc.resizeDesktopFrame();
-
-		} else {
-
-			// Just add the VncCanvas component to the Applet.
-			gridbag.setConstraints(vc, gbc);
-			add(vc);
-			validate();
-
-		}
-
-		try {
-			if (showControls)
-				buttonPanel.enableButtons();
-
-			moveFocusToDesktop();
-
-			processNormalProtocol();// main loop
-
-		} catch (NoRouteToHostException e) {
-			fatalError("Network error: no route to server: " + host, e);
-		} catch (UnknownHostException e) {
-			fatalError("Network error: server name unknown: " + host, e);
-		} catch (ConnectException e) {
-			fatalError("Network error: could not connect to server: " + host
-					+ ":" + port, e);
-		} catch (EOFException e) {
-
-			vncFrame.setVisible(false);
-			vncFrame.dispose();
-			// num4
-			if (leaderflag != null) {
-				while (true) {
-					// echoValue = new EchoClient(echoValue, this);
-					echoValue = new EchoClient(echoValue);
-					echoValue.openport();
-					// runflag = echo.losthost();
-					if (echoValue.losthost()) {
-						break;
-					}
-				}
-			} else {
-
-				if (showOfflineDesktop) {
-					e.printStackTrace();
-					System.out
-							.println("Network error: remote side closed connection");
-					if (vc != null) {
-						vc.enableInput(false);
-					}
-					if (inSeparateFrame) {
-						vncFrame.setTitle(rfb.desktopName + " [disconnected]");
-					}
-					if (rfb != null && !rfb.closed())
-						rfb.close();
-					if (showControls && buttonPanel != null) {
-						buttonPanel.disableButtonsOnDisconnect();
-						if (inSeparateFrame) {
-							vncFrame.pack();
-						} else {
-							validate();
-						}
-					}
-				} else {
-					fatalError("Network error: remote side closed connection",
-							e);
-				}
-			}
-		} catch (IOException e) {
-			String str = e.getMessage();
-			if (str != null && str.length() != 0) {
-				fatalError("Network Error: " + str, e);
-			} else {
-				fatalError(e.toString(), e);
-			}
-		} catch (Exception e) {
-			String str = e.getMessage();
-			if (str != null && str.length() != 0) {
-				fatalError("Error: " + str, e);
-			} else {
-				fatalError(e.toString(), e);
-			}
-		}
-
-	}
-
-	//
-	// Create a VncCanvas instance.
-	//
-
-	void createCanvas(int maxWidth, int maxHeight) throws IOException {
-		// Determine if Java 2D API is available and use a special
-		// version of VncCanvas if it is present.
-		vc = null;
-		try {
-			// This throws ClassNotFoundException if there is no Java 2D API.
-			Class cl = Class.forName("java.awt.Graphics2D");
-			// If we could load Graphics2D class, then we can use VncCanvas2D.
-			cl = Class.forName("VncCanvas2");
-			Class[] argClasses = { this.getClass(), Integer.TYPE, Integer.TYPE };
-			java.lang.reflect.Constructor cstr = cl.getConstructor(argClasses);
-			Object[] argObjects = { this, new Integer(maxWidth),
-					new Integer(maxHeight) };
-			vc = (VncCanvas) cstr.newInstance(argObjects);
-		} catch (Exception e) {
-			System.out.println("Warning: Java 2D API is not available");
-		}
-
-		// If we failed to create VncCanvas2D, use old VncCanvas.
-		if (vc == null)
-			vc = new VncCanvas(this, maxWidth, maxHeight);
-	}
-
-	//
-	// Process RFB socket messages.
-	// If the rfbThread is being stopped, ignore any exceptions,
-	// otherwise rethrow the exception so it can be handled.
-	//
-
-	void processNormalProtocol() throws Exception {
-		try {
-			vc.processNormalProtocol();// main loop
-		} catch (Exception e) {
-			if (rfbThread == null) {
-				System.out.println("Ignoring RFB socket exceptions"
-						+ " because applet is stopping");
-			} else {
-				throw e;
-			}
-		}
-	}
-
-	//
-	// Connect to the RFB server and authenticate the user.
-	//
-
-	void connectAndAuthenticate() throws Exception {
-
-		showConnectionStatus("Initializing...");
-		if (inSeparateFrame) {
-			vncFrame.pack();
-			vncFrame.setVisible(true);
-		} else {
-			validate();
-		}
-
-		showConnectionStatus("Connecting to " + host + ", port " + port + "...");
-
-		rfb = new MyRfbProto(pHost, port, this);
-		showConnectionStatus("Connected to server");
-
-		rfb.readVersionMsg();
-		showConnectionStatus("RFB server supports protocol version "
-				+ rfb.serverMajor + "." + rfb.serverMinor);
-
-		rfb.writeVersionMsg();
-		showConnectionStatus("Using RFB protocol version " + rfb.clientMajor
-				+ "." + rfb.clientMinor);
-
-		if (rfb.serverMinor == 855) {
-			/*
-			 * if connect to proxy, userEchoPortFlag is true. 
-			 * if connect to client, userEchoPortFlag is false.
-			 */
-			boolean useEchoPortFlag = rfb.readProxyFlag();
-			if (useEchoPortFlag) {
-				byte[] b = new byte[4];
-				b = rfb.readEchoPort();
-				echoPort = castByteInt(b);
-
-<<<<<<< local
-				InetAddress addr = InetAddress.getByName(pHost);
-				String h = new String(addr.getHostAddress());
-=======
-		if(rfb.serverMinor == 855) {
-			byte[] b = new byte[4];
-			b = rfb.readEchoPort();
-			echoPort = castByteInt(b);
->>>>>>> other
-
-				getParentName();
-				if (!(h.equals(host))) {
-					rfb.changeParent(host, port);
-					rfb.readVersionMsg();
-					rfb.writeVersionMsg();
-					boolean flag = rfb.readProxyFlag();					
-				}
-			}
-		}
-
-		int secType = rfb.negotiateSecurity();
-		int authType;
-		if (secType == RfbProto.SecTypeTight) {
-			showConnectionStatus("Enabling TightVNC protocol extensions");
-			rfb.setupTunneling();
-			authType = rfb.negotiateAuthenticationTight();
-		} else {
-			authType = secType;
-		}
-
-		switch (authType) {
-		case RfbProto.AuthNone:
-			showConnectionStatus("No authentication needed");
-			rfb.authenticateNone();
-			break;
-		case RfbProto.AuthVNC:
-			showConnectionStatus("Performing standard VNC authentication");
-			if (passwordParam != null) {
-				rfb.authenticateVNC(passwordParam);
-			} else {
-				String pw = askPassword();
-				rfb.authenticateVNC(pw);
-			}
-			break;
-		default:
-			throw new Exception("Unknown authentication scheme " + authType);
-		}
-	}
-
-	void reConnectAndAuthenticate() throws Exception {
-
-		showConnectionStatus("Initializing...");
-
-		if (inSeparateFrame) {
-			vncFrame.pack();
-			vncFrame.setVisible(true);
-		} else {
-			validate();
-		}
-
-		showConnectionStatus("Connecting to " + host + ", port " + port + "...");
-
-		rfb.changeParent(host, port);
-
-		showConnectionStatus("Connected to server");
-
-		rfb.readVersionMsg();
-		showConnectionStatus("RFB server supports protocol version "
-				+ rfb.serverMajor + "." + rfb.serverMinor);
-
-		rfb.writeVersionMsg();
-		showConnectionStatus("Using RFB protocol version " + rfb.clientMajor
-				+ "." + rfb.clientMinor);
-
-		if (rfb.serverMinor == 855) {
-			boolean useEchoPortFlag = rfb.readProxyFlag();
-			if (useEchoPortFlag) {
-				byte[] b = new byte[4];
-				b = rfb.readEchoPort();
-				echoPort = castByteInt(b);
-
-				InetAddress addr = InetAddress.getByName(pHost);
-				String h = new String(addr.getHostAddress());
-
-				getParentName();
-				if (!(h.equals(host))) {
-					rfb.changeParent(host, port);
-					rfb.readVersionMsg();
-					rfb.writeVersionMsg();
-					boolean flag = rfb.readProxyFlag();
-				}
-			}
-		}
-		int secType = rfb.negotiateSecurity();
-		int authType;
-		if (secType == RfbProto.SecTypeTight) {
-			showConnectionStatus("Enabling TightVNC protocol extensions");
-			rfb.setupTunneling();
-			authType = rfb.negotiateAuthenticationTight();
-		} else {
-			authType = secType;
-		}
-
-		switch (authType) {
-		case RfbProto.AuthNone:
-			showConnectionStatus("No authentication needed");
-			rfb.authenticateNone();
-			break;
-		case RfbProto.AuthVNC:
-			showConnectionStatus("Performing standard VNC authentication");
-			if (passwordParam != null) {
-				rfb.authenticateVNC(passwordParam);
-			} else {
-				String pw = askPassword();
-				rfb.authenticateVNC(pw);
-			}
-			break;
-		default:
-			throw new Exception("Unknown authentication scheme " + authType);
-		}
-	}
-
-	//
-	// Show a message describing the connection status.
-	// To hide the connection status label, use (msg == null).
-	//
-
-	void showConnectionStatus(String msg) {
-		if (msg == null) {
-			if (vncContainer.isAncestorOf(connStatusLabel)) {
-				vncContainer.remove(connStatusLabel);
-			}
-			return;
-		}
-
-		System.out.println(msg);
-
-		if (connStatusLabel == null) {
-			connStatusLabel = new Label("Status: " + msg);
-			connStatusLabel.setFont(new Font("Helvetica", Font.PLAIN, 12));
-		} else {
-			connStatusLabel.setText("Status: " + msg);
-		}
-
-		if (!vncContainer.isAncestorOf(connStatusLabel)) {
-			GridBagConstraints gbc = new GridBagConstraints();
-			gbc.gridwidth = GridBagConstraints.REMAINDER;
-			gbc.fill = GridBagConstraints.HORIZONTAL;
-			gbc.anchor = GridBagConstraints.NORTHWEST;
-			gbc.weightx = 1.0;
-			gbc.weighty = 1.0;
-			gbc.insets = new Insets(20, 30, 20, 30);
-			gridbag.setConstraints(connStatusLabel, gbc);
-			vncContainer.add(connStatusLabel);
-		}
-
-		if (inSeparateFrame) {
-			vncFrame.pack();
-		} else {
-			validate();
-		}
-	}
-
-	//
-	// Show an authentication panel.
-	//
-
-	String askPassword() throws Exception {
-		showConnectionStatus(null);
-
-		AuthPanel authPanel = new AuthPanel(this);
-
-		GridBagConstraints gbc = new GridBagConstraints();
-		gbc.gridwidth = GridBagConstraints.REMAINDER;
-		gbc.anchor = GridBagConstraints.NORTHWEST;
-		gbc.weightx = 1.0;
-		gbc.weighty = 1.0;
-		gbc.ipadx = 100;
-		gbc.ipady = 50;
-		gridbag.setConstraints(authPanel, gbc);
-		vncContainer.add(authPanel);
-
-		if (inSeparateFrame) {
-			vncFrame.pack();
-		} else {
-			validate();
-		}
-
-		authPanel.moveFocusToDefaultField();
-		String pw = authPanel.getPassword();
-		vncContainer.remove(authPanel);
-		return pw;
-	}
-
-	//
-	// Do the rest of the protocol initialisation.
-	//
-
-	void doProtocolInitialisation() throws IOException {
-		rfb.writeClientInit();
-		rfb.readServerInit();
-
-		System.out.println("Desktop name is " + rfb.desktopName);
-		System.out.println("Desktop size is " + rfb.framebufferWidth + " x "
-				+ rfb.framebufferHeight);
-
-		setEncodings();
-
-		showConnectionStatus(null);
-	}
-
-	//
-	// Send current encoding list to the RFB server.
-	//
-
-	int[] encodingsSaved;
-	int nEncodingsSaved;
-
-	void setEncodings() {
-		setEncodings(false);
-	}
-
-	void autoSelectEncodings() {
-		setEncodings(true);
-	}
-
-	void setEncodings(boolean autoSelectOnly) {
-		if (options == null || rfb == null || !rfb.inNormalProtocol)
-			return;
-
-		int preferredEncoding = options.preferredEncoding;
-		if (preferredEncoding == -1) {
-			long kbitsPerSecond = rfb.kbitsPerSecond();
-			if (nEncodingsSaved < 1) {
-				// Choose Tight or ZRLE encoding for the very first update.
-				System.out.println("Using Tight/ZRLE encodings");
-				preferredEncoding = RfbProto.EncodingTight;
-			} else if (kbitsPerSecond > 2000
-					&& encodingsSaved[0] != RfbProto.EncodingHextile) {
-				// Switch to Hextile if the connection speed is above 2Mbps.
-				System.out.println("Throughput " + kbitsPerSecond
-						+ " kbit/s - changing to Hextile encoding");
-				preferredEncoding = RfbProto.EncodingHextile;
-			} else if (kbitsPerSecond < 1000
-					&& encodingsSaved[0] != RfbProto.EncodingTight) {
-				// Switch to Tight/ZRLE if the connection speed is below 1Mbps.
-				System.out.println("Throughput " + kbitsPerSecond
-						+ " kbit/s - changing to Tight/ZRLE encodings");
-				preferredEncoding = RfbProto.EncodingTight;
-			} else {
-				// Don't change the encoder.
-				if (autoSelectOnly)
-					return;
-				preferredEncoding = encodingsSaved[0];
-			}
-		} else {
-			// Auto encoder selection is not enabled.
-			if (autoSelectOnly)
-				return;
-		}
-
-		int[] encodings = new int[20];
-		int nEncodings = 0;
-
-		encodings[nEncodings++] = preferredEncoding;
-		if (options.useCopyRect) {
-			encodings[nEncodings++] = RfbProto.EncodingCopyRect;
-		}
-
-		if (preferredEncoding != RfbProto.EncodingTight) {
-			encodings[nEncodings++] = RfbProto.EncodingTight;
-		}
-		if (preferredEncoding != RfbProto.EncodingZRLE) {
-			encodings[nEncodings++] = RfbProto.EncodingZRLE;
-		}
-		if (preferredEncoding != RfbProto.EncodingHextile) {
-			encodings[nEncodings++] = RfbProto.EncodingHextile;
-		}
-		if (preferredEncoding != RfbProto.EncodingZlib) {
-			encodings[nEncodings++] = RfbProto.EncodingZlib;
-		}
-		if (preferredEncoding != RfbProto.EncodingCoRRE) {
-			encodings[nEncodings++] = RfbProto.EncodingCoRRE;
-		}
-		if (preferredEncoding != RfbProto.EncodingRRE) {
-			encodings[nEncodings++] = RfbProto.EncodingRRE;
-		}
-
-		if (options.compressLevel >= 0 && options.compressLevel <= 9) {
-			encodings[nEncodings++] = RfbProto.EncodingCompressLevel0
-					+ options.compressLevel;
-		}
-		if (options.jpegQuality >= 0 && options.jpegQuality <= 9) {
-			encodings[nEncodings++] = RfbProto.EncodingQualityLevel0
-					+ options.jpegQuality;
-		}
-
-		if (options.requestCursorUpdates) {
-			encodings[nEncodings++] = RfbProto.EncodingXCursor;
-			encodings[nEncodings++] = RfbProto.EncodingRichCursor;
-			if (!options.ignoreCursorUpdates)
-				encodings[nEncodings++] = RfbProto.EncodingPointerPos;
-		}
-
-		encodings[nEncodings++] = RfbProto.EncodingLastRect;
-		encodings[nEncodings++] = RfbProto.EncodingNewFBSize;
-
-		boolean encodingsWereChanged = false;
-		if (nEncodings != nEncodingsSaved) {
-			encodingsWereChanged = true;
-		} else {
-			for (int i = 0; i < nEncodings; i++) {
-				if (encodings[i] != encodingsSaved[i]) {
-					encodingsWereChanged = true;
-					break;
-				}
-			}
-		}
-
-		if (encodingsWereChanged) {
-			try {
-				rfb.writeSetEncodings(encodings, nEncodings);
-				if (vc != null) {
-					vc.softCursorFree();
-				}
-			} catch (Exception e) {
-				e.printStackTrace();
-			}
-			encodingsSaved = encodings;
-			nEncodingsSaved = nEncodings;
-		}
-	}
-
-	//
-	// setCutText() - send the given cut text to the RFB server.
-	//
-
-	void setCutText(String text) {
-		try {
-			if (rfb != null && rfb.inNormalProtocol) {
-				rfb.writeClientCutText(text);
-			}
-		} catch (Exception e) {
-			e.printStackTrace();
-		}
-	}
-
-	//
-	// Order change in session recording status. To stop recording, pass
-	// null in place of the fname argument.
-	//
-
-	void setRecordingStatus(String fname) {
-		synchronized (recordingSync) {
-			sessionFileName = fname;
-			recordingStatusChanged = true;
-		}
-	}
-
-	//
-	// Start or stop session recording. Returns true if this method call
-	// causes recording of a new session.
-	//
-
-	boolean checkRecordingStatus() throws IOException {
-		synchronized (recordingSync) {
-			if (recordingStatusChanged) {
-				recordingStatusChanged = false;
-				if (sessionFileName != null) {
-					startRecording();
-					return true;
-				} else {
-					stopRecording();
-				}
-			}
-		}
-		return false;
-	}
-
-	//
-	// Start session recording.
-	//
-
-	protected void startRecording() throws IOException {
-		synchronized (recordingSync) {
-			if (!recordingActive) {
-				// Save settings to restore them after recording the session.
-				cursorUpdatesDef = options.choices[options.cursorUpdatesIndex]
-						.getSelectedItem();
-				eightBitColorsDef = options.choices[options.eightBitColorsIndex]
-						.getSelectedItem();
-				// Set options to values suitable for recording.
-				options.choices[options.cursorUpdatesIndex].select("Disable");
-				options.choices[options.cursorUpdatesIndex].setEnabled(false);
-				options.setEncodings();
-				options.choices[options.eightBitColorsIndex].select("No");
-				options.choices[options.eightBitColorsIndex].setEnabled(false);
-				options.setColorFormat();
-			} else {
-				rfb.closeSession();
-			}
-
-			System.out.println("Recording the session in " + sessionFileName);
-			rfb.startSession(sessionFileName);
-			recordingActive = true;
-		}
-	}
-
-	//
-	// Stop session recording.
-	//
-
-	protected void stopRecording() throws IOException {
-		synchronized (recordingSync) {
-			if (recordingActive) {
-				// Restore options.
-				options.choices[options.cursorUpdatesIndex]
-						.select(cursorUpdatesDef);
-				options.choices[options.cursorUpdatesIndex].setEnabled(true);
-				options.setEncodings();
-				options.choices[options.eightBitColorsIndex]
-						.select(eightBitColorsDef);
-				options.choices[options.eightBitColorsIndex].setEnabled(true);
-				options.setColorFormat();
-
-				rfb.closeSession();
-				System.out.println("Session recording stopped.");
-			}
-			sessionFileName = null;
-			recordingActive = false;
-		}
-	}
-
-	/**
-	 * readParameters() - read parameters from the html source or from the
-	 * command line. On the command line, the arguments are just a sequence of
-	 * param_name/param_value pairs where the names and values correspond to
-	 * those expected in the html applet tag source.
-	 */
-
-	void readParameters() {
-		/*
-		 * host = readParameter("HOST", !inAnApplet);
-		 * 
-		 * if (host == null) { host = getCodeBase().getHost(); if
-		 * (host.equals("")) { fatalError("HOST parameter not specified"); } }
-		 * 
-		 * port = readIntParameter("PORT", 5550);
-		 */
-
-		// Read "ENCPASSWORD" or "PASSWORD" parameter if specified.
-		readPasswordParameters();
-
-		String str;
-		if (inAnApplet) {
-			str = readParameter("Open New Window", false);
-			if (str != null && str.equalsIgnoreCase("Yes"))
-				inSeparateFrame = true;
-		}
-
-		// "Show Controls" set to "No" disables button panel.
-		showControls = true;
-		str = readParameter("Show Controls", false);
-		if (str != null && str.equalsIgnoreCase("No"))
-			showControls = false;
-
-		// "Offer Relogin" set to "No" disables "Login again" and "Close
-		// window" buttons under error messages in applet mode.
-		offerRelogin = true;
-		str = readParameter("Offer Relogin", false);
-		if (str != null && str.equalsIgnoreCase("No"))
-			offerRelogin = false;
-
-		// Do we continue showing desktop on remote disconnect?
-		showOfflineDesktop = false;
-		str = readParameter("Show Offline Desktop", false);
-		if (str != null && str.equalsIgnoreCase("Yes"))
-			showOfflineDesktop = true;
-
-		// Fine tuning options.
-		deferScreenUpdates = readIntParameter("Defer screen updates", 20);
-		deferCursorUpdates = readIntParameter("Defer cursor updates", 10);
-		deferUpdateRequests = readIntParameter("Defer update requests", 0);
-
-		// Debugging options.
-		debugStatsExcludeUpdates = readIntParameter("DEBUG_XU", 0);
-		debugStatsMeasureUpdates = readIntParameter("DEBUG_CU", 0);
-
-		// SocketFactory.
-		socketFactory = readParameter("SocketFactory", false);
-	}
-
-	//
-	// Read password parameters. If an "ENCPASSWORD" parameter is set,
-	// then decrypt the password into the passwordParam string. Otherwise,
-	// try to read the "PASSWORD" parameter directly to passwordParam.
-	//
-
-	private void readPasswordParameters() {
-		String encPasswordParam = readParameter("ENCPASSWORD", false);
-		if (encPasswordParam == null) {
-			passwordParam = readParameter("PASSWORD", false);
-
-		} else {
-			// ENCPASSWORD is hexascii-encoded. Decode.
-			byte[] pw = { 0, 0, 0, 0, 0, 0, 0, 0 };
-			int len = encPasswordParam.length() / 2;
-			if (len > 8)
-				len = 8;
-			for (int i = 0; i < len; i++) {
-				String hex = encPasswordParam.substring(i * 2, i * 2 + 2);
-				Integer x = new Integer(Integer.parseInt(hex, 16));
-				pw[i] = x.byteValue();
-			}
-			// Decrypt the password.
-			byte[] key = { 23, 82, 107, 6, 35, 78, 88, 7 };
-			DesCipher des = new DesCipher(key);
-			des.decrypt(pw, 0, pw, 0);
-			passwordParam = new String(pw);
-
-		}
-	}
-
-	public String readParameter(String name, boolean required) {
-		if (inAnApplet) {
-			String s = getParameter(name);
-			if ((s == null) && required) {
-				fatalError(name + " parameter not specified");
-			}
-			return s;
-		}
-		/*
-		 * for (int i = 0; i < mainArgs.length; i += 2) { if
-		 * (mainArgs[i].equalsIgnoreCase(name)) { try { return mainArgs[i + 1];
-		 * } catch (Exception e) { if (required) { fatalError(name +
-		 * " parameter not specified"); } return null; } } }
-		 */
-		if (required) {
-			fatalError(name + " parameter not specified");
-		}
-		return null;
-	}
-
-	int readIntParameter(String name, int defaultValue) {
-		String str = readParameter(name, false);
-		int result = defaultValue;
-		if (str != null) {
-			try {
-				result = Integer.parseInt(str);
-			} catch (NumberFormatException e) {
-			}
-		}
-		return result;
-	}
-
-	//
-	// moveFocusToDesktop() - move keyboard focus either to VncCanvas.
-	//
-
-	void moveFocusToDesktop() {
-		if (vncContainer != null) {
-			if (vc != null && vncContainer.isAncestorOf(vc))
-				vc.requestFocus();
-		}
-	}
-
-	//
-	// disconnect() - close connection to server.
-	//
-
-	synchronized public void disconnect() {
-		System.out.println("Disconnecting");
-
-		if (vc != null) {
-			double sec = (System.currentTimeMillis() - vc.statStartTime) / 1000.0;
-			double rate = Math.round(vc.statNumUpdates / sec * 100) / 100.0;
-			int nRealRects = vc.statNumPixelRects;
-			int nPseudoRects = vc.statNumTotalRects - vc.statNumPixelRects;
-			System.out.println("Updates received: " + vc.statNumUpdates + " ("
-					+ nRealRects + " rectangles + " + nPseudoRects
-					+ " pseudo), " + rate + " updates/sec");
-			int numRectsOther = nRealRects - vc.statNumRectsTight
-					- vc.statNumRectsZRLE - vc.statNumRectsHextile
-					- vc.statNumRectsRaw - vc.statNumRectsCopy;
-			System.out.println("Rectangles:" + " Tight=" + vc.statNumRectsTight
-					+ "(JPEG=" + vc.statNumRectsTightJPEG + ") ZRLE="
-					+ vc.statNumRectsZRLE + " Hextile="
-					+ vc.statNumRectsHextile + " Raw=" + vc.statNumRectsRaw
-					+ " CopyRect=" + vc.statNumRectsCopy + " other="
-					+ numRectsOther);
-
-			int raw = vc.statNumBytesDecoded;
-			int compressed = vc.statNumBytesEncoded;
-			if (compressed > 0) {
-				double ratio = Math.round((double) raw / compressed * 1000) / 1000.0;
-				System.out.println("Pixel data: " + vc.statNumBytesDecoded
-						+ " bytes, " + vc.statNumBytesEncoded
-						+ " compressed, ratio " + ratio);
-			}
-		}
-
-		if (rfb != null && !rfb.closed())
-			rfb.close();
-		options.dispose();
-		clipboard.dispose();
-		if (rec != null)
-			rec.dispose();
-
-		if (inAnApplet) {
-			showMessage("Disconnected");
-		} else {
-			System.exit(0);
-		}
-	}
-
-	//
-	// fatalError() - print out a fatal error message.
-	// FIXME: Do we really need two versions of the fatalError() method?
-	//
-
-	synchronized public void fatalError(String str) {
-		System.out.println(str);
-
-		if (inAnApplet) {
-			// vncContainer null, applet not inited,
-			// can not present the error to the user.
-			Thread.currentThread().stop();
-		} else {
-			System.exit(1);
-		}
-	}
-
-	synchronized public void fatalError(String str, Exception e) {
-
-		if (rfb != null && rfb.closed()) {
-			// Not necessary to show error message if the error was caused
-			// by I/O problems after the rfb.close() method call.
-			System.out.println("RFB thread finished");
-			return;
-		}
-
-		System.out.println(str);
-		e.printStackTrace();
-
-		if (rfb != null)
-			rfb.close();
-
-		if (inAnApplet) {
-			showMessage(str);
-		} else {
-			System.exit(1);
-		}
-	}
-
-	//
-	// Show message text and optionally "Relogin" and "Close" buttons.
-	//
-
-	void showMessage(String msg) {
-		vncContainer.removeAll();
-
-		Label errLabel = new Label(msg, Label.CENTER);
-		errLabel.setFont(new Font("Helvetica", Font.PLAIN, 12));
-
-		if (offerRelogin) {
-
-			Panel gridPanel = new Panel(new GridLayout(0, 1));
-			Panel outerPanel = new Panel(new FlowLayout(FlowLayout.LEFT));
-			outerPanel.add(gridPanel);
-			vncContainer.setLayout(new FlowLayout(FlowLayout.LEFT, 30, 16));
-			vncContainer.add(outerPanel);
-			Panel textPanel = new Panel(new FlowLayout(FlowLayout.CENTER));
-			textPanel.add(errLabel);
-			gridPanel.add(textPanel);
-			gridPanel.add(new ReloginPanel(this));
-
-		} else {
-
-			vncContainer.setLayout(new FlowLayout(FlowLayout.LEFT, 30, 30));
-			vncContainer.add(errLabel);
-
-		}
-
-		if (inSeparateFrame) {
-			vncFrame.pack();
-		} else {
-			validate();
-		}
-	}
-
-	//
-	// Stop the applet.
-	// Main applet thread will terminate on first exception
-	// after seeing that rfbThread has been set to null.
-	//
-
-	public void stop() {
-		System.out.println("Stopping applet");
-		rfbThread = null;
-	}
-
-	//
-	// This method is called before the applet is destroyed.
-	//
-
-	public void destroy() {
-		System.out.println("Destroying applet");
-
-		vncContainer.removeAll();
-		options.dispose();
-		clipboard.dispose();
-		if (rec != null)
-			rec.dispose();
-		if (rfb != null && !rfb.closed())
-			rfb.close();
-		if (inSeparateFrame)
-			vncFrame.dispose();
-	}
-
-	//
-	// Start/stop receiving mouse events.
-	//
-
-	public void enableInput(boolean enable) {
-		vc.enableInput(enable);
-	}
-
-	//
-	// Close application properly on window close event.
-	//
-
-	public void windowClosing(WindowEvent evt) {
-		System.out.println("Closing window");
-		if (rfb != null)
-			disconnect();
-
-		vncContainer.hide();
-
-		if (!inAnApplet) {
-			System.exit(0);
-		}
-	}
-
-	//
-	// Ignore window events we're not interested in.
-	//
-
-	public void windowActivated(WindowEvent evt) {
-	}
-
-	public void windowDeactivated(WindowEvent evt) {
-	}
-
-	public void windowOpened(WindowEvent evt) {
-	}
-
-	public void windowClosed(WindowEvent evt) {
-	}
-
-	public void windowIconified(WindowEvent evt) {
-	}
-
-	public void windowDeiconified(WindowEvent evt) {
-	}
-
-	public void getParentName() {
-		if (echoValue == null) {
-
-			if (clientSocket == null) {
-
-				// echo = new EchoClient(pHost, this);
-				echoValue = new EchoClient(pHost, this, echoPort);
-				echoValue.openport();
-
-				echoValue = echoValue.requestHostName("1");
-			} else {
-				echoValue = new EchoClient();
-				echoValue = echoValue.Interruption(clientSocket);
-			}
-		}
-		// proxyからの返信で接続先を決定する
-		host = echoValue.responseLine;
-		parent = echoValue.parent;
-		if (echoValue.treenum != null) {
-			treenum = echoValue.treenum;
-		} else {
-			treenum = echoValue.treenum;
-		}
-		if (echoValue.leaderflag != null) {
-			leaderflag = echoValue.leaderflag;
-		} else {
-			leaderflag = echoValue.leaderflag;
-		}
-		System.out.println("Parent =" + parent);
-		System.out.println("mynumber =" + treenum);
-		System.out.println("connect host =" + host);
-		System.out.println("leaderflag(boolean) = " + leaderflag);
-
-	}
-
-	public void setEchoValue(EchoClient value) {
-		this.echoValue = value;
-	}
-
-	int castByteInt(byte[] b) {
-		ByteBuffer bb = ByteBuffer.wrap(b);
-		int value = bb.getInt();
-		return value;
-	}
-
-	public void setClientSocket(Socket sock) {
-		clientSocket = sock;
-	}
-
-	public void close() {
-		rfb.close();
-		vncFrame.setVisible(false);
-		vncFrame.dispose();
-	}
-
-	@Override
-	public Image getScreenImage() {
-//		return vc.memImage;
-		return vc.rawPixelsImage;
-	}
-	
-	public void writeScreenData(byte[] b, String imageFormat) {
-		try{
-			vc.drawBufferedImage(b);
-		}catch(IOException e){
-			e.printStackTrace();
-		}
-	}
-
-}
--- a/src/myVncProxy/OptionNoFrame.java	Fri Jan 13 13:41:30 2012 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,333 +0,0 @@
-package myVncProxy;
-
-import java.awt.*;
-import java.awt.event.*;
-
-class OptionsNoFrame{
-
-  static String[] names = {
-    "Encoding",
-    "Compression level",
-    "JPEG image quality",
-    "Cursor shape updates",
-    "Use CopyRect",
-    "Restricted colors",
-    "Mouse buttons 2 and 3",
-    "View only",
-    "Scale remote cursor",
-    "Share desktop",
-  };
-
-  static String[][] values = {
-    { "Auto", "Raw", "RRE", "CoRRE", "Hextile", "Zlib", "Tight", "ZRLE" },
-    { "Default", "1", "2", "3", "4", "5", "6", "7", "8", "9" },
-    { "JPEG off", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" },
-    { "Enable", "Ignore", "Disable" },
-    { "Yes", "No" },
-    { "Yes", "No" },
-    { "Normal", "Reversed" },
-    { "Yes", "No" },
-    { "No", "50%", "75%", "125%", "150%" },
-    { "Yes", "No" },
-  };
-
-  final int
-    encodingIndex        = 0,
-    compressLevelIndex   = 1,
-    jpegQualityIndex     = 2,
-    cursorUpdatesIndex   = 3,
-    useCopyRectIndex     = 4,
-    eightBitColorsIndex  = 5,
-    mouseButtonIndex     = 6,
-    viewOnlyIndex        = 7,
-    scaleCursorIndex     = 8,
-    shareDesktopIndex    = 9;
-
-  Label[] labels = new Label[names.length];
-  Choice[] choices = new Choice[names.length];
-  Button closeButton;
-  CuiMyVncClient viewer;
-
-
-  //
-  // The actual data which other classes look at:
-  //
-
-  int preferredEncoding;
-  int compressLevel;
-  int jpegQuality;
-  boolean useCopyRect;
-  boolean requestCursorUpdates;
-  boolean ignoreCursorUpdates;
-
-  boolean eightBitColors;
-
-  boolean reverseMouseButtons2And3;
-  boolean shareDesktop;
-  boolean viewOnly;
-  int scaleCursor;
-
-  boolean autoScale;
-  int scalingFactor;
-
-  //
-  // Constructor.  Set up the labels and choices from the names and values
-  // arrays.
-  //
-
-  OptionsNoFrame(CuiMyVncClient v) {
-
-	  viewer = v;
-/*    
-    for (int i = 0; i < names.length; i++) {
-    	labels[i] = new Label(names[i]);
-    	
-    	choices[i] = new Choice();
-    	
-
-        for (int j = 0; j < values[i]. length; j++) {
-        	choices[i].addItem(values[i][j]);
-        }
-    }
-    
-    // Set up defaults
-
-    choices[encodingIndex].select("Auto");
-    choices[compressLevelIndex].select("Default");
-    choices[jpegQualityIndex].select("6");
-    choices[cursorUpdatesIndex].select("Enable");
-    choices[useCopyRectIndex].select("Yes");
-    choices[eightBitColorsIndex].select("No");
-    choices[mouseButtonIndex].select("Normal");
-    choices[viewOnlyIndex].select("No");
-    choices[scaleCursorIndex].select("No");
-    choices[shareDesktopIndex].select("Yes");
-
-    // But let them be overridden by parameters
-
-    for (int i = 0; i < names.length; i++) {
-      String s = viewer.readParameter(names[i], false);
-      if (s != null) {
-	for (int j = 0; j < values[i].length; j++) {
-	  if (s.equalsIgnoreCase(values[i][j])) {
-	    choices[i].select(j);
-	  }
-	}
-      }
-    }
-
-    // FIXME: Provide some sort of GUI for "Scaling Factor".
-
-    autoScale = false;
-    scalingFactor = 100;
-    String s = viewer.readParameter("Scaling Factor", false);
-    if (s != null) {
-      if (s.equalsIgnoreCase("Auto")) {
-	autoScale = true;
-      } else {
-	// Remove the '%' char at the end of string if present.
-	if (s.charAt(s.length() - 1) == '%') {
-	  s = s.substring(0, s.length() - 1);
-	}
-	// Convert to an integer.
-	try {
-	  scalingFactor = Integer.parseInt(s);
-	}
-	catch (NumberFormatException e) {
-	  scalingFactor = 100;
-	}
-	// Make sure scalingFactor is in the range of [1..1000].
-	if (scalingFactor < 1) {
-	  scalingFactor = 1;
-	} else if (scalingFactor > 1000) {
-	  scalingFactor = 1000;
-	}
-      }
-    }
-*/
-
-    // Make the booleans and encodings array correspond to the state of the GUI
-
-//    setEncodings();
-//    setColorFormat();
-//    setOtherOptions();
-	  
-  }
-
-
-  //
-  // Disable the shareDesktop option
-  //
-
-  void disableShareDesktop() {
-    labels[shareDesktopIndex].setEnabled(false);
-    choices[shareDesktopIndex].setEnabled(false);
-  }
-
-  //
-  // setEncodings looks at the encoding, compression level, JPEG
-  // quality level, cursor shape updates and copyRect choices and sets
-  // corresponding variables properly. Then it calls the VncViewer's
-  // setEncodings method to send a SetEncodings message to the RFB
-  // server.
-  //
-
-  void setEncodings() {
-//    useCopyRect = choices[useCopyRectIndex].getSelectedItem().equals("Yes");
-
-    preferredEncoding = RfbProto.EncodingRaw;
-    boolean enableCompressLevel = false;
-
-    if (choices[encodingIndex].getSelectedItem().equals("RRE")) {
-      preferredEncoding = RfbProto.EncodingRRE;
-    } else if (choices[encodingIndex].getSelectedItem().equals("CoRRE")) {
-      preferredEncoding = RfbProto.EncodingCoRRE;
-    } else if (choices[encodingIndex].getSelectedItem().equals("Hextile")) {
-      preferredEncoding = RfbProto.EncodingHextile;
-    } else if (choices[encodingIndex].getSelectedItem().equals("ZRLE")) {
-      preferredEncoding = RfbProto.EncodingZRLE;
-    } else if (choices[encodingIndex].getSelectedItem().equals("Zlib")) {
-      preferredEncoding = RfbProto.EncodingZlib;
-      enableCompressLevel = true;
-    } else if (choices[encodingIndex].getSelectedItem().equals("Tight")) {
-      preferredEncoding = RfbProto.EncodingTight;
-      enableCompressLevel = true;
-    } else if (choices[encodingIndex].getSelectedItem().equals("Auto")) {
-      preferredEncoding = -1;
-    }
-
-    // Handle compression level setting.
-
-    try {
-      compressLevel =
-        Integer.parseInt(choices[compressLevelIndex].getSelectedItem());
-    }
-    catch (NumberFormatException e) {
-      compressLevel = -1;
-    }
-    if (compressLevel < 1 || compressLevel > 9) {
-      compressLevel = -1;
-    }
-    labels[compressLevelIndex].setEnabled(enableCompressLevel);
-    choices[compressLevelIndex].setEnabled(enableCompressLevel);
-
-    // Handle JPEG quality setting.
-
-    try {
-      jpegQuality =
-        Integer.parseInt(choices[jpegQualityIndex].getSelectedItem());
-    }
-    catch (NumberFormatException e) {
-      jpegQuality = -1;
-    }
-    if (jpegQuality < 0 || jpegQuality > 9) {
-      jpegQuality = -1;
-    }
-
-    // Request cursor shape updates if necessary.
-
-    requestCursorUpdates =
-      !choices[cursorUpdatesIndex].getSelectedItem().equals("Disable");
-
-    if (requestCursorUpdates) {
-      ignoreCursorUpdates =
-	choices[cursorUpdatesIndex].getSelectedItem().equals("Ignore");
-    }
-
-    viewer.setEncodings();
-  }
-
-  //
-  // setColorFormat sets eightBitColors variable depending on the GUI
-  // setting, causing switches between 8-bit and 24-bit colors mode if
-  // necessary.
-  //
-
-  void setColorFormat() {
-
-    eightBitColors =
-      choices[eightBitColorsIndex].getSelectedItem().equals("Yes");
-
-    boolean enableJPEG = !eightBitColors;
-
-    labels[jpegQualityIndex].setEnabled(enableJPEG);
-    choices[jpegQualityIndex].setEnabled(enableJPEG);
-  }
-
-  //
-  // setOtherOptions looks at the "other" choices (ones that do not
-  // cause sending any protocol messages) and sets the boolean flags
-  // appropriately.
-  //
-
-  void setOtherOptions() {
-
-    reverseMouseButtons2And3
-      = choices[mouseButtonIndex].getSelectedItem().equals("Reversed");
-
-    viewOnly 
-      = choices[viewOnlyIndex].getSelectedItem().equals("Yes");
-    if (viewer.vc != null)
-      viewer.vc.enableInput(!viewOnly);
-
-    shareDesktop
-      = choices[shareDesktopIndex].getSelectedItem().equals("Yes");
-
-    String scaleString = choices[scaleCursorIndex].getSelectedItem();
-    if (scaleString.endsWith("%"))
-      scaleString = scaleString.substring(0, scaleString.length() - 1);
-    try {
-      scaleCursor = Integer.parseInt(scaleString);
-    }
-    catch (NumberFormatException e) {
-      scaleCursor = 0;
-    }
-    if (scaleCursor < 10 || scaleCursor > 500) {
-      scaleCursor = 0;
-    }
-    if (requestCursorUpdates && !ignoreCursorUpdates && !viewOnly) {
-      labels[scaleCursorIndex].setEnabled(true);
-      choices[scaleCursorIndex].setEnabled(true);
-    } else {
-      labels[scaleCursorIndex].setEnabled(false);
-      choices[scaleCursorIndex].setEnabled(false);
-    }
-    if (viewer.vc != null)
-      viewer.vc.createSoftCursor(); // update cursor scaling
-  }
-
-
-  //
-  // Respond to actions on Choice controls
-  //
-
-  public void itemStateChanged(ItemEvent evt) {
-    Object source = evt.getSource();
-
-    if (source == choices[encodingIndex] ||
-        source == choices[compressLevelIndex] ||
-        source == choices[jpegQualityIndex] ||
-        source == choices[cursorUpdatesIndex] ||
-        source == choices[useCopyRectIndex]) {
-
-      setEncodings();
-
-      if (source == choices[cursorUpdatesIndex]) {
-        setOtherOptions();      // update scaleCursor state
-      }
-
-    } else if (source == choices[eightBitColorsIndex]) {
-
-      setColorFormat();
-
-    } else if (source == choices[mouseButtonIndex] ||
-	       source == choices[shareDesktopIndex] ||
-	       source == choices[viewOnlyIndex] ||
-	       source == choices[scaleCursorIndex]) {
-
-      setOtherOptions();
-
-    }
-  }
-
-}
--- a/src/myVncProxy/WaitReply.java	Fri Jan 13 13:41:30 2012 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,64 +0,0 @@
-package myVncProxy;
-
-import java.net.*;
-import java.io.*;
-
-public class WaitReply extends Thread {
-	// MyVncClient client;
-	InterfaceForViewer client;
-	private String treenum;
-	boolean passflag;
-	
-
-	/*
-	 * public WaitReply(String treenum,MyVncClient client) { this.client =
-	 * client; this.treenum = treenum; }
-	 */
-
-	public WaitReply(String treenum, InterfaceForViewer client) {
-		this.client = client;
-		this.treenum = treenum;
-	}
-	
-	public boolean checkPath() {
-		return passflag;
-	}
-	
-	public void run() {
-		Socket clientSocket = null;
-		ServerSocket echoServer = null;
-		// boolean mainFlag;
-
-		while (true) {
-			try {
-				echoServer = new ServerSocket(10001 + Integer.parseInt(treenum));
-			} catch (IOException e) {
-				System.out.println(e);
-			}
-			try {
-				clientSocket = echoServer.accept();
-				if (clientSocket != null) {
-					client.close();
-					passflag = true;
-					// client.clientSocket = clientSocket;
-					client.setClientSocket(clientSocket);
-					client.init();
-					client.setEchoValue(null);
-					client.getParentName();
-					client.start_threads();
-					client.start();
-					// MyVncClient.main(clientSocket);
-					// echo.Interruption(clientSocket);
-					echoServer.close();
-				}
-
-			} catch (IOException e) {
-				System.out.println(e);
-			}
-			/*
-			 * try { Thread.sleep(100); } catch (InterruptedException e) {
-			 * e.printStackTrace(); }
-			 */
-		}
-	}
-}
\ No newline at end of file