changeset 107:a8b2712de4c5

ZRLEE extension
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Fri, 05 Aug 2011 08:57:00 +0900
parents 7a7baebdd3cf
children 4199efcc4260
files src/myVncProxy/MyRfbProto.java src/myVncProxy/RfbProto.java src/myVncProxy/VncCanvas.java
diffstat 3 files changed, 34 insertions(+), 48 deletions(-) [+]
line wrap: on
line diff
--- a/src/myVncProxy/MyRfbProto.java	Thu Aug 04 21:09:17 2011 +0900
+++ b/src/myVncProxy/MyRfbProto.java	Fri Aug 05 08:57:00 2011 +0900
@@ -32,7 +32,7 @@
 import java.io.OutputStream;
 
 public
-class MyRfbProto<ByteBuffersIterator> extends RfbProto {
+class MyRfbProto extends RfbProto {
 	final static String versionMsg_3_998 = "RFB 003.998\n";
 	/**
 	 * CheckMillis is one of new msgType for RFB 3.998. 
@@ -310,7 +310,7 @@
 		rectH = readU16();           //  10
 		encoding = readU32();      //   12
 		System.out.println("encoding = "+encoding);
-		if (encoding == EncodingZRLE)
+		if (encoding == EncodingZRLE|| encoding==EncodingZRLEE||encoding==EncodingZlib)
 			zLen = readU32();
 		else
 			zLen = 0;
@@ -338,6 +338,7 @@
 			break;
 		case RfbProto.EncodingZlib:
 		case RfbProto.EncodingZRLE:
+		case RfbProto.EncodingZRLEE:
 			dataLen = zLen + 20;
 			is.mark(dataLen);
 			break;
@@ -581,26 +582,24 @@
 		header.limit(16);
 		if (header.get(0)==RfbProto.FramebufferUpdate) {
 			int encoding = header.getInt(12);
-			if (encoding==RfbProto.EncodingZlib||encoding==RfbProto.EncodingZRLE) {
+			if (encoding==RfbProto.EncodingZRLE||encoding==RfbProto.EncodingZlib) { // ZRLEE is already recompressed
 				ByteBuffer len = ByteBuffer.allocate(4);
 				readFully(len.array(),0,4); len.limit(4);
 				ByteBuffer inputData = ByteBuffer.allocate(dataLen-20);
 				readFully(inputData.array(),0,inputData.capacity()); inputData.limit(dataLen-20);
 				LinkedList<ByteBuffer>inputs = new LinkedList<ByteBuffer>();
 				inputs.add(inputData);
-				// int length = rectW * rectH * (bitsPerPixel/8);
-				if (clicomp) {
-					unzip(inflater, inputs, 0, bufs, INFLATE_BUFSIZE);
-				} else {
-					// using new Deflecter every time is incompatible with the protocol, clients have to be modified.
-					Deflater nDeflater = deflater; // new Deflater();
-					LinkedList<ByteBuffer> out = new LinkedList<ByteBuffer>();
-					unzip(inflater, inputs, 0 , out, INFLATE_BUFSIZE);
-					// dump32(inputs);
-					int len2 = zip(nDeflater, out, 0, bufs);
-					ByteBuffer blen = ByteBuffer.allocate(4); blen.putInt(len2); blen.flip();
-					bufs.addFirst(blen);
-				}
+
+				header.putInt(12, RfbProto.EncodingZRLEE); // means recompress every time
+				// using new Deflecter every time is incompatible with the protocol, clients have to be modified.
+				Deflater nDeflater = deflater; // new Deflater();
+				LinkedList<ByteBuffer> out = new LinkedList<ByteBuffer>();
+				unzip(inflater, inputs, 0 , out, INFLATE_BUFSIZE);
+				// dump32(inputs);
+				int len2 = zip(nDeflater, out, 0, bufs);
+				ByteBuffer blen = ByteBuffer.allocate(4); blen.putInt(len2); blen.flip();
+				bufs.addFirst(blen);
+
 				bufs.addFirst(header);
 				multicastqueue.put(bufs);
 				is.reset();
@@ -647,9 +646,9 @@
 				}
 			}
 		};
+		final int myId = clients; 
 		Runnable sender = new Runnable() {
 			public void run() {
-			    Deflater deflater = new Deflater();
 				try {
 					/**
 					 *  initial connection of RFB protocol
@@ -668,24 +667,7 @@
 						ByteBuffer header = bufs.get(inputIndex++);
 						if (header==null) continue;
 						if (header.get(0)==RfbProto.FramebufferUpdate) {
-							System.out.println("client "+ clients);
-							int encoding = header.getInt(12);
-							if (encoding==RfbProto.EncodingZlib||encoding==RfbProto.EncodingZRLE) {
-								LinkedList<ByteBuffer> outs;
-								if (clicomp) {
-									outs = new LinkedList<ByteBuffer>();
-									int len2 = zip(deflater, bufs, inputIndex, outs);
-									ByteBuffer blen = ByteBuffer.allocate(4); blen.putInt(len2); blen.flip();
-									outs.addFirst(blen);
-									outs.addFirst(header);
-									inputIndex = 0;
-								} else {
-									outs = bufs;
-									inputIndex = 0;
-								}
-								writeToClient(os,bufs,inputIndex);
-								continue;
-							}
+							System.out.println("client "+ myId);
 						}
 						os.write(header.array(),header.position(),header.limit());
 						writeToClient(os, bufs, inputIndex);
@@ -738,14 +720,15 @@
 			LinkedList<ByteBuffer> in = new LinkedList<ByteBuffer>();
 			LinkedList<ByteBuffer> out = new LinkedList<ByteBuffer>();
 			LinkedList<ByteBuffer> out2 = new LinkedList<ByteBuffer>();
-			if (false) {
-			for(int i=0;i<10;i++) {
-				in.add(ByteBuffer.wrap("test1".getBytes()));
-				in.add(ByteBuffer.wrap("test2".getBytes()));
-				in.add(ByteBuffer.wrap("test3".getBytes()));
-				in.add(ByteBuffer.wrap("test44".getBytes()));
-			}
-			} else {
+//			if (false) {
+//			for(int i=0;i<10;i++) {
+//				in.add(ByteBuffer.wrap("test1".getBytes()));
+//				in.add(ByteBuffer.wrap("test2".getBytes()));
+//				in.add(ByteBuffer.wrap("test3".getBytes()));
+//				in.add(ByteBuffer.wrap("test44".getBytes()));
+//			}
+//			} else 
+			{
 				String t = "";
 				for(int i=0;i<10;i++) {
 					t += "test1";
--- a/src/myVncProxy/RfbProto.java	Thu Aug 04 21:09:17 2011 +0900
+++ b/src/myVncProxy/RfbProto.java	Fri Aug 05 08:57:00 2011 +0900
@@ -79,7 +79,7 @@
 	// Supported encodings and pseudo-encodings
 	final static int EncodingRaw = 0, EncodingCopyRect = 1, EncodingRRE = 2,
  			EncodingCoRRE = 4, EncodingHextile = 5, EncodingZlib = 6,
-			EncodingTight = 7, EncodingZRLE = 16,
+			EncodingTight = 7, EncodingZRLEE = 15, EncodingZRLE = 16,
 			EncodingCompressLevel0 = 0xFFFFFF00,
 			EncodingQualityLevel0 = 0xFFFFFFE0, EncodingXCursor = 0xFFFFFF10,
 			EncodingRichCursor = 0xFFFFFF11, EncodingPointerPos = 0xFFFFFF18,
@@ -88,6 +88,7 @@
 			SigEncodingCopyRect = "COPYRECT", SigEncodingRRE = "RRE_____",
 			SigEncodingCoRRE = "CORRE___", SigEncodingHextile = "HEXTILE_",
 			SigEncodingZlib = "ZLIB____", SigEncodingTight = "TIGHT___",
+			SigEncodingZRLEE = "ZRLEE___",
 			SigEncodingZRLE = "ZRLE____",
 			SigEncodingCompressLevel0 = "COMPRLVL",
 			SigEncodingQualityLevel0 = "JPEGQLVL",
@@ -471,7 +472,9 @@
 		encodingCaps.add(EncodingHextile, StandardVendor, SigEncodingHextile,
 				"Standard Hextile encoding");
 		encodingCaps.add(EncodingZRLE, StandardVendor, SigEncodingZRLE,
-				"Standard ZRLE encoding");
+	    		"Standard ZRLE encoding");		
+		encodingCaps.add(EncodingZRLEE, StandardVendor, SigEncodingZRLEE,
+	    		"Standard ZRLE(E) encoding");
 		encodingCaps.add(EncodingZlib, TridiaVncVendor, SigEncodingZlib,
 				"Zlib encoding");
 		encodingCaps.add(EncodingTight, TightVncVendor, SigEncodingTight,
@@ -726,6 +729,7 @@
 
 		if (updateRectEncoding == EncodingZlib
 				|| updateRectEncoding == EncodingZRLE
+				|| updateRectEncoding == EncodingZRLEE
 				|| updateRectEncoding == EncodingTight)
 			wereZlibUpdates = true;
 
@@ -958,6 +962,8 @@
 	final static int META_MASK = InputEvent.META_MASK;
 	final static int ALT_MASK = InputEvent.ALT_MASK;
 
+
+
 	//
 	// Write a pointer event message. We may need to send modifier key events
 	// around it to set the correct modifier state.
--- a/src/myVncProxy/VncCanvas.java	Thu Aug 04 21:09:17 2011 +0900
+++ b/src/myVncProxy/VncCanvas.java	Fri Aug 05 08:57:00 2011 +0900
@@ -26,11 +26,8 @@
 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;