changeset 532:9292035b8d93

fix forloop
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sun, 05 May 2019 15:56:33 +0900
parents 13d3c4341d14
children 4be31e107121
files src/main/java/com/glavsoft/rfb/encoding/decoder/ZRLEDecoder.java src/main/java/com/glavsoft/rfb/protocol/ReceiverTask.java src/main/java/jp/ac/u_ryukyu/treevnc/TreeRFBProto.java src/main/java/jp/ac/u_ryukyu/treevnc/VncProxyService.java
diffstat 4 files changed, 72 insertions(+), 42 deletions(-) [+]
line wrap: on
line diff
--- a/src/main/java/com/glavsoft/rfb/encoding/decoder/ZRLEDecoder.java	Sat May 04 14:17:33 2019 +0900
+++ b/src/main/java/com/glavsoft/rfb/encoding/decoder/ZRLEDecoder.java	Sun May 05 15:56:33 2019 +0900
@@ -47,6 +47,7 @@
     class TileLoop {
 		private int deflate_size = 65507;
 		private ByteBuffer c1;
+		private int width; // phase2 length
 		private FramebufferUpdateRectangle c1rect;
 		private int c1headerPos;
 		private int prevLineOffset;
@@ -80,22 +81,40 @@
 		private void zrleeBlocking(TreeRFBProto rfb, ByteBuffer header, FramebufferUpdateRectangle rect) {
 			// dump32(inputs);
 			deflater = rfb.deflater;
+			newMulticastPacket(rfb, rect);
+			c1.put(header.get(0));
+			c1rect = new FramebufferUpdateRectangle(rect.x, rect.y, 0, 0);
+			return;
+		}
+
+		private void newMulticastPacket(TreeRFBProto rfb, FramebufferUpdateRectangle rect) {
 			c1 = rfb.multicastqueue.allocate(deflate_size);
 			if (rfb.addSerialNum)
 				c1.putLong(rfb.counter++);
 			if (rfb.checkDelay)
 				CheckDelay.checkDelay(c1, rect.x, rect.y, rect.width, rect.height, System.currentTimeMillis(), EncodingType.CHECK_DELAY);
 			c1headerPos = c1.position();
-			c1.put(header);
-			header.flip();
-			c1.putInt(0);
-			c1rect = new FramebufferUpdateRectangle(rect.x, rect.y, 0, 0);
-			return;
+			c1.put((byte) 0);
+			c1.put((byte) 0);
+			c1.putShort((short) 0);
+			c1.position(c1.position()+16);
+			c1.putInt(0);     // should be data length
+			width = 0;
+			rectPos = 4;
+			prevoffset = prevLineOffset = prevC1Offset = 0;
 		}
 
 		int spanGap = 128;
 		/**
 		 *
+		 *                +----+
+		 *                |    |   phase 0
+		 *     +---------------+
+		 *     |               |   phase 1
+		 *     +----+----------+
+		 *     |    |              phase 2
+		 *     +----+
+		 *
 		 * @param rfb
 		 * @param last
 		 * @param rect
@@ -108,38 +127,46 @@
 			int span = offset - prevoffset;
 			deflater.setInput(bytes,prevoffset,span);
 			prevoffset = offset;
-			c1rect.width  += tileW;
-			if (c1rect.x > rect.x) {  // phase0
-				if (c1.remaining() > span + spanGap && c1rect.width < rect.width) {
-					deflater.deflate(c1, Deflater.SYNC_FLUSH);
-					return;
+			c1rect.width  += tileW; width += tileW;
+			if (c1rect.x > rect.x) {  // phase 0
+				if (c1rect.x+c1rect.width < rect.x+rect.width) {
+					if (c1.remaining() > spanGap ) {
+						deflater.deflate(c1, Deflater.NO_FLUSH);
+						return;
+					}
+				} else {
+					c1rect.width = rect.x+rect.width-c1rect.x ;
+					c1rect.height += tileH;
+					deflater.deflate(c1, Deflater.NO_FLUSH);
+					flushRectangle(rect);
 				}
-				c1rect.height += tileH;
-				flushRectangle();
 				return;
 			}
-			if (!last && c1.remaining() > span + spanGap) { // phase1
-				c1rect.height += tileH;
-				if (c1rect.width >= rect.width) {
+			if (!last && c1.remaining() > spanGap) { // phase 1
+				if (width >= rect.width) {
+					c1rect.width = rect.width;
+					width = 0;
+					c1rect.height += tileH;
 					prevLineOffset = offset;
 					prevC1Offset = c1.position();
-				}
-				deflater.deflate(c1, Deflater.SYNC_FLUSH);
+					deflater.deflate(c1, Deflater.SYNC_FLUSH);
+				} else
+					deflater.deflate(c1, Deflater.NO_FLUSH);
 			} else { // phase2
 				//  rewind to the last line finish phase 1
-				int savew = c1rect.width; c1rect.width = rect.width;
+				int savew = width;
 				c1.position(prevC1Offset);
-				flushRectangle();
-				// recompress overrun and flush phase 2
-				c1rect.width = savew; c1rect.height = tileH;
-				deflater.setInput(bytes, prevLineOffset, span);
-				deflater.deflate(c1, Deflater.SYNC_FLUSH);
-				flushRectangle();
-				if (!last) {
-					c1.position(c1.position() + 16);
-				} else {
-					flushMuticast(rfb);
+				flushRectangle(rect);
+				if (savew>0) {
+					// recompress overrun and flush phase 2
+					c1rect.width = savew;
+					c1rect.height = tileH;
+					deflater.setInput(bytes, prevLineOffset, span);
+					deflater.deflate(c1, Deflater.SYNC_FLUSH);
+					flushRectangle(rect);
 				}
+				flushMuticast(rfb);
+				if (!last) newMulticastPacket(rfb,rect);
 			}
 		}
 
@@ -149,15 +176,26 @@
 		 * update position paramater
 		 * send muticast pacate if nessesally
 		 */
-		private void flushRectangle() {
+		private void flushRectangle(FramebufferUpdateRectangle rect) {
 			c1.putShort(rectPos + 0,  (short)c1rect.x);
 			c1.putShort(rectPos + 2,  (short)c1rect.y);
 			c1.putShort(rectPos + 4,  (short)c1rect.width);
 			c1.putShort(rectPos + 6, (short)c1rect.height);
 			c1.putInt(rectPos + 8,EncodingType.ZRLEE.getId());
-			c1.putInt(rectPos + 12, c1.position()-rectPos-12);
+			c1.putInt(rectPos + 12, c1.position()-rectPos-12); // data length
 			rectPos = c1.position();
-			c1.putShort(2,(short)(c1.getShort(2)+1));
+			c1.putShort(2,(short)(c1.getShort(2)+1));    // increment rectangle count
+			nextRectangle(rect);
+		}
+
+		private void nextRectangle(FramebufferUpdateRectangle rect) {
+			if (c1rect.x+c1rect.width < rect.x+rect.width) {
+				c1rect.x = c1rect.width;   // next rectangle is phase 1
+			} else {
+				c1rect.x = rect.x;
+				c1rect.y += c1rect.height;
+			}
+			width = 0;
 			c1rect.width = 0;
 			c1rect.height = 0;
 		}
--- a/src/main/java/com/glavsoft/rfb/protocol/ReceiverTask.java	Sat May 04 14:17:33 2019 +0900
+++ b/src/main/java/com/glavsoft/rfb/protocol/ReceiverTask.java	Sun May 05 15:56:33 2019 +0900
@@ -245,6 +245,7 @@
         try {
             reader.readByte(); // padding
             numberOfRectangles = reader.readUInt16();
+            this.numberOfRectangles = numberOfRectangles;
             if(numberOfRectangles > 3) {
                 System.out.println("numberofrectangle : " + numberOfRectangles);
                 if (rfb.getViewer().getUseMulticast()){
--- a/src/main/java/jp/ac/u_ryukyu/treevnc/TreeRFBProto.java	Sat May 04 14:17:33 2019 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/treevnc/TreeRFBProto.java	Sun May 05 15:56:33 2019 +0900
@@ -77,7 +77,7 @@
     private static int uniqueNodeId = 0; // uniquenodeid in all trees (less than MAX_UNIQUE_NODE_ID)
 
     private boolean stopBroadcast;
-    public boolean multicastBlocking = true;
+    public boolean multicastBlocking = false;
 
     public TreeRFBProto(boolean isTreeManager, ViewerInterface viewer) {
         nets.setMyRfb(this);
@@ -905,6 +905,7 @@
         setProtocolContext(workingProtocol);
         this.connectionPresenter = connectionPresenter;
         connectionPresenter.viewer.setConnectionPresenter(connectionPresenter);
+        if (connectionPresenter.isUseMulticast()) multicastBlocking = true;
         connectionPresenter.addModel("ConnectionParamsModel", connectionPresenter.getConnectionParams());
         if (previousContext != null && isTreeManager() && hasParent()) {
             Reader previousReader = previousContext.getReader();
--- a/src/main/java/jp/ac/u_ryukyu/treevnc/VncProxyService.java	Sat May 04 14:17:33 2019 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/treevnc/VncProxyService.java	Sun May 05 15:56:33 2019 +0900
@@ -29,13 +29,6 @@
 		uiSettings = super.uiSettings;
 	}
 
-	public VncProxyService(VncProxyService vps, String hostName) {
-		this();
-		connectionParams.hostName = hostName;
-		myRfb = vps.myRfb;
-		forceReconnection = vps.forceReconnection;
-		reconnectionReason = vps.reconnectionReason;
-	}
 
 	public static void main(String[] argv) {
 		String[] mainArgs = argv;
@@ -69,9 +62,6 @@
 		closeApp();
 	}
 
-	protected void socketClose() {
-	}
-
 	@Override
 	public void rfbSessionStopped(final String reason) {
         System.out.println(reason);