changeset 533:4be31e107121

fix bloking
author riono210
date Sun, 05 May 2019 18:32:55 +0900
parents 9292035b8d93
children a3d0ba67e8cf 170b1e852b26
files src/main/java/com/glavsoft/rfb/encoding/decoder/ZRLEDecoder.java src/main/java/com/glavsoft/rfb/encoding/decoder/ZRLEESender.java src/main/java/jp/ac/u_ryukyu/treevnc/TreeRFBProto.java
diffstat 3 files changed, 39 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/src/main/java/com/glavsoft/rfb/encoding/decoder/ZRLEDecoder.java	Sun May 05 15:56:33 2019 +0900
+++ b/src/main/java/com/glavsoft/rfb/encoding/decoder/ZRLEDecoder.java	Sun May 05 18:32:55 2019 +0900
@@ -77,6 +77,9 @@
 		 * @throws UnsupportedEncodingException
 		 */
 
+		public TileLoop(int offset) {
+			prevoffset = prevLineOffset = prevC1Offset = offset;
+		}
 
 		private void zrleeBlocking(TreeRFBProto rfb, ByteBuffer header, FramebufferUpdateRectangle rect) {
 			// dump32(inputs);
@@ -101,7 +104,6 @@
 			c1.putInt(0);     // should be data length
 			width = 0;
 			rectPos = 4;
-			prevoffset = prevLineOffset = prevC1Offset = 0;
 		}
 
 		int spanGap = 128;
@@ -132,6 +134,7 @@
 				if (c1rect.x+c1rect.width < rect.x+rect.width) {
 					if (c1.remaining() > spanGap ) {
 						deflater.deflate(c1, Deflater.NO_FLUSH);
+						if (!deflater.needsInput()) flushRectangle(rect);
 						return;
 					}
 				} else {
@@ -150,8 +153,12 @@
 					prevLineOffset = offset;
 					prevC1Offset = c1.position();
 					deflater.deflate(c1, Deflater.SYNC_FLUSH);
-				} else
+					if (!deflater.needsInput()) flushRectangle(rect);
+				} else {
 					deflater.deflate(c1, Deflater.NO_FLUSH);
+					if (!deflater.needsInput()) flushRectangle(rect);
+				}
+				return;
 			} else { // phase2
 				//  rewind to the last line finish phase 1
 				int savew = width;
@@ -231,13 +238,25 @@
 		byte[] bytes = unzip(reader, zippedLength, length, rect.getEncodingType());
 		decode1(renderer, null, rect, bytes, zippedLength, null);
     }
-    
+
+
+	public void multicastDecode(Reader reader, Renderer renderer,
+					   FramebufferUpdateRectangle rect, TreeRFBProto rfb) throws TransportException {
+    	ByteBuffer header = ByteBuffer.allocate(16);
+    	reader.read(header.array());
+		int zippedLength = (int) reader.readUInt32();
+		if (0 == zippedLength) return;
+		int length = rect.width * rect.height * renderer.getBytesPerPixel();
+		byte[] bytes = unzip(reader, zippedLength, length, rect.getEncodingType());
+		decode1(renderer, header, rect, bytes, zippedLength, rfb);
+	}
+
 	public void decode1(Renderer renderer, ByteBuffer header, FramebufferUpdateRectangle rect, byte[] bytes, int zippedLength, TreeRFBProto rfbProto) throws TransportException {
 		int offset = zippedLength;
 		int maxX = rect.x + rect.width;
 		int maxY = rect.y + rect.height;
 
-		TileLoop tileloop = new TileLoop();
+		TileLoop tileloop = new TileLoop(zippedLength);
 		//System.out.println("decode1: "+rect);
         if (null == palette) {
             palette = new int [128];
--- a/src/main/java/com/glavsoft/rfb/encoding/decoder/ZRLEESender.java	Sun May 05 15:56:33 2019 +0900
+++ b/src/main/java/com/glavsoft/rfb/encoding/decoder/ZRLEESender.java	Sun May 05 18:32:55 2019 +0900
@@ -3,6 +3,7 @@
 import java.io.UnsupportedEncodingException;
 import java.nio.ByteBuffer;
 
+import com.glavsoft.rfb.protocol.NullRenderer;
 import jp.ac.u_ryukyu.treevnc.TreeRFBProto;
 
 import com.glavsoft.drawing.Renderer;
@@ -34,8 +35,12 @@
                 // ReadSendData convert ZRLE to ZRLEE
                 // unzipped data in the bytes
                 byte[] bytes = new byte[rect.width * rect.height * renderer.getBytesPerPixel()];
-                ByteBuffer header = rfb.readSendData(dataLen, reader, bytes, rect);
-                decoder.decode1(renderer, header, rect, bytes, 0, rfb);
+                if (rfb.multicastBlocking) {
+                   decoder.multicastDecode(reader, renderer, rect, rfb);
+                } else {
+                    ByteBuffer header = rfb.readSendData(dataLen, reader, bytes, rect);
+                    decoder.decode1(renderer, header, rect, bytes, 0, rfb);
+                }
                 return;
             } else {
                 // no reencoding is required
@@ -51,8 +56,14 @@
                 return;
             }
         }
-        byte[] bytes = new byte[dataLen];
-        rfb.readSendData(dataLen, reader, bytes, rect);
+        if (rfb.multicastBlocking) {
+            // do something
+            ZRLEDecoder decoder = new ZRLEDecoder();
+            decoder.multicastDecode(reader, renderer, rect, rfb);
+        } else {
+            byte[] bytes = new byte[dataLen];
+            rfb.readSendData(dataLen, reader, bytes, rect);
+        }
     }
 
     private int getZrleLength(FramebufferUpdateRectangle rect, Reader reader)
--- a/src/main/java/jp/ac/u_ryukyu/treevnc/TreeRFBProto.java	Sun May 05 15:56:33 2019 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/treevnc/TreeRFBProto.java	Sun May 05 18:32:55 2019 +0900
@@ -19,6 +19,7 @@
 import java.net.*;
 import java.nio.ByteBuffer;
 import java.nio.ByteOrder;
+import java.util.Collection;
 import java.util.Enumeration;
 import java.util.Iterator;
 import java.util.LinkedList;
@@ -655,7 +656,6 @@
             if (encoding == EncodingType.ZRLE.getId()
                     || encoding == EncodingType.ZLIB.getId()) {
 
-                if (multicastBlocking) return header;
                 // recompress into ZREE
                 // uncompressed result is remain in bytes
                 ByteBuffer len = multicastqueue.allocate(4);