# HG changeset patch # User anatofuz # Date 1556877701 -32400 # Node ID 9de5137e15985fb593dd9e848d8e18513e44df7a # Parent 2956c4a7bfbdbe638066463c29d8361a0c87af2e refactoring flushRectangle diff -r 2956c4a7bfbd -r 9de5137e1598 Todo.txt --- 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 diff -r 2956c4a7bfbd -r 9de5137e1598 src/main/java/com/glavsoft/rfb/encoding/decoder/ZRLEDecoder.java --- 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 bufs = new LinkedList(); + 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 bufs = new LinkedList(); - bufs.add(c1); - if (rfb.isTreeManager && rfb.connectionPresenter.isUseMulticast()) { - for (ByteBuffer buf : bufs) - rfb.viewer.getRfbBroadcastListener().multicastUpdateRectangle(buf); - } else { - rfb.multicastqueue.waitput(bufs); - } } } diff -r 2956c4a7bfbd -r 9de5137e1598 src/main/java/jp/ac/u_ryukyu/treevnc/TreeRFBProto.java --- 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 nodeList; + public ConnectionPresenter connectionPresenter; + protected boolean readyReconnect = false; private boolean cuiVersion;