changeset 16:e654b2e4de64

add TreeTask.java
author one
date Mon, 27 Aug 2012 06:31:14 +0900
parents 5d43194fdc51
children 718cdde720d4
files src/main/java/com/glavsoft/rfb/protocol/Protocol.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/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
diffstat 6 files changed, 174 insertions(+), 41 deletions(-) [+]
line wrap: on
line diff
--- a/src/main/java/com/glavsoft/rfb/protocol/Protocol.java	Sun Aug 26 12:51:54 2012 +0900
+++ b/src/main/java/com/glavsoft/rfb/protocol/Protocol.java	Mon Aug 27 06:31:14 2012 +0900
@@ -37,9 +37,14 @@
 import com.glavsoft.rfb.protocol.state.ProtocolState;
 import com.glavsoft.transport.Reader;
 import com.glavsoft.transport.Writer;
+import com.glavsoft.viewer.swing.ClipboardControllerImpl;
+import com.glavsoft.viewer.swing.Surface;
 
 import java.util.logging.Logger;
 
+import jp.ac.u_ryukyu.treevnc.server.MyRfbProtoProxy;
+import jp.ac.u_ryukyu.treevnc.server.VncProxyService;
+
 public class Protocol implements ProtocolContext, IChangeSettingsListener {
 	private ProtocolState state;
 	private final Logger logger = Logger.getLogger("com.glavsoft.rfb.protocol");
@@ -275,4 +280,19 @@
 		}
 	}
 
+	public void startNormalHandling(VncProxyService vncProxyService,
+			Surface surface, ClipboardControllerImpl clipboardController,
+			MyRfbProtoProxy rfb) 
+	{
+		this.rfbSessionListener = vncProxyService;
+		this.repaintController = surface;
+		decoders.resetDecoders();
+		receiverTask = new TreeTask(
+				reader, repaintController,
+				clipboardController,
+				decoders, this,true);
+		receiverThread = new Thread(receiverTask);
+		receiverThread.start();
+	}
+	
 }
--- a/src/main/java/com/glavsoft/rfb/protocol/ReceiverTask.java	Sun Aug 26 12:51:54 2012 +0900
+++ b/src/main/java/com/glavsoft/rfb/protocol/ReceiverTask.java	Mon Aug 27 06:31:14 2012 +0900
@@ -51,17 +51,29 @@
 	private static final byte SERVER_CUT_TEXT = 3;
 
 
-	private static Logger logger = Logger.getLogger("com.glavsoft.rfb.protocol.ReceiverTask");
-	private final Reader reader;
+	protected static Logger logger = Logger.getLogger("com.glavsoft.rfb.protocol.ReceiverTask");
+	protected final Reader reader;
 	private volatile boolean isRunning = false;
-	private Renderer renderer;
-	private final IRepaintController repaintController;
+	protected Renderer renderer;
+	protected final IRepaintController repaintController;
 	private final ClipboardController clipboardController;
-	private final DecodersContainer decoders;
-	private FramebufferUpdateRequestMessage fullscreenFbUpdateIncrementalRequest;
-	private final ProtocolContext context;
+	protected final DecodersContainer decoders;
+	protected FramebufferUpdateRequestMessage fullscreenFbUpdateIncrementalRequest;
+	protected final ProtocolContext context;
 	private PixelFormat pixelFormat;
 	private 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;
+		fullscreenFbUpdateIncrementalRequest =
+				new FramebufferUpdateRequestMessage(0, 0, context.getFbWidth(), context.getFbHeight(), true);
+	}
 
 	public ReceiverTask(Reader reader,
 	                    IRepaintController repaintController, ClipboardController clipboardController,
@@ -76,7 +88,7 @@
 		fullscreenFbUpdateIncrementalRequest =
 			new FramebufferUpdateRequestMessage(0, 0, context.getFbWidth(), context.getFbHeight(), true);
 	}
-
+	
 	@Override
 	public void run() {
 		isRunning = true;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/com/glavsoft/rfb/protocol/TreeTask.java	Mon Aug 27 06:31:14 2012 +0900
@@ -0,0 +1,74 @@
+package com.glavsoft.rfb.protocol;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+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.*;
+
+import com.glavsoft.exceptions.CommonException;
+import com.glavsoft.exceptions.TransportException;
+import com.glavsoft.rfb.ClipboardController;
+import com.glavsoft.rfb.IRepaintController;
+import com.glavsoft.rfb.client.FramebufferUpdateRequestMessage;
+import com.glavsoft.rfb.client.SetPixelFormatMessage;
+import com.glavsoft.rfb.encoding.EncodingType;
+import com.glavsoft.rfb.encoding.decoder.Decoder;
+import com.glavsoft.rfb.encoding.decoder.DecodersContainer;
+import com.glavsoft.rfb.encoding.decoder.FramebufferUpdateRectangle;
+import com.glavsoft.rfb.encoding.decoder.RichCursorDecoder;
+import com.glavsoft.transport.Reader;
+
+public class TreeTask extends ReceiverTask {
+	private MulticastQueue<LinkedList<ByteBuffer>> multicastqueue = new MulticastQueue<LinkedList<ByteBuffer>>();
+	private int clients = 0;
+	private RequestScreenThread rThread;
+	final static String versionMsg_3_855 = "RFB 003.855\n";
+	private Reader reader;
+	
+	public TreeTask(Reader reader, IRepaintController repaintController,
+			ClipboardController clipboardController,
+			DecodersContainer decoders, ProtocolContext context,boolean flag) {
+		super(reader, repaintController, clipboardController, decoders, context,true);
+	}
+	
+	@Override
+	public void framebufferUpdateMessage() throws CommonException{
+		reader.readByte(); // padding
+		int numberOfRectangles = reader.readUInt16();
+		while (numberOfRectangles-- > 0) {
+			FramebufferUpdateRectangle rect = new FramebufferUpdateRectangle();
+			rect.fill(reader);
+
+			Decoder decoder = decoders.getDecoderByType(rect.getEncodingType());
+			logger.finest(rect.toString() + (0 == numberOfRectangles ? "\n---" : ""));
+			if (decoder != null) {
+				decoder.decode(reader, renderer, rect);
+				repaintController.repaintBitmap(rect);
+			} else if (rect.getEncodingType() == EncodingType.RICH_CURSOR) {
+				RichCursorDecoder.getInstance().decode(reader, renderer, rect);
+				repaintController.repaintCursor();
+			} else if (rect.getEncodingType() == EncodingType.CURSOR_POS) {
+				renderer.decodeCursorPosition(rect);
+				repaintController.repaintCursor();
+			} else if (rect.getEncodingType() == EncodingType.DESKTOP_SIZE) {
+				fullscreenFbUpdateIncrementalRequest =
+					new FramebufferUpdateRequestMessage(0, 0, rect.width, rect.height, true);
+				synchronized (renderer) {
+					renderer = repaintController.createRenderer(reader, rect.width, rect.height,
+							context.getPixelFormat());
+				}
+				//				repaintController.repaintCursor();
+			} else
+				throw new CommonException("Unprocessed encoding: " + rect.toString());
+		}
+	}
+
+
+}
--- a/src/main/java/jp/ac/u_ryukyu/treevnc/server/MyRfbProtoProxy.java	Sun Aug 26 12:51:54 2012 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/treevnc/server/MyRfbProtoProxy.java	Mon Aug 27 06:31:14 2012 +0900
@@ -26,7 +26,7 @@
 import com.glavsoft.exceptions.TransportException;
 import com.glavsoft.rfb.encoding.EncodingType;
 import com.glavsoft.transport.Reader;
-
+import com.glavsoft.transport.Writer;
 
 //import myVncProxy.MulticastQueue.Client;
 
@@ -47,6 +47,7 @@
 	final static byte SpeedCheckMillis = 4;
 	final static int FramebufferUpdate = 0;
 	final static int CheckDelay = 11;
+	final static int FramebufferUpdateRequest = 3;
 
 	// Secyrity type of OS X
 	final static int SecTypeReqAccess = 32;
@@ -66,7 +67,6 @@
 	private int encoding;
 	private int zLen;
 	private boolean clicomp = false;
-	
 
 	private ServerSocket servSock;
 	protected int acceptPort;
@@ -77,6 +77,7 @@
 	boolean createBimgFlag;
 	boolean proxyFlag = true;
 	private Reader reader;
+	private Writer writer;
 	ExecutorService executor;
 
 	byte[] pngBytes;
@@ -93,10 +94,13 @@
 	private Thread requestThread;
 
 	public MyRfbProtoProxy() {
+		rThread = new RequestScreenThread(this);
+		requestThread = new Thread(rThread);
 	}
 
-	public void setReader(Reader _reader) {
+	public void setStream(Reader _reader, Writer _writer) {
 		reader = _reader;
+		writer = _writer;
 	}
 
 	void initServSock(int port) throws IOException {
@@ -159,7 +163,6 @@
 		}
 	}
 
-
 	void requestThreadStart() {
 		requestThread.start();
 	}
@@ -283,33 +286,36 @@
 	 *             for each packet. ZRLEE can be invisible from user, but it
 	 *             have to be implemented in the clients. ZRLEE compression is
 	 *             not context dependent, so no recompression is necessary.
-	 * @throws TransportException 
+	 * @throws TransportException
 	 */
 
-	void readSendData(int dataLen) throws IOException, DataFormatException, TransportException {
+	void readSendData(int dataLen) throws IOException, DataFormatException,
+			TransportException {
 		LinkedList<ByteBuffer> bufs = new LinkedList<ByteBuffer>();
 		ByteBuffer header = ByteBuffer.allocate(16);
 		reader.readBytes(header.array(), 0, 16);
 		header.limit(16);
-		if (header.get(0) ==  FramebufferUpdate) {
+		if (header.get(0) == FramebufferUpdate) {
 			int encoding = header.getInt(12);
 			if (encoding == EncodingType.ZRLE.getId()
-					|| encoding == EncodingType.ZLIB.getId()) { // ZRLEE is already
-															// recompressed
+					|| encoding == EncodingType.ZLIB.getId()) { // ZRLEE is
+																// already
+				// recompressed
 				ByteBuffer len = ByteBuffer.allocate(4);
 				reader.readBytes(len.array(), 0, 4);
 				len.limit(4);
 				ByteBuffer inputData = ByteBuffer.allocate(dataLen - 20);
 
 				reader.readBytes(inputData.array(), 0, inputData.capacity());
-//				System.out.println(dataLen);
+				// System.out.println(dataLen);
 				inputData.limit(dataLen - 20);
 
 				LinkedList<ByteBuffer> inputs = new LinkedList<ByteBuffer>();
 				inputs.add(inputData);
 
-				header.putInt(12, EncodingType.ZRLEE.getId()); // means recompress
-															// every time
+				header.putInt(12, EncodingType.ZRLEE.getId()); // means
+																// recompress
+																// every time
 				// using new Deflecter every time is incompatible with the
 				// protocol, clients have to be modified.
 				Deflater nDeflater = deflater; // new Deflater();
@@ -323,8 +329,8 @@
 				bufs.addFirst(blen);
 
 				bufs.addFirst(header);
-			//	if(dataLen<=64000)
-					multicastqueue.put(bufs);
+				// if(dataLen<=64000)
+				multicastqueue.put(bufs);
 				// is.reset();
 
 				/*
@@ -458,7 +464,7 @@
 												// after.
 					// writeFramebufferUpdateRequest(0,0, framebufferWidth,
 					// framebufferHeight, false );
-					int i  = 0;
+					int i = 0;
 					for (;;) {
 						LinkedList<ByteBuffer> bufs = c.poll();
 						int inputIndex = 0;
@@ -472,11 +478,8 @@
 							// System.out.println("client "+ myId);
 						}
 						/*
-						if(i%20==0){
-							sendDataCheckDelay();
-						}
-						i++;
-						*/
+						 * if(i%20==0){ sendDataCheckDelay(); } i++;
+						 */
 						writeToClient(os, bufs, inputIndex);
 						writerRunning.set(1); // yes my client is awaking.
 					}
@@ -636,12 +639,12 @@
 			}
 		};
 	}
-	
+
 	void sendRfbVersion(OutputStream os) throws IOException {
 		// os.write(versionMsg_3_8.getBytes());
 		os.write(versionMsg_3_855.getBytes());
 	}
-	
+
 	int readVersionMsg(InputStream is, OutputStream os) throws IOException {
 
 		byte[] b = new byte[12];
@@ -671,14 +674,14 @@
 		}
 		return rfbMinor;
 	}
-	
+
 	void sendProxyFlag(OutputStream os) throws IOException {
 		if (proxyFlag)
 			os.write(1);
 		else
 			os.write(0);
 	}
-	
+
 	void sendPortNumber(OutputStream os) throws IOException {
 		byte[] b = new byte[4];
 		b = castIntByte(geth.port);
@@ -692,8 +695,8 @@
 		else
 			return false;
 	}
-	
-		void sendSecurityType(OutputStream os) throws IOException {
+
+	void sendSecurityType(OutputStream os) throws IOException {
 		// number-of-security-types
 		os.write(1);
 		// security-types
@@ -752,7 +755,7 @@
 		byte[] b = castIntByte(0);
 		os.write(b);
 	}
-	
+
 	byte[] castIntByte(int len) {
 		byte[] b = new byte[4];
 		b[0] = (byte) ((len >>> 24) & 0xFF);
@@ -770,5 +773,23 @@
 	void sendInitData(OutputStream os) throws IOException {
 		os.write(initData);
 	}
-	
+
+	void writeFramebufferUpdateRequest(int x, int y, int w, int h,
+			boolean incremental) throws IOException, TransportException {
+		byte[] b = new byte[10];
+
+		b[0] = (byte) FramebufferUpdateRequest;
+		b[1] = (byte) (incremental ? 1 : 0);
+		b[2] = (byte) ((x >> 8) & 0xff);
+		b[3] = (byte) (x & 0xff);
+		b[4] = (byte) ((y >> 8) & 0xff);
+		b[5] = (byte) (y & 0xff);
+		b[6] = (byte) ((w >> 8) & 0xff);
+		b[7] = (byte) (w & 0xff);
+		b[8] = (byte) ((h >> 8) & 0xff);
+		b[9] = (byte) (h & 0xff);
+
+		writer.write(b);
+	}
+
 }
--- a/src/main/java/jp/ac/u_ryukyu/treevnc/server/RequestScreenThread.java	Sun Aug 26 12:51:54 2012 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/treevnc/server/RequestScreenThread.java	Mon Aug 27 06:31:14 2012 +0900
@@ -2,8 +2,11 @@
 
 import java.io.IOException;
 
+import com.glavsoft.rfb.protocol.Protocol;
+
 public class RequestScreenThread implements Runnable {
 	MyRfbProtoProxy rfb;
+	Protocol protocol;
 
 	RequestScreenThread(MyRfbProtoProxy _rfb) {
 		rfb = _rfb;
@@ -14,8 +17,8 @@
 			try {
 				waitThread();
 				Thread.sleep(3000);
-				rfb.writeFramebufferUpdateRequest(0, 0, rfb.framebufferWidth,
-						rfb.framebufferHeight, false);
+				rfb.writeFramebufferUpdateRequest(0, 0, protocol.getFbWidth(),
+						protocol.getFbHeight(), false);
 
 			} catch (Exception e) {
 				e.printStackTrace();
@@ -36,5 +39,4 @@
     	notify();
     }
     
-    
 }
--- a/src/main/java/jp/ac/u_ryukyu/treevnc/server/VncProxyService.java	Sun Aug 26 12:51:54 2012 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/treevnc/server/VncProxyService.java	Mon Aug 27 06:31:14 2012 +0900
@@ -22,6 +22,7 @@
 import com.glavsoft.viewer.cli.Parser;
 import com.glavsoft.viewer.swing.ClipboardControllerImpl;
 import com.glavsoft.viewer.swing.ParametersHandler;
+import com.glavsoft.viewer.swing.Surface;
 import com.glavsoft.viewer.swing.UiSettings;
 import com.glavsoft.viewer.swing.ParametersHandler.ConnectionParams;
 
@@ -128,7 +129,7 @@
 				workingSocket.setTcpNoDelay(true); // disable Nagle algorithm
 				Reader reader = new Reader(workingSocket.getInputStream());
 				Writer writer = new Writer(workingSocket.getOutputStream());
-				rfb.setReader(reader);
+				rfb.setStream(reader,writer);
 				workingProtocol = new Protocol(reader, writer,
 						new PasswordChooser(passwordFromParams, connectionParams, containerFrame, this),
 						settings);
@@ -143,7 +144,10 @@
 				clipboardController.setEnabled(settings.isAllowClipboardTransfer());
 				settings.addListener(clipboardController);
 				
-
+				surface = new Surface(workingProtocol, this, uiSettings.getScaleFactor());
+				
+				workingProtocol.startNormalHandling(this, surface, clipboardController,rfb);
+				// workingProtocol.startNormalHandling(this, surface, clipboardController);
 				tryAgain = false;
 			} catch (UnsupportedProtocolVersionException e) {
 				connectionManager.showReconnectDialog("Unsupported Protocol Version", e.getMessage());