]> source.dussan.org Git - tigervnc.git/commitdiff
Renaming the file to preserve its history.
authorConstantin Kaplinsky <const@tightvnc.com>
Mon, 21 Apr 2008 05:00:39 +0000 (05:00 +0000)
committerConstantin Kaplinsky <const@tightvnc.com>
Mon, 21 Apr 2008 05:00:39 +0000 (05:00 +0000)
git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@2499 3789f03b-4d11-0410-bbf8-ca57d06f2519

java/src/com/tightvnc/rfbplayer/RfbPlayer.java [new file with mode: 0644]
java/src/com/tightvnc/rfbplayer/VncViewer.java [deleted file]

diff --git a/java/src/com/tightvnc/rfbplayer/RfbPlayer.java b/java/src/com/tightvnc/rfbplayer/RfbPlayer.java
new file mode 100644 (file)
index 0000000..2524a50
--- /dev/null
@@ -0,0 +1,564 @@
+//
+//  Copyright (C) 2001,2002 HorizonLive.com, Inc.  All Rights Reserved.
+//  Copyright (C) 1999 AT&T Laboratories Cambridge.  All Rights Reserved.
+//
+//  This is free software; you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation; either version 2 of the License, or
+//  (at your option) any later version.
+//
+//  This software is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//  GNU General Public License for more details.
+//
+//  You should have received a copy of the GNU General Public License
+//  along with this software; if not, write to the Free Software
+//  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,
+//  USA.
+//
+
+//
+// VncViewer.java - the VNC viewer applet.  This class mainly just sets up the
+// user interface, leaving it to the VncCanvas to do the actual rendering of
+// a VNC desktop.
+//
+
+import java.awt.*;
+import java.awt.event.*;
+import java.io.*;
+
+public class VncViewer extends java.applet.Applet
+  implements java.lang.Runnable, WindowListener {
+
+  boolean inAnApplet = true;
+  boolean inSeparateFrame = false;
+
+  //
+  // main() is called when run as a java program from the command line.
+  // It simply runs the applet inside a newly-created frame.
+  //
+
+  public static void main(String[] argv) {
+    VncViewer v = new VncViewer();
+    v.mainArgs = argv;
+    v.inAnApplet = false;
+    v.inSeparateFrame = true;
+
+    v.init();
+    v.start();
+  }
+
+  String[] mainArgs;
+
+  RfbProto rfb;
+  Thread rfbThread;
+
+  Frame vncFrame;
+  Container vncContainer;
+  ScrollPane desktopScrollPane;
+  GridBagLayout gridbag;
+  ButtonPanel buttonPanel;
+  AuthPanel authenticator;
+  VncCanvas vc;
+  OptionsFrame options;
+  ClipboardFrame clipboard;
+
+  // Variables read from parameter values.
+  String host;
+  int port;
+  String passwordParam;
+  int deferScreenUpdates;
+  int deferCursorUpdates;
+  int deferUpdateRequests;
+
+
+  //
+  // init()
+  //
+
+  public void init() {
+
+    readParameters();
+
+    if (inSeparateFrame) {
+      vncFrame = new Frame("TightVNC");
+      if (!inAnApplet) {
+       vncFrame.add("Center", this);
+      }
+      vncContainer = vncFrame;
+    } else {
+      vncContainer = this;
+    }
+
+    options = new OptionsFrame(this);
+    clipboard = new ClipboardFrame(this);
+    authenticator = new AuthPanel();
+
+    if (inSeparateFrame)
+      vncFrame.addWindowListener(this);
+
+    rfbThread = new Thread(this);
+    rfbThread.start();
+  }
+
+  public void update(Graphics g) {
+  }
+
+  //
+  // run() - executed by the rfbThread to deal with the RFB socket.
+  //
+
+  public void run() {
+
+    gridbag = new GridBagLayout();
+    vncContainer.setLayout(gridbag);
+
+    GridBagConstraints gbc = new GridBagConstraints();
+    gbc.gridwidth = GridBagConstraints.REMAINDER;
+    gbc.anchor = GridBagConstraints.NORTHWEST;
+
+    if (options.showControls) {
+      buttonPanel = new ButtonPanel(this);
+      buttonPanel.setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0));
+      gridbag.setConstraints(buttonPanel, gbc);
+      vncContainer.add(buttonPanel);
+    }
+
+    try {
+      connectAndAuthenticate();
+
+      doProtocolInitialisation();
+
+      vc = new VncCanvas(this);
+      gbc.weightx = 1.0;
+      gbc.weighty = 1.0;
+
+      if (inSeparateFrame) {
+
+       // Create a panel which itself is resizeable and can hold
+       // non-resizeable VncCanvas component at the top left corner.
+       Panel canvasPanel = new Panel();
+       canvasPanel.setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0));
+       canvasPanel.add(vc);
+
+       // Create a ScrollPane which will hold a panel with VncCanvas
+       // inside.
+       desktopScrollPane = new ScrollPane(ScrollPane.SCROLLBARS_AS_NEEDED);
+       gbc.fill = GridBagConstraints.BOTH;
+       gridbag.setConstraints(desktopScrollPane, gbc);
+       desktopScrollPane.add(canvasPanel);
+
+       // Finally, add our ScrollPane to the Frame window.
+       vncFrame.add(desktopScrollPane);
+       vncFrame.setTitle(rfb.desktopName);
+       vncFrame.pack();
+       vc.resizeDesktopFrame();
+
+      } else {
+
+       // Just add the VncCanvas component to the Applet.
+       gridbag.setConstraints(vc, gbc);
+       add(vc);
+       validate();
+
+      }
+
+      if (options.showControls)
+        buttonPanel.enableButtons();
+
+      moveFocusToDesktop();
+      vc.processNormalProtocol();
+
+    } catch (Exception e) {
+      e.printStackTrace();
+      fatalError(e.toString());
+    }
+    
+  }
+
+
+  //
+  // Connect to the RFB server and authenticate the user.
+  //
+
+  void connectAndAuthenticate() throws IOException {
+
+    // The simplest case -- don't ask user a password, get it from the
+    // "PASSWORD" parameter instead. Authentication failures would be
+    // fatal.
+
+    if (passwordParam != null) {
+      if (inSeparateFrame) {
+       vncFrame.pack();
+       vncFrame.show();
+      } else {
+       validate();
+      }
+      if (!tryAuthenticate(passwordParam)) {
+       throw new IOException("VNC authentication failed");
+      }
+      return;
+    }
+
+    // There is no "PASSWORD" parameter -- ask user for a password,
+    // try to authenticate, retry on authentication failures.
+
+    GridBagConstraints gbc = new GridBagConstraints();
+    gbc.gridwidth = GridBagConstraints.REMAINDER;
+    gbc.anchor = GridBagConstraints.NORTHWEST;
+    gbc.weightx = 1.0;
+    gbc.weighty = 1.0;
+    gbc.ipadx = 100;
+    gbc.ipady = 50;
+    gridbag.setConstraints(authenticator, gbc);
+    vncContainer.add(authenticator);
+
+    if (inSeparateFrame) {
+      vncFrame.pack();
+      vncFrame.show();
+    } else {
+      validate();
+      // FIXME: here moveFocusToPasswordField() does not always work
+      // under Netscape 4.7x/Java 1.1.5/Linux. It seems like this call
+      // is being executed before the password field of the
+      // authenticator is fully drawn and activated, therefore
+      // requestFocus() does not work. Currently, I don't know how to
+      // solve this problem.
+      //   -- const
+      authenticator.moveFocusToPasswordField();
+    }
+
+    while (true) {
+      // Wait for user entering a password.
+      synchronized(authenticator) {
+       try {
+         authenticator.wait();
+       } catch (InterruptedException e) {
+       }
+      }
+
+      // Try to authenticate with a given password.
+      if (tryAuthenticate(authenticator.password.getText()))
+       break;
+
+      // Retry on authentication failure.
+      authenticator.retry();
+    }
+
+    vncContainer.remove(authenticator);
+  }
+
+
+  //
+  // Try to authenticate with a given password.
+  //
+
+  boolean tryAuthenticate(String pw) throws IOException {
+
+    rfb = new RfbProto(host, port, this);
+
+    rfb.readVersionMsg();
+
+    System.out.println("RFB server supports protocol version " +
+                      rfb.serverMajor + "." + rfb.serverMinor);
+
+    rfb.writeVersionMsg();
+
+    int authScheme = rfb.readAuthScheme();
+
+    switch (authScheme) {
+
+    case RfbProto.NoAuth:
+      System.out.println("No authentication needed");
+      return true;
+
+    case RfbProto.VncAuth:
+      byte[] challenge = new byte[16];
+      rfb.is.readFully(challenge);
+
+      if (pw.length() > 8)
+       pw = pw.substring(0, 8); // Truncate to 8 chars
+
+      byte[] key = {0, 0, 0, 0, 0, 0, 0, 0};
+      System.arraycopy(pw.getBytes(), 0, key, 0, pw.length());
+
+      DesCipher des = new DesCipher(key);
+
+      des.encrypt(challenge, 0, challenge, 0);
+      des.encrypt(challenge, 8, challenge, 8);
+
+      rfb.os.write(challenge);
+
+      int authResult = rfb.is.readInt();
+
+      switch (authResult) {
+      case RfbProto.VncAuthOK:
+       System.out.println("VNC authentication succeeded");
+       return true;
+      case RfbProto.VncAuthFailed:
+       System.out.println("VNC authentication failed");
+       break;
+      case RfbProto.VncAuthTooMany:
+       throw new IOException("VNC authentication failed - " +
+                             "too many tries");
+      default:
+       throw new IOException("Unknown VNC authentication result " +
+                             authResult);
+      }
+      break;
+
+    default:
+      throw new IOException("Unknown VNC authentication scheme " +
+                           authScheme);
+    }
+    return false;
+  }
+
+
+  //
+  // Do the rest of the protocol initialisation.
+  //
+
+  void doProtocolInitialisation() throws IOException {
+
+    rfb.writeClientInit();
+
+    rfb.readServerInit();
+
+    System.out.println("Desktop name is " + rfb.desktopName);
+    System.out.println("Desktop size is " + rfb.framebufferWidth + " x " +
+                      rfb.framebufferHeight);
+
+    setEncodings();
+  }
+
+
+  //
+  // Send current encoding list to the RFB server.
+  //
+
+  void setEncodings() {
+    try {
+      if (rfb != null && rfb.inNormalProtocol) {
+       rfb.writeSetEncodings(options.encodings, options.nEncodings);
+       if (vc != null) {
+         vc.softCursorFree();
+       }
+      }
+    } catch (Exception e) {
+      e.printStackTrace();
+    }
+  }
+
+
+  //
+  // setCutText() - send the given cut text to the RFB server.
+  //
+
+  void setCutText(String text) {
+    try {
+      if ((rfb != null) && rfb.inNormalProtocol) {
+       rfb.writeClientCutText(text);
+      }
+    } catch (Exception e) {
+      e.printStackTrace();
+    }
+  }
+
+
+  //
+  // readParameters() - read parameters from the html source or from the
+  // command line.  On the command line, the arguments are just a sequence of
+  // param_name/param_value pairs where the names and values correspond to
+  // those expected in the html applet tag source.
+  //
+
+  public void readParameters() {
+    host = readParameter("HOST", !inAnApplet);
+    if (host == null) {
+      host = getCodeBase().getHost();
+      if (host.equals("")) {
+       fatalError("HOST parameter not specified");
+      }
+    }
+
+    String str = readParameter("PORT", true);
+    port = Integer.parseInt(str);
+
+    if (inAnApplet) {
+      str = readParameter("Open New Window", false);
+      if (str != null && str.equalsIgnoreCase("Yes"))
+       inSeparateFrame = true;
+    }
+
+    passwordParam = readParameter("PASSWORD", false);
+
+    // Fine tuning options.
+    deferScreenUpdates = readIntParameter("Defer screen updates", 20);
+    deferCursorUpdates = readIntParameter("Defer cursor updates", 10);
+    deferUpdateRequests = readIntParameter("Defer update requests", 50);
+  }
+
+  public String readParameter(String name, boolean required) {
+    if (inAnApplet) {
+      String s = getParameter(name);
+      if ((s == null) && required) {
+       fatalError(name + " parameter not specified");
+      }
+      return s;
+    }
+
+    for (int i = 0; i < mainArgs.length; i += 2) {
+      if (mainArgs[i].equalsIgnoreCase(name)) {
+       try {
+         return mainArgs[i+1];
+       } catch (Exception e) {
+         if (required) {
+           fatalError(name + " parameter not specified");
+         }
+         return null;
+       }
+      }
+    }
+    if (required) {
+      fatalError(name + " parameter not specified");
+    }
+    return null;
+  }
+
+  int readIntParameter(String name, int defaultValue) {
+    String str = readParameter(name, false);
+    int result = defaultValue;
+    if (str != null) {
+      try {
+       result = Integer.parseInt(str);
+      } catch (NumberFormatException e) { }
+    }
+    return result;
+  }
+
+  //
+  // moveFocusToDesktop() - move keyboard focus either to the
+  // VncCanvas or to the AuthPanel.
+  //
+
+  void moveFocusToDesktop() {
+    if (vncContainer != null) {
+      if (vc != null && vncContainer.isAncestorOf(vc)) {
+       vc.requestFocus();
+      } else if (vncContainer.isAncestorOf(authenticator)) {
+       authenticator.moveFocusToPasswordField();
+      }
+    }
+  }
+
+  //
+  // disconnect() - close connection to server.
+  //
+
+  public void disconnect() {
+    System.out.println("Disconnect");
+    options.dispose();
+    clipboard.dispose();
+
+    if (inAnApplet) {
+      vncContainer.removeAll();
+      if (rfb != null) {
+       rfb.close();
+       rfb = null;
+      }
+      Label errLabel = new Label("Disconnected");
+      errLabel.setFont(new Font("Helvetica", Font.PLAIN, 12));
+      vncContainer.setLayout(new FlowLayout(FlowLayout.LEFT, 30, 30));
+      vncContainer.add(errLabel);
+      if (inSeparateFrame) {
+       vncFrame.pack();
+      } else {
+       validate();
+      }
+      rfbThread.stop();
+    } else {
+      System.exit(0);
+    }
+  }
+
+  //
+  // fatalError() - print out a fatal error message.
+  //
+
+  public void fatalError(String str) {
+    System.out.println(str);
+
+    if (inAnApplet) {
+      vncContainer.removeAll();
+      if (rfb != null) {
+       rfb.close();
+       rfb = null;
+      }
+      Label errLabel = new Label(str);
+      errLabel.setFont(new Font("Helvetica", Font.PLAIN, 12));
+      vncContainer.setLayout(new FlowLayout(FlowLayout.LEFT, 30, 30));
+      vncContainer.add(errLabel);
+      if (inSeparateFrame) {
+       vncFrame.pack();
+      } else {
+       validate();
+      }
+      Thread.currentThread().stop();
+    } else {
+      System.exit(1);
+    }
+  }
+
+
+  //
+  // This method is called before the applet is destroyed.
+  //
+
+  public void destroy() {
+    vncContainer.removeAll();
+    options.dispose();
+    clipboard.dispose();
+    if (rfb != null) {
+      rfb.close();
+    }
+    if (inSeparateFrame) {
+      vncFrame.dispose();
+    }
+  }
+
+
+  //
+  // Close application properly on window close event.
+  //
+
+  public void windowClosing(WindowEvent evt) {
+    if (rfb != null)
+      disconnect();
+
+    vncFrame.dispose();
+    if (!inAnApplet) {
+      System.exit(0);
+    }
+  }
+
+  //
+  // Move the keyboard focus to the password field on window activation.
+  //
+
+  public void windowActivated(WindowEvent evt) {
+    if (vncFrame.isAncestorOf(authenticator))
+      authenticator.moveFocusToPasswordField();
+  }
+
+  //
+  // Ignore window events we're not interested in.
+  //
+
+  public void windowDeactivated (WindowEvent evt) {}
+  public void windowOpened(WindowEvent evt) {}
+  public void windowClosed(WindowEvent evt) {}
+  public void windowIconified(WindowEvent evt) {}
+  public void windowDeiconified(WindowEvent evt) {}
+}
diff --git a/java/src/com/tightvnc/rfbplayer/VncViewer.java b/java/src/com/tightvnc/rfbplayer/VncViewer.java
deleted file mode 100644 (file)
index 2524a50..0000000
+++ /dev/null
@@ -1,564 +0,0 @@
-//
-//  Copyright (C) 2001,2002 HorizonLive.com, Inc.  All Rights Reserved.
-//  Copyright (C) 1999 AT&T Laboratories Cambridge.  All Rights Reserved.
-//
-//  This is free software; you can redistribute it and/or modify
-//  it under the terms of the GNU General Public License as published by
-//  the Free Software Foundation; either version 2 of the License, or
-//  (at your option) any later version.
-//
-//  This software is distributed in the hope that it will be useful,
-//  but WITHOUT ANY WARRANTY; without even the implied warranty of
-//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-//  GNU General Public License for more details.
-//
-//  You should have received a copy of the GNU General Public License
-//  along with this software; if not, write to the Free Software
-//  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,
-//  USA.
-//
-
-//
-// VncViewer.java - the VNC viewer applet.  This class mainly just sets up the
-// user interface, leaving it to the VncCanvas to do the actual rendering of
-// a VNC desktop.
-//
-
-import java.awt.*;
-import java.awt.event.*;
-import java.io.*;
-
-public class VncViewer extends java.applet.Applet
-  implements java.lang.Runnable, WindowListener {
-
-  boolean inAnApplet = true;
-  boolean inSeparateFrame = false;
-
-  //
-  // main() is called when run as a java program from the command line.
-  // It simply runs the applet inside a newly-created frame.
-  //
-
-  public static void main(String[] argv) {
-    VncViewer v = new VncViewer();
-    v.mainArgs = argv;
-    v.inAnApplet = false;
-    v.inSeparateFrame = true;
-
-    v.init();
-    v.start();
-  }
-
-  String[] mainArgs;
-
-  RfbProto rfb;
-  Thread rfbThread;
-
-  Frame vncFrame;
-  Container vncContainer;
-  ScrollPane desktopScrollPane;
-  GridBagLayout gridbag;
-  ButtonPanel buttonPanel;
-  AuthPanel authenticator;
-  VncCanvas vc;
-  OptionsFrame options;
-  ClipboardFrame clipboard;
-
-  // Variables read from parameter values.
-  String host;
-  int port;
-  String passwordParam;
-  int deferScreenUpdates;
-  int deferCursorUpdates;
-  int deferUpdateRequests;
-
-
-  //
-  // init()
-  //
-
-  public void init() {
-
-    readParameters();
-
-    if (inSeparateFrame) {
-      vncFrame = new Frame("TightVNC");
-      if (!inAnApplet) {
-       vncFrame.add("Center", this);
-      }
-      vncContainer = vncFrame;
-    } else {
-      vncContainer = this;
-    }
-
-    options = new OptionsFrame(this);
-    clipboard = new ClipboardFrame(this);
-    authenticator = new AuthPanel();
-
-    if (inSeparateFrame)
-      vncFrame.addWindowListener(this);
-
-    rfbThread = new Thread(this);
-    rfbThread.start();
-  }
-
-  public void update(Graphics g) {
-  }
-
-  //
-  // run() - executed by the rfbThread to deal with the RFB socket.
-  //
-
-  public void run() {
-
-    gridbag = new GridBagLayout();
-    vncContainer.setLayout(gridbag);
-
-    GridBagConstraints gbc = new GridBagConstraints();
-    gbc.gridwidth = GridBagConstraints.REMAINDER;
-    gbc.anchor = GridBagConstraints.NORTHWEST;
-
-    if (options.showControls) {
-      buttonPanel = new ButtonPanel(this);
-      buttonPanel.setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0));
-      gridbag.setConstraints(buttonPanel, gbc);
-      vncContainer.add(buttonPanel);
-    }
-
-    try {
-      connectAndAuthenticate();
-
-      doProtocolInitialisation();
-
-      vc = new VncCanvas(this);
-      gbc.weightx = 1.0;
-      gbc.weighty = 1.0;
-
-      if (inSeparateFrame) {
-
-       // Create a panel which itself is resizeable and can hold
-       // non-resizeable VncCanvas component at the top left corner.
-       Panel canvasPanel = new Panel();
-       canvasPanel.setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0));
-       canvasPanel.add(vc);
-
-       // Create a ScrollPane which will hold a panel with VncCanvas
-       // inside.
-       desktopScrollPane = new ScrollPane(ScrollPane.SCROLLBARS_AS_NEEDED);
-       gbc.fill = GridBagConstraints.BOTH;
-       gridbag.setConstraints(desktopScrollPane, gbc);
-       desktopScrollPane.add(canvasPanel);
-
-       // Finally, add our ScrollPane to the Frame window.
-       vncFrame.add(desktopScrollPane);
-       vncFrame.setTitle(rfb.desktopName);
-       vncFrame.pack();
-       vc.resizeDesktopFrame();
-
-      } else {
-
-       // Just add the VncCanvas component to the Applet.
-       gridbag.setConstraints(vc, gbc);
-       add(vc);
-       validate();
-
-      }
-
-      if (options.showControls)
-        buttonPanel.enableButtons();
-
-      moveFocusToDesktop();
-      vc.processNormalProtocol();
-
-    } catch (Exception e) {
-      e.printStackTrace();
-      fatalError(e.toString());
-    }
-    
-  }
-
-
-  //
-  // Connect to the RFB server and authenticate the user.
-  //
-
-  void connectAndAuthenticate() throws IOException {
-
-    // The simplest case -- don't ask user a password, get it from the
-    // "PASSWORD" parameter instead. Authentication failures would be
-    // fatal.
-
-    if (passwordParam != null) {
-      if (inSeparateFrame) {
-       vncFrame.pack();
-       vncFrame.show();
-      } else {
-       validate();
-      }
-      if (!tryAuthenticate(passwordParam)) {
-       throw new IOException("VNC authentication failed");
-      }
-      return;
-    }
-
-    // There is no "PASSWORD" parameter -- ask user for a password,
-    // try to authenticate, retry on authentication failures.
-
-    GridBagConstraints gbc = new GridBagConstraints();
-    gbc.gridwidth = GridBagConstraints.REMAINDER;
-    gbc.anchor = GridBagConstraints.NORTHWEST;
-    gbc.weightx = 1.0;
-    gbc.weighty = 1.0;
-    gbc.ipadx = 100;
-    gbc.ipady = 50;
-    gridbag.setConstraints(authenticator, gbc);
-    vncContainer.add(authenticator);
-
-    if (inSeparateFrame) {
-      vncFrame.pack();
-      vncFrame.show();
-    } else {
-      validate();
-      // FIXME: here moveFocusToPasswordField() does not always work
-      // under Netscape 4.7x/Java 1.1.5/Linux. It seems like this call
-      // is being executed before the password field of the
-      // authenticator is fully drawn and activated, therefore
-      // requestFocus() does not work. Currently, I don't know how to
-      // solve this problem.
-      //   -- const
-      authenticator.moveFocusToPasswordField();
-    }
-
-    while (true) {
-      // Wait for user entering a password.
-      synchronized(authenticator) {
-       try {
-         authenticator.wait();
-       } catch (InterruptedException e) {
-       }
-      }
-
-      // Try to authenticate with a given password.
-      if (tryAuthenticate(authenticator.password.getText()))
-       break;
-
-      // Retry on authentication failure.
-      authenticator.retry();
-    }
-
-    vncContainer.remove(authenticator);
-  }
-
-
-  //
-  // Try to authenticate with a given password.
-  //
-
-  boolean tryAuthenticate(String pw) throws IOException {
-
-    rfb = new RfbProto(host, port, this);
-
-    rfb.readVersionMsg();
-
-    System.out.println("RFB server supports protocol version " +
-                      rfb.serverMajor + "." + rfb.serverMinor);
-
-    rfb.writeVersionMsg();
-
-    int authScheme = rfb.readAuthScheme();
-
-    switch (authScheme) {
-
-    case RfbProto.NoAuth:
-      System.out.println("No authentication needed");
-      return true;
-
-    case RfbProto.VncAuth:
-      byte[] challenge = new byte[16];
-      rfb.is.readFully(challenge);
-
-      if (pw.length() > 8)
-       pw = pw.substring(0, 8); // Truncate to 8 chars
-
-      byte[] key = {0, 0, 0, 0, 0, 0, 0, 0};
-      System.arraycopy(pw.getBytes(), 0, key, 0, pw.length());
-
-      DesCipher des = new DesCipher(key);
-
-      des.encrypt(challenge, 0, challenge, 0);
-      des.encrypt(challenge, 8, challenge, 8);
-
-      rfb.os.write(challenge);
-
-      int authResult = rfb.is.readInt();
-
-      switch (authResult) {
-      case RfbProto.VncAuthOK:
-       System.out.println("VNC authentication succeeded");
-       return true;
-      case RfbProto.VncAuthFailed:
-       System.out.println("VNC authentication failed");
-       break;
-      case RfbProto.VncAuthTooMany:
-       throw new IOException("VNC authentication failed - " +
-                             "too many tries");
-      default:
-       throw new IOException("Unknown VNC authentication result " +
-                             authResult);
-      }
-      break;
-
-    default:
-      throw new IOException("Unknown VNC authentication scheme " +
-                           authScheme);
-    }
-    return false;
-  }
-
-
-  //
-  // Do the rest of the protocol initialisation.
-  //
-
-  void doProtocolInitialisation() throws IOException {
-
-    rfb.writeClientInit();
-
-    rfb.readServerInit();
-
-    System.out.println("Desktop name is " + rfb.desktopName);
-    System.out.println("Desktop size is " + rfb.framebufferWidth + " x " +
-                      rfb.framebufferHeight);
-
-    setEncodings();
-  }
-
-
-  //
-  // Send current encoding list to the RFB server.
-  //
-
-  void setEncodings() {
-    try {
-      if (rfb != null && rfb.inNormalProtocol) {
-       rfb.writeSetEncodings(options.encodings, options.nEncodings);
-       if (vc != null) {
-         vc.softCursorFree();
-       }
-      }
-    } catch (Exception e) {
-      e.printStackTrace();
-    }
-  }
-
-
-  //
-  // setCutText() - send the given cut text to the RFB server.
-  //
-
-  void setCutText(String text) {
-    try {
-      if ((rfb != null) && rfb.inNormalProtocol) {
-       rfb.writeClientCutText(text);
-      }
-    } catch (Exception e) {
-      e.printStackTrace();
-    }
-  }
-
-
-  //
-  // readParameters() - read parameters from the html source or from the
-  // command line.  On the command line, the arguments are just a sequence of
-  // param_name/param_value pairs where the names and values correspond to
-  // those expected in the html applet tag source.
-  //
-
-  public void readParameters() {
-    host = readParameter("HOST", !inAnApplet);
-    if (host == null) {
-      host = getCodeBase().getHost();
-      if (host.equals("")) {
-       fatalError("HOST parameter not specified");
-      }
-    }
-
-    String str = readParameter("PORT", true);
-    port = Integer.parseInt(str);
-
-    if (inAnApplet) {
-      str = readParameter("Open New Window", false);
-      if (str != null && str.equalsIgnoreCase("Yes"))
-       inSeparateFrame = true;
-    }
-
-    passwordParam = readParameter("PASSWORD", false);
-
-    // Fine tuning options.
-    deferScreenUpdates = readIntParameter("Defer screen updates", 20);
-    deferCursorUpdates = readIntParameter("Defer cursor updates", 10);
-    deferUpdateRequests = readIntParameter("Defer update requests", 50);
-  }
-
-  public String readParameter(String name, boolean required) {
-    if (inAnApplet) {
-      String s = getParameter(name);
-      if ((s == null) && required) {
-       fatalError(name + " parameter not specified");
-      }
-      return s;
-    }
-
-    for (int i = 0; i < mainArgs.length; i += 2) {
-      if (mainArgs[i].equalsIgnoreCase(name)) {
-       try {
-         return mainArgs[i+1];
-       } catch (Exception e) {
-         if (required) {
-           fatalError(name + " parameter not specified");
-         }
-         return null;
-       }
-      }
-    }
-    if (required) {
-      fatalError(name + " parameter not specified");
-    }
-    return null;
-  }
-
-  int readIntParameter(String name, int defaultValue) {
-    String str = readParameter(name, false);
-    int result = defaultValue;
-    if (str != null) {
-      try {
-       result = Integer.parseInt(str);
-      } catch (NumberFormatException e) { }
-    }
-    return result;
-  }
-
-  //
-  // moveFocusToDesktop() - move keyboard focus either to the
-  // VncCanvas or to the AuthPanel.
-  //
-
-  void moveFocusToDesktop() {
-    if (vncContainer != null) {
-      if (vc != null && vncContainer.isAncestorOf(vc)) {
-       vc.requestFocus();
-      } else if (vncContainer.isAncestorOf(authenticator)) {
-       authenticator.moveFocusToPasswordField();
-      }
-    }
-  }
-
-  //
-  // disconnect() - close connection to server.
-  //
-
-  public void disconnect() {
-    System.out.println("Disconnect");
-    options.dispose();
-    clipboard.dispose();
-
-    if (inAnApplet) {
-      vncContainer.removeAll();
-      if (rfb != null) {
-       rfb.close();
-       rfb = null;
-      }
-      Label errLabel = new Label("Disconnected");
-      errLabel.setFont(new Font("Helvetica", Font.PLAIN, 12));
-      vncContainer.setLayout(new FlowLayout(FlowLayout.LEFT, 30, 30));
-      vncContainer.add(errLabel);
-      if (inSeparateFrame) {
-       vncFrame.pack();
-      } else {
-       validate();
-      }
-      rfbThread.stop();
-    } else {
-      System.exit(0);
-    }
-  }
-
-  //
-  // fatalError() - print out a fatal error message.
-  //
-
-  public void fatalError(String str) {
-    System.out.println(str);
-
-    if (inAnApplet) {
-      vncContainer.removeAll();
-      if (rfb != null) {
-       rfb.close();
-       rfb = null;
-      }
-      Label errLabel = new Label(str);
-      errLabel.setFont(new Font("Helvetica", Font.PLAIN, 12));
-      vncContainer.setLayout(new FlowLayout(FlowLayout.LEFT, 30, 30));
-      vncContainer.add(errLabel);
-      if (inSeparateFrame) {
-       vncFrame.pack();
-      } else {
-       validate();
-      }
-      Thread.currentThread().stop();
-    } else {
-      System.exit(1);
-    }
-  }
-
-
-  //
-  // This method is called before the applet is destroyed.
-  //
-
-  public void destroy() {
-    vncContainer.removeAll();
-    options.dispose();
-    clipboard.dispose();
-    if (rfb != null) {
-      rfb.close();
-    }
-    if (inSeparateFrame) {
-      vncFrame.dispose();
-    }
-  }
-
-
-  //
-  // Close application properly on window close event.
-  //
-
-  public void windowClosing(WindowEvent evt) {
-    if (rfb != null)
-      disconnect();
-
-    vncFrame.dispose();
-    if (!inAnApplet) {
-      System.exit(0);
-    }
-  }
-
-  //
-  // Move the keyboard focus to the password field on window activation.
-  //
-
-  public void windowActivated(WindowEvent evt) {
-    if (vncFrame.isAncestorOf(authenticator))
-      authenticator.moveFocusToPasswordField();
-  }
-
-  //
-  // Ignore window events we're not interested in.
-  //
-
-  public void windowDeactivated (WindowEvent evt) {}
-  public void windowOpened(WindowEvent evt) {}
-  public void windowClosed(WindowEvent evt) {}
-  public void windowIconified(WindowEvent evt) {}
-  public void windowDeiconified(WindowEvent evt) {}
-}