changeset 529:9de5137e1598

refactoring flushRectangle
author anatofuz
date Fri, 03 May 2019 19:01:41 +0900
parents 2956c4a7bfbd
children 18c461305cc3
files Todo.txt src/main/java/com/glavsoft/rfb/encoding/decoder/ZRLEDecoder.java src/main/java/jp/ac/u_ryukyu/treevnc/TreeRFBProto.java
diffstat 3 files changed, 34 insertions(+), 57 deletions(-) [+]
line wrap: on
line diff
--- a/Todo.txt	Fri May 03 18:16:58 2019 +0900
+++ b/Todo.txt	Fri May 03 19:01:41 2019 +0900
@@ -5,6 +5,8 @@
     あるところより下はマルチキャストしかいないのでフレームアップデートを流さない
     親ノードに接続する際に自分がマルチキャストかどうかを申告する
 
+    RectangleHeaderを書き換える部分を作成する
+
 Tue Feb 19 15:01:43 JST 2019
     マルチキャスト用のパラメーター
       Packet size
--- a/src/main/java/com/glavsoft/rfb/encoding/decoder/ZRLEDecoder.java	Fri May 03 18:16:58 2019 +0900
+++ b/src/main/java/com/glavsoft/rfb/encoding/decoder/ZRLEDecoder.java	Fri May 03 19:01:41 2019 +0900
@@ -53,6 +53,7 @@
 		private int prevC1Offset;
 		private int prevoffset;
 		private Deflater deflater;
+		private int rectPos;
 
 		/**
 		 * Multicast framebufferUpdate to children.
@@ -117,7 +118,7 @@
 					deflater.deflate(c1, Deflater.SYNC_FLUSH);
 					return;
 				}
-				flushRectangle(rfb, header, rect,  false);
+				flushRectangle(rfb,rect,false);
 				return;
 			}
 			if (!last) { // phase1
@@ -129,14 +130,14 @@
 					deflater.deflate(c1, Deflater.SYNC_FLUSH);
 				} else { // phase2
 					c1.position(prevC1Offset);
-					flushRectangle(rfb, header, rect,  false);
+					flushRectangle(rfb,rect,false);
 					deflater.setInput(bytes, prevLineOffset, span);
 					deflater.deflate(c1, Deflater.SYNC_FLUSH);
-					flushRectangle(rfb, header,rect,  false);
+					flushRectangle(rfb,rect,false);
 				}
 				return;
 			}
-			flushRectangle(rfb, header, rect, true);
+			flushRectangle(rfb,rect,true);
 		}
 
 		/**
@@ -144,69 +145,42 @@
 		 * create next rectangle header
 		 * update position paramater
 		 * send muticast pacate if nessesally
-		 * @param rfb
-		 * @param header
-		 * @param rect
-
-		 * @param b
 		 */
-		private void flushRectangle(TreeRFBProto rfb, ByteBuffer header, FramebufferUpdateRectangle rect, boolean b) {
-			flushMuticast(rfb, header, rect);
+		private void flushRectangle(TreeRFBProto rfb, FramebufferUpdateRectangle rect, boolean last) {
+			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);
+			rectPos = c1.position();
+			c1.putShort(2,(short)(c1.getShort(2)+1));
+			if (!last) {
+				c1.position(c1.position() + 16);
+			} else {
+				flushMuticast(rfb,rect);
+			}
 		}
 
-		private void flushMuticast(TreeRFBProto rfb, ByteBuffer header, FramebufferUpdateRectangle rect) {
+		private void flushMuticast(TreeRFBProto rfb, FramebufferUpdateRectangle rect) {
 			deflater.deflate(c1, Deflater.FULL_FLUSH);
 			deflater.finish();
 			c1.flip();
 			//System.out.println("multicastPut: " + c1rect + " length: " + (c1.remaining()-c1headerPos-header.limit()));
 			try {
-				writeUpdateRectangleWithHeader(c1, c1headerPos, c1.remaining()-c1headerPos-header.limit()-4, c1rect.x, c1rect.y, c1rect.width + tileW, c1rect.height + tileY);
+				deflater.reset();
+
+				LinkedList<ByteBuffer> bufs = new LinkedList<ByteBuffer>();
+				bufs.add(c1);
+				if (rfb.isTreeManager() && rfb.connectionPresenter.isUseMulticast()) {
+					for (ByteBuffer buf : bufs)
+						rfb.getViewer().getRfbBroadcastListener().multicastUpdateRectangle(buf);
+				} else {
+					rfb.multicastqueue.waitput(bufs);
+				}
 			} catch (InterruptedException e) {
 				e.printStackTrace();
 			}
-			c1rect.x += c1rect.width;
-			if (c1rect.x >= rect.x + rect.width) {
-				c1rect.x = rect.x;
-				c1rect.y += tileH;
-			}
-			c1rect.width = 0;
-			c1 = rfb.multicastqueue.allocate(deflate_size);
-			if (rfb.addSerialNum)
-				c1.putLong(rfb.counter++);
-			c1headerPos = c1.position();
-			c1.put(header);
-			header.flip();
-			c1.putInt(0);
-		}
-
-		/**
-		 * make and send frameBufferUpdateRectangle packet
-		 * @param c1
-		 * @param headerPos
-		 * @param len2
-		 * @param x
-		 * @param y
-		 * @param w
-		 * @param h
-		 * @throws InterruptedException
-		 *
-		 */
-		public void writeUpdateRectangleWithHeader(ByteBuffer c1, int headerPos, int len2, int x, int y, int w, int h) throws InterruptedException {
-			deflater.reset();
-
-			c1.putInt(headerPos + 16, len2);
-			c1.putShort(headerPos + 4, (short) x);
-			c1.putShort(headerPos + 6, (short) y);
-			c1.putShort(headerPos + 8, (short) w);
-			c1.putShort(headerPos + 10, (short) h);
-			LinkedList<ByteBuffer> bufs = new LinkedList<ByteBuffer>();
-			bufs.add(c1);
-			if (rfb.isTreeManager && rfb.connectionPresenter.isUseMulticast()) {
-				for (ByteBuffer buf : bufs)
-					rfb.viewer.getRfbBroadcastListener().multicastUpdateRectangle(buf);
-			} else {
-				rfb.multicastqueue.waitput(bufs);
-			}
 		}
 	}
 
--- a/src/main/java/jp/ac/u_ryukyu/treevnc/TreeRFBProto.java	Fri May 03 18:16:58 2019 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/treevnc/TreeRFBProto.java	Fri May 03 19:01:41 2019 +0900
@@ -49,12 +49,13 @@
     private TreeVncCommandChannelListener acceptThread;
     private TreeRootFinderListener getCast;
     private CreateConnectionParam cp;
-    private ConnectionPresenter connectionPresenter;
     private TreeVNCNetwork nets = new TreeVNCNetwork();
     private TreeVncRootSelectionPanel rootSelectionPanel;
     private String vncInterface;
     private TreeManagement treeManager;
     public LinkedList<TreeVNCNode> nodeList;
+    public ConnectionPresenter connectionPresenter;
+
 
     protected boolean readyReconnect = false;
     private boolean cuiVersion;