changeset 28:18fad65bc447

Create MyRfbProto.java MyRfbProto.java is a summary of the intersection of MyRfbClient and MyRfbProxy.
author one
date Sat, 01 Sep 2012 19:24:07 +0900
parents 85958cba5d15
children 57eb5575e6c4
files src/main/java/com/glavsoft/rfb/encoding/ServerInitMessage.java src/main/java/com/glavsoft/rfb/encoding/decoder/ZRLEESender.java src/main/java/com/glavsoft/rfb/protocol/ReceiverTask.java src/main/java/com/glavsoft/rfb/protocol/TreeTask.java src/main/java/jp/ac/u_ryukyu/treevnc/client/MyRfbProtoClient.java src/main/java/jp/ac/u_ryukyu/treevnc/client/TextBoxClient.java src/main/java/jp/ac/u_ryukyu/treevnc/client/WaitReply.java src/main/java/jp/ac/u_ryukyu/treevnc/server/AcceptClient.java src/main/java/jp/ac/u_ryukyu/treevnc/server/MyRfbProtoProxy.java src/main/java/jp/ac/u_ryukyu/treevnc/server/RequestScreenThread.java src/main/java/jp/ac/u_ryukyu/treevnc/server/VncProxyService.java src/main/java/jp/ac/u_ryukyu/treevnc/test/MyRfbProto.java src/viewer_swing/java/com/glavsoft/viewer/ConnectionManager.java src/viewer_swing/java/com/glavsoft/viewer/ContainerManager.java src/viewer_swing/java/com/glavsoft/viewer/TreeConnectionManager.java
diffstat 15 files changed, 297 insertions(+), 48 deletions(-) [+]
line wrap: on
line diff
--- a/src/main/java/com/glavsoft/rfb/encoding/ServerInitMessage.java	Fri Aug 31 18:21:20 2012 +0900
+++ b/src/main/java/com/glavsoft/rfb/encoding/ServerInitMessage.java	Sat Sep 01 19:24:07 2012 +0900
@@ -24,8 +24,6 @@
 
 package com.glavsoft.rfb.encoding;
 
-import java.io.IOException;
-
 import com.glavsoft.exceptions.TransportException;
 import com.glavsoft.transport.Reader;
 
--- a/src/main/java/com/glavsoft/rfb/encoding/decoder/ZRLEESender.java	Fri Aug 31 18:21:20 2012 +0900
+++ b/src/main/java/com/glavsoft/rfb/encoding/decoder/ZRLEESender.java	Sat Sep 01 19:24:07 2012 +0900
@@ -1,6 +1,7 @@
 package com.glavsoft.rfb.encoding.decoder;
 
 import jp.ac.u_ryukyu.treevnc.server.MyRfbProtoProxy;
+import jp.ac.u_ryukyu.treevnc.client.MyRfbProtoClient;
 
 import com.glavsoft.drawing.Renderer;
 import com.glavsoft.exceptions.TransportException;
@@ -14,7 +15,10 @@
 	public ZRLEESender(MyRfbProtoProxy rfb) {
 		this.rfb = rfb;
 	}
-
+	
+	public ZRLEESender(MyRfbProtoClient rfb) {
+	}
+	
 	@Override
 	public void decode(Reader reader, Renderer renderer,
 			FramebufferUpdateRectangle rect) throws TransportException {
--- a/src/main/java/com/glavsoft/rfb/protocol/ReceiverTask.java	Fri Aug 31 18:21:20 2012 +0900
+++ b/src/main/java/com/glavsoft/rfb/protocol/ReceiverTask.java	Sat Sep 01 19:24:07 2012 +0900
@@ -44,8 +44,6 @@
 import java.io.StringWriter;
 import java.util.logging.Logger;
 
-import jp.ac.u_ryukyu.treevnc.server.MyRfbProtoProxy;
-
 public class ReceiverTask implements Runnable {
 	private static final byte FRAMEBUFFER_UPDATE = 0;
 	private static final byte SET_COLOR_MAP_ENTRIES = 1;
@@ -66,20 +64,6 @@
 	protected boolean needSendPixelFormat;
 	
 	public ReceiverTask(Reader reader,
-            IRepaintController repaintController, ClipboardController clipboardController,
-            DecodersContainer decoders, ProtocolContext context,boolean flag) {
-		this.reader = reader;
-		this.repaintController = repaintController;
-		this.clipboardController = clipboardController;
-		this.context = context;
-		this.decoders = decoders;
-		renderer = repaintController.createRenderer(reader, context.getFbWidth(), context.getFbHeight(),
-				context.getPixelFormat());
-		fullscreenFbUpdateIncrementalRequest =
-				new FramebufferUpdateRequestMessage(0, 0, context.getFbWidth(), context.getFbHeight(), true);
-	}
-
-	public ReceiverTask(Reader reader,
 	                    IRepaintController repaintController, ClipboardController clipboardController,
 	                    DecodersContainer decoders, ProtocolContext context) {
 		this.reader = reader;
--- a/src/main/java/com/glavsoft/rfb/protocol/TreeTask.java	Fri Aug 31 18:21:20 2012 +0900
+++ b/src/main/java/com/glavsoft/rfb/protocol/TreeTask.java	Sat Sep 01 19:24:07 2012 +0900
@@ -1,6 +1,7 @@
 package com.glavsoft.rfb.protocol;
 
-import jp.ac.u_ryukyu.treevnc.server.*;
+import jp.ac.u_ryukyu.treevnc.client.MyRfbProtoClient;
+import jp.ac.u_ryukyu.treevnc.server.MyRfbProtoProxy;
 
 import com.glavsoft.rfb.ClipboardController;
 import com.glavsoft.rfb.IRepaintController;
@@ -16,13 +17,19 @@
 	public TreeTask(Reader reader, IRepaintController repaintController,
 			ClipboardController clipboardController,
 			DecodersContainer decoders, ProtocolContext context, MyRfbProtoProxy rfb) {
-		super(reader, repaintController, clipboardController, decoders,context, true);
+		super(reader, repaintController, clipboardController, decoders, context);
 		//super(reader, new NullRepaintController(), clipboardController, decoders,context, true);
 		Decoder decoder = new ZRLEESender(rfb);
 		decoders.setDecoderByType(EncodingType.ZLIB, decoder);
 		decoders.setDecoderByType(EncodingType.ZRLE, decoder);
 	}
-
+	
+	public TreeTask(Reader reader, IRepaintController repaintController,
+			ClipboardController clipboardController,
+			DecodersContainer decoders, ProtocolContext context, MyRfbProtoClient rfb) {
+		super(reader, repaintController, clipboardController, decoders, context);
+		Decoder decoder = new ZRLEESender(rfb);
+	}
 	/*  public void framebufferUpdateMessage() throws CommonException {
 	 * 
 	 *  (non-Javadoc)
--- a/src/main/java/jp/ac/u_ryukyu/treevnc/client/MyRfbProtoClient.java	Fri Aug 31 18:21:20 2012 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/treevnc/client/MyRfbProtoClient.java	Sat Sep 01 19:24:07 2012 +0900
@@ -15,6 +15,7 @@
 import java.util.zip.Inflater;
 
 import jp.ac.u_ryukyu.treevnc.MulticastQueue;
+import jp.ac.u_ryukyu.treevnc.test.MyRfbProto;
 
 
 import com.glavsoft.exceptions.TransportException;
@@ -24,7 +25,7 @@
 import com.glavsoft.viewer.ContainerManager;
 import com.glavsoft.viewer.swing.ParametersHandler.ConnectionParams;
 
-public class MyRfbProtoClient {
+public class MyRfbProtoClient extends MyRfbProto {
 	final static int FramebufferUpdate = 0;
 	final static int CheckDelay = 11;
 	final static String versionMsg_3_855 = "RFB 003.855\n";
--- a/src/main/java/jp/ac/u_ryukyu/treevnc/client/TextBoxClient.java	Fri Aug 31 18:21:20 2012 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/treevnc/client/TextBoxClient.java	Sat Sep 01 19:24:07 2012 +0900
@@ -95,6 +95,7 @@
 		contentPane.add(panel, BorderLayout.CENTER);
 	}
 
+	/*
 	private void reportWindow() {
 		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 		Container pane = getContentPane();
@@ -104,6 +105,7 @@
 		label.setFont(new Font("Arial", Font.PLAIN, 20));
 		pane.add(label);
 	}
+	*/
 
 	public String getAddressOption() {
 		while (!(flag)) {
--- a/src/main/java/jp/ac/u_ryukyu/treevnc/client/WaitReply.java	Fri Aug 31 18:21:20 2012 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/treevnc/client/WaitReply.java	Sat Sep 01 19:24:07 2012 +0900
@@ -9,14 +9,12 @@
 
 public class WaitReply extends Thread {
 	InterfaceForViewer client;
-	private String treenum;
 	boolean passflag;
 	
 
 
 	public WaitReply(String treenum, InterfaceForViewer client) {
 		this.client = client;
-		this.treenum = treenum;
 	}
 	
 	public boolean checkPath() {
--- a/src/main/java/jp/ac/u_ryukyu/treevnc/server/AcceptClient.java	Fri Aug 31 18:21:20 2012 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/treevnc/server/AcceptClient.java	Sat Sep 01 19:24:07 2012 +0900
@@ -121,14 +121,6 @@
 		}
 		//displyLinkedList(ls);
 	}
-	
-	private void displyLinkedList( LinkedList<String> ls) {
-		int g = 0;
-		for (String bs : ls) {
-			System.out.println(g + "number" + bs);
-			g++;
-		}
-	}
 
 	private String decisionLeader(int counter, int treebranch) {
 		if ((counter - 1) % treebranch == 1) { // children in most young treenum
--- a/src/main/java/jp/ac/u_ryukyu/treevnc/server/MyRfbProtoProxy.java	Fri Aug 31 18:21:20 2012 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/treevnc/server/MyRfbProtoProxy.java	Sat Sep 01 19:24:07 2012 +0900
@@ -13,7 +13,6 @@
 
 import org.junit.Test;
 
-import com.glavsoft.exceptions.CommonException;
 import com.glavsoft.exceptions.TransportException;
 import com.glavsoft.rfb.encoding.EncodingType;
 import com.glavsoft.rfb.protocol.Protocol;
@@ -30,8 +29,9 @@
 import java.util.zip.Inflater;
 
 import jp.ac.u_ryukyu.treevnc.MulticastQueue;
+import jp.ac.u_ryukyu.treevnc.test.MyRfbProto;
 
-public class MyRfbProtoProxy {
+public class MyRfbProtoProxy extends MyRfbProto {
 	final static String versionMsg_3_855 = "RFB 003.855\n";
 	/**
 	 * CheckMillis is one of new msgType for RFB 3.855.
--- a/src/main/java/jp/ac/u_ryukyu/treevnc/server/RequestScreenThread.java	Fri Aug 31 18:21:20 2012 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/treevnc/server/RequestScreenThread.java	Sat Sep 01 19:24:07 2012 +0900
@@ -1,7 +1,5 @@
 package jp.ac.u_ryukyu.treevnc.server;
 
-import java.io.IOException;
-
 import com.glavsoft.rfb.protocol.Protocol;
 
 public class RequestScreenThread implements Runnable {
--- a/src/main/java/jp/ac/u_ryukyu/treevnc/server/VncProxyService.java	Fri Aug 31 18:21:20 2012 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/treevnc/server/VncProxyService.java	Sat Sep 01 19:24:07 2012 +0900
@@ -63,7 +63,6 @@
 	private AcceptClient aClient;
 	private Thread bCast;
 	private Thread accThread;
-	private Thread rfbThread;
 	private AcceptThread acceptThread;
 	private GetBroadCastProxy getCast;
 	
@@ -182,7 +181,6 @@
 	
 	public void createConnection() {
 		rfb.selectPort(5999);
-		rfbThread = new Thread(this);
 		acceptThread = new AcceptThread(rfb, 5999);
 		accThread = new Thread(acceptThread);
 		getCast = new GetBroadCastProxy(this,
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/jp/ac/u_ryukyu/treevnc/test/MyRfbProto.java	Sat Sep 01 19:24:07 2012 +0900
@@ -0,0 +1,276 @@
+package jp.ac.u_ryukyu.treevnc.test;
+
+import java.io.IOException;
+import java.net.Socket;
+import java.nio.ByteBuffer;
+import java.util.LinkedList;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import jp.ac.u_ryukyu.treevnc.MulticastQueue;
+import jp.ac.u_ryukyu.treevnc.server.AcceptThread;
+import jp.ac.u_ryukyu.treevnc.server.RequestScreenThread;
+
+import com.glavsoft.exceptions.TransportException;
+import com.glavsoft.rfb.protocol.Protocol;
+import com.glavsoft.rfb.protocol.ProtocolContext;
+import com.glavsoft.transport.Reader;
+import com.glavsoft.transport.Writer;
+
+public class MyRfbProto {
+	final static int CheckDelay = 11;
+	final static int FramebufferUpdate = 0;
+	private ProtocolContext context;
+	final static String versionMsg_3_855 = "RFB 003.855\n";
+	private int clients;
+	private MulticastQueue<LinkedList<ByteBuffer>> multicastqueue = new MulticastQueue<LinkedList<ByteBuffer>>();
+	private RequestScreenThread rThread;
+	private boolean proxyFlag = true;
+
+	
+	public void newClient(AcceptThread acceptThread, final Socket newCli,
+			final Writer os, final Reader is) throws IOException {
+		// createBimgFlag = true;
+		// rfb.addSockTmp(newCli);
+		// addSock(newCli);
+		final int myId = clients;
+		final MulticastQueue.Client<LinkedList<ByteBuffer>> c = multicastqueue.newClient();
+		final AtomicInteger writerRunning = new AtomicInteger();
+		writerRunning.set(1);
+		/**
+		 * Timeout thread. If a client is suspended, it has top of queue
+		 * indefinitely, which caused memory overflow. After the timeout, we
+		 * poll the queue and discard it. Start long wait if writer is running.
+		 */
+		final Runnable timer = new Runnable() {
+			public void run() {
+				int count = 0;
+				for (;;) {
+					long timeout = 50000 / 8;
+					try {
+						synchronized (this) {
+							int state, flag;
+							writerRunning.set(0);
+							wait(timeout);
+							flag = 0;
+							while ((state = writerRunning.get()) == 0) {
+								c.poll(); // discard, should be timeout
+								count++;
+								if (flag == 0) {
+									System.out.println("Discarding " + myId
+											+ " count=" + count);
+									flag = 1;
+								}
+								wait(10); // if this is too short, writer cannot
+											// take the poll, if this is too
+											// long, memory will overflow...
+							}
+							if (flag == 1)
+								System.out.println("Resuming " + myId
+										+ " count=" + count);
+							if (state != 1) {
+								System.out.println("Client died " + myId);
+								break;
+							}
+						}
+					} catch (InterruptedException e) {
+					}
+				}
+			}
+		};
+		new Thread(timer).start();
+		/**
+		 * discard all incoming from clients
+		 */
+		final Runnable reader = new Runnable() {
+			public void run() {
+				byte b[] = new byte[4096];
+				for (;;) {
+					try {
+						int c = is.readByte(b);
+						if (c <= 0)
+							throw new IOException();
+						// System.out.println("client read "+c);
+					} catch (IOException e) {
+						try {
+							writerRunning.set(2);
+							os.close();
+							is.close();
+						} catch (IOException e1) {
+						} catch (TransportException e1) {
+							e1.printStackTrace();
+						}
+						return;
+					} catch (TransportException e) {
+						e.printStackTrace();
+					}
+				}
+			}
+		};
+		/**
+		 * send packets to a client
+		 */
+		Runnable sender = new Runnable() {
+			public void run() {
+				writerRunning.set(1);
+				try {
+					requestThreadNotify();
+					// rThread.checkDelay();
+
+					/**
+					 * initial connection of RFB protocol
+					 */
+					sendRfbVersion(os);
+					// readVersionMsg(is);
+					readVersionMsg(is, os);
+					sendSecurityType(os);
+					readSecType(is);
+					sendSecResult(os);
+					readClientInit(is);
+					sendInitData(os);
+					new Thread(reader).start(); // discard incoming packet here
+												// after.
+					// writeFramebufferUpdateRequest(0,0, framebufferWidth,
+					// framebufferHeight, false );
+					for (;;) {
+						LinkedList<ByteBuffer> bufs = c.poll();
+						int inputIndex = 0;
+						ByteBuffer header = bufs.get(inputIndex);
+						if (header == null)
+							continue;
+						else if (header.get(0) == CheckDelay) {
+							writeToClient(os, bufs, inputIndex);
+							continue;
+						} else if (header.get(0) == FramebufferUpdate) {
+							// System.out.println("client "+ myId);
+						}
+						/*
+						 * if(i%20==0){ sendDataCheckDelay(); } i++;
+						 */
+						writeToClient(os, bufs, inputIndex);
+						writerRunning.set(1); // yes my client is awaking.
+					}
+				} catch (IOException e) {
+					try {
+						writerRunning.set(2);
+						os.close();
+					} catch (IOException e1) {
+					}
+					/* if socket closed cliList.remove(newCli); */
+				} catch (TransportException e) {
+					e.printStackTrace();
+				}
+			}
+
+			public void writeToClient(final Writer os,
+					LinkedList<ByteBuffer> bufs, int inputIndex)
+					throws TransportException {
+				while (inputIndex < bufs.size()) {
+					ByteBuffer b = bufs.get(inputIndex++);
+					os.write(b.array(), b.position(), b.limit());
+				}
+				os.flush();
+			}
+		};
+		clients++;
+		new Thread(sender).start();
+
+	}
+	
+	public synchronized void requestThreadNotify() {
+		rThread.reStart();
+	}
+	
+	private void sendRfbVersion(Writer writer) throws IOException, TransportException {
+		// os.write(versionMsg_3_8.getBytes());
+		writer.write(versionMsg_3_855.getBytes());
+	}
+	
+	private int readVersionMsg(Reader reader, Writer writer) throws IOException, TransportException {
+
+		byte[] b = new byte[12];
+
+		reader.readBytes(b);
+
+		if ((b[0] != 'R') || (b[1] != 'F') || (b[2] != 'B') || (b[3] != ' ')
+				|| (b[4] < '0') || (b[4] > '9') || (b[5] < '0') || (b[5] > '9')
+				|| (b[6] < '0') || (b[6] > '9') || (b[7] != '.')
+				|| (b[8] < '0') || (b[8] > '9') || (b[9] < '0') || (b[9] > '9')
+				|| (b[10] < '0') || (b[10] > '9') || (b[11] != '\n')) {
+			throw new IOException("this is not an RFB server");
+		}
+
+		int rfbMajor = (b[4] - '0') * 100 + (b[5] - '0') * 10 + (b[6] - '0');
+		int rfbMinor = (b[8] - '0') * 100 + (b[9] - '0') * 10 + (b[10] - '0');
+
+		if (rfbMajor < 3) {
+			throw new IOException(
+					"RFB server does not support protocol version 3");
+		}
+
+		if (rfbMinor == 855) {
+			sendProxyFlag(writer);
+			if (proxyFlag)
+				sendPortNumber(writer);
+		}
+		return rfbMinor;
+	}
+	
+	private void sendProxyFlag(Writer writer) throws TransportException {
+		if (proxyFlag)
+			writer.writeInt(1);
+		else
+			writer.writeInt(0);
+	}
+
+	private void sendPortNumber(Writer writer) throws TransportException {
+		byte[] b = new byte[4];
+		//b = castIntByte(getHost.getPort());
+		b = castIntByte(9999);
+		writer.write(b);
+	}
+	
+	private byte[] castIntByte(int len) {
+		byte[] b = new byte[4];
+		b[0] = (byte) ((len >>> 24) & 0xFF);
+		b[1] = (byte) ((len >>> 16) & 0xFF);
+		b[2] = (byte) ((len >>> 8) & 0xFF);
+		b[3] = (byte) ((len >>> 0) & 0xFF);
+		return b;
+	}
+	
+	private void readSecType(Reader reader) throws TransportException {
+		byte[] b = new byte[1];
+		reader.read(b);
+	}
+	
+	private void sendSecurityType(Writer os) throws TransportException {
+		// number-of-security-types
+		os.writeInt(1);
+		// security-types
+		// 1:None
+		os.writeInt(1);
+
+		/*
+		 * os.write(4); os.write(30); os.write(31); os.write(32); os.write(35);
+		 * os.flush();
+		 */
+	}
+	
+	private void sendSecResult(Writer os) throws TransportException {
+		byte[] b = castIntByte(0);
+		os.write(b);
+	}
+
+	private void readClientInit(Reader in) throws TransportException {
+		byte[] b = new byte[0];
+		in.readBytes(b);
+	}
+	
+	private void sendInitData(Writer os) throws TransportException {
+		os.write(context.getInitData());
+	}
+	
+    public void setProtocolContext(Protocol workingProtocol) {
+        context = workingProtocol;
+    }
+}
--- a/src/viewer_swing/java/com/glavsoft/viewer/ConnectionManager.java	Fri Aug 31 18:21:20 2012 +0900
+++ b/src/viewer_swing/java/com/glavsoft/viewer/ConnectionManager.java	Sat Sep 01 19:24:07 2012 +0900
@@ -38,10 +38,6 @@
 import java.net.Socket;
 import java.net.UnknownHostException;
 
-import jp.ac.u_ryukyu.treevnc.client.GetDataClient;
-import jp.ac.u_ryukyu.treevnc.client.GetHostClient;
-import jp.ac.u_ryukyu.treevnc.client.TextBoxClient;
-
 
 public class ConnectionManager implements Serializable {
 	/**
--- a/src/viewer_swing/java/com/glavsoft/viewer/ContainerManager.java	Fri Aug 31 18:21:20 2012 +0900
+++ b/src/viewer_swing/java/com/glavsoft/viewer/ContainerManager.java	Sat Sep 01 19:24:07 2012 +0900
@@ -34,7 +34,6 @@
 import java.awt.event.*;
 import java.io.Serializable;
 
-import jp.ac.u_ryukyu.treevnc.client.MyVncClient;
 
 public class ContainerManager implements Serializable {
 	/**
--- a/src/viewer_swing/java/com/glavsoft/viewer/TreeConnectionManager.java	Fri Aug 31 18:21:20 2012 +0900
+++ b/src/viewer_swing/java/com/glavsoft/viewer/TreeConnectionManager.java	Sat Sep 01 19:24:07 2012 +0900
@@ -26,7 +26,6 @@
 	@Override
 	public Socket connectToHost(final ParametersHandler.ConnectionParams connectionParams, ProtocolSettings settings) {
 		Socket socket = null;
-		boolean wasError = false;
 		GetHostClient bCast = new GetHostClient("who");
 		bCast.createSocket();
 		bCast.sendData();
@@ -47,18 +46,15 @@
 			Viewer.logger.info("Connecting to host " + connectionParams.hostName + ":" + connectionParams.portNumber);
 			try {
 				socket = new Socket(connectionParams.hostName, connectionParams.portNumber);
-				wasError = false;
 			} catch (UnknownHostException e) {
 				Viewer.logger.severe("Unknown host: " + connectionParams.hostName);
 				showConnectionErrorDialog("Unknown host: '" + connectionParams.hostName + "'");
-				wasError = true;
 			} catch (IOException e) {
 				Viewer.logger.severe("Couldn't connect to: " +
 						connectionParams.hostName + ":" + connectionParams.portNumber +
 						": " + e.getMessage());
 				showConnectionErrorDialog("Couldn't connect to: '" + connectionParams.hostName +
 						"'\n" + e.getMessage());
-				wasError = true;
 			}
 		return socket;
 	}