# HG changeset patch # User Shinji KONO # Date 1312502220 -32400 # Node ID a8b2712de4c557d99c21f1655ae828fdb09ad8e2 # Parent 7a7baebdd3cf57281b03aa1320522da5144d57f2 ZRLEE extension diff -r 7a7baebdd3cf -r a8b2712de4c5 src/myVncProxy/MyRfbProto.java --- 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 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); LinkedListinputs = new LinkedList(); 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 out = new LinkedList(); - 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 out = new LinkedList(); + 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 outs; - if (clicomp) { - outs = new LinkedList(); - 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 in = new LinkedList(); LinkedList out = new LinkedList(); LinkedList out2 = new LinkedList(); - 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"; diff -r 7a7baebdd3cf -r a8b2712de4c5 src/myVncProxy/RfbProto.java --- 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. diff -r 7a7baebdd3cf -r a8b2712de4c5 src/myVncProxy/VncCanvas.java --- 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;