changeset 505:af958194248b

change replyToRootSearchMulticast
author oshiro
date Mon, 18 Feb 2019 18:46:23 +0900
parents d409e89ec8ec
children 3fe7e1a372df
files src/main/java/com/glavsoft/rfb/protocol/ReceiverTask.java src/main/java/jp/ac/u_ryukyu/treevnc/TreeRootFinderListener.java
diffstat 2 files changed, 44 insertions(+), 23 deletions(-) [+]
line wrap: on
line diff
--- a/src/main/java/com/glavsoft/rfb/protocol/ReceiverTask.java	Mon Feb 18 18:33:48 2019 +0900
+++ b/src/main/java/com/glavsoft/rfb/protocol/ReceiverTask.java	Mon Feb 18 18:46:23 2019 +0900
@@ -50,7 +50,7 @@
 
 
 public class ReceiverTask implements Runnable {
-    private static final byte FRAMEBUFFER_UPDATE = 0;
+    public static final byte FRAMEBUFFER_UPDATE = 0;
     private static final byte SET_COLOR_MAP_ENTRIES = 1;
     private static final byte BELL = 2;
     private static final byte SERVER_CUT_TEXT = 3;
@@ -120,15 +120,7 @@
                     // pass the input stream to the TreeVNC protocol reader
                     return;
                 }
-                if(! rfb.isTreeManager() && rfb.isAddSerialNum()) {
-                    // client has 8byte packet sequence number
-                    // add serial number flag (4byte)
-                    reader.mark(20+8+4);
-                    getLost(reader); //check seq consistency
-                } else {
-                    reader.mark(20+4);
-                }
-                byte messageId = reader.readByte();
+                byte messageId = getMessageId();
 
                 switch (messageId) {
                     case FRAMEBUFFER_UPDATE:
@@ -200,6 +192,18 @@
         }
     }
 
+    public byte getMessageId() throws Exception {
+        if(! rfb.isTreeManager() && rfb.isAddSerialNum()) {
+            // client has 8byte packet sequence number
+            // add serial number flag (4byte)
+            reader.mark(20+8+4);
+            getLost(reader); //check seq consistency
+        } else {
+            reader.mark(20+4);
+        }
+        return reader.readByte();
+    }
+
     public void sendFrameBufferUpdateRequest() {
         if (rfb.isTreeManager()) {
             sendFrameBufferUpdateRequest0();
@@ -418,4 +422,8 @@
             }
         }
     }
+
+    public void setReader(Reader reader) {
+        this.reader = reader;
+    }
 }
--- a/src/main/java/jp/ac/u_ryukyu/treevnc/TreeRootFinderListener.java	Mon Feb 18 18:33:48 2019 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/treevnc/TreeRootFinderListener.java	Mon Feb 18 18:46:23 2019 +0900
@@ -1,18 +1,24 @@
 package jp.ac.u_ryukyu.treevnc;
 
 import com.glavsoft.rfb.protocol.ProtocolContext.TreeCommand;
+import com.glavsoft.rfb.protocol.ReceiverTask;
+import com.glavsoft.transport.Reader;
 import com.glavsoft.viewer.ViewerInterface;
 import com.glavsoft.viewer.swing.ConnectionParams;
 
+import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.net.*;
 
+import static com.glavsoft.rfb.protocol.ReceiverTask.FRAMEBUFFER_UPDATE;
+
 public class TreeRootFinderListener implements Runnable {
     public static final String Ipv4McastAddr = "224.0.0.1";
     public static final String Ipv6McastAddr = "ff02::1";
     public static String McastAddr = Ipv4McastAddr;
 
 	static final int BufSize = 1024;
+	private ReceiverTask receiverTask;
 	private boolean stopFlag = false;
 	private ViewerInterface vps;
 	private MulticastSocket soc;
@@ -22,6 +28,11 @@
 		vps = vncProxyService;
 	}
 
+	public TreeRootFinderListener(ViewerInterface vncProxyService, ReceiverTask receiverTask) {
+		vps = vncProxyService;
+		this.receiverTask = receiverTask;
+	}
+
     public static MulticastSocket createMulticastSocket() throws IOException {
         MulticastSocket soc = new MulticastSocket(ConnectionParams.DEFAULT_VNC_ROOT_FINDER);
 		try {
@@ -53,20 +64,22 @@
 				String hostname = recvPacket.getAddress().getHostAddress();
 		        byte[] reply = recvPacket.getData();
 				int len = recvPacket.getLength();
-				if (len != 12) {
-					continue;
-				}
-				if ((reply[0]&0xff) != TreeCommand.FIND_ROOT.cmd) {
-					continue;
+				if (len == 12 && (reply[0] & 0xff) == TreeCommand.FIND_ROOT.cmd) {
+					int port = reply[8];
+					port = port * 256 + reply[9];
+					port = port * 256 + reply[10];
+					port = port * 256 + reply[11];
+
+					TreeVncProtocol t = new TreeVncProtocol(hostname, port);
+					t.findRootReply(vps.getRfb().getAcceptPort());
+				} else {
+					if (receiverTask != null) {
+						receiverTask.setReader(new Reader(new ByteArrayInputStream(reply)));
+						if (receiverTask.getMessageId() == FRAMEBUFFER_UPDATE) {
+							receiverTask.framebufferUpdateMessage();
+						}
+					}
 				}
-				int port = reply[8];
-				port = port * 256 + reply[9];
-				port = port * 256 + reply[10];
-				port = port * 256 + reply[11];
-				
-				TreeVncProtocol t = new TreeVncProtocol(hostname, port);
-                t.findRootReply(vps.getRfb().getAcceptPort());
-				if(stopFlag) break;
 			}
 		} catch (Exception e) {
             System.out.println("tree-root-find-listener :" + e.getMessage());