# HG changeset patch # User oc # Date 1422779649 -32400 # Node ID 293c35aa902be6922f2f246b22843e2c6be3cca1 # Parent 1d4d5055a288ab059c9e6d4defb77bc1ed3e6b1f add error message, add assure stream close, delete firstTime value in TreeRFBProto. diff -r 1d4d5055a288 -r 293c35aa902b src/main/java/jp/ac/u_ryukyu/treevnc/CreateConnectionParam.java --- 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 diff -r 1d4d5055a288 -r 293c35aa902b src/main/java/jp/ac/u_ryukyu/treevnc/FindRoot.java --- 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(); } } diff -r 1d4d5055a288 -r 293c35aa902b src/main/java/jp/ac/u_ryukyu/treevnc/TreeRFBProto.java --- 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() { diff -r 1d4d5055a288 -r 293c35aa902b src/main/java/jp/ac/u_ryukyu/treevnc/TreeVncProtocol.java --- 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 diff -r 1d4d5055a288 -r 293c35aa902b src/viewer_swing/java/com/glavsoft/viewer/CuiViewer.java --- 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); diff -r 1d4d5055a288 -r 293c35aa902b src/viewer_swing/java/com/glavsoft/viewer/Viewer.java --- 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);