# HG changeset patch # User Shinji KONO # Date 1557039393 -32400 # Node ID 9292035b8d936b33711dc75d942bbe944cfc82df # Parent 13d3c4341d1401d0ae1ae4b60e6e46bb67126bef fix forloop diff -r 13d3c4341d14 -r 9292035b8d93 src/main/java/com/glavsoft/rfb/encoding/decoder/ZRLEDecoder.java --- 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; } diff -r 13d3c4341d14 -r 9292035b8d93 src/main/java/com/glavsoft/rfb/protocol/ReceiverTask.java --- 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()){ diff -r 13d3c4341d14 -r 9292035b8d93 src/main/java/jp/ac/u_ryukyu/treevnc/TreeRFBProto.java --- 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(); diff -r 13d3c4341d14 -r 9292035b8d93 src/main/java/jp/ac/u_ryukyu/treevnc/VncProxyService.java --- 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);