changeset 327:293c35aa902b

add error message, add assure stream close, delete firstTime value in TreeRFBProto.
author oc
date Sun, 01 Feb 2015 17:34:09 +0900
parents 1d4d5055a288
children 1a2ab6bd5ba3
files src/main/java/jp/ac/u_ryukyu/treevnc/CreateConnectionParam.java src/main/java/jp/ac/u_ryukyu/treevnc/FindRoot.java src/main/java/jp/ac/u_ryukyu/treevnc/TreeRFBProto.java src/main/java/jp/ac/u_ryukyu/treevnc/TreeVncProtocol.java src/viewer_swing/java/com/glavsoft/viewer/CuiViewer.java src/viewer_swing/java/com/glavsoft/viewer/Viewer.java
diffstat 6 files changed, 70 insertions(+), 65 deletions(-) [+]
line wrap: on
line diff
--- a/src/main/java/jp/ac/u_ryukyu/treevnc/CreateConnectionParam.java	Sun Feb 01 15:30:17 2015 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/treevnc/CreateConnectionParam.java	Sun Feb 01 17:34:09 2015 +0900
@@ -15,13 +15,17 @@
 		this.rfb = rfb;
 	}
 
-	public synchronized void findTreeVncRoot() throws InterruptedException {
+	public synchronized void findTreeVncRoot() {
 		rfb.createRootSelectionPanel(this);
-		FindRoot getBcast = new FindRoot(rfb.acceptPort,this);
-		getBcast.findRoot();
-		// wait for RootSelection
-		wait();
-	}
+        FindRoot getBcast = new FindRoot(rfb.acceptPort,this);
+        getBcast.findRoot();
+        // wait for RootSelection
+        try {
+            wait();
+        } catch (InterruptedException e) {
+            System.out.println("any thread interrupt when wait for FindRoot " + e.getMessage());
+        }
+    }
 
 	/**
 	 * To find parent, send WHERE_TO_CONNECT command to the TreeVNC root
--- a/src/main/java/jp/ac/u_ryukyu/treevnc/FindRoot.java	Sun Feb 01 15:30:17 2015 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/treevnc/FindRoot.java	Sun Feb 01 17:34:09 2015 +0900
@@ -22,7 +22,7 @@
     private ServerSocket server = null;
     private BufferedReader is;
     private int port;
-    private boolean stopFlag;
+    private boolean stopFlag = false;
     private TreeVncRootSelectionPanel rootSelectionPanel = new TreeVncRootSelectionPanel();
     private String proxyAddr;
 
@@ -45,7 +45,9 @@
             soc.joinGroup(mAddr);
 			soc.setTimeToLive(1);
 		} catch (IOException e) {
+            System.out.println("cannot create FindRoot socket.");
 			e.printStackTrace();
+            socketClose();
 		}
 	}
 
@@ -68,7 +70,9 @@
 		try {
 			soc.send(sendPacket);
 		} catch (IOException e) {
+            System.out.println("cannot send FindRoot packet.");
 			e.printStackTrace();
+            socketClose();
 		}
 		
 	}
@@ -80,7 +84,10 @@
     void socketClose() {
         try {
             rootSelectionPanel.unVisible();
-            is.close();
+            if (is != null)
+                is.close();
+            if (soc != null)
+                soc.close();
         } catch (IOException e) {
             e.printStackTrace();
         }
@@ -94,8 +101,7 @@
         try {
             while(!stopFlag) {
                 Socket socket = server.accept();
-                is = new BufferedReader(new InputStreamReader(
-                        socket.getInputStream()));
+                is = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                 proxyAddr = is.readLine();
                 // proxyAddr format
                 // 5999:localhost:localhost:133.13.59.210:
@@ -115,9 +121,11 @@
                     rootSelectionPanel.checkBox(proxyAddr2);
                 rootSelectionPanel.setButton();
                 rootSelectionPanel.visible();
+                setStopFlag(true);
             }
-            System.err.println("stop");
         } catch (IOException e) {
+            System.out.println("an I/O error occurs " + e.getMessage());
+            socketClose();
         }
     }
 
--- a/src/main/java/jp/ac/u_ryukyu/treevnc/TreeRFBProto.java	Sun Feb 01 15:30:17 2015 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/treevnc/TreeRFBProto.java	Sun Feb 01 17:34:09 2015 +0900
@@ -21,6 +21,7 @@
 import com.glavsoft.rfb.protocol.ProtocolContext;
 import com.glavsoft.transport.Reader;
 import com.glavsoft.transport.Writer;
+import com.glavsoft.viewer.Viewer;
 import com.glavsoft.viewer.ViewerInterface;
 import com.glavsoft.viewer.swing.ConnectionParams;
 
@@ -56,7 +57,6 @@
     private boolean cuiVersion;
     private boolean permitChangeScreen = true;
     private boolean leader;
-    private boolean firstTime = true;
     private boolean hasViewer = false;
     private boolean reconnecting;
     private boolean normalTermination;
@@ -79,11 +79,17 @@
 
     private byte[] originalInitData = null;
 
-    public TreeRFBProto(boolean isTreeManager) {
+    public TreeRFBProto(boolean isTreeManager, ViewerInterface viewer) {
         rThread = new RequestScreenThread(this);
         nets.setMyRfb(this);
         this.isTreeManager = isTreeManager;
+        this.viewer = viewer;
 //        this.socket = createSocket();
+        if(isTreeManager()) {
+            getCast = new TreeRootFinderListener(viewer);
+            Thread treeRootFindThread = new Thread(getCast, "tree-root-find-listener");
+            treeRootFindThread.start();
+        }
     }
 
     public boolean isTreeManager() {
@@ -808,12 +814,6 @@
     public void createConnectionAndStart(ViewerInterface v) {
         selectPort(ConnectionParams.DEFAULT_VNC_ROOT);
         startTreeVncCommandListener();
-        if(isTreeManager() && firstTime) {
-            getCast = new TreeRootFinderListener(v);
-            Thread treeRootFindThread = new Thread(getCast, "tree-root-find-listener");
-            treeRootFindThread.start();
-            firstTime = false;
-        }
     }
 
     public void startTreeVncCommandListener() {
--- a/src/main/java/jp/ac/u_ryukyu/treevnc/TreeVncProtocol.java	Sun Feb 01 15:30:17 2015 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/treevnc/TreeVncProtocol.java	Sun Feb 01 17:34:09 2015 +0900
@@ -50,44 +50,48 @@
         sendWithHostAndPort(TreeCommand.LOST_PARENT, hostname, port, (short) 0);
     }
 
-    public void sendWithHostAndPort(TreeCommand command, String hostname, int port, short value)
-            throws IOException {
-        openport();
-        if (hostname == null) {
-            // in case of root finder, we can't get localaddress from datagram packet.
-            // so use local part of TCP socket.
-            hostname = echoSocket.getLocalAddress().getHostAddress();
+    public void sendWithHostAndPort(TreeCommand command, String hostname, int port, short value) {
+        try {
+            openport();
+            if (hostname == null) {
+                // in case of root finder, we can't get localaddress from datagram packet.
+                // so use local part of TCP socket.
+                hostname = echoSocket.getLocalAddress().getHostAddress();
+            }
+            int cmdlen = 4 + 4 + 4 + hostname.length();
+            if (cmdlen < 12) cmdlen = 12;
+            ByteBuffer buf = ByteBuffer.allocate(cmdlen);
+            buf.order(ByteOrder.BIG_ENDIAN);
+            buf.put((byte) command.cmd);
+            buf.put((byte) 0);
+            buf.putShort(value);
+            buf.putInt(4 + hostname.length()); // length
+            buf.putInt(port);
+            buf.put(hostname.getBytes(), 0, hostname.length());
+            while (buf.hasRemaining()) buf.put((byte) 0);
+            buf.flip();
+            sendCommandToTheRoot(buf);
+        } catch (IOException e) {
+            System.out.println("cannot send command to the root.");
+            streamClose();
         }
-        int cmdlen = 4+4+4+hostname.length();
-        if (cmdlen < 12) cmdlen=12;
-        ByteBuffer buf = ByteBuffer.allocate(cmdlen);
-        buf.order(ByteOrder.BIG_ENDIAN);
-        buf.put((byte) command.cmd);
-        buf.put((byte) 0);
-        buf.putShort(value);
-        buf.putInt(4+hostname.length()); // length
-        buf.putInt(port);
-        buf.put(hostname.getBytes(), 0, hostname.length());
-        while (buf.hasRemaining() ) buf.put((byte)0) ;
-        buf.flip();
-        sendCommandToTheRoot(buf);
     }
 
     public void sendCommandToTheRoot(ByteBuffer buf) throws IOException {
         char[] charBuf = new char[12];
-        try {
             is.read(charBuf, 0, 12);                       // skip root's version header
             os.write(buf.array(), 0, buf.limit());         // send our command
-        } finally {
-            if(is != null && os != null)
-                streamClose();
+    }
+
+    void streamClose() {
+        try {
+            os.close();
+            is.close();
+            echoSocket.close();
+        } catch (IOException e) {
+            e.printStackTrace();
+            System.out.println("cannot close stream.");
         }
     }
 
-    void streamClose() throws IOException {
-        os.close();
-        is.close();
-        echoSocket.close();
-    }
-
 }
\ No newline at end of file
--- a/src/viewer_swing/java/com/glavsoft/viewer/CuiViewer.java	Sun Feb 01 15:30:17 2015 +0900
+++ b/src/viewer_swing/java/com/glavsoft/viewer/CuiViewer.java	Sun Feb 01 17:34:09 2015 +0900
@@ -212,17 +212,13 @@
     public void startTreeViewer(String hostName, boolean cui) {
         CuiViewer viewer = new CuiViewer();
         viewer.cuiVersion = cui;
-        TreeRFBProto rfb = new TreeRFBProto(false);
+        TreeRFBProto rfb = new TreeRFBProto(false, this);
         CreateConnectionParam cp = new CreateConnectionParam(rfb);
         if (hostName==null) {
-            try {
-                cp.findTreeVncRoot();
-            } catch (InterruptedException e) {
-            }
+            cp.findTreeVncRoot();
         } else {
             cp.setHostName(hostName);
         }
-        rfb.setViewer(viewer);
         rfb.createConnectionAndStart(this);
         cp.sendWhereToConnect(viewer);
         rfb.setCuiVersion(cui);
--- a/src/viewer_swing/java/com/glavsoft/viewer/Viewer.java	Sun Feb 01 15:30:17 2015 +0900
+++ b/src/viewer_swing/java/com/glavsoft/viewer/Viewer.java	Sun Feb 01 17:34:09 2015 +0900
@@ -294,21 +294,15 @@
      * start TreeVNC viewer
      */
     public void startTreeViewer(String hostName,boolean cui) {
-        TreeRFBProto rfb = new TreeRFBProto(false);
+        TreeRFBProto rfb = new TreeRFBProto(false, this);
         rfb.setCuiVersion(cui);
         rfb.setHasViewer(true);
-        rfb.setViewer(this);
         rfb.createConnectionAndStart(this);
         CreateConnectionParam cp = new CreateConnectionParam(rfb);
         if (hostName!=null) {
             cp.setHostName(hostName);
         } else {
-            try {
-                cp.findTreeVncRoot();
-            } catch (InterruptedException e) {
-                System.out.println("cannot find TreeVNC Root "+e.getMessage());
-                return;
-            }
+            cp.findTreeVncRoot();
         }
         cp.sendWhereToConnect(this);
         isTreeVNC = true;
@@ -375,7 +369,7 @@
             System.exit(0);
         }
         String hostname = "localhost";
-        TreeRFBProto rfb = new TreeRFBProto(true);
+        TreeRFBProto rfb = new TreeRFBProto(true, this);
         myRfb = rfb;
         rfb.setShowTree(showTree);
         rfb.setCheckDelay(checkDelay);
@@ -386,7 +380,6 @@
             rfb.fixingSizeHeight = fixingSizeHeight;
         }
         rfb.setFilterSingleDisplay(filterSingleDisplay);
-        rfb.setViewer(this);
         rfb.setCuiVersion(false);
         rfb.setHasViewer(true); // this flag will be overwrited after this method. Do we have to set here?
         rfb.createConnectionAndStart(this);