Revision: 4965
          http://tigervnc.svn.sourceforge.net/tigervnc/?rev=4965&view=rev
Author:   bphinz
Date:     2012-08-26 20:52:15 +0000 (Sun, 26 Aug 2012)
Log Message:
-----------
Fix AccessControlException caused by using System.exit() in applet mode, and 
close viewer properly in several other cases.

Modified Paths:
--------------
    trunk/java/com/tigervnc/network/SocketDescriptor.java
    trunk/java/com/tigervnc/network/TcpListener.java
    trunk/java/com/tigervnc/network/TcpSocket.java
    trunk/java/com/tigervnc/rdr/Exception.java
    trunk/java/com/tigervnc/vncviewer/CConn.java
    trunk/java/com/tigervnc/vncviewer/F8Menu.java
    trunk/java/com/tigervnc/vncviewer/ServerDialog.java
    trunk/java/com/tigervnc/vncviewer/Viewport.java
    trunk/java/com/tigervnc/vncviewer/VncViewer.java

Modified: trunk/java/com/tigervnc/network/SocketDescriptor.java
===================================================================
--- trunk/java/com/tigervnc/network/SocketDescriptor.java       2012-08-26 
20:35:30 UTC (rev 4964)
+++ trunk/java/com/tigervnc/network/SocketDescriptor.java       2012-08-26 
20:52:15 UTC (rev 4965)
@@ -49,6 +49,15 @@
     }
   }
 
+  public void shutdown() throws IOException {
+    try {
+      channel.socket().shutdownInput();
+      channel.socket().shutdownOutput();
+    } catch(IOException e) {
+      throw new IOException(e.toString());
+    }
+  }
+
   public void close() throws IOException {
     try {
       channel.close();

Modified: trunk/java/com/tigervnc/network/TcpListener.java
===================================================================
--- trunk/java/com/tigervnc/network/TcpListener.java    2012-08-26 20:35:30 UTC 
(rev 4964)
+++ trunk/java/com/tigervnc/network/TcpListener.java    2012-08-26 20:52:15 UTC 
(rev 4965)
@@ -62,8 +62,7 @@
         addr = InetAddress.getByName("0.0.0.0");
       }
     } catch (UnknownHostException e) {
-      System.out.println(e.toString());
-      System.exit(-1);
+      throw new Exception(e.toString());
     }
   
     try {
@@ -129,8 +128,7 @@
     try {
       fd = new SocketDescriptor();
     } catch (java.lang.Exception e) {
-      System.out.println(e.toString());
-      System.exit(-1);
+      throw new SocketException(e.toString());
     }
     fd.setChannel(new_sock);
     TcpSocket s = new TcpSocket(fd);

Modified: trunk/java/com/tigervnc/network/TcpSocket.java
===================================================================
--- trunk/java/com/tigervnc/network/TcpSocket.java      2012-08-26 20:35:30 UTC 
(rev 4964)
+++ trunk/java/com/tigervnc/network/TcpSocket.java      2012-08-26 20:52:15 UTC 
(rev 4965)
@@ -153,9 +153,9 @@
   }
 
   public void shutdown() throws Exception {
+    super.shutdown();
     try {
-      close();
-      super.shutdown();
+      ((SocketDescriptor)getFd()).shutdown();
     } catch (IOException e) {
       throw new Exception(e.toString());
     }

Modified: trunk/java/com/tigervnc/rdr/Exception.java
===================================================================
--- trunk/java/com/tigervnc/rdr/Exception.java  2012-08-26 20:35:30 UTC (rev 
4964)
+++ trunk/java/com/tigervnc/rdr/Exception.java  2012-08-26 20:52:15 UTC (rev 
4965)
@@ -22,7 +22,6 @@
 public class Exception extends RuntimeException {
   public Exception(String s) {
     super(s);
-    System.out.println(s);
   }
 }
 

Modified: trunk/java/com/tigervnc/vncviewer/CConn.java
===================================================================
--- trunk/java/com/tigervnc/vncviewer/CConn.java        2012-08-26 20:35:30 UTC 
(rev 4964)
+++ trunk/java/com/tigervnc/vncviewer/CConn.java        2012-08-26 20:52:15 UTC 
(rev 4965)
@@ -116,18 +116,16 @@
       String name = sock.getPeerEndpoint();
       vlog.info("Accepted connection from "+name);
     } else {
-      if (vncServerName != null) {
+      if (vncServerName != null &&
+          !viewer.alwaysShowServerDialog.getValue()) {
         serverHost = Hostname.getHost(vncServerName);
         serverPort = Hostname.getPort(vncServerName);
       } else {
         ServerDialog dlg = new ServerDialog(options, vncServerName, this);
         if (!dlg.showDialog() || dlg.server.getSelectedItem().equals("")) {
-          if (viewer.firstApplet) {
-            System.exit(1);
-          } else {
-            viewer.stop();
-            return;
-          }
+          vlog.info("No server name specified!");
+          close();
+          return;
         }
         vncServerName = (String)dlg.server.getSelectedItem();
         serverHost = Hostname.getHost(vncServerName);
@@ -171,12 +169,6 @@
     if (viewport != null)
       viewport.dispose();
     viewport = null;
-    if (viewer.firstApplet) {
-      System.exit(1);
-    } else {
-      close();
-      viewer.stop();
-    }
   } 
 
   // blockCallback() is called when reading from the socket would block.
@@ -691,11 +683,13 @@
   ////////////////////////////////////////////////////////////////////
   // The following methods are all called from the GUI thread
 
-  // close() closes the socket, thus waking up the RFB thread.
+  // close() shuts down the socket, thus waking up the RFB thread.
   public void close() {
+    deleteWindow();
     shuttingDown = true;
     try {
-      sock.shutdown();
+      if (sock != null)
+        sock.shutdown();
     } catch (java.lang.Exception e) {
       throw new Exception(e.toString());
     }
@@ -1321,7 +1315,7 @@
 
   // shuttingDown is set by the GUI thread and only ever tested by the RFB
   // thread after the window has been destroyed.
-  boolean shuttingDown;
+  boolean shuttingDown = false;
 
   // reading and writing int and boolean is atomic in java, so no
   // synchronization of the following flags is needed:

Modified: trunk/java/com/tigervnc/vncviewer/F8Menu.java
===================================================================
--- trunk/java/com/tigervnc/vncviewer/F8Menu.java       2012-08-26 20:35:30 UTC 
(rev 4964)
+++ trunk/java/com/tigervnc/vncviewer/F8Menu.java       2012-08-26 20:52:15 UTC 
(rev 4965)
@@ -85,7 +85,7 @@
 
   public void actionPerformed(ActionEvent ev) {
     if (actionMatch(ev, exit)) {
-      cc.deleteWindow();
+      cc.close();
     } else if (actionMatch(ev, fullScreen)) {
       cc.toggleFullScreen();
     } else if (actionMatch(ev, restore)) {

Modified: trunk/java/com/tigervnc/vncviewer/ServerDialog.java
===================================================================
--- trunk/java/com/tigervnc/vncviewer/ServerDialog.java 2012-08-26 20:35:30 UTC 
(rev 4964)
+++ trunk/java/com/tigervnc/vncviewer/ServerDialog.java 2012-08-26 20:52:15 UTC 
(rev 4965)
@@ -44,8 +44,8 @@
     setTitle("VNC Viewer : Connection Details");
     addWindowListener(new WindowAdapter() {
       public void windowClosing(WindowEvent e) {
-        if (cc.viewer.firstApplet && cc.viewport == null) {
-          System.exit(1);
+        if (cc.viewer.nViewers == 1) {
+          cc.viewer.exit(1);
         } else {
           ok = false;
           endDialog();

Modified: trunk/java/com/tigervnc/vncviewer/Viewport.java
===================================================================
--- trunk/java/com/tigervnc/vncviewer/Viewport.java     2012-08-26 20:35:30 UTC 
(rev 4964)
+++ trunk/java/com/tigervnc/vncviewer/Viewport.java     2012-08-26 20:52:15 UTC 
(rev 4965)
@@ -49,7 +49,7 @@
     });
     addWindowListener(new WindowAdapter() {
       public void windowClosing(WindowEvent e) {
-        cc.deleteWindow();
+        cc.close();
       }
     });
     addComponentListener(new ComponentAdapter() {

Modified: trunk/java/com/tigervnc/vncviewer/VncViewer.java
===================================================================
--- trunk/java/com/tigervnc/vncviewer/VncViewer.java    2012-08-26 20:35:30 UTC 
(rev 4964)
+++ trunk/java/com/tigervnc/vncviewer/VncViewer.java    2012-08-26 20:52:15 UTC 
(rev 4965)
@@ -108,8 +108,6 @@
   public static void main(String[] argv) {
     setLookAndFeel();
     VncViewer viewer = new VncViewer(argv);
-    viewer.firstApplet = true;
-    viewer.stop = false;
     viewer.start();
   }
 
@@ -138,7 +136,7 @@
 
       if (argv[i].equalsIgnoreCase("-tunnel") || 
argv[i].equalsIgnoreCase("-via")) {
         if (!tunnel.createTunnel(argv.length, argv, i))
-          System.exit(1);
+          exit(1);
         if (argv[i].equalsIgnoreCase("-via")) i++;
         continue;
       }
@@ -242,22 +240,22 @@
 "  \t%R     remote TCP port number.\n"+
 "\n");
     System.err.print(propertiesString);
+    // Technically, we shouldn't use System.exit here but if there is a 
parameter
+    // error then the problem is in the index/html file anyway.
     System.exit(1);
   }
 
   public VncViewer() {
     applet = true;
-    firstApplet = true;
   }
 
   public static void newViewer(VncViewer oldViewer, Socket sock, boolean 
close) {
     VncViewer viewer = new VncViewer();
     viewer.applet = oldViewer.applet;
-    viewer.firstApplet = (close) ? true : false;
     viewer.sock = sock;
     viewer.start();
     if (close)
-      oldViewer.stop();
+      oldViewer.exit(0);
   }
 
   public static void newViewer(VncViewer oldViewer, Socket sock) {
@@ -295,8 +293,7 @@
   public void start() {
     vlog.debug("start called");
     getTimestamp();
-    nViewers++;
-    if (applet && firstApplet) {
+    if (applet && nViewers == 0) {
       alwaysShowServerDialog.setParam(true);
       Configuration.global().readAppletParams(this);
       String host = getCodeBase().getHost();
@@ -307,12 +304,20 @@
                                        : ("::"+port)));
       }
     }
+    nViewers++;
     thread = new Thread(this);
     thread.start();
   }
 
-  public void stop() {
-    stop = true;
+  public void exit(int n) {
+    nViewers--;
+    if (nViewers > 0)
+      return;
+    if (applet) {
+      destroy();
+    } else {
+      System.exit(n);
+    }
   }
 
   public void paint(Graphics g) {
@@ -337,7 +342,7 @@
         listener = new TcpListener(null, port);
       } catch (java.lang.Exception e) {
         System.out.println(e.toString());
-        System.exit(1);
+        exit(1);
       }
 
       vlog.info("Listening on port "+port);
@@ -351,29 +356,22 @@
 
     try {
       cc = new CConn(this, sock, vncServerName.getValue());
-      while (!stop)
+      while (!cc.shuttingDown)
         cc.processMsg();
-      if (nViewers > 1) {
-        cc = null;
-        return;
-      }
-    } catch (EndOfStream e) {
-      vlog.info(e.toString());
     } catch (java.lang.Exception e) {
-      if (cc != null) cc.deleteWindow();
       if (cc == null || !cc.shuttingDown) {
         e.printStackTrace();
         JOptionPane.showMessageDialog(null,
           e.toString(),
           "VNC Viewer : Error",
           JOptionPane.ERROR_MESSAGE);
+      } else {
+        if (!cc.shuttingDown)
+          vlog.info(e.toString());
+        cc = null;
       }
     }
-    if (cc != null) cc.deleteWindow();
-    nViewers--;
-    if (!applet && nViewers == 0) {
-      System.exit(0);
-    }
+    exit(0);
   }
 
   BoolParameter useLocalCursor
@@ -536,7 +534,7 @@
 
   Thread thread;
   Socket sock;
-  boolean applet, firstApplet, stop;
+  boolean applet;
   Image logo;
   static int nViewers;
   static LogWriter vlog = new LogWriter("main");

This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.


------------------------------------------------------------------------------
Live Security Virtual Conference
Exclusive live event will cover all the ways today's security and 
threat landscape has changed and how IT managers can respond. Discussions 
will include endpoint security, mobile security and the latest in malware 
threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
_______________________________________________
Tigervnc-commits mailing list
Tigervnc-commits@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/tigervnc-commits

Reply via email to