aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrian Hinz <bphinz@users.sourceforge.net>2012-08-26 20:52:15 +0000
committerBrian Hinz <bphinz@users.sourceforge.net>2012-08-26 20:52:15 +0000
commit932fac573ab2f5a92c930e08de8aa9ddb98d4395 (patch)
treeb74ab123c4625241066c5ac8250d3c2e6015296d
parent7e4488dce2eaf6b2d661aae890213500af9a5ba6 (diff)
downloadtigervnc-932fac573ab2f5a92c930e08de8aa9ddb98d4395.tar.gz
tigervnc-932fac573ab2f5a92c930e08de8aa9ddb98d4395.zip
Fix AccessControlException caused by using System.exit() in applet mode, and close viewer properly in several other cases.
git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@4965 3789f03b-4d11-0410-bbf8-ca57d06f2519
-rw-r--r--java/com/tigervnc/network/SocketDescriptor.java9
-rw-r--r--java/com/tigervnc/network/TcpListener.java6
-rw-r--r--java/com/tigervnc/network/TcpSocket.java4
-rw-r--r--java/com/tigervnc/rdr/Exception.java1
-rw-r--r--java/com/tigervnc/vncviewer/CConn.java26
-rw-r--r--java/com/tigervnc/vncviewer/F8Menu.java2
-rw-r--r--java/com/tigervnc/vncviewer/ServerDialog.java4
-rw-r--r--java/com/tigervnc/vncviewer/Viewport.java2
-rw-r--r--java/com/tigervnc/vncviewer/VncViewer.java48
9 files changed, 50 insertions, 52 deletions
diff --git a/java/com/tigervnc/network/SocketDescriptor.java b/java/com/tigervnc/network/SocketDescriptor.java
index 3517a99f..4c5a23af 100644
--- a/java/com/tigervnc/network/SocketDescriptor.java
+++ b/java/com/tigervnc/network/SocketDescriptor.java
@@ -49,6 +49,15 @@ public class SocketDescriptor implements FileDescriptor {
}
}
+ 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();
diff --git a/java/com/tigervnc/network/TcpListener.java b/java/com/tigervnc/network/TcpListener.java
index 959d5459..b7dc4384 100644
--- a/java/com/tigervnc/network/TcpListener.java
+++ b/java/com/tigervnc/network/TcpListener.java
@@ -62,8 +62,7 @@ public class TcpListener extends SocketListener {
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 @@ public class TcpListener extends SocketListener {
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);
diff --git a/java/com/tigervnc/network/TcpSocket.java b/java/com/tigervnc/network/TcpSocket.java
index ac53aaf7..cdc05016 100644
--- a/java/com/tigervnc/network/TcpSocket.java
+++ b/java/com/tigervnc/network/TcpSocket.java
@@ -153,9 +153,9 @@ public class TcpSocket extends Socket {
}
public void shutdown() throws Exception {
+ super.shutdown();
try {
- close();
- super.shutdown();
+ ((SocketDescriptor)getFd()).shutdown();
} catch (IOException e) {
throw new Exception(e.toString());
}
diff --git a/java/com/tigervnc/rdr/Exception.java b/java/com/tigervnc/rdr/Exception.java
index 627b98d9..19977aac 100644
--- a/java/com/tigervnc/rdr/Exception.java
+++ b/java/com/tigervnc/rdr/Exception.java
@@ -22,7 +22,6 @@ package com.tigervnc.rdr;
public class Exception extends RuntimeException {
public Exception(String s) {
super(s);
- System.out.println(s);
}
}
diff --git a/java/com/tigervnc/vncviewer/CConn.java b/java/com/tigervnc/vncviewer/CConn.java
index f4c75a2e..e3aea943 100644
--- a/java/com/tigervnc/vncviewer/CConn.java
+++ b/java/com/tigervnc/vncviewer/CConn.java
@@ -116,18 +116,16 @@ public class CConn extends CConnection
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 @@ public class CConn extends CConnection
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 @@ public class CConn extends CConnection
////////////////////////////////////////////////////////////////////
// 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 @@ public class CConn extends CConnection
// 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:
diff --git a/java/com/tigervnc/vncviewer/F8Menu.java b/java/com/tigervnc/vncviewer/F8Menu.java
index b346db95..5d804b5b 100644
--- a/java/com/tigervnc/vncviewer/F8Menu.java
+++ b/java/com/tigervnc/vncviewer/F8Menu.java
@@ -85,7 +85,7 @@ public class F8Menu extends JPopupMenu implements ActionListener {
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)) {
diff --git a/java/com/tigervnc/vncviewer/ServerDialog.java b/java/com/tigervnc/vncviewer/ServerDialog.java
index b331d7a2..b596dbfd 100644
--- a/java/com/tigervnc/vncviewer/ServerDialog.java
+++ b/java/com/tigervnc/vncviewer/ServerDialog.java
@@ -44,8 +44,8 @@ class ServerDialog extends Dialog implements
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();
diff --git a/java/com/tigervnc/vncviewer/Viewport.java b/java/com/tigervnc/vncviewer/Viewport.java
index 680a02d3..de3621c2 100644
--- a/java/com/tigervnc/vncviewer/Viewport.java
+++ b/java/com/tigervnc/vncviewer/Viewport.java
@@ -49,7 +49,7 @@ public class Viewport extends JFrame
});
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
- cc.deleteWindow();
+ cc.close();
}
});
addComponentListener(new ComponentAdapter() {
diff --git a/java/com/tigervnc/vncviewer/VncViewer.java b/java/com/tigervnc/vncviewer/VncViewer.java
index b2fbee5c..acbdb7f2 100644
--- a/java/com/tigervnc/vncviewer/VncViewer.java
+++ b/java/com/tigervnc/vncviewer/VncViewer.java
@@ -108,8 +108,6 @@ public class VncViewer extends java.applet.Applet implements Runnable
public static void main(String[] argv) {
setLookAndFeel();
VncViewer viewer = new VncViewer(argv);
- viewer.firstApplet = true;
- viewer.stop = false;
viewer.start();
}
@@ -138,7 +136,7 @@ public class VncViewer extends java.applet.Applet implements Runnable
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 @@ public class VncViewer extends java.applet.Applet implements Runnable
" \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 class VncViewer extends java.applet.Applet implements Runnable
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 @@ public class VncViewer extends java.applet.Applet implements Runnable
: ("::"+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 @@ public class VncViewer extends java.applet.Applet implements Runnable
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 @@ public class VncViewer extends java.applet.Applet implements Runnable
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 @@ public class VncViewer extends java.applet.Applet implements Runnable
Thread thread;
Socket sock;
- boolean applet, firstApplet, stop;
+ boolean applet;
Image logo;
static int nViewers;
static LogWriter vlog = new LogWriter("main");