Index: trunk/packages/invirt-vnc-client/ButtonPanel.java
===================================================================
--- trunk/packages/invirt-vnc-client/ButtonPanel.java	(revision 1418)
+++ trunk/packages/invirt-vnc-client/ButtonPanel.java	(revision 1438)
@@ -28,5 +28,5 @@
 import java.io.*;
 
-class ButtonPanel extends Panel implements ActionListener, ItemListener {
+class ButtonPanel extends Panel implements ActionListener {
 
   VncViewer viewer;
@@ -37,6 +37,4 @@
   Button ctrlAltDelButton;
   Button refreshButton;
-  Checkbox altCheckbox;
-  Checkbox ctrlCheckbox;
 
   ButtonPanel(VncViewer v) {
@@ -68,13 +66,4 @@
     add(refreshButton);
     refreshButton.addActionListener(this);
-    
-    altCheckbox = new Checkbox("Alt");
-    altCheckbox.setEnabled(false);
-    add(altCheckbox);
-    altCheckbox.addItemListener(this);
-    ctrlCheckbox = new Checkbox("Control");
-    ctrlCheckbox.setEnabled(false);
-    add(ctrlCheckbox);
-    ctrlCheckbox.addItemListener(this);
   }
 
@@ -115,6 +104,4 @@
   public void enableRemoteAccessControls(boolean enable) {
     ctrlAltDelButton.setEnabled(enable);
-    ctrlCheckbox.setEnabled(enable);
-    altCheckbox.setEnabled(enable);
   }
 
@@ -164,12 +151,4 @@
     }
   }
-    public void itemStateChanged(ItemEvent evt) {
-	viewer.moveFocusToDesktop();
-	int state = evt.getStateChange();
-	int extraModifiers = 0;
-	if (altCheckbox.getState()) { extraModifiers |= InputEvent.ALT_MASK; }
-	if (ctrlCheckbox.getState()) { extraModifiers |= InputEvent.CTRL_MASK; }
-	viewer.vc.extraModifiers = extraModifiers;
-    }
 }
 
Index: trunk/packages/invirt-vnc-client/InvirtTrustManager.java
===================================================================
--- trunk/packages/invirt-vnc-client/InvirtTrustManager.java	(revision 1418)
+++ 	(revision )
@@ -1,122 +1,0 @@
-/*
- * Copyright 2006 Perry Nguyen <pfnguyen@hanhuy.com>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-import java.io.IOException;
-import java.io.InputStream;
-import java.security.KeyStore;
-import java.security.KeyStoreException;
-import java.security.NoSuchAlgorithmException;
-import java.security.cert.CertificateException;
-import java.security.cert.X509Certificate;
-import java.util.Enumeration;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import javax.net.ssl.TrustManager;
-import javax.net.ssl.TrustManagerFactory;
-import javax.net.ssl.X509TrustManager;
-
-public class InvirtTrustManager implements X509TrustManager {
-    private X509TrustManager trustManager;
-    private final static char[] KEY_STORE_PASSWORD =
-        { 'f', 'o', 'o', 'b', 'a', 'r' };
-    private final static String KEY_STORE_RESOURCE =
-        "trust.store";
-
-    private KeyStore loadKeyStore() throws Exception {
-        InputStream in = getClass().getClassLoader().getResourceAsStream(
-                KEY_STORE_RESOURCE);
-        KeyStore ks = null;
-        try {
-            if (in == null) {
-                //log.severe("Unable to open KeyStore");
-                throw new NullPointerException();
-            }
-            ks = KeyStore.getInstance(KeyStore.getDefaultType());
-            ks.load(in, KEY_STORE_PASSWORD);
-	    /*if (log.isLoggable(Level.FINEST)) {
-                for (Enumeration<String> aliases = ks.aliases();
-                aliases.hasMoreElements();) {
-                    String alias = aliases.nextElement();
-                    log.finest("ALIAS: " + alias);
-                }
-		}*/
-        } catch (NoSuchAlgorithmException e) {
-            throwError(e);
-        } catch (CertificateException e) {
-            throwError(e);
-        } catch (IOException e) {
-            throwError(e);
-        } catch (KeyStoreException e) {
-            throwError(e);
-        } finally {
-            try {
-                if (in != null)
-                    in.close();
-            }
-            catch (IOException e) { } // ignore
-        }
-        return ks;
-    }
-    private void createTrustManager() {
-	try {
-	    try {
-		KeyStore keystore = loadKeyStore();
-		TrustManagerFactory factory = TrustManagerFactory.getInstance(
-									      TrustManagerFactory.getDefaultAlgorithm());
-		factory.init(keystore);
-		TrustManager[] trustManagers = factory.getTrustManagers();
-		if (trustManagers.length == 0)
-		    throw new IllegalStateException("No trust manager found");
-		setTrustManager((X509TrustManager) trustManagers[0]);
-	    } catch (NoSuchAlgorithmException e) {
-		throwError(e);
-	    } catch (KeyStoreException e) {
-		throwError(e);
-	    }
-	} catch (Exception e) {
-	    e.printStackTrace();
-	}
-    }
-    private void throwError(Exception e) throws Exception {
-        //HttpClientError error = new HttpClientError(e.getMessage());
-        //error.initCause(e);
-        throw e;
-    }
-    public X509TrustManager getTrustManager() {
-        if (trustManager == null)
-            createTrustManager();
-        return trustManager;
-    }
-
-    public void setTrustManager(X509TrustManager trustManager) {
-        this.trustManager = trustManager;
-    }
-
-    public void checkClientTrusted(X509Certificate[] chain, String authType)
-            throws CertificateException {
-        getTrustManager().checkClientTrusted(chain, authType);
-    }
-
-    public void checkServerTrusted(X509Certificate[] chain, String authType)
-            throws CertificateException {
-        getTrustManager().checkServerTrusted(chain, authType);
-
-    }
-
-    public X509Certificate[] getAcceptedIssuers() {
-        return getTrustManager().getAcceptedIssuers();
-    }
-
-}
Index: trunk/packages/invirt-vnc-client/Makefile
===================================================================
--- trunk/packages/invirt-vnc-client/Makefile	(revision 1418)
+++ trunk/packages/invirt-vnc-client/Makefile	(revision 1438)
@@ -5,5 +5,5 @@
 CP = cp
 JC = javac
-JCFLAGS = -target 1.1 -source 1.2
+JCFLAGS = -target 1.1
 JAR = jar
 ARCHIVE = VncViewer.jar
@@ -18,8 +18,6 @@
 	  RecordingFrame.class SessionRecorder.class \
 	  SocketFactory.class HTTPConnectSocketFactory.class \
-	  VNCProxyConnectSocketFactory.class VNCProxyConnectSocket.class \
 	  HTTPConnectSocket.class ReloginPanel.class \
-	  InStream.class MemInStream.class ZlibInStream.class \
-	  VNCProxyConnectSocketWrapper.class SocketWrapper.class SocketWrapper\$$WrappingSocketImpl.class InvirtTrustManager.class
+	  InStream.class MemInStream.class ZlibInStream.class
 
 SOURCES = VncViewer.java RfbProto.java AuthPanel.java VncCanvas.java \
@@ -29,8 +27,6 @@
 	  RecordingFrame.java SessionRecorder.java \
 	  SocketFactory.java HTTPConnectSocketFactory.java \
-	  VNCProxyConnectSocketFactory.java VNCProxyConnectSocket.java \
 	  HTTPConnectSocket.java ReloginPanel.java \
-	  InStream.java MemInStream.java ZlibInStream.java \
-	  VNCProxyConnectSocketWrapper.java SocketWrapper.java InvirtTrustManager.java
+	  InStream.java MemInStream.java ZlibInStream.java
 
 all: $(CLASSES) $(ARCHIVE)
Index: trunk/packages/invirt-vnc-client/RfbProto.java
===================================================================
--- trunk/packages/invirt-vnc-client/RfbProto.java	(revision 1418)
+++ trunk/packages/invirt-vnc-client/RfbProto.java	(revision 1438)
@@ -209,5 +209,4 @@
 
     if (viewer.socketFactory == null) {
-	System.out.println("Null socketFactory");
       sock = new Socket(host, port);
     } else {
@@ -215,5 +214,4 @@
 	Class factoryClass = Class.forName(viewer.socketFactory);
 	SocketFactory factory = (SocketFactory)factoryClass.newInstance();
-	System.out.println("Using socketFactory " + factory);
 	if (viewer.inAnApplet)
 	  sock = factory.createSocket(host, port, viewer);
@@ -239,5 +237,5 @@
       sock.close();
       closed = true;
-      System.out.println("RFB socket closed " + sock);
+      System.out.println("RFB socket closed");
       if (rec != null) {
 	rec.close();
Index: trunk/packages/invirt-vnc-client/SocketWrapper.java
===================================================================
--- trunk/packages/invirt-vnc-client/SocketWrapper.java	(revision 1418)
+++ 	(revision )
@@ -1,262 +1,0 @@
-/*
- * Written by Dawid Kurzyniec and released to the public domain, as explained
- * at http://creativecommons.org/licenses/publicdomain
- */
-
-//package edu.emory.mathcs.util.net;
-
-import java.io.*;
-import java.net.*;
-import java.nio.channels.*;
-
-/**
- * Wrapper for sockets which enables to add functionality in subclasses
- * on top of existing, connected sockets. It is useful when direct subclassing
- * of delegate socket class is not possible, e.g. if the delegate socket is
- * created by a library. Possible usage example is socket factory chaining.
- * This class delegates all socket-related requests to the wrapped delegate,
- * as of JDK 1.4.
- *
- * @author Dawid Kurzyniec
- * @version 1.4
- */
-public abstract class SocketWrapper extends Socket {
-
-    /**
-     * the wrapped delegate socket.
-     */
-    protected final Socket delegate;
-
-    /**
-     * Creates new socket wrapper for a given socket. The delegate
-     * must be connected and bound and it must not be closed.
-     * @param delegate the delegate socket to wrap
-     * @throws SocketException if the delegate socket is closed, not bound,
-     *                         or not connected
-     */
-    protected SocketWrapper(Socket delegate) throws SocketException {
-        super(new WrappingSocketImpl(delegate));
-        this.delegate = delegate;
-	System.out.println("Creating SocketWrapper $Rev$");
-    }
-
-    public SocketChannel getChannel() {
-        return delegate.getChannel();
-    }
-
-    /**
-     * Returns true, indicating that the socket is bound.
-     *
-     * @return true
-     */
-    public boolean isBound() {
-        return true;
-    }
-
-    public boolean isClosed() {
-        return super.isClosed() || delegate.isClosed();
-    }
-
-    /**
-     * Returns true, indicating that the socket is connected.
-     *
-     * @return true
-     */
-    public boolean isConnected() {
-        return true;
-    }
-
-    public boolean isInputShutdown() {
-        return super.isInputShutdown() || delegate.isInputShutdown();
-    }
-
-    public boolean isOutputShutdown() {
-        return super.isInputShutdown() || delegate.isOutputShutdown();
-    }
-
-    private static class WrappingSocketImpl extends SocketImpl {
-        private final Socket delegate;
-        WrappingSocketImpl(Socket delegate) throws SocketException {
-            if (delegate == null) {
-                throw new NullPointerException();
-            }
-            if (delegate.isClosed()) {
-                throw new SocketException("Delegate server socket is closed");
-            }
-            if (!(delegate.isBound())) {
-                throw new SocketException("Delegate server socket is not bound");
-            }
-            if (!(delegate.isConnected())) {
-                throw new SocketException("Delegate server socket is not connected");
-            }
-            this.delegate = delegate;
-        }
-
-        protected void create(boolean stream) {}
-
-        protected void connect(String host, int port) {
-            // delegate is always connected, thus this method is never called
-            throw new UnsupportedOperationException();
-        }
-
-        protected void connect(InetAddress address, int port) {
-            // delegate is always connected, thus this method is never called
-            throw new UnsupportedOperationException();
-        }
-
-        protected void connect(SocketAddress address, int timeout) {
-            // delegate is always connected, thus this method is never called
-            throw new UnsupportedOperationException();
-        }
-
-        protected void bind(InetAddress host, int port) {
-            // delegate is always bound, thus this method is never called
-            throw new UnsupportedOperationException();
-        }
-
-        protected void listen(int backlog) {
-            // this wrapper is never used by a ServerSocket
-            throw new UnsupportedOperationException();
-        }
-
-        protected void accept(SocketImpl s) {
-            // this wrapper is never used by a ServerSocket
-            throw new UnsupportedOperationException();
-        }
-
-        protected InputStream getInputStream() throws IOException {
-            return delegate.getInputStream();
-        }
-
-        protected OutputStream getOutputStream() throws IOException {
-            return delegate.getOutputStream();
-        }
-
-        protected int available() throws IOException {
-            return getInputStream().available();
-        }
-
-        protected void close() throws IOException {
-	    System.out.println("Calling delegate.close");
-            delegate.close();
-        }
-
-        protected void shutdownInput() throws IOException {
-            delegate.shutdownInput();
-        }
-
-        protected void shutdownOutput() throws IOException {
-            delegate.shutdownOutput();
-        }
-
-        protected FileDescriptor getFileDescriptor() {
-            // this wrapper is never used by a ServerSocket
-            throw new UnsupportedOperationException();
-        }
-
-        protected InetAddress getInetAddress() {
-            return delegate.getInetAddress();
-        }
-
-        protected int getPort() {
-            return delegate.getPort();
-        }
-
-        protected boolean supportsUrgentData() {
-            return false; // must be overridden in sub-class
-        }
-
-        protected void sendUrgentData (int data) throws IOException {
-            delegate.sendUrgentData(data);
-        }
-
-        protected int getLocalPort() {
-            return delegate.getLocalPort();
-        }
-
-        public Object getOption(int optID) throws SocketException {
-            switch (optID) {
-                case SocketOptions.IP_TOS:
-                    return new Integer(delegate.getTrafficClass());
-                case SocketOptions.SO_BINDADDR:
-                    return delegate.getLocalAddress();
-                case SocketOptions.SO_KEEPALIVE:
-                    return Boolean.valueOf(delegate.getKeepAlive());
-                case SocketOptions.SO_LINGER:
-                    return new Integer(delegate.getSoLinger());
-                case SocketOptions.SO_OOBINLINE:
-                    return Boolean.valueOf(delegate.getOOBInline());
-                case SocketOptions.SO_RCVBUF:
-                    return new Integer(delegate.getReceiveBufferSize());
-                case SocketOptions.SO_REUSEADDR:
-                    return Boolean.valueOf(delegate.getReuseAddress());
-                case SocketOptions.SO_SNDBUF:
-                    return new Integer(delegate.getSendBufferSize());
-                case SocketOptions.SO_TIMEOUT:
-                    return new Integer(delegate.getSoTimeout());
-                case SocketOptions.TCP_NODELAY:
-                    return Boolean.valueOf(delegate.getTcpNoDelay());
-                case SocketOptions.SO_BROADCAST:
-                default:
-                    throw new IllegalArgumentException("Unsupported option type");
-            }
-        }
-
-        public void setOption(int optID, Object value) throws SocketException {
-            switch (optID) {
-                case SocketOptions.SO_BINDADDR:
-                    throw new IllegalArgumentException("Socket is bound");
-                case SocketOptions.SO_KEEPALIVE:
-                    delegate.setKeepAlive(((Boolean)value).booleanValue());
-                    break;
-                case SocketOptions.SO_LINGER:
-                    if (value instanceof Boolean) {
-                        delegate.setSoLinger(((Boolean)value).booleanValue(), 0);
-                    }
-                    else {
-                        delegate.setSoLinger(true, ((Integer)value).intValue());
-                    }
-                    break;
-                case SocketOptions.SO_OOBINLINE:
-                    delegate.setOOBInline(((Boolean)value).booleanValue());
-                    break;
-                case SocketOptions.SO_RCVBUF:
-                    delegate.setReceiveBufferSize(((Integer)value).intValue());
-                    break;
-                case SocketOptions.SO_REUSEADDR:
-                    delegate.setReuseAddress(((Boolean)value).booleanValue());
-                    break;
-                case SocketOptions.SO_SNDBUF:
-                    delegate.setSendBufferSize(((Integer)value).intValue());
-                    break;
-                case SocketOptions.SO_TIMEOUT:
-                    delegate.setSoTimeout(((Integer)value).intValue());
-                    break;
-                case SocketOptions.TCP_NODELAY:
-                    delegate.setTcpNoDelay(((Boolean)value).booleanValue());
-                    break;
-                case SocketOptions.SO_BROADCAST:
-                default:
-                    throw new IllegalArgumentException("Unsupported option type");
-            }
-        }
-    }
-
-    public void close() throws IOException {
-	System.out.println("Calling SocketWrapper.delegate.close");
-	delegate.close();
-    }
-
-    public boolean equals(Object obj) {
-        if (!(obj instanceof SocketWrapper)) return false;
-        SocketWrapper that = (SocketWrapper)obj;
-        return this.delegate.equals(that.delegate);
-    }
-
-    public int hashCode() {
-        return delegate.hashCode() ^ 0x01010101;
-    }
-    public String toString() {
-	return "<SocketWrapper " + super.toString() + "(delegating to " + delegate.toString() +  ")" + ">";
-    }
-}
Index: trunk/packages/invirt-vnc-client/VNCProxyConnectSocket.java
===================================================================
--- trunk/packages/invirt-vnc-client/VNCProxyConnectSocket.java	(revision 1418)
+++ 	(revision )
@@ -1,61 +1,0 @@
-//
-//  Copyright (C) 2002 Constantin Kaplinsky, Inc.  All Rights Reserved.
-//  Copyright 2007 MIT Student Information Processing Board
-//
-//  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.
-//
-
-//
-// VNCProxySocket.java together with VNCProxySocketFactory.java
-// implement an alternate way to connect to VNC servers via one or two
-// VNCProxy proxies supporting the VNCProxy VNCCONNECT method.
-//
-
-import java.net.*;
-import java.io.*;
-
-class VNCProxyConnectSocket extends Socket {
-
-  public VNCProxyConnectSocket(String host, int port,
-                               String vmname, String authtoken)
-    throws IOException {
-
-    // Connect to the specified HTTP proxy
-    super(host, port);
-
-    // Send the CONNECT request
-    getOutputStream().write(("CONNECTVNC " + vmname +
-                             " VNCProxy/1.0\r\nAuth-token: " + authtoken +
-                             "\r\n\r\n").getBytes());
-
-    // Read the first line of the response
-    DataInputStream is = new DataInputStream(getInputStream());
-    String str = is.readLine();
-
-    // Check the HTTP error code -- it should be "200" on success
-    if (!str.startsWith("VNCProxy/1.0 200 ")) {
-      if (str.startsWith("VNCProxy/1.0 "))
-        str = str.substring(13);
-      throw new IOException("Proxy reports \"" + str + "\"");
-    }
-
-    // Success -- skip remaining HTTP headers
-    do {
-      str = is.readLine();
-    } while (str.length() != 0);
-  }
-}
-
Index: trunk/packages/invirt-vnc-client/VNCProxyConnectSocketFactory.java
===================================================================
--- trunk/packages/invirt-vnc-client/VNCProxyConnectSocketFactory.java	(revision 1418)
+++ 	(revision )
@@ -1,98 +1,0 @@
-//
-//  Copyright (C) 2002 Constantin Kaplinsky, Inc.  All Rights Reserved.
-//  Copyright 2007 MIT Student Information Processing Board
-//
-//  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.
-//
-
-//
-// VNCProxyConnectSocketFactory.java together with VNCProxyConnectSocket.java
-// implement an alternate way to connect to VNC servers via one or two
-// VNCProxy proxies supporting the VNCProxy CONNECT method.
-//
-
-import java.applet.*;
-import java.net.*;
-import javax.net.ssl.*;
-import java.io.*;
-
-class VNCProxyConnectSocketFactory implements SocketFactory {
-
-    SSLSocketFactory factory;
-    
-    public VNCProxyConnectSocketFactory() {
-	try {
-	    SSLContext c = SSLContext.getInstance("SSL");
-	    c.init(null,
-		   new TrustManager[] { new InvirtTrustManager() },
-		   null);
-	    factory =
-		(SSLSocketFactory)c.getSocketFactory();
-	} catch (Exception e) {
-	    e.printStackTrace();
-	}
-    }
-
-  public Socket createSocket(String host, int port, Applet applet)
-    throws IOException {
-
-    return createSocket(host, port,
-			applet.getParameter("VMNAME"),
-			applet.getParameter("AUTHTOKEN"));
-  }
-
-  public Socket createSocket(String host, int port, String[] args)
-    throws IOException {
-
-    return createSocket(host, port,
-			readArg(args, "VMNAME"),
-			readArg(args, "AUTHTOKEN"));
-  }
-
-  public Socket createSocket(String host, int port,
-			     String vmname, String authtoken)
-    throws IOException {
-
-    if (vmname == null || authtoken == null) {
-      System.out.println("Incomplete parameter list for VNCProxyConnectSocket");
-      return new Socket(host, port);
-    }
-
-    System.out.println("VNCProxy CONNECT via proxy " + host +
-		       " port " + port + " to vm " + vmname);
-    SSLSocket ssls = (SSLSocket)factory.createSocket(host, port);
-    ssls.startHandshake();
-    VNCProxyConnectSocketWrapper s =
-      new VNCProxyConnectSocketWrapper(ssls, vmname, authtoken);
-
-    return (Socket)s;
-  }
-
-  private String readArg(String[] args, String name) {
-
-    for (int i = 0; i < args.length; i += 2) {
-      if (args[i].equalsIgnoreCase(name)) {
-	try {
-	  return args[i+1];
-	} catch (Exception e) {
-	  return null;
-	}
-      }
-    }
-    return null;
-  }
-}
-
Index: trunk/packages/invirt-vnc-client/VNCProxyConnectSocketWrapper.java
===================================================================
--- trunk/packages/invirt-vnc-client/VNCProxyConnectSocketWrapper.java	(revision 1418)
+++ 	(revision )
@@ -1,60 +1,0 @@
-//
-//  Copyright (C) 2002 Constantin Kaplinsky, Inc.  All Rights Reserved.
-//  Copyright 2007 MIT Student Information Processing Board
-//
-//  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.
-//
-
-//
-// VNCProxySocket.java together with VNCProxySocketFactory.java
-// implement an alternate way to connect to VNC servers via one or two
-// VNCProxy proxies supporting the VNCProxy VNCCONNECT method.
-//
-
-import java.net.*;
-import java.io.*;
-
-class VNCProxyConnectSocketWrapper extends SocketWrapper {
-
-  public VNCProxyConnectSocketWrapper(Socket sock,
-                               String vmname, String authtoken)
-    throws IOException {
-
-    super(sock);
-
-    // Send the CONNECT request
-    getOutputStream().write(("CONNECTVNC " + vmname +
-                             " VNCProxy/1.0\r\nAuth-token: " + authtoken +
-                             "\r\n\r\n").getBytes());
-
-    // Read the first line of the response
-    DataInputStream is = new DataInputStream(getInputStream());
-    String str = is.readLine();
-
-    // Check the HTTP error code -- it should be "200" on success
-    if (!str.startsWith("VNCProxy/1.0 200 ")) {
-      if (str.startsWith("VNCProxy/1.0 "))
-        str = str.substring(13);
-      throw new IOException("Proxy reports \"" + str + "\"");
-    }
-
-    // Success -- skip remaining HTTP headers
-    do {
-      str = is.readLine();
-    } while (str.length() != 0);
-  }
-}
-
Index: trunk/packages/invirt-vnc-client/VncCanvas.java
===================================================================
--- trunk/packages/invirt-vnc-client/VncCanvas.java	(revision 1418)
+++ trunk/packages/invirt-vnc-client/VncCanvas.java	(revision 1438)
@@ -80,5 +80,4 @@
   // True if we process keyboard and mouse events.
   boolean inputEnabled;
-  int extraModifiers = 0;
 
   //
@@ -1512,7 +1511,4 @@
 	synchronized(rfb) {
 	  try {
-	    if (extraModifiers != 0) {
-	      evt.setModifiers(evt.getModifiers() | extraModifiers);
-	    }
 	    rfb.writeKeyEvent(evt);
 	  } catch (Exception e) {
Index: trunk/packages/invirt-vnc-client/config.todo
===================================================================
--- trunk/packages/invirt-vnc-client/config.todo	(revision 1418)
+++ 	(revision )
@@ -1,1 +1,0 @@
-all: separate our changes from upstream
Index: trunk/packages/invirt-vnc-client/debian/changelog
===================================================================
--- trunk/packages/invirt-vnc-client/debian/changelog	(revision 1418)
+++ trunk/packages/invirt-vnc-client/debian/changelog	(revision 1438)
@@ -1,2 +1,8 @@
+invirt-vnc-client (0.0.6) unstable; urgency=low
+
+  * Isolate our patches from the upstream source
+
+ -- Evan Broder <broder@mit.edu>  Fri, 31 Oct 2008 06:10:38 -0400
+
 invirt-vnc-client (0.0.5) unstable; urgency=low
 
Index: trunk/packages/invirt-vnc-client/debian/control
===================================================================
--- trunk/packages/invirt-vnc-client/debian/control	(revision 1418)
+++ trunk/packages/invirt-vnc-client/debian/control	(revision 1438)
@@ -3,5 +3,5 @@
 Priority: extra
 Maintainer: Invirt project <invirt@mit.edu>
-Build-Depends: cdbs (>= 0.4.23-1.1), debhelper (>= 4.1.0), subversion, sun-java6-jdk | java-compiler
+Build-Depends: cdbs (>= 0.4.23-1.1), debhelper (>= 4.1.0), quilt, sun-java6-jdk | java-compiler
 Standards-Version: 3.7.2
 
Index: trunk/packages/invirt-vnc-client/debian/patches/add-control-alt-checkboxes.patch
===================================================================
--- trunk/packages/invirt-vnc-client/debian/patches/add-control-alt-checkboxes.patch	(revision 1438)
+++ trunk/packages/invirt-vnc-client/debian/patches/add-control-alt-checkboxes.patch	(revision 1438)
@@ -0,0 +1,83 @@
+Index: invirt-vnc-client/ButtonPanel.java
+===================================================================
+--- invirt-vnc-client.orig/ButtonPanel.java	2008-10-31 06:08:45.000000000 -0400
++++ invirt-vnc-client/ButtonPanel.java	2008-10-31 06:09:10.000000000 -0400
+@@ -27,7 +27,7 @@
+ import java.awt.event.*;
+ import java.io.*;
+ 
+-class ButtonPanel extends Panel implements ActionListener {
++class ButtonPanel extends Panel implements ActionListener, ItemListener {
+ 
+   VncViewer viewer;
+   Button disconnectButton;
+@@ -36,6 +36,8 @@
+   Button clipboardButton;
+   Button ctrlAltDelButton;
+   Button refreshButton;
++  Checkbox altCheckbox;
++  Checkbox ctrlCheckbox;
+ 
+   ButtonPanel(VncViewer v) {
+     viewer = v;
+@@ -65,6 +67,15 @@
+     refreshButton.setEnabled(false);
+     add(refreshButton);
+     refreshButton.addActionListener(this);
++    
++    altCheckbox = new Checkbox("Alt");
++    altCheckbox.setEnabled(false);
++    add(altCheckbox);
++    altCheckbox.addItemListener(this);
++    ctrlCheckbox = new Checkbox("Control");
++    ctrlCheckbox.setEnabled(false);
++    add(ctrlCheckbox);
++    ctrlCheckbox.addItemListener(this);
+   }
+ 
+   //
+@@ -103,6 +114,8 @@
+ 
+   public void enableRemoteAccessControls(boolean enable) {
+     ctrlAltDelButton.setEnabled(enable);
++    ctrlCheckbox.setEnabled(enable);
++    altCheckbox.setEnabled(enable);
+   }
+ 
+   //
+@@ -150,5 +163,13 @@
+       }
+     }
+   }
++    public void itemStateChanged(ItemEvent evt) {
++	viewer.moveFocusToDesktop();
++	int state = evt.getStateChange();
++	int extraModifiers = 0;
++	if (altCheckbox.getState()) { extraModifiers |= InputEvent.ALT_MASK; }
++	if (ctrlCheckbox.getState()) { extraModifiers |= InputEvent.CTRL_MASK; }
++	viewer.vc.extraModifiers = extraModifiers;
++    }
+ }
+ 
+Index: invirt-vnc-client/VncCanvas.java
+===================================================================
+--- invirt-vnc-client.orig/VncCanvas.java	2008-10-31 06:08:45.000000000 -0400
++++ invirt-vnc-client/VncCanvas.java	2008-10-31 06:09:10.000000000 -0400
+@@ -79,6 +79,7 @@
+ 
+   // True if we process keyboard and mouse events.
+   boolean inputEnabled;
++  int extraModifiers = 0;
+ 
+   //
+   // The constructors.
+@@ -1510,6 +1511,9 @@
+ 	// Input enabled.
+ 	synchronized(rfb) {
+ 	  try {
++	    if (extraModifiers != 0) {
++	      evt.setModifiers(evt.getModifiers() | extraModifiers);
++	    }
+ 	    rfb.writeKeyEvent(evt);
+ 	  } catch (Exception e) {
+ 	    e.printStackTrace();
Index: trunk/packages/invirt-vnc-client/debian/patches/invirt-ssl-proxy.patch
===================================================================
--- trunk/packages/invirt-vnc-client/debian/patches/invirt-ssl-proxy.patch	(revision 1438)
+++ trunk/packages/invirt-vnc-client/debian/patches/invirt-ssl-proxy.patch	(revision 1438)
@@ -0,0 +1,685 @@
+Index: invirt-vnc-client/InvirtTrustManager.java
+===================================================================
+--- /dev/null	1970-01-01 00:00:00.000000000 +0000
++++ invirt-vnc-client/InvirtTrustManager.java	2008-10-31 06:09:10.000000000 -0400
+@@ -0,0 +1,122 @@
++/*
++ * Copyright 2006 Perry Nguyen <pfnguyen@hanhuy.com>
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *     http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++import java.io.IOException;
++import java.io.InputStream;
++import java.security.KeyStore;
++import java.security.KeyStoreException;
++import java.security.NoSuchAlgorithmException;
++import java.security.cert.CertificateException;
++import java.security.cert.X509Certificate;
++import java.util.Enumeration;
++import java.util.logging.Level;
++import java.util.logging.Logger;
++
++import javax.net.ssl.TrustManager;
++import javax.net.ssl.TrustManagerFactory;
++import javax.net.ssl.X509TrustManager;
++
++public class InvirtTrustManager implements X509TrustManager {
++    private X509TrustManager trustManager;
++    private final static char[] KEY_STORE_PASSWORD =
++        { 'f', 'o', 'o', 'b', 'a', 'r' };
++    private final static String KEY_STORE_RESOURCE =
++        "trust.store";
++
++    private KeyStore loadKeyStore() throws Exception {
++        InputStream in = getClass().getClassLoader().getResourceAsStream(
++                KEY_STORE_RESOURCE);
++        KeyStore ks = null;
++        try {
++            if (in == null) {
++                //log.severe("Unable to open KeyStore");
++                throw new NullPointerException();
++            }
++            ks = KeyStore.getInstance(KeyStore.getDefaultType());
++            ks.load(in, KEY_STORE_PASSWORD);
++	    /*if (log.isLoggable(Level.FINEST)) {
++                for (Enumeration<String> aliases = ks.aliases();
++                aliases.hasMoreElements();) {
++                    String alias = aliases.nextElement();
++                    log.finest("ALIAS: " + alias);
++                }
++		}*/
++        } catch (NoSuchAlgorithmException e) {
++            throwError(e);
++        } catch (CertificateException e) {
++            throwError(e);
++        } catch (IOException e) {
++            throwError(e);
++        } catch (KeyStoreException e) {
++            throwError(e);
++        } finally {
++            try {
++                if (in != null)
++                    in.close();
++            }
++            catch (IOException e) { } // ignore
++        }
++        return ks;
++    }
++    private void createTrustManager() {
++	try {
++	    try {
++		KeyStore keystore = loadKeyStore();
++		TrustManagerFactory factory = TrustManagerFactory.getInstance(
++									      TrustManagerFactory.getDefaultAlgorithm());
++		factory.init(keystore);
++		TrustManager[] trustManagers = factory.getTrustManagers();
++		if (trustManagers.length == 0)
++		    throw new IllegalStateException("No trust manager found");
++		setTrustManager((X509TrustManager) trustManagers[0]);
++	    } catch (NoSuchAlgorithmException e) {
++		throwError(e);
++	    } catch (KeyStoreException e) {
++		throwError(e);
++	    }
++	} catch (Exception e) {
++	    e.printStackTrace();
++	}
++    }
++    private void throwError(Exception e) throws Exception {
++        //HttpClientError error = new HttpClientError(e.getMessage());
++        //error.initCause(e);
++        throw e;
++    }
++    public X509TrustManager getTrustManager() {
++        if (trustManager == null)
++            createTrustManager();
++        return trustManager;
++    }
++
++    public void setTrustManager(X509TrustManager trustManager) {
++        this.trustManager = trustManager;
++    }
++
++    public void checkClientTrusted(X509Certificate[] chain, String authType)
++            throws CertificateException {
++        getTrustManager().checkClientTrusted(chain, authType);
++    }
++
++    public void checkServerTrusted(X509Certificate[] chain, String authType)
++            throws CertificateException {
++        getTrustManager().checkServerTrusted(chain, authType);
++
++    }
++
++    public X509Certificate[] getAcceptedIssuers() {
++        return getTrustManager().getAcceptedIssuers();
++    }
++
++}
+\ No newline at end of file
+Index: invirt-vnc-client/Makefile
+===================================================================
+--- invirt-vnc-client.orig/Makefile	2008-10-31 06:09:10.000000000 -0400
++++ invirt-vnc-client/Makefile	2008-10-31 06:09:10.000000000 -0400
+@@ -17,8 +17,10 @@
+ 	  DesCipher.class CapabilityInfo.class CapsContainer.class \
+ 	  RecordingFrame.class SessionRecorder.class \
+ 	  SocketFactory.class HTTPConnectSocketFactory.class \
++	  VNCProxyConnectSocketFactory.class VNCProxyConnectSocket.class \
+ 	  HTTPConnectSocket.class ReloginPanel.class \
+-	  InStream.class MemInStream.class ZlibInStream.class
++	  InStream.class MemInStream.class ZlibInStream.class \
++	  VNCProxyConnectSocketWrapper.class SocketWrapper.class SocketWrapper\$$WrappingSocketImpl.class InvirtTrustManager.class
+ 
+ SOURCES = VncViewer.java RfbProto.java AuthPanel.java VncCanvas.java \
+ 	  VncCanvas2.java \
+@@ -26,8 +28,10 @@
+ 	  DesCipher.java CapabilityInfo.java CapsContainer.java \
+ 	  RecordingFrame.java SessionRecorder.java \
+ 	  SocketFactory.java HTTPConnectSocketFactory.java \
++	  VNCProxyConnectSocketFactory.java VNCProxyConnectSocket.java \
+ 	  HTTPConnectSocket.java ReloginPanel.java \
+-	  InStream.java MemInStream.java ZlibInStream.java
++	  InStream.java MemInStream.java ZlibInStream.java \
++	  VNCProxyConnectSocketWrapper.java SocketWrapper.java InvirtTrustManager.java
+ 
+ all: $(CLASSES) $(ARCHIVE)
+ 
+Index: invirt-vnc-client/RfbProto.java
+===================================================================
+--- invirt-vnc-client.orig/RfbProto.java	2007-04-26 22:36:00.000000000 -0400
++++ invirt-vnc-client/RfbProto.java	2008-10-31 06:09:10.000000000 -0400
+@@ -208,11 +208,13 @@
+     port = p;
+ 
+     if (viewer.socketFactory == null) {
++	System.out.println("Null socketFactory");
+       sock = new Socket(host, port);
+     } else {
+       try {
+ 	Class factoryClass = Class.forName(viewer.socketFactory);
+ 	SocketFactory factory = (SocketFactory)factoryClass.newInstance();
++	System.out.println("Using socketFactory " + factory);
+ 	if (viewer.inAnApplet)
+ 	  sock = factory.createSocket(host, port, viewer);
+ 	else
+@@ -236,7 +238,7 @@
+     try {
+       sock.close();
+       closed = true;
+-      System.out.println("RFB socket closed");
++      System.out.println("RFB socket closed " + sock);
+       if (rec != null) {
+ 	rec.close();
+ 	rec = null;
+Index: invirt-vnc-client/SocketWrapper.java
+===================================================================
+--- /dev/null	1970-01-01 00:00:00.000000000 +0000
++++ invirt-vnc-client/SocketWrapper.java	2008-10-31 06:09:10.000000000 -0400
+@@ -0,0 +1,262 @@
++/*
++ * Written by Dawid Kurzyniec and released to the public domain, as explained
++ * at http://creativecommons.org/licenses/publicdomain
++ */
++
++//package edu.emory.mathcs.util.net;
++
++import java.io.*;
++import java.net.*;
++import java.nio.channels.*;
++
++/**
++ * Wrapper for sockets which enables to add functionality in subclasses
++ * on top of existing, connected sockets. It is useful when direct subclassing
++ * of delegate socket class is not possible, e.g. if the delegate socket is
++ * created by a library. Possible usage example is socket factory chaining.
++ * This class delegates all socket-related requests to the wrapped delegate,
++ * as of JDK 1.4.
++ *
++ * @author Dawid Kurzyniec
++ * @version 1.4
++ */
++public abstract class SocketWrapper extends Socket {
++
++    /**
++     * the wrapped delegate socket.
++     */
++    protected final Socket delegate;
++
++    /**
++     * Creates new socket wrapper for a given socket. The delegate
++     * must be connected and bound and it must not be closed.
++     * @param delegate the delegate socket to wrap
++     * @throws SocketException if the delegate socket is closed, not bound,
++     *                         or not connected
++     */
++    protected SocketWrapper(Socket delegate) throws SocketException {
++        super(new WrappingSocketImpl(delegate));
++        this.delegate = delegate;
++	System.out.println("Creating SocketWrapper $Rev$");
++    }
++
++    public SocketChannel getChannel() {
++        return delegate.getChannel();
++    }
++
++    /**
++     * Returns true, indicating that the socket is bound.
++     *
++     * @return true
++     */
++    public boolean isBound() {
++        return true;
++    }
++
++    public boolean isClosed() {
++        return super.isClosed() || delegate.isClosed();
++    }
++
++    /**
++     * Returns true, indicating that the socket is connected.
++     *
++     * @return true
++     */
++    public boolean isConnected() {
++        return true;
++    }
++
++    public boolean isInputShutdown() {
++        return super.isInputShutdown() || delegate.isInputShutdown();
++    }
++
++    public boolean isOutputShutdown() {
++        return super.isInputShutdown() || delegate.isOutputShutdown();
++    }
++
++    private static class WrappingSocketImpl extends SocketImpl {
++        private final Socket delegate;
++        WrappingSocketImpl(Socket delegate) throws SocketException {
++            if (delegate == null) {
++                throw new NullPointerException();
++            }
++            if (delegate.isClosed()) {
++                throw new SocketException("Delegate server socket is closed");
++            }
++            if (!(delegate.isBound())) {
++                throw new SocketException("Delegate server socket is not bound");
++            }
++            if (!(delegate.isConnected())) {
++                throw new SocketException("Delegate server socket is not connected");
++            }
++            this.delegate = delegate;
++        }
++
++        protected void create(boolean stream) {}
++
++        protected void connect(String host, int port) {
++            // delegate is always connected, thus this method is never called
++            throw new UnsupportedOperationException();
++        }
++
++        protected void connect(InetAddress address, int port) {
++            // delegate is always connected, thus this method is never called
++            throw new UnsupportedOperationException();
++        }
++
++        protected void connect(SocketAddress address, int timeout) {
++            // delegate is always connected, thus this method is never called
++            throw new UnsupportedOperationException();
++        }
++
++        protected void bind(InetAddress host, int port) {
++            // delegate is always bound, thus this method is never called
++            throw new UnsupportedOperationException();
++        }
++
++        protected void listen(int backlog) {
++            // this wrapper is never used by a ServerSocket
++            throw new UnsupportedOperationException();
++        }
++
++        protected void accept(SocketImpl s) {
++            // this wrapper is never used by a ServerSocket
++            throw new UnsupportedOperationException();
++        }
++
++        protected InputStream getInputStream() throws IOException {
++            return delegate.getInputStream();
++        }
++
++        protected OutputStream getOutputStream() throws IOException {
++            return delegate.getOutputStream();
++        }
++
++        protected int available() throws IOException {
++            return getInputStream().available();
++        }
++
++        protected void close() throws IOException {
++	    System.out.println("Calling delegate.close");
++            delegate.close();
++        }
++
++        protected void shutdownInput() throws IOException {
++            delegate.shutdownInput();
++        }
++
++        protected void shutdownOutput() throws IOException {
++            delegate.shutdownOutput();
++        }
++
++        protected FileDescriptor getFileDescriptor() {
++            // this wrapper is never used by a ServerSocket
++            throw new UnsupportedOperationException();
++        }
++
++        protected InetAddress getInetAddress() {
++            return delegate.getInetAddress();
++        }
++
++        protected int getPort() {
++            return delegate.getPort();
++        }
++
++        protected boolean supportsUrgentData() {
++            return false; // must be overridden in sub-class
++        }
++
++        protected void sendUrgentData (int data) throws IOException {
++            delegate.sendUrgentData(data);
++        }
++
++        protected int getLocalPort() {
++            return delegate.getLocalPort();
++        }
++
++        public Object getOption(int optID) throws SocketException {
++            switch (optID) {
++                case SocketOptions.IP_TOS:
++                    return new Integer(delegate.getTrafficClass());
++                case SocketOptions.SO_BINDADDR:
++                    return delegate.getLocalAddress();
++                case SocketOptions.SO_KEEPALIVE:
++                    return Boolean.valueOf(delegate.getKeepAlive());
++                case SocketOptions.SO_LINGER:
++                    return new Integer(delegate.getSoLinger());
++                case SocketOptions.SO_OOBINLINE:
++                    return Boolean.valueOf(delegate.getOOBInline());
++                case SocketOptions.SO_RCVBUF:
++                    return new Integer(delegate.getReceiveBufferSize());
++                case SocketOptions.SO_REUSEADDR:
++                    return Boolean.valueOf(delegate.getReuseAddress());
++                case SocketOptions.SO_SNDBUF:
++                    return new Integer(delegate.getSendBufferSize());
++                case SocketOptions.SO_TIMEOUT:
++                    return new Integer(delegate.getSoTimeout());
++                case SocketOptions.TCP_NODELAY:
++                    return Boolean.valueOf(delegate.getTcpNoDelay());
++                case SocketOptions.SO_BROADCAST:
++                default:
++                    throw new IllegalArgumentException("Unsupported option type");
++            }
++        }
++
++        public void setOption(int optID, Object value) throws SocketException {
++            switch (optID) {
++                case SocketOptions.SO_BINDADDR:
++                    throw new IllegalArgumentException("Socket is bound");
++                case SocketOptions.SO_KEEPALIVE:
++                    delegate.setKeepAlive(((Boolean)value).booleanValue());
++                    break;
++                case SocketOptions.SO_LINGER:
++                    if (value instanceof Boolean) {
++                        delegate.setSoLinger(((Boolean)value).booleanValue(), 0);
++                    }
++                    else {
++                        delegate.setSoLinger(true, ((Integer)value).intValue());
++                    }
++                    break;
++                case SocketOptions.SO_OOBINLINE:
++                    delegate.setOOBInline(((Boolean)value).booleanValue());
++                    break;
++                case SocketOptions.SO_RCVBUF:
++                    delegate.setReceiveBufferSize(((Integer)value).intValue());
++                    break;
++                case SocketOptions.SO_REUSEADDR:
++                    delegate.setReuseAddress(((Boolean)value).booleanValue());
++                    break;
++                case SocketOptions.SO_SNDBUF:
++                    delegate.setSendBufferSize(((Integer)value).intValue());
++                    break;
++                case SocketOptions.SO_TIMEOUT:
++                    delegate.setSoTimeout(((Integer)value).intValue());
++                    break;
++                case SocketOptions.TCP_NODELAY:
++                    delegate.setTcpNoDelay(((Boolean)value).booleanValue());
++                    break;
++                case SocketOptions.SO_BROADCAST:
++                default:
++                    throw new IllegalArgumentException("Unsupported option type");
++            }
++        }
++    }
++
++    public void close() throws IOException {
++	System.out.println("Calling SocketWrapper.delegate.close");
++	delegate.close();
++    }
++
++    public boolean equals(Object obj) {
++        if (!(obj instanceof SocketWrapper)) return false;
++        SocketWrapper that = (SocketWrapper)obj;
++        return this.delegate.equals(that.delegate);
++    }
++
++    public int hashCode() {
++        return delegate.hashCode() ^ 0x01010101;
++    }
++    public String toString() {
++	return "<SocketWrapper " + super.toString() + "(delegating to " + delegate.toString() +  ")" + ">";
++    }
++}
+\ No newline at end of file
+Index: invirt-vnc-client/VNCProxyConnectSocket.java
+===================================================================
+--- /dev/null	1970-01-01 00:00:00.000000000 +0000
++++ invirt-vnc-client/VNCProxyConnectSocket.java	2008-10-31 06:09:10.000000000 -0400
+@@ -0,0 +1,61 @@
++//
++//  Copyright (C) 2002 Constantin Kaplinsky, Inc.  All Rights Reserved.
++//  Copyright 2007 MIT Student Information Processing Board
++//
++//  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.
++//
++
++//
++// VNCProxySocket.java together with VNCProxySocketFactory.java
++// implement an alternate way to connect to VNC servers via one or two
++// VNCProxy proxies supporting the VNCProxy VNCCONNECT method.
++//
++
++import java.net.*;
++import java.io.*;
++
++class VNCProxyConnectSocket extends Socket {
++
++  public VNCProxyConnectSocket(String host, int port,
++                               String vmname, String authtoken)
++    throws IOException {
++
++    // Connect to the specified HTTP proxy
++    super(host, port);
++
++    // Send the CONNECT request
++    getOutputStream().write(("CONNECTVNC " + vmname +
++                             " VNCProxy/1.0\r\nAuth-token: " + authtoken +
++                             "\r\n\r\n").getBytes());
++
++    // Read the first line of the response
++    DataInputStream is = new DataInputStream(getInputStream());
++    String str = is.readLine();
++
++    // Check the HTTP error code -- it should be "200" on success
++    if (!str.startsWith("VNCProxy/1.0 200 ")) {
++      if (str.startsWith("VNCProxy/1.0 "))
++        str = str.substring(13);
++      throw new IOException("Proxy reports \"" + str + "\"");
++    }
++
++    // Success -- skip remaining HTTP headers
++    do {
++      str = is.readLine();
++    } while (str.length() != 0);
++  }
++}
++
+Index: invirt-vnc-client/VNCProxyConnectSocketFactory.java
+===================================================================
+--- /dev/null	1970-01-01 00:00:00.000000000 +0000
++++ invirt-vnc-client/VNCProxyConnectSocketFactory.java	2008-10-31 06:09:10.000000000 -0400
+@@ -0,0 +1,98 @@
++//
++//  Copyright (C) 2002 Constantin Kaplinsky, Inc.  All Rights Reserved.
++//  Copyright 2007 MIT Student Information Processing Board
++//
++//  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.
++//
++
++//
++// VNCProxyConnectSocketFactory.java together with VNCProxyConnectSocket.java
++// implement an alternate way to connect to VNC servers via one or two
++// VNCProxy proxies supporting the VNCProxy CONNECT method.
++//
++
++import java.applet.*;
++import java.net.*;
++import javax.net.ssl.*;
++import java.io.*;
++
++class VNCProxyConnectSocketFactory implements SocketFactory {
++
++    SSLSocketFactory factory;
++    
++    public VNCProxyConnectSocketFactory() {
++	try {
++	    SSLContext c = SSLContext.getInstance("SSL");
++	    c.init(null,
++		   new TrustManager[] { new InvirtTrustManager() },
++		   null);
++	    factory =
++		(SSLSocketFactory)c.getSocketFactory();
++	} catch (Exception e) {
++	    e.printStackTrace();
++	}
++    }
++
++  public Socket createSocket(String host, int port, Applet applet)
++    throws IOException {
++
++    return createSocket(host, port,
++			applet.getParameter("VMNAME"),
++			applet.getParameter("AUTHTOKEN"));
++  }
++
++  public Socket createSocket(String host, int port, String[] args)
++    throws IOException {
++
++    return createSocket(host, port,
++			readArg(args, "VMNAME"),
++			readArg(args, "AUTHTOKEN"));
++  }
++
++  public Socket createSocket(String host, int port,
++			     String vmname, String authtoken)
++    throws IOException {
++
++    if (vmname == null || authtoken == null) {
++      System.out.println("Incomplete parameter list for VNCProxyConnectSocket");
++      return new Socket(host, port);
++    }
++
++    System.out.println("VNCProxy CONNECT via proxy " + host +
++		       " port " + port + " to vm " + vmname);
++    SSLSocket ssls = (SSLSocket)factory.createSocket(host, port);
++    ssls.startHandshake();
++    VNCProxyConnectSocketWrapper s =
++      new VNCProxyConnectSocketWrapper(ssls, vmname, authtoken);
++
++    return (Socket)s;
++  }
++
++  private String readArg(String[] args, String name) {
++
++    for (int i = 0; i < args.length; i += 2) {
++      if (args[i].equalsIgnoreCase(name)) {
++	try {
++	  return args[i+1];
++	} catch (Exception e) {
++	  return null;
++	}
++      }
++    }
++    return null;
++  }
++}
++
+Index: invirt-vnc-client/VNCProxyConnectSocketWrapper.java
+===================================================================
+--- /dev/null	1970-01-01 00:00:00.000000000 +0000
++++ invirt-vnc-client/VNCProxyConnectSocketWrapper.java	2008-10-31 06:09:10.000000000 -0400
+@@ -0,0 +1,60 @@
++//
++//  Copyright (C) 2002 Constantin Kaplinsky, Inc.  All Rights Reserved.
++//  Copyright 2007 MIT Student Information Processing Board
++//
++//  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.
++//
++
++//
++// VNCProxySocket.java together with VNCProxySocketFactory.java
++// implement an alternate way to connect to VNC servers via one or two
++// VNCProxy proxies supporting the VNCProxy VNCCONNECT method.
++//
++
++import java.net.*;
++import java.io.*;
++
++class VNCProxyConnectSocketWrapper extends SocketWrapper {
++
++  public VNCProxyConnectSocketWrapper(Socket sock,
++                               String vmname, String authtoken)
++    throws IOException {
++
++    super(sock);
++
++    // Send the CONNECT request
++    getOutputStream().write(("CONNECTVNC " + vmname +
++                             " VNCProxy/1.0\r\nAuth-token: " + authtoken +
++                             "\r\n\r\n").getBytes());
++
++    // Read the first line of the response
++    DataInputStream is = new DataInputStream(getInputStream());
++    String str = is.readLine();
++
++    // Check the HTTP error code -- it should be "200" on success
++    if (!str.startsWith("VNCProxy/1.0 200 ")) {
++      if (str.startsWith("VNCProxy/1.0 "))
++        str = str.substring(13);
++      throw new IOException("Proxy reports \"" + str + "\"");
++    }
++
++    // Success -- skip remaining HTTP headers
++    do {
++      str = is.readLine();
++    } while (str.length() != 0);
++  }
++}
++
Index: trunk/packages/invirt-vnc-client/debian/patches/makefile-source-version.patch
===================================================================
--- trunk/packages/invirt-vnc-client/debian/patches/makefile-source-version.patch	(revision 1438)
+++ trunk/packages/invirt-vnc-client/debian/patches/makefile-source-version.patch	(revision 1438)
@@ -0,0 +1,13 @@
+Index: invirt-vnc-client/Makefile
+===================================================================
+--- invirt-vnc-client.orig/Makefile	2008-10-31 06:08:46.000000000 -0400
++++ invirt-vnc-client/Makefile	2008-10-31 06:09:17.000000000 -0400
+@@ -4,7 +4,7 @@
+ 
+ CP = cp
+ JC = javac
+-JCFLAGS = -target 1.1
++JCFLAGS = -target 1.1 -source 1.2
+ JAR = jar
+ ARCHIVE = VncViewer.jar
+ MANIFEST = MANIFEST.MF
Index: trunk/packages/invirt-vnc-client/debian/patches/series
===================================================================
--- trunk/packages/invirt-vnc-client/debian/patches/series	(revision 1438)
+++ trunk/packages/invirt-vnc-client/debian/patches/series	(revision 1438)
@@ -0,0 +1,3 @@
+makefile-source-version.patch
+add-control-alt-checkboxes.patch
+invirt-ssl-proxy.patch
Index: trunk/packages/invirt-vnc-client/debian/rules
===================================================================
--- trunk/packages/invirt-vnc-client/debian/rules	(revision 1418)
+++ trunk/packages/invirt-vnc-client/debian/rules	(revision 1438)
@@ -2,4 +2,5 @@
 
 include /usr/share/cdbs/1/rules/debhelper.mk
+include /usr/share/cdbs/1/rules/patchsys-quilt.mk
 include /usr/share/cdbs/1/class/makefile.mk
 
