# HG changeset patch # User Shinji KONO # Date 1403538506 -32400 # Node ID f76ee760c2d212236a4b9c7db57ac545fcc74a17 # Parent feefc1e58153366d2d3f7d28a49e6a774b2372f0 dead lock on command line root diff -r feefc1e58153 -r f76ee760c2d2 src/main/java/com/glavsoft/rfb/encoding/decoder/ZRLEESender.java --- a/src/main/java/com/glavsoft/rfb/encoding/decoder/ZRLEESender.java Mon Jun 23 22:31:22 2014 +0900 +++ b/src/main/java/com/glavsoft/rfb/encoding/decoder/ZRLEESender.java Tue Jun 24 00:48:26 2014 +0900 @@ -34,6 +34,7 @@ } else if (!rfb.getCuiVersion()) { rfb.readSendData(dataLen, reader, null); reader.reset(); + reader.skip(16); decoder.decode(reader, renderer, rect); return; } diff -r feefc1e58153 -r f76ee760c2d2 src/main/java/jp/ac/u_ryukyu/treevnc/MyRfbProto.java --- a/src/main/java/jp/ac/u_ryukyu/treevnc/MyRfbProto.java Mon Jun 23 22:31:22 2014 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/treevnc/MyRfbProto.java Tue Jun 24 00:48:26 2014 +0900 @@ -56,6 +56,7 @@ private TreeRootFinderListener getCast; private CreateConnectionParam cp; private boolean hasViewer = false; + private boolean reconnecting; public MyRfbProto() { @@ -346,14 +347,19 @@ } - public synchronized void setReadyReconnect(boolean ready) { - readyReconnect = ready; - if (ready) { - notifyAll(); - } + public void setReadyReconnect(boolean ready) { + if (reconnecting) { + sendDesktopSizeChange(id); + reconnecting = false; + } else { + readyReconnect = ready; + if (ready) { + notifyAll(); + } + } } - public synchronized void waitForReady(ViewerInterface vncProxyService) throws InterruptedException { + public synchronized void waitForReady() throws InterruptedException { while (!readyReconnect) { wait(); } @@ -503,7 +509,9 @@ if (header.get(0) == FramebufferUpdate) { int encoding = header.getInt(12); if (encoding == EncodingType.ZRLE.getId() - || encoding == EncodingType.ZLIB.getId()) { // ZRLEE is already compressed + || encoding == EncodingType.ZLIB.getId()) { + // recompress into ZREE + // uncompressed result is remain in bytes ByteBuffer len = multicastqueue.allocate(4); reader.readBytes(len.array(), 0, 4); len.limit(4); @@ -532,7 +540,6 @@ bufs.addFirst(header); addSerialNumber(bufs); multicastqueue.put(bufs); - if (!isRoot()) reader.reset(); } catch (DataFormatException e) { throw new TransportException(e); } catch (IOException e) { @@ -540,6 +547,7 @@ } return; } + // ZRLEE is already compressed bufs.add(header); if (dataLen > 16) { ByteBuffer b = multicastqueue.allocate(dataLen - 16); @@ -612,12 +620,8 @@ // stop reader stop stopReceiverTask(); vncProxyService.inhelitClients(vncProxyService, hostName); - orderRecconection(vncProxyService, hostName, id); - } - - public void orderRecconection(ViewerInterface vncProxyService, String hostName, short id) throws UnknownHostException, IOException, InterruptedException { - waitForReady(vncProxyService); - sendDesktopSizeChange(id); + reconnecting = true; + // after connecting VNC server, rfb send SEND_INIT_DATA command } /** @@ -664,5 +668,9 @@ hasViewer = b; } + public void setReconnecting(boolean b) { + reconnecting = b; + } + } diff -r feefc1e58153 -r f76ee760c2d2 src/main/java/jp/ac/u_ryukyu/treevnc/server/VncProxyService.java --- a/src/main/java/jp/ac/u_ryukyu/treevnc/server/VncProxyService.java Mon Jun 23 22:31:22 2014 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/treevnc/server/VncProxyService.java Tue Jun 24 00:48:26 2014 +0900 @@ -25,7 +25,7 @@ static VncProxyService currentVps; public VncProxyService() { - ProtocolSettings.getDefaultSettings(); + ProtocolSettings.getDefaultSettings(); uiSettings = super.uiSettings; } diff -r feefc1e58153 -r f76ee760c2d2 src/viewer_swing/java/com/glavsoft/viewer/Viewer.java --- a/src/viewer_swing/java/com/glavsoft/viewer/Viewer.java Mon Jun 23 22:31:22 2014 +0900 +++ b/src/viewer_swing/java/com/glavsoft/viewer/Viewer.java Tue Jun 24 00:48:26 2014 +0900 @@ -386,6 +386,7 @@ connectionParams.setConnectionParam(hostname, vncport); isApplet = true; settings.setViewOnly(true); // too avoid unnecessary upward traffic + rfb.setReconnecting(true); run(); } @@ -395,6 +396,7 @@ connectionParams.setConnectionParam(hostName, vncport); isApplet = true; myRfbProto.createConnectionAndStart(this); + myRfbProto.setReconnecting(true); run(); } } diff -r feefc1e58153 -r f76ee760c2d2 src/viewer_swing/java/com/glavsoft/viewer/swing/SwingRfbConnectionWorker.java --- a/src/viewer_swing/java/com/glavsoft/viewer/swing/SwingRfbConnectionWorker.java Mon Jun 23 22:31:22 2014 +0900 +++ b/src/viewer_swing/java/com/glavsoft/viewer/swing/SwingRfbConnectionWorker.java Tue Jun 24 00:48:26 2014 +0900 @@ -26,7 +26,9 @@ import com.glavsoft.exceptions.*; import com.glavsoft.rfb.IPasswordRetriever; +import com.glavsoft.rfb.IRepaintController; import com.glavsoft.rfb.IRfbSessionListener; +import com.glavsoft.rfb.protocol.NullRepaintController; import com.glavsoft.rfb.protocol.Protocol; import com.glavsoft.rfb.protocol.ProtocolSettings; import com.glavsoft.transport.Reader; @@ -118,7 +120,8 @@ if(!myRfb.getCuiVersion()) viewerWindow = viewerWindowFactory.createViewerWindow(workingProtocol, rfbSettings, uiSettings, connectionString, presenter); myRfb.setProtocolContext(workingProtocol); - workingProtocol.startNormalHandling(this, viewerWindow.getSurface(), clipboardController, myRfb); + IRepaintController s = viewerWindow==null? new NullRepaintController() : viewerWindow.getSurface(); + workingProtocol.startNormalHandling(this, s, clipboardController, myRfb); presenter.showMessage("Started"); if (myRfb.hasViewer()) viewerWindow.setVisible(true); diff -r feefc1e58153 -r f76ee760c2d2 src/viewer_swing/java/com/glavsoft/viewer/swing/SwingViewerWindow.java --- a/src/viewer_swing/java/com/glavsoft/viewer/swing/SwingViewerWindow.java Mon Jun 23 22:31:22 2014 +0900 +++ b/src/viewer_swing/java/com/glavsoft/viewer/swing/SwingViewerWindow.java Tue Jun 24 00:48:26 2014 +0900 @@ -832,17 +832,17 @@ JButton screenButton = buttonsBar.createButton("share", "Share my screen", new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - // before change server, data from previous server - // should be stopped. - viewer.setCuiVersion(true); - if (viewer.getRfb().isRoot()) { - try { - viewer.getRfb().changeVNCServer(viewer, "localhost", 1980, 1090, viewer.getRfb().getId()); - } catch (Exception e1) { - System.out.println("can't change server :" + e1.getMessage()); - } - return; - } + // before change server, data from previous server + // should be stopped. + viewer.setCuiVersion(true); + if (viewer.getRfb().isRoot()) { + try { + viewer.getRfb().changeVNCServer(viewer, "127.0.0.1", 1980, 1090, viewer.getRfb().getId()); + } catch (Exception e1) { + System.out.println("can't change server :" + e1.getMessage()); + } + return; + } String adr = viewer.getRfb().getMyAddress(); context.sendMessage(new ScreenChangeRequest(adr, viewer.getRfb().getId())); }