Make the final switch on console proxy refactoring work. new VNC engine will be in use after this commit

Reviewed-By: Kelven
This commit is contained in:
Kelven Yang 2012-03-27 14:56:10 -07:00
parent 27c77133d4
commit fe950868c3
59 changed files with 29 additions and 10854 deletions

View File

@ -91,16 +91,10 @@
<property name="scripts.dir" location="${base.dir}/scripts" />
<property name="scripts.target.dir" location="${target.dir}/scripts"/>
<!-- directories for console proxy & applet code compilation-->
<property name="console-common.dir" location="${base.dir}/console" />
<property name="console-common.dist.dir" location="${dist.dir}/console-common" />
<!-- directories for console proxy compilation-->
<property name="console-proxy.dir" location="${base.dir}/console-proxy" />
<property name="console-proxy.dist.dir" location="${dist.dir}/console-proxy" />
<property name="console-viewer.dir" location="${base.dir}/console-viewer" />
<property name="console-viewer.dist.dir" location="${dist.dir}/console-viewer" />
<property name="tools.dir" location="${base.dir}/tools" />
<!-- <property name="antcontrib.dir" location="${tools.dir}/tools/ant/apache-ant-1.8.0/lib" />-->
<property name="deploy.dir" location="${build.dir}/deploy" />
@ -118,7 +112,6 @@
<property name="utils.jar" value="cloud-utils.jar" />
<property name="server.jar" value="cloud-server.jar" />
<property name="agent.jar" value="cloud-agent.jar" />
<property name="console-common.jar" value="cloud-console-common.jar" />
<property name="console-proxy.jar" value="cloud-console-proxy.jar" />
<property name="api.jar" value="cloud-api.jar"/>
<property name="vmware-base.jar" value="cloud-vmware-base.jar" />
@ -317,19 +310,11 @@
</copy>
</target>
<path id="console-common.classpath">
<path refid="deps.classpath" />
<path refid="dist.classpath" />
</path>
<target name="compile-console-common" depends="-init" description="Compile the console-common jar that is shared.">
<compile-java jar.name="${console-common.jar}" top.dir="${console-common.dir}" classpath="console-common.classpath" />
</target>
<path id="console-proxy.classpath">
<path refid="deps.classpath" />
<path refid="dist.classpath" />
</path>
<target name="compile-console-proxy" depends="-init, compile-console-common" description="Compile the console proxy.">
<target name="compile-console-proxy" depends="-init" description="Compile the console proxy.">
<compile-java jar.name="${console-proxy.jar}" top.dir="${console-proxy.dir}" classpath="console-proxy.classpath" >
<include-files>
<fileset dir="${console-proxy.dir}/certs">
@ -364,7 +349,6 @@
<copy todir="${copyto.dir}">
<fileset dir="${jar.dir}">
<include name="cloud-console-proxy.jar" />
<include name="cloud-console-common.jar" />
</fileset>
</copy>
<copy todir="${copyto.dir}/conf">
@ -381,11 +365,6 @@
<include name="*.cur" />
</fileset>
</copy>
<copy todir="${copyto.dir}/applet">
<fileset dir="${jar.dir}">
<include name="VMOpsConsoleApplet.jar" />
</fileset>
</copy>
<copy todir="${copyto.dir}/js">
<fileset dir="${console-proxy.dir}/js">
<include name="*.js" />
@ -410,7 +389,7 @@
</copy>
</target>
<target name="build-console-proxy" depends="-init, build-console-viewer, compile-console-proxy, copy-console-proxy">
<target name="build-console-proxy" depends="-init, compile-console-proxy, copy-console-proxy">
<copy todir="${console-proxy.dist.dir}">
<fileset dir="${console-proxy.dir}/scripts">
</fileset>
@ -421,36 +400,6 @@
</copy>
</target>
<path id="console-viewer.classpath">
<path refid="deps.classpath" />
<path refid="dist.classpath" />
</path>
<target name="build-console-viewer" depends="-init" description="Compile console viewer applet">
<mkdir dir="${classes.dir}/console-viewer" />
<depend srcdir="${console-viewer.dir}/src" destdir="${classes.dir}/console-viewer" cache="${dep.cache.dir}" />
<javac srcdir="${console-common.dir}/src" debug="${debug}" debuglevel="${debuglevel}" deprecation="${deprecation}" destdir="${classes.dir}/console-viewer" source="${source.compat.version}" target="${target.compat.version}" includeantruntime="false">
<classpath refid="console-viewer.classpath" />
<exclude name="${compile.java.exclude.files}" />
<compilerarg value="-Xlint:all" />
</javac>
<javac srcdir="${console-viewer.dir}/src" debug="${debug}" debuglevel="${debuglevel}" deprecation="${deprecation}" destdir="${classes.dir}/console-viewer" source="${source.compat.version}" target="${target.compat.version}" includeantruntime="false">
<classpath refid="console-viewer.classpath" />
<exclude name="${compile.java.exclude.files}" />
<compilerarg value="-Xlint:all" />
</javac>
<jar jarfile="${jar.dir}/VMOpsConsoleApplet.jar" basedir="${classes.dir}/console-viewer">
<manifest>
<attribute name="Class-Path" value="" />
<attribute name="Built-By" value="${built.by}" />
<attribute name="Manifest-Version" value="1.0" />
<attribute name="Main-Class" value="ConsoleViewer" />
</manifest>
</jar>
</target>
<path id="agent.classpath">
<path refid="deps.classpath" />
<fileset dir="${target.dir}">

View File

@ -283,7 +283,7 @@
</target>
<!-- The following target is OBSOLETE. If you need to add a jar file / target, go to the function def runant(target): in wscrpit_build, and list the jar file and the target in the appropriate places -->
<target name="sendjarfiles" depends="compile-utils, compile-core, compile-server, compile-agent, compile-console-common, compile-console-proxy, build-console-viewer">
<target name="sendjarfiles" depends="compile-utils, compile-core, compile-server, compile-agent, compile-console-proxy">
<copy todir="${waf.artifacts}">
<fileset dir="${target.dir}/jar"/>
</copy>

View File

@ -3,6 +3,5 @@
<classpathentry kind="src" path="src"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
<classpathentry combineaccessrules="false" kind="src" path="/deps"/>
<classpathentry combineaccessrules="false" kind="src" path="/console"/>
<classpathentry kind="output" path="bin"/>
</classpath>

View File

@ -22,8 +22,8 @@ import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.cloud.console.Logger;
import com.cloud.consoleproxy.util.Logger;
public class AjaxFIFOImageCache {
private static final Logger s_logger = Logger.getLogger(AjaxFIFOImageCache.class);

View File

@ -17,7 +17,7 @@
*/
// repackage it to VMOps common packaging structure
package com.cloud.console;
package com.cloud.consoleproxy;
public class AuthenticationException extends Exception {
private static final long serialVersionUID = -393139302884898842L;

View File

@ -14,8 +14,7 @@ import java.util.concurrent.Executor;
import org.apache.log4j.xml.DOMConfigurator;
import com.cloud.console.AuthenticationException;
import com.cloud.console.Logger;
import com.cloud.consoleproxy.util.Logger;
import com.sun.net.httpserver.HttpServer;
/**

View File

@ -28,7 +28,7 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.cloud.console.Logger;
import com.cloud.consoleproxy.util.Logger;
import com.sun.net.httpserver.Headers;
import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;

View File

@ -23,7 +23,7 @@ import java.io.OutputStream;
import java.util.HashMap;
import java.util.Map;
import com.cloud.console.Logger;
import com.cloud.consoleproxy.util.Logger;
import com.sun.net.httpserver.Headers;
import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;

View File

@ -23,7 +23,7 @@ import java.net.InetSocketAddress;
import javax.net.ssl.SSLServerSocket;
import com.cloud.console.Logger;
import com.cloud.consoleproxy.util.Logger;
import com.sun.net.httpserver.HttpServer;
public class ConsoleProxyBaseServerFactoryImpl implements ConsoleProxyServerFactory {

View File

@ -6,8 +6,8 @@ import java.util.List;
import org.apache.log4j.Logger;
import com.cloud.console.TileInfo;
import com.cloud.console.TileTracker;
import com.cloud.consoleproxy.util.TileInfo;
import com.cloud.consoleproxy.util.TileTracker;
import com.cloud.consoleproxy.vnc.FrameBufferCanvas;
/**

View File

@ -1,280 +0,0 @@
/**
* Copyright (C) 2010 Cloud.com, Inc. All rights reserved.
*
* This software is licensed under the GNU General Public License v3 or later.
*
* It 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 3 of the License, or any later version.
* This program 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 program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.cloud.consoleproxy;
import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.util.StringTokenizer;
import com.cloud.console.Logger;
import com.cloud.console.RfbProto;
public class ConsoleProxyClientHandler extends Thread {
/*
private static final Logger s_logger = Logger.getLogger(ConsoleProxyClientHandler.class);
Socket clientSocket = null;
DataInputStream clientIns = null;
OutputStream clientOuts = null;
public ConsoleProxyClientHandler(Socket client) {
clientSocket = client;
}
synchronized void cleanup() {
try {
if (clientSocket != null) {
s_logger.info("Closing connection to "
+ clientSocket.getInetAddress());
clientSocket.close();
clientSocket = null;
}
} catch (IOException ioe) {
}
try {
if (clientIns != null) {
clientIns.close();
clientIns = null;
}
} catch (IOException ioe) {
}
try {
if (clientOuts != null) {
clientOuts.close();
clientOuts = null;
}
} catch (IOException ioe) {
}
}
public void run() {
try {
String srcinfo = clientSocket.getInetAddress().getHostAddress() +
":" + clientSocket.getPort();
clientIns = new DataInputStream(new BufferedInputStream(
clientSocket.getInputStream()));
// clientOuts = new GZIPOutputStream(clientSocket.getOutputStream(), 65536);
clientOuts = clientSocket.getOutputStream();
clientOuts.write("RFB 000.000\000".getBytes("US-ASCII"));
clientOuts.flush();
int b1 = clientIns.read();
int b2 = clientIns.read();
if (b1 != 'V' || b2 != 'M') {
throw new Exception ("Bad header");
}
byte[] proxyInfo = new byte[clientIns.read()];
clientIns.readFully(proxyInfo);
String proxyString = new String(proxyInfo, "US-ASCII");
StringTokenizer stk = new StringTokenizer(proxyString, ":\n");
String host = stk.nextToken();
int port = Integer.parseInt(stk.nextToken());
String sid = stk.nextToken();
ConsoleProxyViewer viewer = ConsoleProxy.getVncViewer(host, port, sid, "", "");
ConsoleProxy.waitForViewerToStart(viewer);
handleClientSession(viewer, srcinfo);
} catch (Exception ioe) {
if(s_logger.isDebugEnabled())
s_logger.debug(ioe.toString());
} finally {
cleanup();
}
}
void writeServer (ConsoleProxyViewer viewer, byte[] b, int off, int len) {
viewer.writeServer(b, off, len);
}
void writeClientU16 (int n) throws IOException {
byte[] b = new byte[2];
b[0] = (byte) ((n >> 8) & 0xff);
b[1] = (byte) (n & 0xff);
clientOuts.write(b);
}
void writeClientU32 (int n) throws IOException {
byte[] b = new byte[4];
b[0] = (byte) ((n >> 24) & 0xff);
b[1] = (byte) ((n >> 16) & 0xff);
b[2] = (byte) ((n >> 8) & 0xff);
b[3] = (byte) (n & 0xff);
clientOuts.write(b);
}
String RFB_VERSION_STRING = "RFB 003.008\n";
void handleClientSession(ConsoleProxyViewer viewer, String srcinfo) throws Exception {
s_logger.info("Start to handle client session");
viewer.setAjaxViewer(false);
// Exchange version with client
clientOuts.write(RFB_VERSION_STRING.getBytes("US-ASCII"));
clientOuts.flush();
byte[] clientVersion = new byte[12];
clientIns.readFully(clientVersion);
if (!RFB_VERSION_STRING.equals(new String(clientVersion, "US-ASCII"))) {
throw new Exception("Bad client version");
}
// Send security type -- no authentication needed
byte[] serverSecurity = new byte[2];
serverSecurity[0] = 1;
serverSecurity[1] = 1;
clientOuts.write(serverSecurity);
clientOuts.flush();
int clientSecurity = clientIns.read();
if (clientSecurity != 1) {
throw new Exception("Unsupported client security type " + clientSecurity);
}
byte[] serverSecResp = new byte[4];
serverSecResp[0] = serverSecResp[1] = serverSecResp[2] = serverSecResp[3] = 0;
clientOuts.write(serverSecResp);
clientOuts.flush();
// Receive and ignore client init
clientIns.read();
s_logger.info("Sending ServerInit w=" + viewer.rfb.framebufferWidth +
" h=" + viewer.rfb.framebufferHeight +
" bits=" + viewer.rfb.bitsPerPixel +
" depth=" + viewer.rfb.depth +
" name=" + viewer.rfb.desktopName);
// Send serverInit
writeClientU16(viewer.rfb.framebufferWidth);
writeClientU16(viewer.rfb.framebufferHeight);
clientOuts.write(viewer.rfb.bitsPerPixel);
clientOuts.write(viewer.rfb.depth);
clientOuts.write(viewer.rfb.bigEndian ? 1 : 0);
clientOuts.write(viewer.rfb.trueColour ? 1 : 0);
writeClientU16(viewer.rfb.redMax);
writeClientU16(viewer.rfb.greenMax);
writeClientU16(viewer.rfb.blueMax);
clientOuts.write(viewer.rfb.redShift);
clientOuts.write(viewer.rfb.greenShift);
clientOuts.write(viewer.rfb.blueShift);
byte[] pad = new byte[3];
clientOuts.write(pad);
writeClientU32(viewer.rfb.desktopName.length());
clientOuts.write(viewer.rfb.desktopName.getBytes("US-ASCII"));
clientOuts.flush();
// Lock the viewer to avoid race condition
synchronized (viewer) {
if (viewer.clientStream != null) {
s_logger.info("Disconnecting client link stream " +
viewer.clientStream.hashCode() + " from " +
viewer.clientStreamInfo);
viewer.clientStream.close();
}
viewer.clientStream = clientOuts;
viewer.clientStreamInfo = srcinfo;
viewer.lastUsedTime = System.currentTimeMillis();
s_logger.info("Setting client link stream " +
viewer.clientStream.hashCode() + " from " + srcinfo);
}
try {
while (!viewer.isDropped()) {
byte[] b = new byte[512];
int nbytes = 0;
int msgType = clientIns.read();
b[0] = (byte)msgType;
switch (msgType) {
case RfbProto.SetPixelFormat:
clientIns.readFully(b, 1, 19);
nbytes = 20;
if(s_logger.isDebugEnabled())
s_logger.debug("C->S RFB message SetPixelFormat, size=" + nbytes);
break;
case RfbProto.SetEncodings:
clientIns.read(); // padding
b[1] = 0;
int n = clientIns.readUnsignedShort();
if (n > (512 - 4)/4) {
throw new Exception ("Too many client encodings");
}
b[2] = (byte) ((n >> 8) & 0xff);
b[3] = (byte) (n & 0xff);
clientIns.readFully(b, 4, n * 4);
nbytes = n * 4 + 4;
if(s_logger.isDebugEnabled())
s_logger.debug("C->S RFB message SetEncodings, size=" + nbytes);
break;
case RfbProto.FramebufferUpdateRequest:
clientIns.readFully(b, 1, 9);
nbytes = 10;
if(s_logger.isDebugEnabled()) {
int i = b[1];
int x = ((0xff & b[2]) << 8) + b[3];
int y = ((0xff & b[4]) << 8) + b[5];
int w = ((0xff & b[6]) << 8) + b[7];
int h = ((0xff & b[8]) << 8) + b[9];
s_logger.debug("C->S RFB message FramebufferUpdateRequest, size=" + nbytes + " x=" + x
+" y=" + y + " w=" + w + " h=" + h);
}
break;
case RfbProto.KeyboardEvent:
clientIns.readFully(b, 1, 7);
nbytes = 8;
if(s_logger.isDebugEnabled())
s_logger.debug("C->S RFB message KeyboardEvent, size=" + nbytes);
break;
case RfbProto.PointerEvent:
clientIns.readFully(b, 1, 5);
nbytes = 6;
if(s_logger.isDebugEnabled())
s_logger.debug("C->S RFB message PointerEvent, size=" + nbytes);
break;
case RfbProto.VMOpsClientCustom:
clientIns.read(); // read and ignore, used to track liveliness
// of the client
if(s_logger.isDebugEnabled())
s_logger.debug("C->S RFB message VMOpsClientCustom");
break;
default:
if(s_logger.isDebugEnabled())
s_logger.debug("C->S unknown message type: " + msgType + ", size=" + nbytes);
throw new Exception("Bad client event type: " + msgType);
}
writeServer(viewer, b, 0, nbytes);
}
} finally {
viewer.lastUsedTime = System.currentTimeMillis();
}
}
*/
}

View File

@ -22,7 +22,7 @@ import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import com.cloud.console.Logger;
import com.cloud.consoleproxy.util.Logger;
import com.sun.net.httpserver.Headers;
import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;

View File

@ -17,16 +17,19 @@
*/
package com.cloud.consoleproxy;
import com.cloud.consoleproxy.util.Logger;
import com.cloud.consoleproxy.util.LoggerFactory;
public class ConsoleProxyLoggerFactory implements com.cloud.console.LoggerFactory {
public class ConsoleProxyLoggerFactory implements LoggerFactory {
public ConsoleProxyLoggerFactory() {
}
public com.cloud.console.Logger getLogger(Class clazz) {
public Logger getLogger(Class<?> clazz) {
return new Log4jLogger(org.apache.log4j.Logger.getLogger(clazz));
}
public static class Log4jLogger extends com.cloud.console.Logger {
public static class Log4jLogger extends Logger {
private org.apache.log4j.Logger logger;
public Log4jLogger(org.apache.log4j.Logger logger) {

View File

@ -26,7 +26,8 @@ import java.util.Map;
import org.apache.log4j.xml.DOMConfigurator;
import com.cloud.console.Logger;
import com.cloud.consoleproxy.util.Logger;
//
// This class is not currently in use, was planning to add a simulated embedded VNC server and monitor console proxy health by

View File

@ -26,7 +26,7 @@ import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import com.cloud.console.Logger;
import com.cloud.consoleproxy.util.Logger;
import com.sun.net.httpserver.Headers;
import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;

View File

@ -1,63 +0,0 @@
/**
* Copyright (C) 2010 Cloud.com, Inc. All rights reserved.
*
* This software is licensed under the GNU General Public License v3 or later.
*
* It 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 3 of the License, or any later version.
* This program 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 program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.cloud.consoleproxy;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.Hashtable;
/*
public class ConsoleProxyStatus {
ArrayList<ConsoleProxyConnection> connections;
public ConsoleProxyStatus() {
}
public void setConnections(Hashtable<String, ConsoleProxyViewer> connMap) {
ArrayList<ConsoleProxyConnection> conns = new ArrayList<ConsoleProxyConnection>();
Enumeration<String> e = connMap.keys();
while (e.hasMoreElements()) {
synchronized (connMap) {
String key = e.nextElement();
ConsoleProxyViewer viewer = connMap.get(key);
ConsoleProxyConnection conn = new ConsoleProxyConnection();
conn.id = viewer.id;
conn.clientInfo = viewer.clientStreamInfo;
conn.host = viewer.host;
conn.port = viewer.port;
conn.tag = viewer.getTag();
conn.createTime = viewer.createTime;
conn.lastUsedTime = viewer.lastUsedTime;
conns.add(conn);
}
}
connections = conns;
}
public static class ConsoleProxyConnection {
public int id;
public String clientInfo;
public String host;
public int port;
public String tag;
public long createTime;
public long lastUsedTime;
public ConsoleProxyConnection() {
}
}
}
*/

View File

@ -30,7 +30,7 @@ import java.io.OutputStream;
import java.util.HashMap;
import java.util.Map;
import com.cloud.console.Logger;
import com.cloud.consoleproxy.util.Logger;
import com.sun.net.httpserver.Headers;
import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;

View File

@ -1,680 +0,0 @@
/**
* Copyright (C) 2010 Cloud.com, Inc. All rights reserved.
*
* This software is licensed under the GNU General Public License v3 or later.
*
* It 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 3 of the License, or any later version.
* This program 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 program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.cloud.consoleproxy;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Map;
import java.util.Properties;
import java.util.concurrent.Executor;
import javax.net.ssl.SSLServerSocket;
import org.apache.log4j.xml.DOMConfigurator;
import com.cloud.console.AuthenticationException;
import com.cloud.console.Logger;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.sun.net.httpserver.HttpServer;
/*
public class ConsoleProxy_obsolete {
private static final Logger s_logger = Logger.getLogger(ConsoleProxy_obsolete.class);
public static final int KEYBOARD_RAW = 0;
public static final int KEYBOARD_COOKED = 1;
public static Object context;
// this has become more ugly, to store keystore info passed from management server (we now use management server managed keystore to support
// dynamically changing to customer supplied certificate)
public static byte[] ksBits;
public static String ksPassword;
public static Method authMethod;
public static Method reportMethod;
public static Method ensureRouteMethod;
static Hashtable<String, ConsoleProxyViewer> connectionMap = new Hashtable<String, ConsoleProxyViewer>();
static int tcpListenPort = 5999;
static int httpListenPort = 80;
static int httpCmdListenPort = 8001;
static String jarDir = "./applet/";
static boolean compressServerMessage = true;
static int viewerLinger = 180;
static int reconnectMaxRetry = 5;
static int readTimeoutSeconds = 90;
static int keyboardType = KEYBOARD_RAW;
static String factoryClzName;
static boolean standaloneStart = false;
private static void configLog4j() {
URL configUrl = System.class.getResource("/conf/log4j-cloud.xml");
if(configUrl == null)
configUrl = System.class.getClassLoader().getSystemResource("log4j-cloud.xml");
if(configUrl == null)
configUrl = System.class.getClassLoader().getSystemResource("conf/log4j-cloud.xml");
if(configUrl != null) {
try {
System.out.println("Configure log4j using " + configUrl.toURI().toString());
} catch (URISyntaxException e1) {
e1.printStackTrace();
}
try {
File file = new File(configUrl.toURI());
System.out.println("Log4j configuration from : " + file.getAbsolutePath());
DOMConfigurator.configureAndWatch(file.getAbsolutePath(), 10000);
} catch (URISyntaxException e) {
System.out.println("Unable to convert log4j configuration Url to URI");
}
// DOMConfigurator.configure(configUrl);
} else {
System.out.println("Configure log4j with default properties");
}
}
private static void configProxy(Properties conf) {
s_logger.info("Configure console proxy...");
for(Object key : conf.keySet()) {
s_logger.info("Property " + (String)key + ": " + conf.getProperty((String)key));
}
String s = conf.getProperty("consoleproxy.tcpListenPort");
if (s!=null) {
tcpListenPort = Integer.parseInt(s);
s_logger.info("Setting tcpListenPort=" + s);
}
s = conf.getProperty("consoleproxy.httpListenPort");
if (s!=null) {
httpListenPort = Integer.parseInt(s);
s_logger.info("Setting httpListenPort=" + s);
}
s = conf.getProperty("premium");
if(s != null && s.equalsIgnoreCase("true")) {
s_logger.info("Premium setting will override settings from consoleproxy.properties, listen at port 443");
httpListenPort = 443;
factoryClzName = "com.cloud.consoleproxy.ConsoleProxySecureServerFactoryImpl";
} else {
factoryClzName = ConsoleProxyBaseServerFactoryImpl.class.getName();
}
s = conf.getProperty("consoleproxy.httpCmdListenPort");
if (s!=null) {
httpCmdListenPort = Integer.parseInt(s);
s_logger.info("Setting httpCmdListenPort=" + s);
}
s = conf.getProperty("consoleproxy.jarDir");
if (s!=null) {
jarDir = s;
s_logger.info("Setting jarDir=" + s);
}
s = conf.getProperty("consoleproxy.viewerLinger");
if (s!=null) {
viewerLinger = Integer.parseInt(s);
s_logger.info("Setting viewerLinger=" + s);
}
s = conf.getProperty("consoleproxy.compressServerMessage");
if (s!=null) {
compressServerMessage = Boolean.parseBoolean(s);
s_logger.info("Setting compressServerMessage=" + s);
}
s = conf.getProperty("consoleproxy.reconnectMaxRetry");
if (s!=null) {
reconnectMaxRetry = Integer.parseInt(s);
s_logger.info("Setting reconnectMaxRetry=" + reconnectMaxRetry);
}
s = conf.getProperty("consoleproxy.readTimeoutSeconds");
if (s!=null) {
readTimeoutSeconds = Integer.parseInt(s);
s_logger.info("Setting readTimeoutSeconds=" + readTimeoutSeconds);
}
}
public static ConsoleProxyServerFactory getHttpServerFactory() {
try {
Class<?> clz = Class.forName(factoryClzName);
try {
ConsoleProxyServerFactory factory = (ConsoleProxyServerFactory)clz.newInstance();
factory.init(ConsoleProxy_obsolete.ksBits, ConsoleProxy_obsolete.ksPassword);
return factory;
} catch (InstantiationException e) {
s_logger.error(e.getMessage(), e);
return null;
} catch (IllegalAccessException e) {
s_logger.error(e.getMessage(), e);
return null;
}
} catch (ClassNotFoundException e) {
s_logger.warn("Unable to find http server factory class: " + factoryClzName);
return new ConsoleProxyBaseServerFactoryImpl();
}
}
public static boolean authenticateConsoleAccess(String host, String port, String vmId, String sid, String ticket) {
if(standaloneStart)
return true;
if(authMethod != null) {
Object result;
try {
result = authMethod.invoke(ConsoleProxy_obsolete.context, host, port, vmId, sid, ticket);
} catch (IllegalAccessException e) {
s_logger.error("Unable to invoke authenticateConsoleAccess due to IllegalAccessException" + " for vm: " + vmId, e);
return false;
} catch (InvocationTargetException e) {
s_logger.error("Unable to invoke authenticateConsoleAccess due to InvocationTargetException " + " for vm: " + vmId, e);
return false;
}
if(result != null && result instanceof Boolean) {
return ((Boolean)result).booleanValue();
} else {
s_logger.error("Invalid authentication return object " + result + " for vm: " + vmId + ", decline the access");
return false;
}
} else {
s_logger.warn("Private channel towards management server is not setup. Switch to offline mode and allow access to vm: " + vmId);
return true;
}
}
public static void reportLoadInfo(String gsonLoadInfo) {
if(reportMethod != null) {
try {
reportMethod.invoke(ConsoleProxy_obsolete.context, gsonLoadInfo);
} catch (IllegalAccessException e) {
s_logger.error("Unable to invoke reportLoadInfo due to " + e.getMessage());
} catch (InvocationTargetException e) {
s_logger.error("Unable to invoke reportLoadInfo due to " + e.getMessage());
}
} else {
s_logger.warn("Private channel towards management server is not setup. Switch to offline mode and ignore load report");
}
}
public static void ensureRoute(String address) {
if(ensureRouteMethod != null) {
try {
ensureRouteMethod.invoke(ConsoleProxy_obsolete.context, address);
} catch (IllegalAccessException e) {
s_logger.error("Unable to invoke ensureRoute due to " + e.getMessage());
} catch (InvocationTargetException e) {
s_logger.error("Unable to invoke ensureRoute due to " + e.getMessage());
}
} else {
s_logger.warn("Unable to find ensureRoute method, console proxy agent is not up to date");
}
}
public static void startWithContext(Properties conf, Object context, byte[] ksBits, String ksPassword) {
s_logger.info("Start console proxy with context");
if(conf != null) {
for(Object key : conf.keySet()) {
s_logger.info("Context property " + (String)key + ": " + conf.getProperty((String)key));
}
}
configLog4j();
Logger.setFactory(new ConsoleProxyLoggerFactory());
// Using reflection to setup private/secure communication channel towards management server
ConsoleProxy_obsolete.context = context;
ConsoleProxy_obsolete.ksBits = ksBits;
ConsoleProxy_obsolete.ksPassword = ksPassword;
try {
Class<?> contextClazz = Class.forName("com.cloud.agent.resource.consoleproxy.ConsoleProxyResource");
authMethod = contextClazz.getDeclaredMethod("authenticateConsoleAccess", String.class, String.class, String.class, String.class, String.class);
reportMethod = contextClazz.getDeclaredMethod("reportLoadInfo", String.class);
ensureRouteMethod = contextClazz.getDeclaredMethod("ensureRoute", String.class);
} catch (SecurityException e) {
s_logger.error("Unable to setup private channel due to SecurityException", e);
} catch (NoSuchMethodException e) {
s_logger.error("Unable to setup private channel due to NoSuchMethodException", e);
} catch (IllegalArgumentException e) {
s_logger.error("Unable to setup private channel due to IllegalArgumentException", e);
} catch(ClassNotFoundException e) {
s_logger.error("Unable to setup private channel due to ClassNotFoundException", e);
}
// merge properties from conf file
InputStream confs = ConsoleProxy_obsolete.class.getResourceAsStream("/conf/consoleproxy.properties");
Properties props = new Properties();
if (confs == null) {
s_logger.info("Can't load consoleproxy.properties from classpath, will use default configuration");
} else {
try {
props.load(confs);
for(Object key : props.keySet()) {
// give properties passed via context high priority, treat properties from consoleproxy.properties
// as default values
if(conf.get(key) == null)
conf.put(key, props.get(key));
}
} catch (Exception e) {
s_logger.error(e.toString(), e);
}
}
start(conf);
}
public static void start(Properties conf) {
System.setProperty("java.awt.headless", "true");
configProxy(conf);
ConsoleProxyServerFactory factory = getHttpServerFactory();
if(factory == null) {
s_logger.error("Unable to load console proxy server factory");
System.exit(1);
}
if(httpListenPort != 0) {
startupHttpMain();
} else {
s_logger.error("A valid HTTP server port is required to be specified, please check your consoleproxy.httpListenPort settings");
System.exit(1);
}
if(httpCmdListenPort > 0) {
startupHttpCmdPort();
} else {
s_logger.info("HTTP command port is disabled");
}
ViewerGCThread cthread = new ViewerGCThread(connectionMap);
cthread.setName("Viewer GC Thread");
cthread.start();
if(tcpListenPort > 0) {
SSLServerSocket srvSock = null;
try {
srvSock = factory.createSSLServerSocket(tcpListenPort);
s_logger.info("Listening for TCP on port " + tcpListenPort);
} catch (IOException ioe) {
s_logger.error(ioe.toString(), ioe);
System.exit(1);
}
if(srvSock != null) {
while (true) {
Socket conn = null;
try {
conn = srvSock.accept();
String srcinfo = conn.getInetAddress().getHostAddress() + ":" + conn.getPort();
s_logger.info("Accepted connection from " + srcinfo);
conn.setSoLinger(false,0);
ConsoleProxyClientHandler worker = new ConsoleProxyClientHandler(conn);
worker.setName("Proxy Thread " + worker.getId() + " <" + srcinfo);
worker.start();
} catch (IOException ioe2) {
s_logger.error(ioe2.toString(), ioe2);
try {
if (conn != null) {
conn.close();
}
} catch (IOException ioe) {}
} catch (Throwable e) {
// Something really bad happened
// Terminate the program
s_logger.error(e.toString(), e);
System.exit(1);
}
}
} else {
s_logger.warn("TCP port is enabled in configuration but we are not able to instantiate server socket.");
}
} else {
s_logger.info("TCP port is disabled for applet viewers");
}
}
private static void startupHttpMain() {
try {
ConsoleProxyServerFactory factory = getHttpServerFactory();
if(factory == null) {
s_logger.error("Unable to load HTTP server factory");
System.exit(1);
}
HttpServer server = factory.createHttpServerInstance(httpListenPort);
server.createContext("/getscreen", new ConsoleProxyThumbnailHandler());
server.createContext("/resource/", new ConsoleProxyResourceHandler());
server.createContext("/ajax", new ConsoleProxyAjaxHandler());
server.createContext("/ajaximg", new ConsoleProxyAjaxImageHandler());
server.setExecutor(new ThreadExecutor()); // creates a default executor
server.start();
} catch(Exception e) {
s_logger.error(e.getMessage(), e);
System.exit(1);
}
}
private static void startupHttpCmdPort() {
try {
s_logger.info("Listening for HTTP CMDs on port " + httpCmdListenPort);
HttpServer cmdServer = HttpServer.create(new InetSocketAddress(httpCmdListenPort), 2);
cmdServer.createContext("/cmd", new ConsoleProxyCmdHandler());
cmdServer.setExecutor(new ThreadExecutor()); // creates a default executor
cmdServer.start();
} catch(Exception e) {
s_logger.error(e.getMessage(), e);
System.exit(1);
}
}
public static void main(String[] argv) {
standaloneStart = true;
configLog4j();
Logger.setFactory(new ConsoleProxyLoggerFactory());
InputStream confs = ConsoleProxy_obsolete.class.getResourceAsStream("/conf/consoleproxy.properties");
Properties conf = new Properties();
if (confs == null) {
s_logger.info("Can't load consoleproxy.properties from classpath, will use default configuration");
} else {
try {
conf.load(confs);
} catch (Exception e) {
s_logger.error(e.toString(), e);
}
}
start(conf);
}
static ConsoleProxyViewer createViewer() {
ConsoleProxyViewer viewer = new ConsoleProxyViewer();
viewer.compressServerMessage = compressServerMessage;
return viewer;
}
static void initViewer(ConsoleProxyViewer viewer, String host, int port, String tag, String sid, String ticket) throws AuthenticationException {
ConsoleProxyViewer.authenticationExternally(host, String.valueOf(port), tag, sid, ticket);
viewer.host = host;
viewer.port = port;
viewer.tag = tag;
viewer.passwordParam = sid;
viewer.init();
}
static ConsoleProxyViewer getVncViewer(String host, int port, String sid, String tag, String ticket) throws Exception {
ConsoleProxyViewer viewer = null;
boolean reportLoadChange = false;
synchronized (connectionMap) {
viewer = connectionMap.get(host + ":" + port);
if (viewer == null) {
viewer = createViewer();
initViewer(viewer, host, port, tag, sid, ticket);
connectionMap.put(host + ":" + port, viewer);
s_logger.info("Added viewer object " + viewer);
reportLoadChange = true;
} else if (!viewer.rfbThread.isAlive()) {
s_logger.info("The rfb thread died, reinitializing the viewer " +
viewer);
initViewer(viewer, host, port, tag, sid, ticket);
reportLoadChange = true;
} else if (!sid.equals(viewer.passwordParam)) {
s_logger.warn("Bad sid detected(VNC port may be reused). sid in session: " + viewer.passwordParam + ", sid in request: " + sid);
initViewer(viewer, host, port, tag, sid, ticket);
reportLoadChange = true;
}
}
if(viewer != null) {
if (viewer.status == ConsoleProxyViewer.STATUS_NORMAL_OPERATION) {
// Do not update lastUsedTime if the viewer is in the process of starting up
// or if it failed to authenticate.
viewer.lastUsedTime = System.currentTimeMillis();
}
}
if(reportLoadChange) {
ConsoleProxyStatus status = new ConsoleProxyStatus();
status.setConnections(ConsoleProxy_obsolete.connectionMap);
Gson gson = new GsonBuilder().setPrettyPrinting().create();
String loadInfo = gson.toJson(status);
ConsoleProxy_obsolete.reportLoadInfo(loadInfo);
if(s_logger.isDebugEnabled())
s_logger.debug("Report load change : " + loadInfo);
}
return viewer;
}
static ConsoleProxyViewer getAjaxVncViewer(String host, int port, String sid, String tag, String ticket, String ajaxSession) throws Exception {
boolean reportLoadChange = false;
synchronized (connectionMap) {
ConsoleProxyViewer viewer = connectionMap.get(host + ":" + port);
// s_logger.info("view lookup " + host + ":" + port + " = " + viewer);
if (viewer == null) {
viewer = createViewer();
viewer.ajaxViewer = true;
initViewer(viewer, host, port, tag, sid, ticket);
connectionMap.put(host + ":" + port, viewer);
s_logger.info("Added viewer object " + viewer);
reportLoadChange = true;
} else if (!viewer.rfbThread.isAlive()) {
s_logger.info("The rfb thread died, reinitializing the viewer " +
viewer);
initViewer(viewer, host, port, tag, sid, ticket);
reportLoadChange = true;
} else if (!sid.equals(viewer.passwordParam)) {
s_logger.warn("Bad sid detected(VNC port may be reused). sid in session: " + viewer.passwordParam + ", sid in request: " + sid);
initViewer(viewer, host, port, tag, sid, ticket);
reportLoadChange = true;
} else {
if(ajaxSession == null || ajaxSession.isEmpty())
ConsoleProxyViewer.authenticationExternally(host, String.valueOf(port), tag, sid, ticket);
}
if (viewer.status == ConsoleProxyViewer.STATUS_NORMAL_OPERATION) {
// Do not update lastUsedTime if the viewer is in the process of starting up
// or if it failed to authenticate.
viewer.lastUsedTime = System.currentTimeMillis();
}
if(reportLoadChange) {
ConsoleProxyStatus status = new ConsoleProxyStatus();
status.setConnections(ConsoleProxy_obsolete.connectionMap);
Gson gson = new GsonBuilder().setPrettyPrinting().create();
String loadInfo = gson.toJson(status);
ConsoleProxy_obsolete.reportLoadInfo(loadInfo);
if(s_logger.isDebugEnabled())
s_logger.debug("Report load change : " + loadInfo);
}
return viewer;
}
}
public static void removeViewer(ConsoleProxyViewer viewer) {
synchronized (connectionMap) {
for(Map.Entry<String, ConsoleProxyViewer> entry : connectionMap.entrySet()) {
if(entry.getValue() == viewer) {
connectionMap.remove(entry.getKey());
return;
}
}
}
}
static void waitForViewerToStart(ConsoleProxyViewer viewer) throws Exception {
if (viewer.status == ConsoleProxyViewer.STATUS_NORMAL_OPERATION) {
return;
}
Long startTime = System.currentTimeMillis();
int delay = 500;
while (System.currentTimeMillis() < startTime + 30000 &&
viewer.status != ConsoleProxyViewer.STATUS_NORMAL_OPERATION) {
if (viewer.status == ConsoleProxyViewer.STATUS_AUTHENTICATION_FAILURE) {
throw new Exception ("Authentication failure");
}
try {
Thread.sleep(delay);
} catch (InterruptedException e) {
// ignore
}
delay = (int)(delay * 1.5);
}
if (viewer.status != ConsoleProxyViewer.STATUS_NORMAL_OPERATION) {
throw new Exception ("Cannot start VncViewer");
}
s_logger.info("Waited " +
(System.currentTimeMillis() - startTime) + "ms for VncViewer to start");
}
static class ThreadExecutor implements Executor {
public void execute(Runnable r) {
new Thread(r).start();
}
}
static class ViewerGCThread extends Thread {
Hashtable<String, ConsoleProxyViewer> connMap;
long lastLogScan = 0L;
public ViewerGCThread(Hashtable<String, ConsoleProxyViewer> connMap) {
this.connMap = connMap;
}
private void cleanupLogging() {
if(lastLogScan != 0 && System.currentTimeMillis() - lastLogScan < 3600000)
return;
lastLogScan = System.currentTimeMillis();
File logDir = new File("./logs");
File files[] = logDir.listFiles();
if(files != null) {
for(File file : files) {
if(System.currentTimeMillis() - file.lastModified() >= 86400000L) {
try {
file.delete();
} catch(Throwable e) {
}
}
}
}
}
@Override
public void run() {
while (true) {
cleanupLogging();
s_logger.info("connMap=" + connMap);
Enumeration<String> e = connMap.keys();
while (e.hasMoreElements()) {
String key;
ConsoleProxyViewer viewer;
synchronized (connMap) {
key = e.nextElement();
viewer = connMap.get(key);
}
long seconds_unused = (System.currentTimeMillis() - viewer.lastUsedTime) / 1000;
if (seconds_unused > viewerLinger / 2 && viewer.clientStream != null) {
s_logger.info("Pinging client for " + viewer +
" which has not been used for " + seconds_unused + "sec");
byte[] bs = new byte[2];
bs[0] = (byte)250;
bs[1] = 3;
viewer.writeToClientStream(bs);
}
if (seconds_unused < viewerLinger) {
continue;
}
synchronized (connMap) {
connMap.remove(key);
}
// close the server connection
s_logger.info("Dropping " + viewer +
" which has not been used for " +
seconds_unused + " seconds");
viewer.dropMe = true;
synchronized (viewer) {
if (viewer.clientStream != null) {
try {
viewer.clientStream.close();
} catch (IOException ioe) {
// ignored
}
viewer.clientStream = null;
viewer.clientStreamInfo = null;
}
if (viewer.rfb != null) {
viewer.rfb.close();
}
}
// report load change for removal of the viewer
ConsoleProxyStatus status = new ConsoleProxyStatus();
status.setConnections(ConsoleProxy_obsolete.connectionMap);
Gson gson = new GsonBuilder().setPrettyPrinting().create();
String loadInfo = gson.toJson(status);
ConsoleProxy_obsolete.reportLoadInfo(loadInfo);
if(s_logger.isDebugEnabled())
s_logger.debug("Report load change : " + loadInfo);
}
try {
Thread.sleep(30000);
} catch (InterruptedException exp) {
// Ignore
}
}
}
}
}
*/

View File

@ -1,38 +0,0 @@
/**
* Copyright (C) 2010 Cloud.com, Inc. All rights reserved.
*
* This software is licensed under the GNU General Public License v3 or later.
*
* It 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 3 of the License, or any later version.
* This program 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 program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.cloud.consoleproxy;
public class ViewerOptions {
public int preferredEncoding = -1;
public int compressLevel = 5;
public int jpegQuality = 5;
public boolean useCopyRect = false;
public boolean requestCursorUpdates = true;
public boolean ignoreCursorUpdates = false;
public boolean eightBitColors = false;
public boolean reverseMouseButtons2And3 = false;
public boolean shareDesktop = true;
public boolean viewOnly = false;
public int scaleCursor = 0;
public boolean autoScale = false;
public int scalingFactor = 100;
}

View File

@ -10,8 +10,8 @@ import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.List;
import com.cloud.console.TileInfo;
import com.cloud.consoleproxy.util.ImageHelper;
import com.cloud.consoleproxy.util.TileInfo;
/**
* A <code>BuffereImageCanvas</code> component represents frame buffer image on the

View File

@ -3,7 +3,7 @@ package com.cloud.consoleproxy.vnc;
import java.awt.Image;
import java.util.List;
import com.cloud.console.TileInfo;
import com.cloud.consoleproxy.util.TileInfo;
public interface FrameBufferCanvas {
Image getFrameBufferScaledImage(int width, int height);

View File

@ -16,8 +16,8 @@ import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import com.cloud.console.Logger;
import com.cloud.consoleproxy.ConsoleProxyClientListener;
import com.cloud.consoleproxy.util.Logger;
import com.cloud.consoleproxy.vnc.packet.client.KeyboardEventPacket;
import com.cloud.consoleproxy.vnc.packet.client.MouseEventPacket;

View File

@ -5,8 +5,8 @@ import java.awt.datatransfer.StringSelection;
import java.io.DataInputStream;
import java.io.IOException;
import com.cloud.console.Logger;
import com.cloud.consoleproxy.ConsoleProxyClientListener;
import com.cloud.consoleproxy.util.Logger;
import com.cloud.consoleproxy.vnc.packet.server.FramebufferUpdatePacket;
import com.cloud.consoleproxy.vnc.packet.server.ServerCutText;

View File

@ -3,7 +3,7 @@ package com.cloud.consoleproxy.vnc.packet.server;
import java.io.DataInputStream;
import java.io.IOException;
import com.cloud.console.Logger;
import com.cloud.consoleproxy.util.Logger;
import com.cloud.consoleproxy.vnc.RfbConstants;
public class ServerCutText {

View File

@ -1,7 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="src"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
<classpathentry combineaccessrules="false" kind="src" path="/console"/>
<classpathentry kind="output" path="bin"/>
</classpath>

View File

@ -1,17 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>console-viewer</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jdt.core.javanature</nature>
</natures>
</projectDescription>

View File

@ -1,5 +0,0 @@
REM Example Usage
REM run-viewer HOST 192.168.1.220 PORT 5917 PROXYHOST 127-0-0-1.realhostip.com PROXYPORT 5999 SID pass
REM
java -cp applet\VMOpsConsoleApplet.jar com.vmops.consoleviewer.ConsoleApplet %*

View File

@ -1,118 +0,0 @@
//
// Copyright (C) 1999 AT&T Laboratories Cambridge. All Rights Reserved.
// Copyright (C) 2002-2006 Constantin Kaplinsky. 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.
//
package com.cloud.consoleviewer;
import java.awt.*;
import java.awt.event.*;
//
// The panel which implements the user authentication scheme
//
@SuppressWarnings("serial")
class AuthPanel extends Panel implements ActionListener {
TextField passwordField;
Button okButton;
//
// Constructor.
//
public AuthPanel(ConsoleViewer viewer)
{
Label titleLabel = new Label("VNC Authentication", Label.CENTER);
titleLabel.setFont(new Font("Helvetica", Font.BOLD, 18));
Label promptLabel = new Label("Password:", Label.CENTER);
passwordField = new TextField(10);
passwordField.setForeground(Color.black);
passwordField.setBackground(Color.white);
passwordField.setEchoChar('*');
okButton = new Button("OK");
GridBagLayout gridbag = new GridBagLayout();
GridBagConstraints gbc = new GridBagConstraints();
setLayout(gridbag);
gbc.gridwidth = GridBagConstraints.REMAINDER;
gbc.insets = new Insets(0,0,20,0);
gridbag.setConstraints(titleLabel,gbc);
add(titleLabel);
gbc.fill = GridBagConstraints.NONE;
gbc.gridwidth = 1;
gbc.insets = new Insets(0,0,0,0);
gridbag.setConstraints(promptLabel,gbc);
add(promptLabel);
gridbag.setConstraints(passwordField,gbc);
add(passwordField);
passwordField.addActionListener(this);
// gbc.ipady = 10;
gbc.gridwidth = GridBagConstraints.REMAINDER;
gbc.fill = GridBagConstraints.BOTH;
gbc.insets = new Insets(0,20,0,0);
gbc.ipadx = 30;
gridbag.setConstraints(okButton,gbc);
add(okButton);
okButton.addActionListener(this);
}
//
// Move keyboard focus to the default object, that is, the password
// text field.
//
public void moveFocusToDefaultField()
{
passwordField.requestFocus();
}
//
// This method is called when a button is pressed or return is
// pressed in the password text field.
//
public synchronized void actionPerformed(ActionEvent evt)
{
if (evt.getSource() == passwordField || evt.getSource() == okButton) {
passwordField.setEnabled(false);
notify();
}
}
//
// Wait for user entering a password, and return it as String.
//
public synchronized String getPassword() throws Exception
{
try {
wait();
} catch (InterruptedException e) { }
return passwordField.getText();
}
}

View File

@ -1,164 +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.
//
//
// ButtonPanel class implements panel with four buttons in the
// VNCViewer desktop window.
//
package com.cloud.consoleviewer;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import com.cloud.console.RfbProto;
@SuppressWarnings("serial")
class ButtonPanel extends Panel implements ActionListener {
ConsoleViewer viewer;
Button disconnectButton;
Button optionsButton;
Button recordButton;
Button clipboardButton;
Button ctrlAltDelButton;
Button refreshButton;
ButtonPanel(ConsoleViewer v) {
viewer = v;
setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0));
/*
disconnectButton = new Button("Disconnect");
disconnectButton.setEnabled(false);
add(disconnectButton);
disconnectButton.addActionListener(this);
optionsButton = new Button("Options");
add(optionsButton);
optionsButton.addActionListener(this);
clipboardButton = new Button("Clipboard");
clipboardButton.setEnabled(false);
add(clipboardButton);
clipboardButton.addActionListener(this);
if (viewer.rec != null) {
recordButton = new Button("Record");
add(recordButton);
recordButton.addActionListener(this);
}
*/
ctrlAltDelButton = new Button("Send Ctrl-Alt-Del");
ctrlAltDelButton.setEnabled(false);
add(ctrlAltDelButton);
ctrlAltDelButton.addActionListener(this);
refreshButton = new Button("Refresh");
refreshButton.setEnabled(false);
add(refreshButton);
refreshButton.addActionListener(this);
}
//
// Enable buttons on successful connection.
//
public void enableButtons() {
/*
disconnectButton.setEnabled(true);
clipboardButton.setEnabled(true);
*/
refreshButton.setEnabled(true);
}
//
// Disable all buttons on disconnect.
//
public void disableButtonsOnDisconnect() {
/*
remove(disconnectButton);
disconnectButton = new Button("Hide desktop");
disconnectButton.setEnabled(true);
add(disconnectButton, 0);
disconnectButton.addActionListener(this);
optionsButton.setEnabled(false);
clipboardButton.setEnabled(false);
*/
ctrlAltDelButton.setEnabled(false);
refreshButton.setEnabled(false);
validate();
}
//
// Enable/disable controls that should not be available in view-only
// mode.
//
public void enableRemoteAccessControls(boolean enable) {
ctrlAltDelButton.setEnabled(enable);
}
//
// Event processing.
//
@SuppressWarnings("deprecation")
public void actionPerformed(ActionEvent evt) {
viewer.moveFocusToDesktop();
if (evt.getSource() == disconnectButton) {
viewer.disconnect();
} else if (evt.getSource() == optionsButton) {
// viewer.options.setVisible(!viewer.options.isVisible());
} else if (evt.getSource() == recordButton) {
// viewer.rec.setVisible(!viewer.rec.isVisible());
} else if (evt.getSource() == clipboardButton) {
// viewer.clipboard.setVisible(!viewer.clipboard.isVisible());
} else if (evt.getSource() == ctrlAltDelButton) {
try {
final int modifiers = InputEvent.CTRL_MASK | InputEvent.ALT_MASK;
KeyEvent ctrlAltDelEvent =
new KeyEvent(this, KeyEvent.KEY_PRESSED, 0, modifiers, 127);
viewer.rfb.writeKeyEvent(ctrlAltDelEvent);
ctrlAltDelEvent =
new KeyEvent(this, KeyEvent.KEY_RELEASED, 0, modifiers, 127);
viewer.rfb.writeKeyEvent(ctrlAltDelEvent);
} catch (IOException e) {
e.printStackTrace();
}
} else if (evt.getSource() == refreshButton) {
try {
RfbProto rfb = viewer.rfb;
rfb.writeFramebufferUpdateRequest(0, 0, rfb.framebufferWidth,
rfb.framebufferHeight, false);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

View File

@ -1,135 +0,0 @@
//
// Copyright (C) 2001 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.
//
package com.cloud.consoleviewer;
//
// Clipboard frame.
//
import java.awt.*;
import java.awt.event.*;
@SuppressWarnings("serial")
class ClipboardFrame extends Frame
implements WindowListener, ActionListener {
TextArea textArea;
Button clearButton, closeButton;
String selection;
ConsoleViewer viewer;
//
// Constructor.
//
ClipboardFrame(ConsoleViewer v) {
super("TightVNC Clipboard");
viewer = v;
GridBagLayout gridbag = new GridBagLayout();
setLayout(gridbag);
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridwidth = GridBagConstraints.REMAINDER;
gbc.fill = GridBagConstraints.BOTH;
gbc.weighty = 1.0;
textArea = new TextArea(5, 40);
gridbag.setConstraints(textArea, gbc);
add(textArea);
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.weightx = 1.0;
gbc.weighty = 0.0;
gbc.gridwidth = 1;
clearButton = new Button("Clear");
gridbag.setConstraints(clearButton, gbc);
add(clearButton);
clearButton.addActionListener(this);
closeButton = new Button("Close");
gridbag.setConstraints(closeButton, gbc);
add(closeButton);
closeButton.addActionListener(this);
pack();
addWindowListener(this);
}
//
// Set the cut text from the RFB server.
//
void setCutText(String text) {
selection = text;
textArea.setText(text);
if (isVisible()) {
textArea.selectAll();
}
}
//
// When the focus leaves the window, see if we have new cut text and
// if so send it to the RFB server.
//
public void windowDeactivated (WindowEvent evt) {
if (selection != null && !selection.equals(textArea.getText())) {
selection = textArea.getText();
viewer.setCutText(selection);
}
}
//
// Close our window properly.
//
public void windowClosing(WindowEvent evt) {
setVisible(false);
}
//
// Ignore window events we're not interested in.
//
public void windowActivated(WindowEvent evt) {}
public void windowOpened(WindowEvent evt) {}
public void windowClosed(WindowEvent evt) {}
public void windowIconified(WindowEvent evt) {}
public void windowDeiconified(WindowEvent evt) {}
//
// Respond to button presses
//
public void actionPerformed(ActionEvent evt) {
if (evt.getSource() == clearButton) {
textArea.setText("");
} else if (evt.getSource() == closeButton) {
setVisible(false);
}
}
}

View File

@ -1,167 +0,0 @@
//
// Copyright (C) 2001-2004 HorizonLive.com, Inc. All Rights Reserved.
// Copyright (C) 2002 Constantin Kaplinsky. 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.
//
package com.cloud.consoleviewer;
import java.awt.*;
import java.awt.event.*;
import com.cloud.console.Logger;
public class ConsoleApplet extends java.applet.Applet implements WindowListener {
private static final Logger s_logger = Logger.getLogger(ConsoleApplet.class);
private static final long serialVersionUID = -8463170916581351766L;
ConsoleViewer viewer;
String errorMsg;
public ConsoleApplet() {
viewer = new ConsoleViewer();
}
public static void main(String[] argv) {
ConsoleApplet applet = new ConsoleApplet();
applet.viewer.mainArgs = argv;
applet.viewer.inAnApplet = false;
applet.viewer.inSeparateFrame = true;
applet.viewer.inProxyMode = false;
applet.init();
applet.start();
}
// Reference to this applet for inter-applet communication.
public static java.applet.Applet refApplet;
//
// init()
//
public void init() {
s_logger.info("Initializing applet");
refApplet = this;
viewer.applet = this;
viewer.init();
disableFocusTraversal(this);
errorMsg = "Connecting...";
invalidate();
}
public void paint(Graphics g) {
if(viewer != null && viewer.vc != null && viewer.vc.memGraphics != null)
g.setColor(Color.WHITE);
else
g.setColor(Color.BLACK);
g.fillRect(0, 0, 800, 600);
if(errorMsg != null && errorMsg.length() > 0) {
g.setFont(new Font(null, Font.PLAIN, 20));
g.setColor(Color.WHITE);
FontMetrics fm = g.getFontMetrics();
int width = fm.stringWidth(errorMsg);
int startx = (800 - width) / 2;
if (startx < 0) startx = 0;
g.drawString(errorMsg, startx, 600 / 2);
}
}
public void paintErrorString(String msg) {
s_logger.info("paintErrorString");
errorMsg = msg;
invalidate();
repaint();
}
public void stop() {
s_logger.info("Stopping applet");
viewer.stop();
}
//
// This method is called before the applet is destroyed.
//
public void destroy() {
s_logger.info("Destroying applet");
viewer.destroy();
viewer = null;
}
public void sendCtrlAltDel() {
if(viewer != null && viewer.vc != null)
viewer.vc.sendCtrlAltDel();
}
public int getFrameBufferWidth() {
if(viewer != null && viewer.vc != null)
return viewer.vc.getWidth();
return 800;
}
public int getFrameBufferHeight() {
if(viewer != null && viewer.vc != null)
return viewer.vc.getHeight();
return 600;
}
//
// Close application properly on window close event.
//
public void windowClosing(WindowEvent evt) {
s_logger.info("Closing window");
viewer.windowClosing(evt);
}
//
// Ignore window events we're not interested in.
//
public void windowActivated(WindowEvent evt) {
}
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) {
}
static public void disableFocusTraversal(Container con) {
con.setFocusTraversalKeysEnabled(false);
con.setFocusCycleRoot(true);
}
}

File diff suppressed because it is too large Load Diff

View File

@ -1,418 +0,0 @@
//
// Copyright (C) 2001 HorizonLive.com, Inc. All Rights Reserved.
// Copyright (C) 2001 Constantin Kaplinsky. All Rights Reserved.
// Copyright (C) 2000 Tridia Corporation. 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.
//
//
// Options frame.
//
// This deals with all the options the user can play with.
// It sets the encodings array and some booleans.
//
package com.cloud.consoleviewer;
import java.awt.*;
import java.awt.event.*;
class OptionsFrame {
/* extends Frame
}
implements WindowListener, ActionListener, ItemListener {
static String[] names = {
"Encoding",
"Compression level",
"JPEG image quality",
"Cursor shape updates",
"Use CopyRect",
"Restricted colors",
"Mouse buttons 2 and 3",
"View only",
"Scale remote cursor",
"Share desktop",
};
static String[][] values = {
{ "Auto", "Raw", "RRE", "CoRRE", "Hextile", "Zlib", "Tight", "ZRLE" },
{ "Default", "1", "2", "3", "4", "5", "6", "7", "8", "9" },
{ "JPEG off", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" },
{ "Enable", "Ignore", "Disable" },
{ "Yes", "No" },
{ "Yes", "No" },
{ "Normal", "Reversed" },
{ "Yes", "No" },
{ "No", "50%", "75%", "125%", "150%" },
{ "Yes", "No" },
};
final int
encodingIndex = 0,
compressLevelIndex = 1,
jpegQualityIndex = 2,
cursorUpdatesIndex = 3,
useCopyRectIndex = 4,
eightBitColorsIndex = 5,
mouseButtonIndex = 6,
viewOnlyIndex = 7,
scaleCursorIndex = 8,
shareDesktopIndex = 9;
Label[] labels = new Label[names.length];
Choice[] choices = new Choice[names.length];
Button closeButton;
VncViewer viewer;
*/
//
// The actual data which other classes look at:
//
int preferredEncoding = -1;
int compressLevel = 5;
int jpegQuality = 5;
boolean useCopyRect = false;
boolean requestCursorUpdates = true;
boolean ignoreCursorUpdates = false;
boolean eightBitColors = false;
boolean reverseMouseButtons2And3 = false;
boolean shareDesktop = true;
boolean viewOnly = false;
int scaleCursor = 0;
boolean autoScale = false;
int scalingFactor = 100;
//
// Constructor. Set up the labels and choices from the names and values
// arrays.
//
OptionsFrame(ConsoleViewer v) {
}
/*
super("TightVNC Options");
viewer = v;
GridBagLayout gridbag = new GridBagLayout();
setLayout(gridbag);
GridBagConstraints gbc = new GridBagConstraints();
gbc.fill = GridBagConstraints.BOTH;
for (int i = 0; i < names.length; i++) {
labels[i] = new Label(names[i]);
gbc.gridwidth = 1;
gridbag.setConstraints(labels[i],gbc);
add(labels[i]);
choices[i] = new Choice();
gbc.gridwidth = GridBagConstraints.REMAINDER;
gridbag.setConstraints(choices[i],gbc);
add(choices[i]);
choices[i].addItemListener(this);
for (int j = 0; j < values[i].length; j++) {
choices[i].addItem(values[i][j]);
}
}
closeButton = new Button("Close");
gbc.gridwidth = GridBagConstraints.REMAINDER;
gridbag.setConstraints(closeButton, gbc);
add(closeButton);
closeButton.addActionListener(this);
pack();
addWindowListener(this);
// Set up defaults
choices[encodingIndex].select("Auto");
choices[compressLevelIndex].select("Default");
choices[jpegQualityIndex].select("6");
choices[cursorUpdatesIndex].select("Enable");
choices[useCopyRectIndex].select("Yes");
choices[eightBitColorsIndex].select("No");
choices[mouseButtonIndex].select("Normal");
choices[viewOnlyIndex].select("No");
choices[scaleCursorIndex].select("No");
choices[shareDesktopIndex].select("Yes");
// But let them be overridden by parameters
for (int i = 0; i < names.length; i++) {
String s = viewer.readParameter(names[i], false);
if (s != null) {
for (int j = 0; j < values[i].length; j++) {
if (s.equalsIgnoreCase(values[i][j])) {
choices[i].select(j);
}
}
}
}
// FIXME: Provide some sort of GUI for "Scaling Factor".
autoScale = false;
scalingFactor = 100;
String s = viewer.readParameter("Scaling Factor", false);
if (s != null) {
if (s.equalsIgnoreCase("Auto")) {
autoScale = true;
} else {
// Remove the '%' char at the end of string if present.
if (s.charAt(s.length() - 1) == '%') {
s = s.substring(0, s.length() - 1);
}
// Convert to an integer.
try {
scalingFactor = Integer.parseInt(s);
}
catch (NumberFormatException e) {
scalingFactor = 100;
}
// Make sure scalingFactor is in the range of [1..1000].
if (scalingFactor < 1) {
scalingFactor = 1;
} else if (scalingFactor > 1000) {
scalingFactor = 1000;
}
}
}
// Make the booleans and encodings array correspond to the state of the GUI
setEncodings();
setColorFormat();
setOtherOptions();
}
//
// Disable the shareDesktop option
//
void disableShareDesktop() {
labels[shareDesktopIndex].setEnabled(false);
choices[shareDesktopIndex].setEnabled(false);
}
//
// setEncodings looks at the encoding, compression level, JPEG
// quality level, cursor shape updates and copyRect choices and sets
// corresponding variables properly. Then it calls the VncViewer's
// setEncodings method to send a SetEncodings message to the RFB
// server.
//
void setEncodings() {
useCopyRect = choices[useCopyRectIndex].getSelectedItem().equals("Yes");
preferredEncoding = RfbProto.EncodingRaw;
boolean enableCompressLevel = false;
boolean enableQualityLevel = false;
if (choices[encodingIndex].getSelectedItem().equals("RRE")) {
preferredEncoding = RfbProto.EncodingRRE;
} else if (choices[encodingIndex].getSelectedItem().equals("CoRRE")) {
preferredEncoding = RfbProto.EncodingCoRRE;
} else if (choices[encodingIndex].getSelectedItem().equals("Hextile")) {
preferredEncoding = RfbProto.EncodingHextile;
} else if (choices[encodingIndex].getSelectedItem().equals("ZRLE")) {
preferredEncoding = RfbProto.EncodingZRLE;
} else if (choices[encodingIndex].getSelectedItem().equals("Zlib")) {
preferredEncoding = RfbProto.EncodingZlib;
enableCompressLevel = true;
} else if (choices[encodingIndex].getSelectedItem().equals("Tight")) {
preferredEncoding = RfbProto.EncodingTight;
enableCompressLevel = true;
enableQualityLevel = !eightBitColors;
} else if (choices[encodingIndex].getSelectedItem().equals("Auto")) {
preferredEncoding = -1;
enableQualityLevel = !eightBitColors;
}
// Handle compression level setting.
try {
compressLevel =
Integer.parseInt(choices[compressLevelIndex].getSelectedItem());
}
catch (NumberFormatException e) {
compressLevel = -1;
}
if (compressLevel < 1 || compressLevel > 9) {
compressLevel = -1;
}
labels[compressLevelIndex].setEnabled(enableCompressLevel);
choices[compressLevelIndex].setEnabled(enableCompressLevel);
// Handle JPEG quality setting.
try {
jpegQuality =
Integer.parseInt(choices[jpegQualityIndex].getSelectedItem());
}
catch (NumberFormatException e) {
jpegQuality = -1;
}
if (jpegQuality < 0 || jpegQuality > 9) {
jpegQuality = -1;
}
labels[jpegQualityIndex].setEnabled(enableQualityLevel);
choices[jpegQualityIndex].setEnabled(enableQualityLevel);
// Request cursor shape updates if necessary.
requestCursorUpdates =
!choices[cursorUpdatesIndex].getSelectedItem().equals("Disable");
if (requestCursorUpdates) {
ignoreCursorUpdates =
choices[cursorUpdatesIndex].getSelectedItem().equals("Ignore");
}
viewer.setEncodings();
}
//
// setColorFormat sets eightBitColors variable depending on the GUI
// setting, causing switches between 8-bit and 24-bit colors mode if
// necessary.
//
void setColorFormat() {
eightBitColors =
choices[eightBitColorsIndex].getSelectedItem().equals("Yes");
boolean enableJPEG = !eightBitColors &&
(choices[encodingIndex].getSelectedItem().equals("Tight") ||
choices[encodingIndex].getSelectedItem().equals("Auto"));
labels[jpegQualityIndex].setEnabled(enableJPEG);
choices[jpegQualityIndex].setEnabled(enableJPEG);
}
//
// setOtherOptions looks at the "other" choices (ones which don't set the
// encoding or the color format) and sets the boolean flags appropriately.
//
void setOtherOptions() {
reverseMouseButtons2And3
= choices[mouseButtonIndex].getSelectedItem().equals("Reversed");
viewOnly
= choices[viewOnlyIndex].getSelectedItem().equals("Yes");
if (viewer.vc != null)
viewer.vc.enableInput(!viewOnly);
shareDesktop
= choices[shareDesktopIndex].getSelectedItem().equals("Yes");
String scaleString = choices[scaleCursorIndex].getSelectedItem();
if (scaleString.endsWith("%"))
scaleString = scaleString.substring(0, scaleString.length() - 1);
try {
scaleCursor = Integer.parseInt(scaleString);
}
catch (NumberFormatException e) {
scaleCursor = 0;
}
if (scaleCursor < 10 || scaleCursor > 500) {
scaleCursor = 0;
}
if (requestCursorUpdates && !ignoreCursorUpdates && !viewOnly) {
labels[scaleCursorIndex].setEnabled(true);
choices[scaleCursorIndex].setEnabled(true);
} else {
labels[scaleCursorIndex].setEnabled(false);
choices[scaleCursorIndex].setEnabled(false);
}
if (viewer.vc != null)
viewer.vc.createSoftCursor(); // update cursor scaling
}
//
// Respond to actions on Choice controls
//
public void itemStateChanged(ItemEvent evt) {
Object source = evt.getSource();
if (source == choices[encodingIndex] ||
source == choices[compressLevelIndex] ||
source == choices[jpegQualityIndex] ||
source == choices[cursorUpdatesIndex] ||
source == choices[useCopyRectIndex]) {
setEncodings();
if (source == choices[cursorUpdatesIndex]) {
setOtherOptions(); // update scaleCursor state
}
} else if (source == choices[eightBitColorsIndex]) {
setColorFormat();
} else if (source == choices[mouseButtonIndex] ||
source == choices[shareDesktopIndex] ||
source == choices[viewOnlyIndex] ||
source == choices[scaleCursorIndex]) {
setOtherOptions();
}
}
//
// Respond to button press
//
public void actionPerformed(ActionEvent evt) {
if (evt.getSource() == closeButton)
setVisible(false);
}
//
// Respond to window events
//
public void windowClosing(WindowEvent evt) {
setVisible(false);
}
public void windowActivated(WindowEvent evt) {}
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) {}
*/
}

View File

@ -1,314 +0,0 @@
//
// Copyright (C) 2002 Constantin Kaplinsky. 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.
//
//
// Recording frame. It allows to control recording RFB sessions into
// FBS (FrameBuffer Stream) files.
//
package com.cloud.consoleviewer;
import java.io.*;
import java.awt.*;
import java.awt.event.*;
@SuppressWarnings("serial")
class RecordingFrame extends Frame
implements WindowListener, ActionListener {
boolean recording;
TextField fnameField;
Button browseButton;
Label statusLabel;
Button recordButton, nextButton, closeButton;
ConsoleViewer viewer;
//
// Check if current security manager allows to create a
// RecordingFrame object.
//
public static boolean checkSecurity() {
SecurityManager security = System.getSecurityManager();
if (security != null) {
try {
security.checkPropertyAccess("user.dir");
security.checkPropertyAccess("file.separator");
// Work around (rare) checkPropertyAccess bug
System.getProperty("user.dir");
} catch (SecurityException e) {
System.out.println("SecurityManager restricts session recording.");
return false;
}
}
return true;
}
//
// Constructor.
//
RecordingFrame(ConsoleViewer v) {
super("TightVNC Session Recording");
viewer = v;
// Determine initial filename for next saved session.
// FIXME: Check SecurityManager.
String fname = nextNewFilename(System.getProperty("user.dir") +
System.getProperty("file.separator") +
"vncsession.fbs");
// Construct new panel with file name field and "Browse" button.
Panel fnamePanel = new Panel();
GridBagLayout fnameGridbag = new GridBagLayout();
fnamePanel.setLayout(fnameGridbag);
GridBagConstraints fnameConstraints = new GridBagConstraints();
fnameConstraints.gridwidth = GridBagConstraints.RELATIVE;
fnameConstraints.fill = GridBagConstraints.BOTH;
fnameConstraints.weightx = 4.0;
fnameField = new TextField(fname, 64);
fnameGridbag.setConstraints(fnameField, fnameConstraints);
fnamePanel.add(fnameField);
fnameField.addActionListener(this);
fnameConstraints.gridwidth = GridBagConstraints.REMAINDER;
fnameConstraints.weightx = 1.0;
browseButton = new Button("Browse");
fnameGridbag.setConstraints(browseButton, fnameConstraints);
fnamePanel.add(browseButton);
browseButton.addActionListener(this);
// Construct the frame.
GridBagLayout gridbag = new GridBagLayout();
setLayout(gridbag);
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridwidth = GridBagConstraints.REMAINDER;
gbc.fill = GridBagConstraints.BOTH;
gbc.weighty = 1.0;
gbc.insets = new Insets(10, 0, 0, 0);
Label helpLabel =
new Label("File name to save next recorded session in:", Label.CENTER);
gridbag.setConstraints(helpLabel, gbc);
add(helpLabel);
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.weighty = 0.0;
gbc.insets = new Insets(0, 0, 0, 0);
gridbag.setConstraints(fnamePanel, gbc);
add(fnamePanel);
gbc.fill = GridBagConstraints.BOTH;
gbc.weighty = 1.0;
gbc.insets = new Insets(10, 0, 10, 0);
statusLabel = new Label("", Label.CENTER);
gridbag.setConstraints(statusLabel, gbc);
add(statusLabel);
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.weightx = 1.0;
gbc.weighty = 0.0;
gbc.gridwidth = 1;
gbc.insets = new Insets(0, 0, 0, 0);
recordButton = new Button("Record");
gridbag.setConstraints(recordButton, gbc);
add(recordButton);
recordButton.addActionListener(this);
nextButton = new Button("Next file");
gridbag.setConstraints(nextButton, gbc);
add(nextButton);
nextButton.addActionListener(this);
closeButton = new Button("Close");
gridbag.setConstraints(closeButton, gbc);
add(closeButton);
closeButton.addActionListener(this);
// Set correct text, font and color for the statusLabel.
stopRecording();
pack();
addWindowListener(this);
}
//
// If the given string ends with ".NNN" where NNN is a decimal
// number, increase this number by one. Otherwise, append ".001"
// to the given string.
//
protected String nextFilename(String fname) {
int len = fname.length();
int suffixPos = len;
int suffixNum = 1;
if (len > 4 && fname.charAt(len - 4) == '.') {
try {
suffixNum = Integer.parseInt(fname.substring(len - 3, len)) + 1;
suffixPos = len - 4;
} catch (NumberFormatException e) { }
}
char[] zeroes = {'0', '0', '0'};
String suffix = String.valueOf(suffixNum);
if (suffix.length() < 3) {
suffix = new String(zeroes, 0, 3 - suffix.length()) + suffix;
}
return fname.substring(0, suffixPos) + '.' + suffix;
}
//
// Find next name of a file which does not exist yet.
//
protected String nextNewFilename(String fname) {
String newName = fname;
File f;
try {
do {
newName = nextFilename(newName);
f = new File(newName);
} while (f.exists());
} catch (SecurityException e) { }
return newName;
}
//
// Let the user choose a file name showing a FileDialog.
//
protected boolean browseFile() {
File currentFile = new File(fnameField.getText());
FileDialog fd =
new FileDialog(this, "Save next session as...", FileDialog.SAVE);
fd.setDirectory(currentFile.getParent());
fd.setVisible(true);
if (fd.getFile() != null) {
String newDir = fd.getDirectory();
String sep = System.getProperty("file.separator");
if (newDir.length() > 0) {
if (!sep.equals(newDir.substring(newDir.length() - sep.length())))
newDir += sep;
}
String newFname = newDir + fd.getFile();
if (newFname.equals(fnameField.getText())) {
fnameField.setText(newFname);
return true;
}
}
return false;
}
//
// Start recording.
//
public void startRecording() {
statusLabel.setText("Status: Recording...");
statusLabel.setFont(new Font("Helvetica", Font.BOLD, 12));
statusLabel.setForeground(Color.red);
recordButton.setLabel("Stop recording");
recording = true;
viewer.setRecordingStatus(fnameField.getText());
}
//
// Stop recording.
//
public void stopRecording() {
statusLabel.setText("Status: Not recording.");
statusLabel.setFont(new Font("Helvetica", Font.PLAIN, 12));
statusLabel.setForeground(Color.black);
recordButton.setLabel("Record");
recording = false;
viewer.setRecordingStatus(null);
}
//
// Close our window properly.
//
public void windowClosing(WindowEvent evt) {
setVisible(false);
}
//
// Ignore window events we're not interested in.
//
public void windowActivated(WindowEvent evt) {}
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) {}
//
// Respond to button presses
//
public void actionPerformed(ActionEvent evt) {
if (evt.getSource() == browseButton) {
if (browseFile() && recording)
startRecording();
} else if (evt.getSource() == recordButton) {
if (!recording) {
startRecording();
} else {
stopRecording();
fnameField.setText(nextNewFilename(fnameField.getText()));
}
} else if (evt.getSource() == nextButton) {
fnameField.setText(nextNewFilename(fnameField.getText()));
if (recording)
startRecording();
} else if (evt.getSource() == closeButton) {
setVisible(false);
}
}
}

View File

@ -1,66 +0,0 @@
//
// Copyright (C) 2002 Cendio Systems. All Rights Reserved.
// Copyright (C) 2002 Constantin Kaplinsky. 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.
//
//
// ReloginPanel class implements panel with a button for logging in again,
// after fatal errors or disconnect
//
package com.cloud.consoleviewer;
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
//
// The panel which implements the Relogin button
//
@SuppressWarnings("serial")
class ReloginPanel extends Panel implements ActionListener {
Button reloginButton;
Button closeButton;
ConsoleViewer viewer;
//
// Constructor.
//
public ReloginPanel(ConsoleViewer v) {
viewer = v;
setLayout(new FlowLayout(FlowLayout.CENTER));
reloginButton = new Button("Login again");
add(reloginButton);
reloginButton.addActionListener(this);
if (viewer.inSeparateFrame) {
closeButton = new Button("Close window");
add(closeButton);
closeButton.addActionListener(this);
}
}
//
// This method is called when a button is pressed.
//
public synchronized void actionPerformed(ActionEvent evt) {
if (viewer.inSeparateFrame)
viewer.vncFrame.dispose();
if (evt.getSource() == reloginButton)
viewer.applet.getAppletContext().showDocument(viewer.applet.getDocumentBase());
}
}

View File

@ -1,48 +0,0 @@
<html>
<title>Console Viewer Applet</title>
<body>
<script language="javascript">
function sendCtrlAltDel() {
document.TheApplet.sendCtrlAltDel();
}
</script>
<div height="40" width="100%">
<input type="button" value="Ctrl-Alt-Del" onclick="sendCtrlAltDel();"></input>
</div>
<!--
<div>
<embed
name="TheApplet"
code="com.vmops.consoleviewer.ConsoleApplet.class"
type="application/x-java-applet"
width= "1600" height="1200"
archive="https://127-0-0-1.realhostip.com:8000/getjar/VMOpsConsoleApplet.jar"
HOST="192.168.1.220"
PORT="5919"
PROXYHOST="127-0-0-1.realhostip.com"
PROXYPORT="5999"
SID=" dbbc5ca902413ca2"
/>
</div>
-->
<object
name="TheApplet"
classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93"
codebase="http://java.sun.com/update/1.6.0/jinstall-6u10-windows-i586.cab#Version=1,6,0,0"
width="1600" height="1200" border=0 hspace=0 vspace=0>
<PARAM name="CODE" value="com.vmops.consoleviewer.ConsoleApplet.class">
<PARAM name="ARCHIVE" value="https://127-0-0-1.realhostip.com:8000/getjar/VMOpsConsoleApplet.jar">
<PARAM name="HOST" value="192.168.1.220">
<PARAM name="PORT" value="5919">
<PARAM name="PROXYHOST" value="127-0-0-1.realhostip.com">
<PARAM name="PROXYPORT" value="5999">
<PARAM name="SID" value="dbbc5ca902413ca2">
</object>
</body>
</html>

View File

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="src"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
<classpathentry kind="output" path="bin"/>
</classpath>

View File

@ -1,17 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>console</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jdt.core.javanature</nature>
</natures>
</projectDescription>

View File

@ -1,90 +0,0 @@
//
// Copyright (C) 2003 Constantin Kaplinsky. 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.
//
//
// CapabilityInfo.java - A class to hold information about a
// particular capability as used in the RFB protocol 3.130.
//
// repackage it to VMOps common packaging structure
package com.cloud.console;
public class CapabilityInfo {
// Public methods
public CapabilityInfo(int code,
String vendorSignature,
String nameSignature,
String description) {
this.code = code;
this.vendorSignature = vendorSignature;
this.nameSignature = nameSignature;
this.description = description;
enabled = false;
}
public CapabilityInfo(int code,
byte[] vendorSignature,
byte[] nameSignature) {
this.code = code;
this.vendorSignature = new String(vendorSignature);
this.nameSignature = new String(nameSignature);
this.description = null;
enabled = false;
}
public int getCode() {
return code;
}
public String getDescription() {
return description;
}
public boolean isEnabled() {
return enabled;
}
public void enable() {
enabled = true;
}
public boolean equals(CapabilityInfo other) {
return (other != null && this.code == other.code &&
this.vendorSignature.equals(other.vendorSignature) &&
this.nameSignature.equals(other.nameSignature));
}
public boolean enableIfEquals(CapabilityInfo other) {
if (this.equals(other))
enable();
return isEnabled();
}
// Protected data
protected int code;
protected String vendorSignature;
protected String nameSignature;
protected String description;
protected boolean enabled;
}

View File

@ -1,109 +0,0 @@
//
// Copyright (C) 2003 Constantin Kaplinsky. 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.
//
//
// CapsContainer.java - A container of capabilities as used in the RFB
// protocol 3.130
//
// repackage it to VMOps common packaging structure
package com.cloud.console;
import java.util.Vector;
import java.util.Hashtable;
public class CapsContainer {
// Public methods
public CapsContainer() {
infoMap = new Hashtable(64, (float)0.25);
orderedList = new Vector(32, 8);
}
@SuppressWarnings("unchecked")
public void add(CapabilityInfo capinfo) {
Integer key = new Integer(capinfo.getCode());
infoMap.put(key, capinfo);
}
@SuppressWarnings("unchecked")
public void add(int code, String vendor, String name, String desc) {
Integer key = new Integer(code);
infoMap.put(key, new CapabilityInfo(code, vendor, name, desc));
}
public boolean isKnown(int code) {
return infoMap.containsKey(new Integer(code));
}
public CapabilityInfo getInfo(int code) {
return (CapabilityInfo)infoMap.get(new Integer(code));
}
public String getDescription(int code) {
CapabilityInfo capinfo = (CapabilityInfo)infoMap.get(new Integer(code));
if (capinfo == null)
return null;
return capinfo.getDescription();
}
@SuppressWarnings("unchecked")
public boolean enable(CapabilityInfo other) {
Integer key = new Integer(other.getCode());
CapabilityInfo capinfo = (CapabilityInfo)infoMap.get(key);
if (capinfo == null)
return false;
boolean enabled = capinfo.enableIfEquals(other);
if (enabled)
orderedList.addElement(key);
return enabled;
}
public boolean isEnabled(int code) {
CapabilityInfo capinfo = (CapabilityInfo)infoMap.get(new Integer(code));
if (capinfo == null)
return false;
return capinfo.isEnabled();
}
public int numEnabled() {
return orderedList.size();
}
public int getByOrder(int idx) {
int code;
try {
code = ((Integer)orderedList.elementAt(idx)).intValue();
} catch (ArrayIndexOutOfBoundsException e) {
code = 0;
}
return code;
}
// Protected data
protected Hashtable infoMap;
protected Vector orderedList;
}

File diff suppressed because it is too large Load Diff

View File

@ -1,63 +0,0 @@
//
// Copyright (C) 2006 Constantin Kaplinsky. 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.
//
package com.cloud.console;
import java.awt.*;
import java.io.*;
//
// VncCanvas2 is a special version of VncCanvas which may use Java 2 API.
//
@SuppressWarnings("serial")
public class ConsoleCanvas2 extends ConsoleCanvas {
public ConsoleCanvas2(RfbViewer v) throws IOException {
super(v);
disableFocusTraversalKeys();
}
public ConsoleCanvas2(RfbViewer v, int maxWidth_, int maxHeight_)
{
super(v, maxWidth_, maxHeight_);
disableFocusTraversalKeys();
}
public void paintScaledFrameBuffer(Graphics g) {
Graphics2D g2d = (Graphics2D)g;
g2d.setRenderingHint(RenderingHints.KEY_RENDERING,
RenderingHints.VALUE_RENDER_QUALITY);
g2d.drawImage(memImage, 0, 0, scaledWidth, scaledHeight, null);
}
//
// Try to disable focus traversal keys (JVMs 1.4 and higher).
//
private void disableFocusTraversalKeys() {
try {
Class<?>[] argClasses = { Boolean.TYPE };
java.lang.reflect.Method method =
getClass().getMethod("setFocusTraversalKeysEnabled", argClasses);
Object[] argObjects = { new Boolean(false) };
method.invoke(this, argObjects);
} catch (Exception e) {}
}
}

View File

@ -1,496 +0,0 @@
//
// This DES class has been extracted from package Acme.Crypto for use in VNC.
// The bytebit[] array has been reversed so that the most significant bit
// in each byte of the key is ignored, not the least significant. Also the
// unnecessary odd parity code has been removed.
//
// These changes are:
// Copyright (C) 1999 AT&T Laboratories Cambridge. All Rights Reserved.
//
// 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.
//
// DesCipher - the DES encryption method
//
// The meat of this code is by Dave Zimmerman <dzimm@widget.com>, and is:
//
// Copyright (c) 1996 Widget Workshop, Inc. All Rights Reserved.
//
// Permission to use, copy, modify, and distribute this software
// and its documentation for NON-COMMERCIAL or COMMERCIAL purposes and
// without fee is hereby granted, provided that this copyright notice is kept
// intact.
//
// WIDGET WORKSHOP MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY
// OF THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
// TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
// PARTICULAR PURPOSE, OR NON-INFRINGEMENT. WIDGET WORKSHOP SHALL NOT BE LIABLE
// FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
// DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
//
// THIS SOFTWARE IS NOT DESIGNED OR INTENDED FOR USE OR RESALE AS ON-LINE
// CONTROL EQUIPMENT IN HAZARDOUS ENVIRONMENTS REQUIRING FAIL-SAFE
// PERFORMANCE, SUCH AS IN THE OPERATION OF NUCLEAR FACILITIES, AIRCRAFT
// NAVIGATION OR COMMUNICATION SYSTEMS, AIR TRAFFIC CONTROL, DIRECT LIFE
// SUPPORT MACHINES, OR WEAPONS SYSTEMS, IN WHICH THE FAILURE OF THE
// SOFTWARE COULD LEAD DIRECTLY TO DEATH, PERSONAL INJURY, OR SEVERE
// PHYSICAL OR ENVIRONMENTAL DAMAGE ("HIGH RISK ACTIVITIES"). WIDGET WORKSHOP
// SPECIFICALLY DISCLAIMS ANY EXPRESS OR IMPLIED WARRANTY OF FITNESS FOR
// HIGH RISK ACTIVITIES.
//
//
// The rest is:
//
// Copyright (C) 1996 by Jef Poskanzer <jef@acme.com>. All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions
// are met:
// 1. Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// 2. Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in the
// documentation and/or other materials provided with the distribution.
//
// THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
// OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
// SUCH DAMAGE.
//
// Visit the ACME Labs Java page for up-to-date versions of this and other
// fine Java utilities: http://www.acme.com/java/
// repackage it to VMOps common packaging structure
package com.cloud.console;
/// The DES encryption method.
// <P>
// This is surprisingly fast, for pure Java. On a SPARC 20, wrapped
// in Acme.Crypto.EncryptedOutputStream or Acme.Crypto.EncryptedInputStream,
// it does around 7000 bytes/second.
// <P>
// Most of this code is by Dave Zimmerman <dzimm@widget.com>, and is
// Copyright (c) 1996 Widget Workshop, Inc. See the source file for details.
// <P>
// <A HREF="/resources/classes/Acme/Crypto/DesCipher.java">Fetch the software.</A><BR>
// <A HREF="/resources/classes/Acme.tar.Z">Fetch the entire Acme package.</A>
// <P>
// @see Des3Cipher
// @see EncryptedOutputStream
// @see EncryptedInputStream
public class DesCipher
{
// Constructor, byte-array key.
public DesCipher( byte[] key )
{
setKey( key );
}
// Key routines.
private int[] encryptKeys = new int[32];
private int[] decryptKeys = new int[32];
/// Set the key.
public void setKey( byte[] key )
{
deskey( key, true, encryptKeys );
deskey( key, false, decryptKeys );
}
// Turn an 8-byte key into internal keys.
private void deskey( byte[] keyBlock, boolean encrypting, int[] KnL )
{
int i, j, l, m, n;
int[] pc1m = new int[56];
int[] pcr = new int[56];
int[] kn = new int[32];
for ( j = 0; j < 56; ++j )
{
l = pc1[j];
m = l & 07;
pc1m[j] = ( (keyBlock[l >>> 3] & bytebit[m]) != 0 )? 1: 0;
}
for ( i = 0; i < 16; ++i )
{
if ( encrypting )
m = i << 1;
else
m = (15-i) << 1;
n = m+1;
kn[m] = kn[n] = 0;
for ( j = 0; j < 28; ++j )
{
l = j+totrot[i];
if ( l < 28 )
pcr[j] = pc1m[l];
else
pcr[j] = pc1m[l-28];
}
for ( j=28; j < 56; ++j )
{
l = j+totrot[i];
if ( l < 56 )
pcr[j] = pc1m[l];
else
pcr[j] = pc1m[l-28];
}
for ( j = 0; j < 24; ++j )
{
if ( pcr[pc2[j]] != 0 )
kn[m] |= bigbyte[j];
if ( pcr[pc2[j+24]] != 0 )
kn[n] |= bigbyte[j];
}
}
cookey( kn, KnL );
}
private void cookey( int[] raw, int KnL[] )
{
int raw0, raw1;
int rawi, KnLi;
int i;
for ( i = 0, rawi = 0, KnLi = 0; i < 16; ++i )
{
raw0 = raw[rawi++];
raw1 = raw[rawi++];
KnL[KnLi] = (raw0 & 0x00fc0000) << 6;
KnL[KnLi] |= (raw0 & 0x00000fc0) << 10;
KnL[KnLi] |= (raw1 & 0x00fc0000) >>> 10;
KnL[KnLi] |= (raw1 & 0x00000fc0) >>> 6;
++KnLi;
KnL[KnLi] = (raw0 & 0x0003f000) << 12;
KnL[KnLi] |= (raw0 & 0x0000003f) << 16;
KnL[KnLi] |= (raw1 & 0x0003f000) >>> 4;
KnL[KnLi] |= (raw1 & 0x0000003f);
++KnLi;
}
}
// Block encryption routines.
private int[] tempInts = new int[2];
/// Encrypt a block of eight bytes.
public void encrypt( byte[] clearText, int clearOff, byte[] cipherText, int cipherOff )
{
squashBytesToInts( clearText, clearOff, tempInts, 0, 2 );
des( tempInts, tempInts, encryptKeys );
spreadIntsToBytes( tempInts, 0, cipherText, cipherOff, 2 );
}
/// Decrypt a block of eight bytes.
public void decrypt( byte[] cipherText, int cipherOff, byte[] clearText, int clearOff )
{
squashBytesToInts( cipherText, cipherOff, tempInts, 0, 2 );
des( tempInts, tempInts, decryptKeys );
spreadIntsToBytes( tempInts, 0, clearText, clearOff, 2 );
}
// The DES function.
private void des( int[] inInts, int[] outInts, int[] keys )
{
int fval, work, right, leftt;
int round;
int keysi = 0;
leftt = inInts[0];
right = inInts[1];
work = ((leftt >>> 4) ^ right) & 0x0f0f0f0f;
right ^= work;
leftt ^= (work << 4);
work = ((leftt >>> 16) ^ right) & 0x0000ffff;
right ^= work;
leftt ^= (work << 16);
work = ((right >>> 2) ^ leftt) & 0x33333333;
leftt ^= work;
right ^= (work << 2);
work = ((right >>> 8) ^ leftt) & 0x00ff00ff;
leftt ^= work;
right ^= (work << 8);
right = (right << 1) | ((right >>> 31) & 1);
work = (leftt ^ right) & 0xaaaaaaaa;
leftt ^= work;
right ^= work;
leftt = (leftt << 1) | ((leftt >>> 31) & 1);
for ( round = 0; round < 8; ++round )
{
work = (right << 28) | (right >>> 4);
work ^= keys[keysi++];
fval = SP7[ work & 0x0000003f ];
fval |= SP5[(work >>> 8) & 0x0000003f ];
fval |= SP3[(work >>> 16) & 0x0000003f ];
fval |= SP1[(work >>> 24) & 0x0000003f ];
work = right ^ keys[keysi++];
fval |= SP8[ work & 0x0000003f ];
fval |= SP6[(work >>> 8) & 0x0000003f ];
fval |= SP4[(work >>> 16) & 0x0000003f ];
fval |= SP2[(work >>> 24) & 0x0000003f ];
leftt ^= fval;
work = (leftt << 28) | (leftt >>> 4);
work ^= keys[keysi++];
fval = SP7[ work & 0x0000003f ];
fval |= SP5[(work >>> 8) & 0x0000003f ];
fval |= SP3[(work >>> 16) & 0x0000003f ];
fval |= SP1[(work >>> 24) & 0x0000003f ];
work = leftt ^ keys[keysi++];
fval |= SP8[ work & 0x0000003f ];
fval |= SP6[(work >>> 8) & 0x0000003f ];
fval |= SP4[(work >>> 16) & 0x0000003f ];
fval |= SP2[(work >>> 24) & 0x0000003f ];
right ^= fval;
}
right = (right << 31) | (right >>> 1);
work = (leftt ^ right) & 0xaaaaaaaa;
leftt ^= work;
right ^= work;
leftt = (leftt << 31) | (leftt >>> 1);
work = ((leftt >>> 8) ^ right) & 0x00ff00ff;
right ^= work;
leftt ^= (work << 8);
work = ((leftt >>> 2) ^ right) & 0x33333333;
right ^= work;
leftt ^= (work << 2);
work = ((right >>> 16) ^ leftt) & 0x0000ffff;
leftt ^= work;
right ^= (work << 16);
work = ((right >>> 4) ^ leftt) & 0x0f0f0f0f;
leftt ^= work;
right ^= (work << 4);
outInts[0] = right;
outInts[1] = leftt;
}
// Tables, permutations, S-boxes, etc.
private static byte[] bytebit = {
(byte)0x01, (byte)0x02, (byte)0x04, (byte)0x08,
(byte)0x10, (byte)0x20, (byte)0x40, (byte)0x80
};
private static int[] bigbyte = {
0x800000, 0x400000, 0x200000, 0x100000,
0x080000, 0x040000, 0x020000, 0x010000,
0x008000, 0x004000, 0x002000, 0x001000,
0x000800, 0x000400, 0x000200, 0x000100,
0x000080, 0x000040, 0x000020, 0x000010,
0x000008, 0x000004, 0x000002, 0x000001
};
private static byte[] pc1 = {
(byte)56, (byte)48, (byte)40, (byte)32, (byte)24, (byte)16, (byte) 8,
(byte) 0, (byte)57, (byte)49, (byte)41, (byte)33, (byte)25, (byte)17,
(byte) 9, (byte) 1, (byte)58, (byte)50, (byte)42, (byte)34, (byte)26,
(byte)18, (byte)10, (byte) 2, (byte)59, (byte)51, (byte)43, (byte)35,
(byte)62, (byte)54, (byte)46, (byte)38, (byte)30, (byte)22, (byte)14,
(byte) 6, (byte)61, (byte)53, (byte)45, (byte)37, (byte)29, (byte)21,
(byte)13, (byte) 5, (byte)60, (byte)52, (byte)44, (byte)36, (byte)28,
(byte)20, (byte)12, (byte) 4, (byte)27, (byte)19, (byte)11, (byte)3
};
private static int[] totrot = {
1, 2, 4, 6, 8, 10, 12, 14, 15, 17, 19, 21, 23, 25, 27, 28
};
private static byte[] pc2 = {
(byte)13, (byte)16, (byte)10, (byte)23, (byte) 0, (byte) 4,
(byte) 2, (byte)27, (byte)14, (byte) 5, (byte)20, (byte) 9,
(byte)22, (byte)18, (byte)11, (byte)3 , (byte)25, (byte) 7,
(byte)15, (byte) 6, (byte)26, (byte)19, (byte)12, (byte) 1,
(byte)40, (byte)51, (byte)30, (byte)36, (byte)46, (byte)54,
(byte)29, (byte)39, (byte)50, (byte)44, (byte)32, (byte)47,
(byte)43, (byte)48, (byte)38, (byte)55, (byte)33, (byte)52,
(byte)45, (byte)41, (byte)49, (byte)35, (byte)28, (byte)31,
};
private static int[] SP1 = {
0x01010400, 0x00000000, 0x00010000, 0x01010404,
0x01010004, 0x00010404, 0x00000004, 0x00010000,
0x00000400, 0x01010400, 0x01010404, 0x00000400,
0x01000404, 0x01010004, 0x01000000, 0x00000004,
0x00000404, 0x01000400, 0x01000400, 0x00010400,
0x00010400, 0x01010000, 0x01010000, 0x01000404,
0x00010004, 0x01000004, 0x01000004, 0x00010004,
0x00000000, 0x00000404, 0x00010404, 0x01000000,
0x00010000, 0x01010404, 0x00000004, 0x01010000,
0x01010400, 0x01000000, 0x01000000, 0x00000400,
0x01010004, 0x00010000, 0x00010400, 0x01000004,
0x00000400, 0x00000004, 0x01000404, 0x00010404,
0x01010404, 0x00010004, 0x01010000, 0x01000404,
0x01000004, 0x00000404, 0x00010404, 0x01010400,
0x00000404, 0x01000400, 0x01000400, 0x00000000,
0x00010004, 0x00010400, 0x00000000, 0x01010004
};
private static int[] SP2 = {
0x80108020, 0x80008000, 0x00008000, 0x00108020,
0x00100000, 0x00000020, 0x80100020, 0x80008020,
0x80000020, 0x80108020, 0x80108000, 0x80000000,
0x80008000, 0x00100000, 0x00000020, 0x80100020,
0x00108000, 0x00100020, 0x80008020, 0x00000000,
0x80000000, 0x00008000, 0x00108020, 0x80100000,
0x00100020, 0x80000020, 0x00000000, 0x00108000,
0x00008020, 0x80108000, 0x80100000, 0x00008020,
0x00000000, 0x00108020, 0x80100020, 0x00100000,
0x80008020, 0x80100000, 0x80108000, 0x00008000,
0x80100000, 0x80008000, 0x00000020, 0x80108020,
0x00108020, 0x00000020, 0x00008000, 0x80000000,
0x00008020, 0x80108000, 0x00100000, 0x80000020,
0x00100020, 0x80008020, 0x80000020, 0x00100020,
0x00108000, 0x00000000, 0x80008000, 0x00008020,
0x80000000, 0x80100020, 0x80108020, 0x00108000
};
private static int[] SP3 = {
0x00000208, 0x08020200, 0x00000000, 0x08020008,
0x08000200, 0x00000000, 0x00020208, 0x08000200,
0x00020008, 0x08000008, 0x08000008, 0x00020000,
0x08020208, 0x00020008, 0x08020000, 0x00000208,
0x08000000, 0x00000008, 0x08020200, 0x00000200,
0x00020200, 0x08020000, 0x08020008, 0x00020208,
0x08000208, 0x00020200, 0x00020000, 0x08000208,
0x00000008, 0x08020208, 0x00000200, 0x08000000,
0x08020200, 0x08000000, 0x00020008, 0x00000208,
0x00020000, 0x08020200, 0x08000200, 0x00000000,
0x00000200, 0x00020008, 0x08020208, 0x08000200,
0x08000008, 0x00000200, 0x00000000, 0x08020008,
0x08000208, 0x00020000, 0x08000000, 0x08020208,
0x00000008, 0x00020208, 0x00020200, 0x08000008,
0x08020000, 0x08000208, 0x00000208, 0x08020000,
0x00020208, 0x00000008, 0x08020008, 0x00020200
};
private static int[] SP4 = {
0x00802001, 0x00002081, 0x00002081, 0x00000080,
0x00802080, 0x00800081, 0x00800001, 0x00002001,
0x00000000, 0x00802000, 0x00802000, 0x00802081,
0x00000081, 0x00000000, 0x00800080, 0x00800001,
0x00000001, 0x00002000, 0x00800000, 0x00802001,
0x00000080, 0x00800000, 0x00002001, 0x00002080,
0x00800081, 0x00000001, 0x00002080, 0x00800080,
0x00002000, 0x00802080, 0x00802081, 0x00000081,
0x00800080, 0x00800001, 0x00802000, 0x00802081,
0x00000081, 0x00000000, 0x00000000, 0x00802000,
0x00002080, 0x00800080, 0x00800081, 0x00000001,
0x00802001, 0x00002081, 0x00002081, 0x00000080,
0x00802081, 0x00000081, 0x00000001, 0x00002000,
0x00800001, 0x00002001, 0x00802080, 0x00800081,
0x00002001, 0x00002080, 0x00800000, 0x00802001,
0x00000080, 0x00800000, 0x00002000, 0x00802080
};
private static int[] SP5 = {
0x00000100, 0x02080100, 0x02080000, 0x42000100,
0x00080000, 0x00000100, 0x40000000, 0x02080000,
0x40080100, 0x00080000, 0x02000100, 0x40080100,
0x42000100, 0x42080000, 0x00080100, 0x40000000,
0x02000000, 0x40080000, 0x40080000, 0x00000000,
0x40000100, 0x42080100, 0x42080100, 0x02000100,
0x42080000, 0x40000100, 0x00000000, 0x42000000,
0x02080100, 0x02000000, 0x42000000, 0x00080100,
0x00080000, 0x42000100, 0x00000100, 0x02000000,
0x40000000, 0x02080000, 0x42000100, 0x40080100,
0x02000100, 0x40000000, 0x42080000, 0x02080100,
0x40080100, 0x00000100, 0x02000000, 0x42080000,
0x42080100, 0x00080100, 0x42000000, 0x42080100,
0x02080000, 0x00000000, 0x40080000, 0x42000000,
0x00080100, 0x02000100, 0x40000100, 0x00080000,
0x00000000, 0x40080000, 0x02080100, 0x40000100
};
private static int[] SP6 = {
0x20000010, 0x20400000, 0x00004000, 0x20404010,
0x20400000, 0x00000010, 0x20404010, 0x00400000,
0x20004000, 0x00404010, 0x00400000, 0x20000010,
0x00400010, 0x20004000, 0x20000000, 0x00004010,
0x00000000, 0x00400010, 0x20004010, 0x00004000,
0x00404000, 0x20004010, 0x00000010, 0x20400010,
0x20400010, 0x00000000, 0x00404010, 0x20404000,
0x00004010, 0x00404000, 0x20404000, 0x20000000,
0x20004000, 0x00000010, 0x20400010, 0x00404000,
0x20404010, 0x00400000, 0x00004010, 0x20000010,
0x00400000, 0x20004000, 0x20000000, 0x00004010,
0x20000010, 0x20404010, 0x00404000, 0x20400000,
0x00404010, 0x20404000, 0x00000000, 0x20400010,
0x00000010, 0x00004000, 0x20400000, 0x00404010,
0x00004000, 0x00400010, 0x20004010, 0x00000000,
0x20404000, 0x20000000, 0x00400010, 0x20004010
};
private static int[] SP7 = {
0x00200000, 0x04200002, 0x04000802, 0x00000000,
0x00000800, 0x04000802, 0x00200802, 0x04200800,
0x04200802, 0x00200000, 0x00000000, 0x04000002,
0x00000002, 0x04000000, 0x04200002, 0x00000802,
0x04000800, 0x00200802, 0x00200002, 0x04000800,
0x04000002, 0x04200000, 0x04200800, 0x00200002,
0x04200000, 0x00000800, 0x00000802, 0x04200802,
0x00200800, 0x00000002, 0x04000000, 0x00200800,
0x04000000, 0x00200800, 0x00200000, 0x04000802,
0x04000802, 0x04200002, 0x04200002, 0x00000002,
0x00200002, 0x04000000, 0x04000800, 0x00200000,
0x04200800, 0x00000802, 0x00200802, 0x04200800,
0x00000802, 0x04000002, 0x04200802, 0x04200000,
0x00200800, 0x00000000, 0x00000002, 0x04200802,
0x00000000, 0x00200802, 0x04200000, 0x00000800,
0x04000002, 0x04000800, 0x00000800, 0x00200002
};
private static int[] SP8 = {
0x10001040, 0x00001000, 0x00040000, 0x10041040,
0x10000000, 0x10001040, 0x00000040, 0x10000000,
0x00040040, 0x10040000, 0x10041040, 0x00041000,
0x10041000, 0x00041040, 0x00001000, 0x00000040,
0x10040000, 0x10000040, 0x10001000, 0x00001040,
0x00041000, 0x00040040, 0x10040040, 0x10041000,
0x00001040, 0x00000000, 0x00000000, 0x10040040,
0x10000040, 0x10001000, 0x00041040, 0x00040000,
0x00041040, 0x00040000, 0x10041000, 0x00001000,
0x00000040, 0x10040040, 0x00001000, 0x00041040,
0x10001000, 0x00000040, 0x10000040, 0x10040000,
0x10040040, 0x10000000, 0x00040000, 0x10001040,
0x00000000, 0x10041040, 0x00040040, 0x10000040,
0x10040000, 0x10001000, 0x10001040, 0x00000000,
0x10041040, 0x00041000, 0x00041000, 0x00001040,
0x00001040, 0x00040040, 0x10000000, 0x10041000
};
// Routines taken from other parts of the Acme utilities.
/// Squash bytes down to ints.
public static void squashBytesToInts( byte[] inBytes, int inOff, int[] outInts, int outOff, int intLen )
{
for ( int i = 0; i < intLen; ++i )
outInts[outOff + i] =
( ( inBytes[inOff + i * 4 ] & 0xff ) << 24 ) |
( ( inBytes[inOff + i * 4 + 1] & 0xff ) << 16 ) |
( ( inBytes[inOff + i * 4 + 2] & 0xff ) << 8 ) |
( inBytes[inOff + i * 4 + 3] & 0xff );
}
/// Spread ints into bytes.
public static void spreadIntsToBytes( int[] inInts, int inOff, byte[] outBytes, int outOff, int intLen )
{
for ( int i = 0; i < intLen; ++i )
{
outBytes[outOff + i * 4 ] = (byte) ( inInts[inOff + i] >>> 24 );
outBytes[outOff + i * 4 + 1] = (byte) ( inInts[inOff + i] >>> 16 );
outBytes[outOff + i * 4 + 2] = (byte) ( inInts[inOff + i] >>> 8 );
outBytes[outOff + i * 4 + 3] = (byte) inInts[inOff + i];
}
}
}

View File

@ -1,27 +0,0 @@
/**
* Copyright (C) 2010 Cloud.com, Inc. All rights reserved.
*
* This software is licensed under the GNU General Public License v3 or later.
*
* It 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 3 of the License, or any later version.
* This program 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 program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.cloud.console;
import java.awt.Rectangle;
import java.util.List;
public interface ITileScanListener {
boolean onTileChange(Rectangle rowMergedRect, int row, int col);
void onRegionChange(List<Region> regionList);
}

View File

@ -1,180 +0,0 @@
/* Copyright (C) 2002-2005 RealVNC Ltd. 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.
*/
// repackage it to VMOps common packaging structure
package com.cloud.console;
//
// rdr::InStream marshalls data from a buffer stored in RDR (RFB Data
// Representation).
//
abstract public class InStream {
// check() ensures there is buffer data for at least one item of size
// itemSize bytes. Returns the number of items in the buffer (up to a
// maximum of nItems).
public final int check(int itemSize, int nItems) throws Exception {
if (ptr + itemSize * nItems > end) {
if (ptr + itemSize > end)
return overrun(itemSize, nItems);
nItems = (end - ptr) / itemSize;
}
return nItems;
}
public final void check(int itemSize) throws Exception {
if (ptr + itemSize > end)
overrun(itemSize, 1);
}
// readU/SN() methods read unsigned and signed N-bit integers.
public final int readS8() throws Exception {
check(1); return b[ptr++];
}
public final int readS16() throws Exception {
check(2); int b0 = b[ptr++];
int b1 = b[ptr++] & 0xff; return b0 << 8 | b1;
}
public final int readS32() throws Exception {
check(4); int b0 = b[ptr++];
int b1 = b[ptr++] & 0xff;
int b2 = b[ptr++] & 0xff;
int b3 = b[ptr++] & 0xff;
return b0 << 24 | b1 << 16 | b2 << 8 | b3;
}
public final int readU8() throws Exception {
return readS8() & 0xff;
}
public final int readU16() throws Exception {
return readS16() & 0xffff;
}
public final int readU32() throws Exception {
return readS32() & 0xffffffff;
}
// readString() reads a string - a U32 length followed by the data.
public final String readString() throws Exception {
int len = readU32();
if (len > maxStringLength)
throw new Exception("InStream max string length exceeded");
char[] str = new char[len];
int i = 0;
while (i < len) {
int j = i + check(1, len - i);
while (i < j) {
str[i++] = (char)b[ptr++];
}
}
return new String(str);
}
// maxStringLength protects against allocating a huge buffer. Set it
// higher if you need longer strings.
public static int maxStringLength = 65535;
public final void skip(int bytes) throws Exception {
while (bytes > 0) {
int n = check(1, bytes);
ptr += n;
bytes -= n;
}
}
// readBytes() reads an exact number of bytes into an array at an offset.
public void readBytes(byte[] data, int offset, int length) throws Exception {
int offsetEnd = offset + length;
while (offset < offsetEnd) {
int n = check(1, offsetEnd - offset);
System.arraycopy(b, ptr, data, offset, n);
ptr += n;
offset += n;
}
}
// readOpaqueN() reads a quantity "without byte-swapping". Because java has
// no byte-ordering, we just use big-endian.
public final int readOpaque8() throws Exception {
return readU8();
}
public final int readOpaque16() throws Exception {
return readU16();
}
public final int readOpaque32() throws Exception {
return readU32();
}
public final int readOpaque24A() throws Exception {
check(3); int b0 = b[ptr++];
int b1 = b[ptr++]; int b2 = b[ptr++];
return b0 << 24 | b1 << 16 | b2 << 8;
}
public final int readOpaque24B() throws Exception {
check(3); int b0 = b[ptr++];
int b1 = b[ptr++]; int b2 = b[ptr++];
return b0 << 16 | b1 << 8 | b2;
}
// pos() returns the position in the stream.
abstract public int pos();
// bytesAvailable() returns true if at least one byte can be read from the
// stream without blocking. i.e. if false is returned then readU8() would
// block.
public boolean bytesAvailable() { return end != ptr; }
// getbuf(), getptr(), getend() and setptr() are "dirty" methods which allow
// you to manipulate the buffer directly. This is useful for a stream which
// is a wrapper around an underlying stream.
public final byte[] getbuf() { return b; }
public final int getptr() { return ptr; }
public final int getend() { return end; }
public final void setptr(int p) { ptr = p; }
// overrun() is implemented by a derived class to cope with buffer overrun.
// It ensures there are at least itemSize bytes of buffer data. Returns
// the number of items in the buffer (up to a maximum of nItems). itemSize
// is supposed to be "small" (a few bytes).
abstract protected int overrun(int itemSize, int nItems) throws Exception;
protected InStream() {}
protected byte[] b;
protected int ptr;
protected int end;
}

View File

@ -1,225 +0,0 @@
/**
* Copyright (C) 2010 Cloud.com, Inc. All rights reserved.
*
* This software is licensed under the GNU General Public License v3 or later.
*
* It 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 3 of the License, or any later version.
* This program 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 program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.cloud.console;
// logger facility for dynamic switch between console logger used in Applet and log4j based logger
public class Logger {
private static LoggerFactory factory = null;
public static final int LEVEL_TRACE = 1;
public static final int LEVEL_DEBUG = 2;
public static final int LEVEL_INFO = 3;
public static final int LEVEL_WARN = 4;
public static final int LEVEL_ERROR = 5;
private Class<?> clazz;
private Logger logger;
private static int level = LEVEL_INFO;
public static Logger getLogger(Class<?> clazz) {
return new Logger(clazz);
}
public static void setFactory(LoggerFactory f) {
factory = f;
}
public static void setLevel(int l) {
level = l;
}
public Logger(Class<?> clazz) {
this.clazz = clazz;
}
protected Logger() {
}
public boolean isTraceEnabled() {
if(factory != null) {
if(logger == null)
logger = factory.getLogger(clazz);
return logger.isTraceEnabled();
}
return level <= LEVEL_TRACE;
}
public boolean isDebugEnabled() {
if(factory != null) {
if(logger == null)
logger = factory.getLogger(clazz);
return logger.isDebugEnabled();
}
return level <= LEVEL_DEBUG;
}
public boolean isInfoEnabled() {
if(factory != null) {
if(logger == null)
logger = factory.getLogger(clazz);
return logger.isInfoEnabled();
}
return level <= LEVEL_INFO;
}
public void trace(Object message) {
if(factory != null) {
if(logger == null)
logger = factory.getLogger(clazz);
logger.trace(message);
} else {
if(level <= LEVEL_TRACE)
System.out.println(message);
}
}
public void trace(Object message, Throwable exception) {
if(factory != null) {
if(logger == null)
logger = factory.getLogger(clazz);
logger.trace(message, exception);
} else {
if(level <= LEVEL_TRACE) {
System.out.println(message);
if (exception != null) {
exception.printStackTrace(System.out);
}
}
}
}
public void info(Object message) {
if(factory != null) {
if(logger == null)
logger = factory.getLogger(clazz);
logger.info(message);
} else {
if(level <= LEVEL_INFO)
System.out.println(message);
}
}
public void info(Object message, Throwable exception) {
if(factory != null) {
if(logger == null)
logger = factory.getLogger(clazz);
logger.info(message, exception);
} else {
if(level <= LEVEL_INFO) {
System.out.println(message);
if (exception != null) {
exception.printStackTrace(System.out);
}
}
}
}
public void debug(Object message) {
if(factory != null) {
if(logger == null)
logger = factory.getLogger(clazz);
logger.debug(message);
} else {
if(level <= LEVEL_DEBUG)
System.out.println(message);
}
}
public void debug(Object message, Throwable exception) {
if(factory != null) {
if(logger == null)
logger = factory.getLogger(clazz);
logger.debug(message, exception);
} else {
if(level <= LEVEL_DEBUG) {
System.out.println(message);
if (exception != null) {
exception.printStackTrace(System.out);
}
}
}
}
public void warn(Object message) {
if(factory != null) {
if(logger == null)
logger = factory.getLogger(clazz);
logger.warn(message);
} else {
if(level <= LEVEL_WARN)
System.out.println(message);
}
}
public void warn(Object message, Throwable exception) {
if(factory != null) {
if(logger == null)
logger = factory.getLogger(clazz);
logger.warn(message, exception);
} else {
if(level <= LEVEL_WARN) {
System.out.println(message);
if (exception != null) {
exception.printStackTrace(System.out);
}
}
}
}
public void error(Object message) {
if(factory != null) {
if(logger == null)
logger = factory.getLogger(clazz);
logger.error(message);
} else {
if(level <= LEVEL_ERROR)
System.out.println(message);
}
}
public void error(Object message, Throwable exception) {
if(factory != null) {
if(logger == null)
logger = factory.getLogger(clazz);
logger.error(message, exception);
} else {
if(level <= LEVEL_ERROR) {
System.out.println(message);
if (exception != null) {
exception.printStackTrace(System.out);
}
}
}
}
}

View File

@ -1,23 +0,0 @@
/**
* Copyright (C) 2010 Cloud.com, Inc. All rights reserved.
*
* This software is licensed under the GNU General Public License v3 or later.
*
* It 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 3 of the License, or any later version.
* This program 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 program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.cloud.console;
public interface LoggerFactory {
Logger getLogger(Class<?> clazz);
}

View File

@ -1,35 +0,0 @@
/* Copyright (C) 2002-2005 RealVNC Ltd. 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.
*/
// repackage it to VMOps common packaging structure
package com.cloud.console;
public class MemInStream extends InStream {
public MemInStream(byte[] data, int offset, int len) {
b = data;
ptr = offset;
end = offset + len;
}
public int pos() { return ptr; }
protected int overrun(int itemSize, int nItems) throws Exception {
throw new Exception("MemInStream overrun: end of stream");
}
}

View File

@ -1,92 +0,0 @@
/**
* Copyright (C) 2010 Cloud.com, Inc. All rights reserved.
*
* This software is licensed under the GNU General Public License v3 or later.
*
* It 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 3 of the License, or any later version.
* This program 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 program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.cloud.console;
import java.awt.Rectangle;
import java.util.ArrayList;
import java.util.List;
public class Region {
private Rectangle bound;
private List<Rectangle> rectList;
public Region() {
bound = new Rectangle(0, 0, 0, 0);
rectList = new ArrayList<Rectangle>();
}
public Region(Rectangle rect) {
bound = new Rectangle(rect.x, rect.y, rect.width, rect.height);
rectList = new ArrayList<Rectangle>();
rectList.add(rect);
}
public Rectangle getBound() {
return bound;
}
public void clearBound() {
assert(rectList.size() == 0);
bound.x = bound.y = bound.width = bound.height = 0;
}
public List<Rectangle> getRectangles() {
return rectList;
}
public boolean add(Rectangle rect) {
if(bound.isEmpty()) {
assert(rectList.size() == 0);
bound.x = rect.x;
bound.y = rect.y;
bound.width = rect.width;
bound.height = rect.height;
rectList.add(rect);
return true;
}
Rectangle rcInflated = new Rectangle(rect.x - 1, rect.y- 1, rect.width + 2, rect.height + 2);
if(!bound.intersects(rcInflated))
return false;
for(Rectangle r : rectList) {
if(r.intersects(rcInflated)) {
if(!r.contains(rect)) {
enlargeBound(rect);
rectList.add(rect);
return true;
}
}
}
return false;
}
private void enlargeBound(Rectangle rect) {
int boundLeft = Math.min(bound.x, rect.x);
int boundTop = Math.min(bound.y, rect.y);
int boundRight = Math.max(bound.x + bound.width, rect.x + rect.width);
int boundBottom = Math.max(bound.y + bound.height, rect.y + rect.height);
bound.x = boundLeft;
bound.y = boundTop;
bound.width = boundRight - boundLeft;
bound.height = boundBottom - boundTop;
}
}

View File

@ -1,61 +0,0 @@
/**
* Copyright (C) 2010 Cloud.com, Inc. All rights reserved.
*
* This software is licensed under the GNU General Public License v3 or later.
*
* It 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 3 of the License, or any later version.
* This program 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 program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.cloud.console;
import java.awt.Rectangle;
import java.util.ArrayList;
import java.util.List;
public class RegionClassifier {
private List<Region> regionList;
public RegionClassifier() {
regionList = new ArrayList<Region>();
}
public void add(Rectangle rect) {
// quickly identify that if we need a new region
boolean newRegion = true;
Rectangle rcInflated = new Rectangle(rect.x - 1, rect.y - 1, rect.width + 2, rect.height + 2);
for(Region region : regionList) {
if(region.getBound().intersects(rcInflated)) {
newRegion = false;
break;
}
}
if(newRegion) {
regionList.add(new Region(rect));
} else {
for(Region region : regionList) {
if(region.add(rect))
return;
}
regionList.add(new Region(rect));
}
}
public List<Region> getRegionList() {
return regionList;
}
public void clear() {
regionList.clear();
}
}

File diff suppressed because it is too large Load Diff

View File

@ -1,29 +0,0 @@
/**
* Copyright (C) 2010 Cloud.com, Inc. All rights reserved.
*
* This software is licensed under the GNU General Public License v3 or later.
*
* It 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 3 of the License, or any later version.
* This program 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 program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.cloud.console;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
public interface RfbProtoAdapter {
Socket createConnection(String host, int port) throws IOException;
void writeInit(OutputStream os) throws IOException;
void swapMouseButton(Integer[] masks);
}

View File

@ -1,57 +0,0 @@
/**
* Copyright (C) 2010 Cloud.com, Inc. All rights reserved.
*
* This software is licensed under the GNU General Public License v3 or later.
*
* It 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 3 of the License, or any later version.
* This program 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 program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.cloud.console;
import java.awt.Dimension;
import java.io.IOException;
public interface RfbViewer {
boolean isProxy();
boolean hasClientConnection();
RfbProto getRfb();
Dimension getScreenSize();
Dimension getFrameSize();
int getScalingFactor();
int getCursorScaleFactor();
boolean ignoreCursorUpdate();
int getDeferCursorUpdateTimeout();
int getDeferScreenUpdateTimeout();
int getDeferUpdateRequestTimeout();
int setPixelFormat(RfbProto rfb) throws IOException;
void onInputEnabled(boolean enable);
void onFramebufferSizeChange(int w, int h);
void onFramebufferUpdate(int x, int y, int w, int h);
void onFramebufferCursorMove(int x, int y);
void onFramebufferCursorShapeChange(int encodingType,
int xhot, int yhot, int width, int height, byte[] cursorData);
void onDesktopResize();
void onFrameResize(Dimension newSize);
void onDisconnectMessage();
void onBellMessage();
void onPreProtocolProcess(byte[] bs) throws IOException;
boolean onPostFrameBufferUpdateProcess(boolean cursorPosReceived) throws IOException;
void onProtocolProcessException(IOException e);
}

View File

@ -1,196 +0,0 @@
//
// Copyright (C) 2002 Constantin Kaplinsky. 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.
//
//
// SessionRecorder is a class to write FBS (FrameBuffer Stream) files.
// FBS files are used to save RFB sessions for later playback.
//
// repackage it to VMOps common packaging structure
package com.cloud.console;
import java.io.*;
public class SessionRecorder {
protected FileOutputStream f;
protected DataOutputStream df;
protected long startTime, lastTimeOffset;
protected byte[] buffer;
protected int bufferSize;
protected int bufferBytes;
public SessionRecorder(String name, int bufsize) throws IOException {
f = new FileOutputStream(name);
df = new DataOutputStream(f);
startTime = System.currentTimeMillis();
lastTimeOffset = 0;
bufferSize = bufsize;
bufferBytes = 0;
buffer = new byte[bufferSize];
}
public SessionRecorder(String name) throws IOException {
this(name, 65536);
}
//
// Close the file, free resources.
//
public void close() throws IOException {
try {
flush();
} catch (IOException e) {
}
df = null;
f.close();
f = null;
buffer = null;
}
//
// Write the FBS file header as defined in the rfbproxy utility.
//
public void writeHeader() throws IOException {
df.write("FBS 001.000\n".getBytes());
}
//
// Write one byte.
//
public void writeByte(int b) throws IOException {
prepareWriting();
buffer[bufferBytes++] = (byte)b;
}
//
// Write 16-bit value, big-endian.
//
public void writeShortBE(int v) throws IOException {
prepareWriting();
buffer[bufferBytes++] = (byte)(v >> 8);
buffer[bufferBytes++] = (byte)v;
}
//
// Write 32-bit value, big-endian.
//
public void writeIntBE(int v) throws IOException {
prepareWriting();
buffer[bufferBytes] = (byte)(v >> 24);
buffer[bufferBytes + 1] = (byte)(v >> 16);
buffer[bufferBytes + 2] = (byte)(v >> 8);
buffer[bufferBytes + 3] = (byte)v;
bufferBytes += 4;
}
//
// Write 16-bit value, little-endian.
//
public void writeShortLE(int v) throws IOException {
prepareWriting();
buffer[bufferBytes++] = (byte)v;
buffer[bufferBytes++] = (byte)(v >> 8);
}
//
// Write 32-bit value, little-endian.
//
public void writeIntLE(int v) throws IOException {
prepareWriting();
buffer[bufferBytes] = (byte)v;
buffer[bufferBytes + 1] = (byte)(v >> 8);
buffer[bufferBytes + 2] = (byte)(v >> 16);
buffer[bufferBytes + 3] = (byte)(v >> 24);
bufferBytes += 4;
}
//
// Write byte arrays.
//
public void write(byte b[], int off, int len) throws IOException {
prepareWriting();
while (len > 0) {
if (bufferBytes > bufferSize - 4)
flush(false);
int partLen;
if (bufferBytes + len > bufferSize) {
partLen = bufferSize - bufferBytes;
} else {
partLen = len;
}
System.arraycopy(b, off, buffer, bufferBytes, partLen);
bufferBytes += partLen;
off += partLen;
len -= partLen;
}
}
public void write(byte b[]) throws IOException {
write(b, 0, b.length);
}
//
// Flush the output. This method saves buffered data in the
// underlying file object adding data sizes and timestamps. If the
// updateTimeOffset is set to false, then the current time offset
// will not be changed for next write operation.
//
public void flush(boolean updateTimeOffset) throws IOException {
if (bufferBytes > 0) {
df.writeInt(bufferBytes);
df.write(buffer, 0, (bufferBytes + 3) & 0x7FFFFFFC);
df.writeInt((int)lastTimeOffset);
bufferBytes = 0;
if (updateTimeOffset)
lastTimeOffset = -1;
}
}
public void flush() throws IOException {
flush(true);
}
//
// Before writing any data, remember time offset and flush the
// buffer before it becomes full.
//
protected void prepareWriting() throws IOException {
if (lastTimeOffset == -1)
lastTimeOffset = System.currentTimeMillis() - startTime;
if (bufferBytes > bufferSize - 4)
flush(false);
}
}

View File

@ -1,86 +0,0 @@
/**
* Copyright (C) 2010 Cloud.com, Inc. All rights reserved.
*
* This software is licensed under the GNU General Public License v3 or later.
*
* It 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 3 of the License, or any later version.
* This program 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 program. If not, see <http://www.gnu.org/licenses/>.
*
*/
// repackage it to VMOps common packaging structure
package com.cloud.console;
import java.io.*;
public class SplitInputStream extends FilterInputStream {
ByteArrayOutputStream bo;
public SplitInputStream(InputStream in) {
super(in);
}
public int read() throws IOException {
int b = super.read();
if (b >= 0 && bo != null) {
bo.write(b);
}
return b;
}
public int read(byte b[]) throws IOException {
return read(b, 0, b.length);
}
public int read(byte b[], int off, int len) throws IOException {
int res = super.read(b, off, len);
if (res > 0 && bo != null) {
bo.write(b, off, res);
}
return res;
}
public long skip(long n) throws IOException {
long res = super.skip(n);
if (res > 0 && bo != null) {
byte[] b = new byte[(int)res];
bo.write(b, 0, (int)res);
}
return res;
}
public int available() throws IOException {
return super.available();
}
public void close() throws IOException {
super.close();
}
public void mark(int readlimit) {
super.mark(readlimit);
}
public void reset() throws IOException {
super.reset();
}
public boolean markSupported() {
return false;
}
public void setSplit() {
bo = new ByteArrayOutputStream();
}
public byte[] getSplit() {
if (bo == null) {
return null;
}
byte[] res = bo.toByteArray();
bo = null;
return res;
}
public byte[] getSplitData() {
if(bo == null)
return null;
return bo.toByteArray();
}
}

View File

@ -1,57 +0,0 @@
/**
* Copyright (C) 2010 Cloud.com, Inc. All rights reserved.
*
* This software is licensed under the GNU General Public License v3 or later.
*
* It 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 3 of the License, or any later version.
* This program 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 program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.cloud.console;
import java.awt.Rectangle;
public class TileInfo {
private int row;
private int col;
private Rectangle tileRect;
public TileInfo(int row, int col, Rectangle tileRect) {
this.row = row;
this.col = col;
this.tileRect = tileRect;
}
public int getRow() {
return row;
}
public void setRow(int row) {
this.row = row;
}
public int getCol() {
return col;
}
public void setCol(int col) {
this.col = col;
}
public Rectangle getTileRect() {
return tileRect;
}
public void setTileRect(Rectangle tileRect) {
this.tileRect = tileRect;
}
}

View File

@ -1,271 +0,0 @@
/**
* Copyright (C) 2010 Cloud.com, Inc. All rights reserved.
*
* This software is licensed under the GNU General Public License v3 or later.
*
* It 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 3 of the License, or any later version.
* This program 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 program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.cloud.console;
import java.awt.Rectangle;
import java.util.ArrayList;
import java.util.List;
public class TileTracker {
// 2 dimension tile status snapshot, a true value means the corresponding tile has been invalidated
private boolean[][] snapshot;
private int tileWidth = 0;
private int tileHeight = 0;
private int trackWidth = 0;
private int trackHeight = 0;
public TileTracker() {
}
public int getTileWidth() {
return tileWidth;
}
public void setTileWidth(int tileWidth) {
this.tileWidth = tileWidth;
}
public int getTileHeight() {
return tileHeight;
}
public void setTileHeight(int tileHeight) {
this.tileHeight = tileHeight;
}
public int getTrackWidth() {
return trackWidth;
}
public void setTrackWidth(int trackWidth) {
this.trackWidth = trackWidth;
}
public int getTrackHeight() {
return trackHeight;
}
public void setTrackHeight(int trackHeight) {
this.trackHeight = trackHeight;
}
public void initTracking(int tileWidth, int tileHeight, int trackWidth, int trackHeight) {
assert(tileWidth > 0);
assert(tileHeight > 0);
assert(trackWidth > 0);
assert(trackHeight > 0);
assert(tileWidth <= trackWidth);
assert(tileHeight <= trackHeight);
this.tileWidth = tileWidth;
this.tileHeight = tileHeight;
this.trackWidth = trackWidth;
this.trackHeight = trackHeight;
int cols = getTileCols();
int rows = getTileRows();
snapshot = new boolean[rows][cols];
for(int i = 0; i < rows; i++)
for(int j = 0; j < cols; j++)
snapshot[i][j] = false;
}
public synchronized void resize(int trackWidth, int trackHeight) {
assert(tileWidth > 0);
assert(tileHeight > 0);
assert(trackWidth > 0);
assert(trackHeight > 0);
this.trackWidth = trackWidth;
this.trackHeight = trackHeight;
int cols = getTileCols();
int rows = getTileRows();
snapshot = new boolean[rows][cols];
for(int i = 0; i < rows; i++)
for(int j = 0; j < cols; j++)
snapshot[i][j] = true;
}
public void invalidate(Rectangle rect) {
setTileFlag(rect, true);
}
public void validate(Rectangle rect) {
setTileFlag(rect, false);
}
public List<TileInfo> scan(boolean init) {
List<TileInfo> l = new ArrayList<TileInfo>();
synchronized(this) {
for(int i = 0; i < getTileRows(); i++) {
for(int j = 0; j < getTileCols(); j++) {
if(init || snapshot[i][j]) {
Rectangle rect = new Rectangle();
rect.y = i*tileHeight;
rect.x = j*tileWidth;
rect.width = Math.min(trackWidth - rect.x, tileWidth);
rect.height = Math.min(trackHeight - rect.y, tileHeight);
l.add(new TileInfo(i, j, rect));
snapshot[i][j] = false;
}
}
}
return l;
}
}
public boolean hasFullCoverage() {
synchronized(this) {
for(int i = 0; i < getTileRows(); i++) {
for(int j = 0; j < getTileCols(); j++) {
if(!snapshot[i][j])
return false;
}
}
}
return true;
}
public void initCoverageTest() {
synchronized(this) {
for(int i = 0; i < getTileRows(); i++) {
for(int j = 0; j < getTileCols(); j++) {
snapshot[i][j] = false;
}
}
}
}
// listener will be called while holding the object lock, use it
// with care to avoid deadlock condition being formed
public synchronized void scan(int nStartRow, int nStartCol, ITileScanListener listener) {
assert(listener != null);
int cols = getTileCols();
int rows = getTileRows();
nStartRow = nStartRow % rows;
nStartCol = nStartCol % cols;
int nPos = nStartRow*cols + nStartCol;
int nUnits = rows*cols;
int nStartPos = nPos;
int nRow;
int nCol;
do {
nRow = nPos / cols;
nCol = nPos % cols;
if(snapshot[nRow][nCol]) {
int nEndCol = nCol;
for(; nEndCol < cols && snapshot[nRow][nEndCol]; nEndCol++) {
snapshot[nRow][nEndCol] = false;
}
Rectangle rect = new Rectangle();
rect.y = nRow*tileHeight;
rect.height = tileHeight;
rect.x = nCol*tileWidth;
rect.width = (nEndCol - nCol)*tileWidth;
if(!listener.onTileChange(rect, nRow, nEndCol))
break;
}
nPos = (nPos + 1) % nUnits;
} while(nPos != nStartPos);
}
public void capture(ITileScanListener listener) {
assert(listener != null);
int cols = getTileCols();
int rows = getTileRows();
RegionClassifier classifier = new RegionClassifier();
int left, top, right, bottom;
synchronized(this) {
for(int i = 0; i < rows; i++) {
top = i*tileHeight;
bottom = Math.min(top + tileHeight, trackHeight);
for(int j = 0; j < cols; j++) {
left = j*tileWidth;
right = Math.min(left + tileWidth, trackWidth);
if(snapshot[i][j]) {
snapshot[i][j] = false;
classifier.add(new Rectangle(left, top, right - left, bottom - top));
}
}
}
}
listener.onRegionChange(classifier.getRegionList());
}
private synchronized void setTileFlag(Rectangle rect, boolean flag) {
int nStartTileRow;
int nStartTileCol;
int nEndTileRow;
int nEndTileCol;
int cols = getTileCols();
int rows = getTileRows();
if(rect != null) {
nStartTileRow = Math.min(getTileYPos(rect.y), rows - 1);
nStartTileCol = Math.min(getTileXPos(rect.x), cols - 1);
nEndTileRow = Math.min(getTileYPos(rect.y + rect.height - 1), rows -1);
nEndTileCol = Math.min(getTileXPos(rect.x + rect.width - 1), cols -1);
} else {
nStartTileRow = 0;
nStartTileCol = 0;
nEndTileRow = rows - 1;
nEndTileCol = cols - 1;
}
for(int i = nStartTileRow; i <= nEndTileRow; i++)
for(int j = nStartTileCol; j <= nEndTileCol; j++)
snapshot[i][j] = flag;
}
private int getTileRows() {
return (trackHeight + tileHeight - 1) / tileHeight;
}
private int getTileCols() {
return (trackWidth + tileWidth - 1) / tileWidth;
}
private int getTileXPos(int x) {
return x / tileWidth;
}
public int getTileYPos(int y) {
return y / tileHeight;
}
}

View File

@ -1,114 +0,0 @@
/* Copyright (C) 2002-2005 RealVNC Ltd. 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.
*/
// repackage it to VMOps common packaging structure
package com.cloud.console;
//
// A ZlibInStream reads from a zlib.io.InputStream
//
public class ZlibInStream extends InStream {
static final int defaultBufSize = 16384;
public ZlibInStream(int bufSize_) {
bufSize = bufSize_;
b = new byte[bufSize];
ptr = end = ptrOffset = 0;
inflater = new java.util.zip.Inflater();
}
public ZlibInStream() { this(defaultBufSize); }
public void setUnderlying(InStream is, int bytesIn_) {
underlying = is;
bytesIn = bytesIn_;
ptr = end = 0;
}
public void reset() throws Exception {
ptr = end = 0;
if (underlying == null) return;
while (bytesIn > 0) {
decompress();
end = 0; // throw away any data
}
underlying = null;
}
public int pos() { return ptrOffset + ptr; }
protected int overrun(int itemSize, int nItems) throws Exception {
if (itemSize > bufSize)
throw new Exception("ZlibInStream overrun: max itemSize exceeded");
if (underlying == null)
throw new Exception("ZlibInStream overrun: no underlying stream");
if (end - ptr != 0)
System.arraycopy(b, ptr, b, 0, end - ptr);
ptrOffset += ptr;
end -= ptr;
ptr = 0;
while (end < itemSize) {
decompress();
}
if (itemSize * nItems > end)
nItems = end / itemSize;
return nItems;
}
// decompress() calls the decompressor once. Note that this won't
// necessarily generate any output data - it may just consume some input
// data. Returns false if wait is false and we would block on the underlying
// stream.
private void decompress() throws Exception {
try {
underlying.check(1);
int avail_in = underlying.getend() - underlying.getptr();
if (avail_in > bytesIn)
avail_in = bytesIn;
if (inflater.needsInput()) {
inflater.setInput(underlying.getbuf(), underlying.getptr(), avail_in);
}
int n = inflater.inflate(b, end, bufSize - end);
end += n;
if (inflater.needsInput()) {
bytesIn -= avail_in;
underlying.setptr(underlying.getptr() + avail_in);
}
} catch (java.util.zip.DataFormatException e) {
throw new Exception("ZlibInStream: inflate failed");
}
}
private InStream underlying;
private int bufSize;
private int ptrOffset;
private java.util.zip.Inflater inflater;
private int bytesIn;
}