You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by ra...@apache.org on 2014/01/23 07:24:54 UTC
[1/6] git commit: updated refs/heads/master to 62ef617
Updated Branches:
refs/heads/master 206c35c62 -> 62ef61794
CLOUDSTACK-5705: fixed the thumbnail not wrking for hyperv
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/513f1dba
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/513f1dba
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/513f1dba
Branch: refs/heads/master
Commit: 513f1dba36d0d66acd973ebec3126dc48b4a0042
Parents: b2de225
Author: Anshul Gangwar <an...@citrix.com>
Authored: Wed Jan 1 14:42:19 2014 +0530
Committer: Rajesh Battala <ra...@citrix.com>
Committed: Thu Jan 23 10:54:08 2014 +0530
----------------------------------------------------------------------
.../src/com/cloud/servlet/ConsoleProxyServlet.java | 17 ++++++++++++++++-
1 file changed, 16 insertions(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/513f1dba/server/src/com/cloud/servlet/ConsoleProxyServlet.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/servlet/ConsoleProxyServlet.java b/server/src/com/cloud/servlet/ConsoleProxyServlet.java
index a6b179a..6a5c6a9 100644
--- a/server/src/com/cloud/servlet/ConsoleProxyServlet.java
+++ b/server/src/com/cloud/servlet/ConsoleProxyServlet.java
@@ -369,7 +369,16 @@ public class ConsoleProxyServlet extends HttpServlet {
String sid = vm.getVncPassword();
String tag = vm.getUuid();
- String ticket = genAccessTicket(host, String.valueOf(portInfo.second()), sid, tag);
+
+ int port = -1;
+ if (portInfo.second() == -9) {
+ //for hyperv
+ port = Integer.parseInt(_ms.findDetail(hostVo.getId(), "rdp.server.port").getValue());
+ } else {
+ port = portInfo.second();
+ }
+
+ String ticket = genAccessTicket(parsedHostInfo.first(), String.valueOf(port), sid, tag);
ConsoleProxyPasswordBasedEncryptor encryptor = new ConsoleProxyPasswordBasedEncryptor(getEncryptorPassword());
ConsoleProxyClientParam param = new ConsoleProxyClientParam();
@@ -378,6 +387,12 @@ public class ConsoleProxyServlet extends HttpServlet {
param.setClientHostPassword(sid);
param.setClientTag(tag);
param.setTicket(ticket);
+ if (portInfo.second() == -9) {
+ //For Hyperv Clinet Host Address will send Instance id
+ param.setHypervHost(host);
+ param.setUsername(_ms.findDetail(hostVo.getId(), "username").getValue());
+ param.setPassword(_ms.findDetail(hostVo.getId(), "password").getValue());
+ }
if (parsedHostInfo.second() != null && parsedHostInfo.third() != null) {
param.setClientTunnelUrl(parsedHostInfo.second());
param.setClientTunnelSession(parsedHostInfo.third());
[6/6] git commit: updated refs/heads/master to 62ef617
Posted by ra...@apache.org.
Fixed check style error
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/62ef6179
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/62ef6179
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/62ef6179
Branch: refs/heads/master
Commit: 62ef61794d5944bd4ff618eba299ee2b525394dc
Parents: 6ebbec2
Author: Anshul Gangwar <an...@citrix.com>
Authored: Wed Jan 22 12:16:59 2014 +0530
Committer: Rajesh Battala <ra...@citrix.com>
Committed: Thu Jan 23 10:54:09 2014 +0530
----------------------------------------------------------------------
.../src/com/cloud/consoleproxy/rdp/RdpBufferedImageCanvas.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/62ef6179/services/console-proxy/server/src/com/cloud/consoleproxy/rdp/RdpBufferedImageCanvas.java
----------------------------------------------------------------------
diff --git a/services/console-proxy/server/src/com/cloud/consoleproxy/rdp/RdpBufferedImageCanvas.java b/services/console-proxy/server/src/com/cloud/consoleproxy/rdp/RdpBufferedImageCanvas.java
index 6dabe05..4214574 100644
--- a/services/console-proxy/server/src/com/cloud/consoleproxy/rdp/RdpBufferedImageCanvas.java
+++ b/services/console-proxy/server/src/com/cloud/consoleproxy/rdp/RdpBufferedImageCanvas.java
@@ -32,7 +32,7 @@ import common.BufferedImageCanvas;
public class RdpBufferedImageCanvas extends BufferedImageCanvas implements FrameBufferCanvas {
/**
- *
+ *
*/
private static final long serialVersionUID = 1L;
[5/6] git commit: updated refs/heads/master to 62ef617
Posted by ra...@apache.org.
CLOUDSTACK-5716: fixed can't type special character in console view
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/6ebbec23
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/6ebbec23
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/6ebbec23
Branch: refs/heads/master
Commit: 6ebbec239d15f64d07d6e9cc90e6bbdd43046c78
Parents: 513f1db
Author: Anshul Gangwar <an...@citrix.com>
Authored: Fri Jan 3 17:03:36 2014 +0530
Committer: Rajesh Battala <ra...@citrix.com>
Committed: Thu Jan 23 10:54:09 2014 +0530
----------------------------------------------------------------------
.../adapter/AwtRdpKeyboardAdapter.java | 2 +-
.../consoleproxy/ConsoleProxyRdpClient.java | 29 +++++++-------------
.../cloud/consoleproxy/rdp/KeysymToKeycode.java | 27 ++++++++++++++++--
3 files changed, 36 insertions(+), 22 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6ebbec23/services/console-proxy-rdp/rdpconsole/src/main/java/rdpclient/adapter/AwtRdpKeyboardAdapter.java
----------------------------------------------------------------------
diff --git a/services/console-proxy-rdp/rdpconsole/src/main/java/rdpclient/adapter/AwtRdpKeyboardAdapter.java b/services/console-proxy-rdp/rdpconsole/src/main/java/rdpclient/adapter/AwtRdpKeyboardAdapter.java
index f2b19e1..2d1e8fc 100755
--- a/services/console-proxy-rdp/rdpconsole/src/main/java/rdpclient/adapter/AwtRdpKeyboardAdapter.java
+++ b/services/console-proxy-rdp/rdpconsole/src/main/java/rdpclient/adapter/AwtRdpKeyboardAdapter.java
@@ -343,7 +343,7 @@ public class AwtRdpKeyboardAdapter extends BaseElement {
default:
System.err.println("Key is not mapped: " + event + ".");
- return 57; // Space
+ return event.getKeyCode();
}
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6ebbec23/services/console-proxy/server/src/com/cloud/consoleproxy/ConsoleProxyRdpClient.java
----------------------------------------------------------------------
diff --git a/services/console-proxy/server/src/com/cloud/consoleproxy/ConsoleProxyRdpClient.java b/services/console-proxy/server/src/com/cloud/consoleproxy/ConsoleProxyRdpClient.java
index 6b317ff..d5a3fcd 100644
--- a/services/console-proxy/server/src/com/cloud/consoleproxy/ConsoleProxyRdpClient.java
+++ b/services/console-proxy/server/src/com/cloud/consoleproxy/ConsoleProxyRdpClient.java
@@ -57,8 +57,6 @@ public class ConsoleProxyRdpClient extends ConsoleProxyClientBase {
private Thread _worker;
private volatile boolean _workerDone = false;
- private int _lastModifierStates = 0;
-
private AwtMouseEventSource _mouseEventSource = null;
private AwtKeyEventSource _keyEventSource = null;
@@ -203,26 +201,19 @@ public class ConsoleProxyRdpClient extends ConsoleProxyClientBase {
private int mapModifier(int modifiers) {
int mod = 0;
- if ((modifiers & SHIFT_KEY_MASK) != (_lastModifierStates & SHIFT_KEY_MASK)) {
- if ((modifiers & SHIFT_KEY_MASK) != 0)
- mod = mod | InputEvent.SHIFT_DOWN_MASK;
- }
- if ((modifiers & CTRL_KEY_MASK) != (_lastModifierStates & CTRL_KEY_MASK)) {
- if ((modifiers & CTRL_KEY_MASK) != 0)
- mod = mod | InputEvent.CTRL_DOWN_MASK;
- }
+ if ((modifiers & SHIFT_KEY_MASK) != 0)
+ mod = mod | InputEvent.SHIFT_DOWN_MASK;
- if ((modifiers & META_KEY_MASK) != (_lastModifierStates & META_KEY_MASK)) {
- if ((modifiers & META_KEY_MASK) != 0)
- mod = mod | InputEvent.META_DOWN_MASK;
- }
+ if ((modifiers & CTRL_KEY_MASK) != 0)
+ mod = mod | InputEvent.CTRL_DOWN_MASK;
+
+ if ((modifiers & META_KEY_MASK) != 0)
+ mod = mod | InputEvent.META_DOWN_MASK;
+
+ if ((modifiers & ALT_KEY_MASK) != 0)
+ mod = mod | InputEvent.ALT_DOWN_MASK;
- if ((modifiers & ALT_KEY_MASK) != (_lastModifierStates & ALT_KEY_MASK)) {
- if ((modifiers & ALT_KEY_MASK) != 0)
- mod = mod | InputEvent.ALT_DOWN_MASK;
- }
- _lastModifierStates = mod;
return mod;
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6ebbec23/services/console-proxy/server/src/com/cloud/consoleproxy/rdp/KeysymToKeycode.java
----------------------------------------------------------------------
diff --git a/services/console-proxy/server/src/com/cloud/consoleproxy/rdp/KeysymToKeycode.java b/services/console-proxy/server/src/com/cloud/consoleproxy/rdp/KeysymToKeycode.java
index 10282ad..f13dfe6 100644
--- a/services/console-proxy/server/src/com/cloud/consoleproxy/rdp/KeysymToKeycode.java
+++ b/services/console-proxy/server/src/com/cloud/consoleproxy/rdp/KeysymToKeycode.java
@@ -20,7 +20,7 @@ import java.awt.event.KeyEvent;
public class KeysymToKeycode {
- // this keymap is taken from http://openwonderland.googlecode.com/svn/trunk/modules/foundation/xremwin/src/classes/org/jdesktop/wonderland/modules/xremwin/client/KeycodeToKeysym.java
+ // some of this keymap is taken from http://openwonderland.googlecode.com/svn/trunk/modules/foundation/xremwin/src/classes/org/jdesktop/wonderland/modules/xremwin/client/KeycodeToKeysym.java
private final static int[][] map = {
/* XK_BackSpace */{0xFF08, KeyEvent.VK_BACK_SPACE},
/* XK_Tab */{0xFF09, KeyEvent.VK_TAB},
@@ -101,10 +101,33 @@ public class KeysymToKeycode {
/* XK_x */{0x0078, KeyEvent.VK_X},
/* XK_y */{0x0079, KeyEvent.VK_Y},
/* XK_z */{0x007a, KeyEvent.VK_Z},
+ {0x0060, KeyEvent.VK_BACK_QUOTE},
+ {0x007e, KeyEvent.VK_BACK_QUOTE},
+ {0x0021, KeyEvent.VK_1},
+ {0x0040, KeyEvent.VK_2},
+ {0x0023, KeyEvent.VK_3},
+ {0x0024, KeyEvent.VK_4},
+ {0x0025, KeyEvent.VK_5},
+ {0x005e, KeyEvent.VK_6},
+ {0x0026, KeyEvent.VK_7},
+ {0x002A, KeyEvent.VK_8},
+ {0x0028, KeyEvent.VK_9},
+ {0x0029, KeyEvent.VK_0},
+ {0x005f, KeyEvent.VK_MINUS},
+ {0x002b, KeyEvent.VK_EQUALS},
+ {0x007b, KeyEvent.VK_OPEN_BRACKET},
+ {0x007d, KeyEvent.VK_CLOSE_BRACKET},
+ {0x007c, KeyEvent.VK_BACK_SLASH},
+ {0x003a, KeyEvent.VK_SEMICOLON},
+ {0x0027, KeyEvent.VK_QUOTE},
+ {0x0022, KeyEvent.VK_QUOTE},
+ {0x003c, KeyEvent.VK_COMMA},
+ {0x003e, KeyEvent.VK_PERIOD},
+ {0x003f, KeyEvent.VK_SLASH},
};
public static int getKeycode(int keysym) {
- for (int i = 0; i < (map.length - 1); i++) {
+ for (int i = 0; i < (map.length); i++) {
if (map[i][0] == keysym) {
return map[i][1];
}
[3/6] git commit: updated refs/heads/master to 62ef617
Posted by ra...@apache.org.
CLOUDSTACK-5703: putting rdp server port value in host details
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/b2de225f
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/b2de225f
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/b2de225f
Branch: refs/heads/master
Commit: b2de225f54f80e48598c9327d19c276186682299
Parents: 3e2f7dd
Author: Anshul Gangwar <an...@citrix.com>
Authored: Wed Jan 1 14:15:31 2014 +0530
Committer: Rajesh Battala <ra...@citrix.com>
Committed: Thu Jan 23 10:54:08 2014 +0530
----------------------------------------------------------------------
.../HypervResource/HypervResourceController.cs | 1 +
server/src/com/cloud/servlet/ConsoleProxyServlet.java | 13 +++++--------
2 files changed, 6 insertions(+), 8 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b2de225f/plugins/hypervisors/hyperv/DotNet/ServerResource/HypervResource/HypervResourceController.cs
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/hyperv/DotNet/ServerResource/HypervResource/HypervResourceController.cs b/plugins/hypervisors/hyperv/DotNet/ServerResource/HypervResource/HypervResourceController.cs
index 6daadee..76336e9 100644
--- a/plugins/hypervisors/hyperv/DotNet/ServerResource/HypervResource/HypervResourceController.cs
+++ b/plugins/hypervisors/hyperv/DotNet/ServerResource/HypervResource/HypervResourceController.cs
@@ -1921,6 +1921,7 @@ namespace HypervResource
string productVersion = System.Environment.OSVersion.Version.Major.ToString() + "." +
System.Environment.OSVersion.Version.Minor.ToString();
details.Add("product_version", productVersion);
+ details.Add("rdp.server.port", 2179);
}
// Detect CPUs, speed, memory
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b2de225f/server/src/com/cloud/servlet/ConsoleProxyServlet.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/servlet/ConsoleProxyServlet.java b/server/src/com/cloud/servlet/ConsoleProxyServlet.java
index 5edd95d..a6b179a 100644
--- a/server/src/com/cloud/servlet/ConsoleProxyServlet.java
+++ b/server/src/com/cloud/servlet/ConsoleProxyServlet.java
@@ -395,25 +395,22 @@ public class ConsoleProxyServlet extends HttpServlet {
private String composeConsoleAccessUrl(String rootUrl, VirtualMachine vm, HostVO hostVo) {
StringBuffer sb = new StringBuffer(rootUrl);
String host = hostVo.getPrivateIpAddress();
- String username = _ms.findDetail(hostVo.getId(), "username").getValue();
- String password = _ms.findDetail(hostVo.getId(), "password").getValue();
Pair<String, Integer> portInfo = _ms.getVncPort(vm);
if (s_logger.isDebugEnabled())
s_logger.debug("Port info " + portInfo.first());
Ternary<String, String, String> parsedHostInfo = parseHostInfo(portInfo.first());
+
int port = -1;
- String sid;
-
if (portInfo.second() == -9) {
//for hyperv
- port = 2179;
+ port = Integer.parseInt(_ms.findDetail(hostVo.getId(), "rdp.server.port").getValue());
} else {
port = portInfo.second();
}
- sid = vm.getVncPassword();
+ String sid = vm.getVncPassword();
UserVmDetailVO details = _userVmDetailsDao.findDetail(vm.getId(), "keyboard");
String tag = vm.getUuid();
@@ -434,8 +431,8 @@ public class ConsoleProxyServlet extends HttpServlet {
if (portInfo.second() == -9) {
//For Hyperv Clinet Host Address will send Instance id
param.setHypervHost(host);
- param.setUsername(username);
- param.setPassword(password);
+ param.setUsername(_ms.findDetail(hostVo.getId(), "username").getValue());
+ param.setPassword(_ms.findDetail(hostVo.getId(), "password").getValue());
}
if (parsedHostInfo.second() != null && parsedHostInfo.third() != null) {
param.setClientTunnelUrl(parsedHostInfo.second());
[2/6] git commit: updated refs/heads/master to 62ef617
Posted by ra...@apache.org.
CLOUDSTACK-5344 commit for console proxy rdp for hyperv
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/5941ac46
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/5941ac46
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/5941ac46
Branch: refs/heads/master
Commit: 5941ac46d2ffc3069752195303f2beab45c1bb61
Parents: 206c35c
Author: Anshul Gangwar <an...@citrix.com>
Authored: Tue Dec 31 00:56:27 2013 +0530
Committer: Rajesh Battala <ra...@citrix.com>
Committed: Thu Jan 23 10:54:08 2014 +0530
----------------------------------------------------------------------
.../HypervResource/HypervResourceController.cs | 39 +++
.../src/com/cloud/server/ManagementServer.java | 3 +
.../com/cloud/server/ManagementServerImpl.java | 5 +
.../cloud/servlet/ConsoleProxyClientParam.java | 45 ++-
.../com/cloud/servlet/ConsoleProxyServlet.java | 51 ++-
.../main/java/common/BufferedImageCanvas.java | 6 +-
.../java/common/adapter/AwtCanvasAdapter.java | 4 +-
.../src/main/java/rdpclient/RdpClient.java | 15 +-
services/console-proxy/server/pom.xml | 5 +
.../com/cloud/consoleproxy/ConsoleProxy.java | 20 +-
.../consoleproxy/ConsoleProxyAjaxHandler.java | 6 +
.../consoleproxy/ConsoleProxyClientParam.java | 32 +-
.../ConsoleProxyHttpHandlerHelper.java | 34 +-
.../consoleproxy/ConsoleProxyRdpClient.java | 318 +++++++++++++++++++
.../cloud/consoleproxy/rdp/KeysymToKeycode.java | 115 +++++++
.../rdp/RdpBufferedImageCanvas.java | 103 ++++++
16 files changed, 765 insertions(+), 36 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5941ac46/plugins/hypervisors/hyperv/DotNet/ServerResource/HypervResource/HypervResourceController.cs
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/hyperv/DotNet/ServerResource/HypervResource/HypervResourceController.cs b/plugins/hypervisors/hyperv/DotNet/ServerResource/HypervResource/HypervResourceController.cs
index a1c91a5..6daadee 100644
--- a/plugins/hypervisors/hyperv/DotNet/ServerResource/HypervResource/HypervResourceController.cs
+++ b/plugins/hypervisors/hyperv/DotNet/ServerResource/HypervResource/HypervResourceController.cs
@@ -2000,6 +2000,45 @@ namespace HypervResource
}
}
+ // POST api/HypervResource/GetVncPortCommand
+ [HttpPost]
+ [ActionName(CloudStackTypes.GetVncPortCommand)]
+ public JContainer GetVncPortCommand([FromBody]dynamic cmd)
+ {
+ using (log4net.NDC.Push(Guid.NewGuid().ToString()))
+ {
+ logger.Info(CloudStackTypes.GetVncPortCommand + cmd.ToString());
+
+ string details = null;
+ bool result = false;
+ string address = null;
+ int port = -9;
+
+ try
+ {
+ string vmName = (string)cmd.name;
+ var sys = wmiCallsV2.GetComputerSystem(vmName);
+ address = "instanceId=" + sys.Name ;
+ result = true;
+ }
+ catch (Exception sysEx)
+ {
+ details = CloudStackTypes.GetVncPortAnswer + " failed due to " + sysEx.Message;
+ logger.Error(details, sysEx);
+ }
+
+ object ansContent = new
+ {
+ result = result,
+ details = details,
+ address = address,
+ port = port
+ };
+
+ return ReturnCloudStackTypedJArray(ansContent, CloudStackTypes.GetVncPortAnswer);
+ }
+ }
+
public static System.Net.NetworkInformation.NetworkInterface GetNicInfoFromIpAddress(string ipAddress, out string subnet)
{
System.Net.NetworkInformation.NetworkInterface[] nics = System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces();
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5941ac46/server/src/com/cloud/server/ManagementServer.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/server/ManagementServer.java b/server/src/com/cloud/server/ManagementServer.java
index 5a6ca78..3b5f5ff 100755
--- a/server/src/com/cloud/server/ManagementServer.java
+++ b/server/src/com/cloud/server/ManagementServer.java
@@ -16,6 +16,7 @@
// under the License.
package com.cloud.server;
+import com.cloud.host.DetailVO;
import com.cloud.host.HostVO;
import com.cloud.storage.GuestOSVO;
import com.cloud.utils.Pair;
@@ -47,6 +48,8 @@ public interface ManagementServer extends ManagementService, PluggableService {
*/
HostVO getHostBy(long hostId);
+ DetailVO findDetail(long hostId, String name);
+
String getConsoleAccessUrlRoot(long vmId);
GuestOSVO getGuestOs(Long guestOsId);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5941ac46/server/src/com/cloud/server/ManagementServerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/server/ManagementServerImpl.java b/server/src/com/cloud/server/ManagementServerImpl.java
index bbb31cf..4bffa3f 100755
--- a/server/src/com/cloud/server/ManagementServerImpl.java
+++ b/server/src/com/cloud/server/ManagementServerImpl.java
@@ -855,6 +855,11 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe
}
@Override
+ public DetailVO findDetail(long hostId, String name) {
+ return _detailsDao.findDetail(hostId, name);
+ }
+
+ @Override
public long getId() {
return MacAddress.getMacAddress().toLong();
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5941ac46/server/src/com/cloud/servlet/ConsoleProxyClientParam.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/servlet/ConsoleProxyClientParam.java b/server/src/com/cloud/servlet/ConsoleProxyClientParam.java
index e979337..ce06a96 100644
--- a/server/src/com/cloud/servlet/ConsoleProxyClientParam.java
+++ b/server/src/com/cloud/servlet/ConsoleProxyClientParam.java
@@ -27,7 +27,11 @@ public class ConsoleProxyClientParam {
private String clientTunnelUrl;
private String clientTunnelSession;
+ private String hypervHost;
+
private String ajaxSessionId;
+ private String username;
+ private String password;
public ConsoleProxyClientParam() {
clientHostPort = 0;
@@ -89,20 +93,20 @@ public class ConsoleProxyClientParam {
this.clientTunnelSession = clientTunnelSession;
}
- public String getLocale() {
- return this.locale;
+ public String getAjaxSessionId() {
+ return ajaxSessionId;
}
- public void setLocale(String locale) {
- this.locale = locale;
+ public void setAjaxSessionId(String ajaxSessionId) {
+ this.ajaxSessionId = ajaxSessionId;
}
- public String getAjaxSessionId() {
- return this.ajaxSessionId;
+ public String getLocale() {
+ return locale;
}
- public void setAjaxSessionId(String ajaxSessionId) {
- this.ajaxSessionId = ajaxSessionId;
+ public void setLocale(String locale) {
+ this.locale = locale;
}
public String getClientMapKey() {
@@ -111,4 +115,29 @@ public class ConsoleProxyClientParam {
return clientHostAddress + ":" + clientHostPort;
}
+
+ public void setHypervHost(String host) {
+ hypervHost = host;
+ }
+
+ public String getHypervHost() {
+ return hypervHost;
+ }
+
+ public void setUsername(String username) {
+ this.username = username;
+
+ }
+
+ public String getUsername() {
+ return username;
+ }
+
+ public void setPassword(String password) {
+ this.password = password;
+ }
+
+ public String getPassword() {
+ return password;
+ }
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5941ac46/server/src/com/cloud/servlet/ConsoleProxyServlet.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/servlet/ConsoleProxyServlet.java b/server/src/com/cloud/servlet/ConsoleProxyServlet.java
index e0deaa2..5edd95d 100644
--- a/server/src/com/cloud/servlet/ConsoleProxyServlet.java
+++ b/server/src/com/cloud/servlet/ConsoleProxyServlet.java
@@ -328,15 +328,21 @@ public class ConsoleProxyServlet extends HttpServlet {
s_logger.info("Parse host info returned from executing GetVNCPortCommand. host info: " + hostInfo);
- if (hostInfo != null && hostInfo.startsWith("consoleurl")) {
- String tokens[] = hostInfo.split("&");
-
- if (hostInfo.length() > 19 && hostInfo.indexOf('/', 19) > 19) {
- host = hostInfo.substring(19, hostInfo.indexOf('/', 19)).trim();
- tunnelUrl = tokens[0].substring("consoleurl=".length());
- tunnelSession = tokens[1].split("=")[1];
+ if (hostInfo != null) {
+ if (hostInfo.startsWith("consoleurl")) {
+ String tokens[] = hostInfo.split("&");
+
+ if (hostInfo.length() > 19 && hostInfo.indexOf('/', 19) > 19) {
+ host = hostInfo.substring(19, hostInfo.indexOf('/', 19)).trim();
+ tunnelUrl = tokens[0].substring("consoleurl=".length());
+ tunnelSession = tokens[1].split("=")[1];
+ } else {
+ host = "";
+ }
+ } else if (hostInfo.startsWith("instanceId")) {
+ host = hostInfo.substring(hostInfo.indexOf('=') + 1);
} else {
- host = "";
+ host = hostInfo;
}
} else {
host = hostInfo;
@@ -389,28 +395,49 @@ public class ConsoleProxyServlet extends HttpServlet {
private String composeConsoleAccessUrl(String rootUrl, VirtualMachine vm, HostVO hostVo) {
StringBuffer sb = new StringBuffer(rootUrl);
String host = hostVo.getPrivateIpAddress();
+ String username = _ms.findDetail(hostVo.getId(), "username").getValue();
+ String password = _ms.findDetail(hostVo.getId(), "password").getValue();
Pair<String, Integer> portInfo = _ms.getVncPort(vm);
if (s_logger.isDebugEnabled())
s_logger.debug("Port info " + portInfo.first());
Ternary<String, String, String> parsedHostInfo = parseHostInfo(portInfo.first());
+ int port = -1;
+ String sid;
+
+ if (portInfo.second() == -9) {
+ //for hyperv
+ port = 2179;
+ } else {
+ port = portInfo.second();
+ }
+ sid = vm.getVncPassword();
UserVmDetailVO details = _userVmDetailsDao.findDetail(vm.getId(), "keyboard");
- String sid = vm.getVncPassword();
+
String tag = vm.getUuid();
- String ticket = genAccessTicket(host, String.valueOf(portInfo.second()), sid, tag);
+
+ String ticket = genAccessTicket(parsedHostInfo.first(), String.valueOf(port), sid, tag);
ConsoleProxyPasswordBasedEncryptor encryptor = new ConsoleProxyPasswordBasedEncryptor(getEncryptorPassword());
ConsoleProxyClientParam param = new ConsoleProxyClientParam();
param.setClientHostAddress(parsedHostInfo.first());
- param.setClientHostPort(portInfo.second());
+ param.setClientHostPort(port);
param.setClientHostPassword(sid);
param.setClientTag(tag);
param.setTicket(ticket);
+
if (details != null) {
param.setLocale(details.getValue());
}
- if (parsedHostInfo.second() != null && parsedHostInfo.third() != null) {
+
+ if (portInfo.second() == -9) {
+ //For Hyperv Clinet Host Address will send Instance id
+ param.setHypervHost(host);
+ param.setUsername(username);
+ param.setPassword(password);
+ }
+ if (parsedHostInfo.second() != null && parsedHostInfo.third() != null) {
param.setClientTunnelUrl(parsedHostInfo.second());
param.setClientTunnelSession(parsedHostInfo.third());
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5941ac46/services/console-proxy-rdp/rdpconsole/src/main/java/common/BufferedImageCanvas.java
----------------------------------------------------------------------
diff --git a/services/console-proxy-rdp/rdpconsole/src/main/java/common/BufferedImageCanvas.java b/services/console-proxy-rdp/rdpconsole/src/main/java/common/BufferedImageCanvas.java
index 43abb27..9cb5231 100755
--- a/services/console-proxy-rdp/rdpconsole/src/main/java/common/BufferedImageCanvas.java
+++ b/services/console-proxy-rdp/rdpconsole/src/main/java/common/BufferedImageCanvas.java
@@ -30,7 +30,7 @@ public class BufferedImageCanvas extends Canvas {
private static final long serialVersionUID = 1L;
// Offline screen buffer
- private BufferedImage offlineImage;
+ protected BufferedImage offlineImage;
// Cached Graphics2D object for offline screen buffer
private Graphics2D graphics;
@@ -76,4 +76,8 @@ public class BufferedImageCanvas extends Canvas {
return graphics;
}
+ public void updateFrameBuffer(int x, int y, int w, int h) {
+ //this method will be used to mark the dirty tiles
+ }
+
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5941ac46/services/console-proxy-rdp/rdpconsole/src/main/java/common/adapter/AwtCanvasAdapter.java
----------------------------------------------------------------------
diff --git a/services/console-proxy-rdp/rdpconsole/src/main/java/common/adapter/AwtCanvasAdapter.java b/services/console-proxy-rdp/rdpconsole/src/main/java/common/adapter/AwtCanvasAdapter.java
index 55ca8fd..f3a73d70 100755
--- a/services/console-proxy-rdp/rdpconsole/src/main/java/common/adapter/AwtCanvasAdapter.java
+++ b/services/console-proxy-rdp/rdpconsole/src/main/java/common/adapter/AwtCanvasAdapter.java
@@ -77,13 +77,14 @@ public class AwtCanvasAdapter extends BaseElement {
}
private void handleCopyRect(CopyRectOrder order, ByteBuffer buf) {
- // TODO Auto-generated method stub
// Copy image
canvas.getOfflineGraphics().copyArea(order.srcX, order.srcY, order.width, order.height, order.x - order.srcX, order.y - order.srcY);
// Request update of repainted area
+ canvas.updateFrameBuffer(order.x, order.y, order.width, order.height);
canvas.repaint(order.x, order.y, order.width, order.height);
+
}
private void handleBitmap(BitmapOrder order, ByteBuffer buf) {
@@ -137,6 +138,7 @@ public class AwtCanvasAdapter extends BaseElement {
g.drawImage(rectImage, x, y, null);
// Request update of repainted area
+ canvas.updateFrameBuffer(x, y, width, height);
canvas.repaint(x, y, width, height);
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5941ac46/services/console-proxy-rdp/rdpconsole/src/main/java/rdpclient/RdpClient.java
----------------------------------------------------------------------
diff --git a/services/console-proxy-rdp/rdpconsole/src/main/java/rdpclient/RdpClient.java b/services/console-proxy-rdp/rdpconsole/src/main/java/rdpclient/RdpClient.java
index afde706..a3db165 100755
--- a/services/console-proxy-rdp/rdpconsole/src/main/java/rdpclient/RdpClient.java
+++ b/services/console-proxy-rdp/rdpconsole/src/main/java/rdpclient/RdpClient.java
@@ -63,6 +63,9 @@ import common.adapter.AwtCanvasAdapter;
public class RdpClient extends PipelineImpl {
+ AwtMouseEventSource mouseEventSource = null;
+ AwtKeyEventSource keyEventSource = null;
+
/**
* Name of last OneTimePacket in handshake sequence.
*/
@@ -333,8 +336,8 @@ public class RdpClient extends PipelineImpl {
// Main network
//
- AwtMouseEventSource mouseEventSource = new AwtMouseEventSource("mouse");
- AwtKeyEventSource keyEventSource = new AwtKeyEventSource("keyboard");
+ mouseEventSource = new AwtMouseEventSource("mouse");
+ keyEventSource = new AwtKeyEventSource("keyboard");
// Subscribe packet sender to various events
canvas.addMouseListener(mouseEventSource);
@@ -390,4 +393,12 @@ public class RdpClient extends PipelineImpl {
link("client_x224_data_queue", "client_tpkt_queue", "client_tpkt_queue< queue");
}
+
+ public AwtMouseEventSource getMouseEventSource() {
+ return mouseEventSource;
+ }
+
+ public AwtKeyEventSource getKeyEventSource() {
+ return keyEventSource;
+ }
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5941ac46/services/console-proxy/server/pom.xml
----------------------------------------------------------------------
diff --git a/services/console-proxy/server/pom.xml b/services/console-proxy/server/pom.xml
index bc780a7..5d0b3bc 100644
--- a/services/console-proxy/server/pom.xml
+++ b/services/console-proxy/server/pom.xml
@@ -44,6 +44,11 @@
<artifactId>cloud-utils</artifactId>
<version>${project.version}</version>
</dependency>
+ <dependency>
+ <groupId>rdpclient</groupId>
+ <artifactId>cloudstack-service-console-proxy-rdpclient</artifactId>
+ <version>${project.version}</version>
+ </dependency>
</dependencies>
<build>
<resources>
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5941ac46/services/console-proxy/server/src/com/cloud/consoleproxy/ConsoleProxy.java
----------------------------------------------------------------------
diff --git a/services/console-proxy/server/src/com/cloud/consoleproxy/ConsoleProxy.java b/services/console-proxy/server/src/com/cloud/consoleproxy/ConsoleProxy.java
index f889cdb..02fda64 100644
--- a/services/console-proxy/server/src/com/cloud/consoleproxy/ConsoleProxy.java
+++ b/services/console-proxy/server/src/com/cloud/consoleproxy/ConsoleProxy.java
@@ -196,8 +196,8 @@ public class ConsoleProxy {
Object result;
try {
result =
- authMethod.invoke(ConsoleProxy.context, param.getClientHostAddress(), String.valueOf(param.getClientHostPort()), param.getClientTag(),
- param.getClientHostPassword(), param.getTicket(), new Boolean(reauthentication));
+ authMethod.invoke(ConsoleProxy.context, param.getClientHostAddress(), String.valueOf(param.getClientHostPort()), param.getClientTag(),
+ param.getClientHostPassword(), param.getTicket(), new Boolean(reauthentication));
} catch (IllegalAccessException e) {
s_logger.error("Unable to invoke authenticateConsoleAccess due to IllegalAccessException" + " for vm: " + param.getClientTag(), e);
authResult.setSuccess(false);
@@ -407,7 +407,7 @@ public class ConsoleProxy {
synchronized (connectionMap) {
viewer = connectionMap.get(clientKey);
if (viewer == null) {
- viewer = new ConsoleProxyVncClient();
+ viewer = getClient(param);
viewer.initClient(param);
connectionMap.put(clientKey, viewer);
s_logger.info("Added viewer object " + viewer);
@@ -418,7 +418,7 @@ public class ConsoleProxy {
viewer.initClient(param);
} else if (!param.getClientHostPassword().equals(viewer.getClientHostPassword())) {
s_logger.warn("Bad sid detected(VNC port may be reused). sid in session: " + viewer.getClientHostPassword() + ", sid in request: " +
- param.getClientHostPassword());
+ param.getClientHostPassword());
viewer.initClient(param);
}
}
@@ -442,7 +442,7 @@ public class ConsoleProxy {
ConsoleProxyClient viewer = connectionMap.get(clientKey);
if (viewer == null) {
authenticationExternally(param);
- viewer = new ConsoleProxyVncClient();
+ viewer = getClient(param);
viewer.initClient(param);
connectionMap.put(clientKey, viewer);
@@ -457,7 +457,7 @@ public class ConsoleProxy {
}
if (param.getClientHostPassword() == null || param.getClientHostPassword().isEmpty() ||
- !param.getClientHostPassword().equals(viewer.getClientHostPassword()))
+ !param.getClientHostPassword().equals(viewer.getClientHostPassword()))
throw new AuthenticationException("Cannot use the existing viewer " + viewer + ": bad sid");
if (!viewer.isFrontEndAlive()) {
@@ -479,6 +479,14 @@ public class ConsoleProxy {
}
}
+ private static ConsoleProxyClient getClient(ConsoleProxyClientParam param) {
+ if (param.getHypervHost() != null) {
+ return new ConsoleProxyRdpClient();
+ } else {
+ return new ConsoleProxyVncClient();
+ }
+ }
+
public static void removeViewer(ConsoleProxyClient viewer) {
synchronized (connectionMap) {
for (Map.Entry<String, ConsoleProxyClient> entry : connectionMap.entrySet()) {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5941ac46/services/console-proxy/server/src/com/cloud/consoleproxy/ConsoleProxyAjaxHandler.java
----------------------------------------------------------------------
diff --git a/services/console-proxy/server/src/com/cloud/consoleproxy/ConsoleProxyAjaxHandler.java b/services/console-proxy/server/src/com/cloud/consoleproxy/ConsoleProxyAjaxHandler.java
index 18d97d2..fa0bd06 100644
--- a/services/console-proxy/server/src/com/cloud/consoleproxy/ConsoleProxyAjaxHandler.java
+++ b/services/console-proxy/server/src/com/cloud/consoleproxy/ConsoleProxyAjaxHandler.java
@@ -80,6 +80,9 @@ public class ConsoleProxyAjaxHandler implements HttpHandler {
String console_url = queryMap.get("consoleurl");
String console_host_session = queryMap.get("sessionref");
String vm_locale = queryMap.get("locale");
+ String hypervHost = queryMap.get("hypervHost");
+ String username = queryMap.get("username");
+ String password = queryMap.get("password");
if (tag == null)
tag = "";
@@ -128,6 +131,9 @@ public class ConsoleProxyAjaxHandler implements HttpHandler {
param.setClientTunnelUrl(console_url);
param.setClientTunnelSession(console_host_session);
param.setLocale(vm_locale);
+ param.setHypervHost(hypervHost);
+ param.setUsername(username);
+ param.setPassword(password);
viewer = ConsoleProxy.getAjaxVncViewer(param, ajaxSessionIdStr);
} catch (Exception e) {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5941ac46/services/console-proxy/server/src/com/cloud/consoleproxy/ConsoleProxyClientParam.java
----------------------------------------------------------------------
diff --git a/services/console-proxy/server/src/com/cloud/consoleproxy/ConsoleProxyClientParam.java b/services/console-proxy/server/src/com/cloud/consoleproxy/ConsoleProxyClientParam.java
index a04dd30..e62ac45 100644
--- a/services/console-proxy/server/src/com/cloud/consoleproxy/ConsoleProxyClientParam.java
+++ b/services/console-proxy/server/src/com/cloud/consoleproxy/ConsoleProxyClientParam.java
@@ -33,6 +33,10 @@ public class ConsoleProxyClientParam {
private String locale;
private String ajaxSessionId;
+ private String hypervHost;
+ private String username;
+ private String password;
+
public ConsoleProxyClientParam() {
clientHostPort = 0;
}
@@ -94,7 +98,7 @@ public class ConsoleProxyClientParam {
}
public String getAjaxSessionId() {
- return this.ajaxSessionId;
+ return ajaxSessionId;
}
public void setAjaxSessionId(String ajaxSessionId) {
@@ -102,7 +106,7 @@ public class ConsoleProxyClientParam {
}
public String getLocale() {
- return this.locale;
+ return locale;
}
public void setLocale(String locale) {
@@ -115,4 +119,28 @@ public class ConsoleProxyClientParam {
return clientHostAddress + ":" + clientHostPort;
}
+
+ public void setHypervHost(String hypervHost) {
+ this.hypervHost = hypervHost;
+ }
+
+ public String getHypervHost() {
+ return hypervHost;
+ }
+
+ public void setUsername(String username) {
+ this.username = username;
+ }
+
+ public String getUsername() {
+ return username;
+ }
+
+ public void setPassword(String password) {
+ this.password = password;
+ }
+
+ public String getPassword() {
+ return password;
+ }
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5941ac46/services/console-proxy/server/src/com/cloud/consoleproxy/ConsoleProxyHttpHandlerHelper.java
----------------------------------------------------------------------
diff --git a/services/console-proxy/server/src/com/cloud/consoleproxy/ConsoleProxyHttpHandlerHelper.java b/services/console-proxy/server/src/com/cloud/consoleproxy/ConsoleProxyHttpHandlerHelper.java
index 7811d50..51a703a 100644
--- a/services/console-proxy/server/src/com/cloud/consoleproxy/ConsoleProxyHttpHandlerHelper.java
+++ b/services/console-proxy/server/src/com/cloud/consoleproxy/ConsoleProxyHttpHandlerHelper.java
@@ -54,14 +54,29 @@ public class ConsoleProxyHttpHandlerHelper {
// make sure we get information from token only
guardUserInput(map);
if (param != null) {
- if (param.getClientHostAddress() != null)
+ if (param.getClientHostAddress() != null) {
+ s_logger.debug("decode token. host: " + param.getClientHostAddress());
map.put("host", param.getClientHostAddress());
- if (param.getClientHostPort() != 0)
+ } else {
+ s_logger.error("decode token. host info is not found!");
+ }
+ if (param.getClientHostPort() != 0) {
+ s_logger.debug("decode token. port: " + param.getClientHostPort());
map.put("port", String.valueOf(param.getClientHostPort()));
- if (param.getClientTag() != null)
+ } else {
+ s_logger.error("decode token. port info is not found!");
+ }
+ if (param.getClientTag() != null) {
+ s_logger.debug("decode token. tag: " + param.getClientTag());
map.put("tag", param.getClientTag());
- if (param.getClientHostPassword() != null)
+ } else {
+ s_logger.error("decode token. tag info is not found!");
+ }
+ if (param.getClientHostPassword() != null) {
map.put("sid", param.getClientHostPassword());
+ } else {
+ s_logger.error("decode token. sid info is not found!");
+ }
if (param.getClientTunnelUrl() != null)
map.put("consoleurl", param.getClientTunnelUrl());
if (param.getClientTunnelSession() != null)
@@ -70,6 +85,14 @@ public class ConsoleProxyHttpHandlerHelper {
map.put("ticket", param.getTicket());
if (param.getLocale() != null)
map.put("locale", param.getLocale());
+ if (param.getHypervHost() != null)
+ map.put("hypervHost", param.getHypervHost());
+ if (param.getUsername() != null)
+ map.put("username", param.getUsername());
+ if (param.getPassword() != null)
+ map.put("password", param.getPassword());
+ } else {
+ s_logger.error("Unable to decode token");
}
} else {
// we no longer accept information from parameter other than token
@@ -88,5 +111,8 @@ public class ConsoleProxyHttpHandlerHelper {
map.remove("sessionref");
map.remove("ticket");
map.remove("locale");
+ map.remove("hypervHost");
+ map.remove("username");
+ map.remove("password");
}
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5941ac46/services/console-proxy/server/src/com/cloud/consoleproxy/ConsoleProxyRdpClient.java
----------------------------------------------------------------------
diff --git a/services/console-proxy/server/src/com/cloud/consoleproxy/ConsoleProxyRdpClient.java b/services/console-proxy/server/src/com/cloud/consoleproxy/ConsoleProxyRdpClient.java
new file mode 100644
index 0000000..73c00be
--- /dev/null
+++ b/services/console-proxy/server/src/com/cloud/consoleproxy/ConsoleProxyRdpClient.java
@@ -0,0 +1,318 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+package com.cloud.consoleproxy;
+
+import java.awt.event.InputEvent;
+import java.awt.event.KeyEvent;
+import java.awt.event.MouseEvent;
+import java.io.IOException;
+import java.net.InetSocketAddress;
+
+import org.apache.log4j.Logger;
+
+import rdpclient.RdpClient;
+import streamer.Pipeline;
+import streamer.PipelineImpl;
+import streamer.SocketWrapper;
+import streamer.apr.AprSocketWrapperImpl;
+import streamer.ssl.SSLState;
+
+import com.cloud.consoleproxy.rdp.KeysymToKeycode;
+import com.cloud.consoleproxy.rdp.RdpBufferedImageCanvas;
+import com.cloud.consoleproxy.vnc.FrameBufferCanvas;
+
+import common.AwtKeyEventSource;
+import common.AwtMouseEventSource;
+import common.ScreenDescription;
+import common.SizeChangeListener;
+
+public class ConsoleProxyRdpClient extends ConsoleProxyClientBase {
+
+ private static final Logger s_logger = Logger.getLogger(ConsoleProxyRdpClient.class);
+
+ private static final int SHIFT_KEY_MASK = 64;
+ private static final int CTRL_KEY_MASK = 128;
+ private static final int META_KEY_MASK = 256;
+ private static final int ALT_KEY_MASK = 512;
+
+ private RdpClient _client;
+ private ScreenDescription _screen;
+ private SocketWrapper _socket = null;
+ private RdpBufferedImageCanvas _canvas = null;
+
+ private Thread _worker;
+ private volatile boolean _workerDone = false;
+
+ private int _lastModifierStates = 0;
+
+ private AwtMouseEventSource _mouseEventSource = null;
+ private AwtKeyEventSource _keyEventSource = null;
+
+ public RdpBufferedImageCanvas getCanvas() {
+ return _canvas;
+ }
+
+ public void setCanvas(RdpBufferedImageCanvas canvas) {
+ _canvas = canvas;
+ }
+
+ @Override
+ public void onClientConnected() {
+ // TODO Auto-generated method stub
+ }
+
+ @Override
+ public void onClientClose() {
+ s_logger.info("Received client close indication. remove viewer from map.");
+ ConsoleProxy.removeViewer(this);
+ }
+
+ @Override
+ public boolean isHostConnected() {
+ //FIXME
+ return true;
+ }
+
+ @Override
+ public boolean isFrontEndAlive() {
+ if (_socket != null) {
+ if (_workerDone || System.currentTimeMillis() - getClientLastFrontEndActivityTime() > ConsoleProxy.VIEWER_LINGER_SECONDS * 1000) {
+ s_logger.info("Front end has been idle for too long");
+ _socket.shutdown();
+ return false;
+ } else {
+ return true;
+ }
+ } else {
+ return false;
+ }
+ }
+
+ @Override
+ public void sendClientRawKeyboardEvent(InputEventType event, int code, int modifiers) {
+ if (_client == null)
+ return;
+
+ updateFrontEndActivityTime();
+
+ KeyEvent keyEvent = map(event, code, modifiers);
+ switch (event) {
+ case KEY_DOWN:
+ _keyEventSource.keyPressed(keyEvent);
+ break;
+
+ case KEY_UP:
+ _keyEventSource.keyReleased(keyEvent);
+ break;
+
+ case KEY_PRESS:
+ break;
+
+ default:
+ assert (false);
+ break;
+ }
+ }
+
+ private KeyEvent map(InputEventType event, int code, int modifiers) {
+ int keycode = KeysymToKeycode.getKeycode(code);
+ char keyChar = (char)keycode;
+
+ KeyEvent keyEvent = null;
+ int modifier = mapModifier(modifiers);
+
+ switch (event) {
+ case KEY_DOWN:
+ keyEvent = new KeyEvent(_canvas, KeyEvent.KEY_PRESSED, System.currentTimeMillis(), modifier, keycode, keyChar);
+ break;
+
+ case KEY_UP:
+ keyEvent = new KeyEvent(_canvas, KeyEvent.KEY_RELEASED, System.currentTimeMillis(), modifier, keycode, keyChar);
+ break;
+
+ case KEY_PRESS:
+ break;
+
+ default:
+ assert (false);
+ break;
+ }
+ return keyEvent;
+ }
+
+ @Override
+ public void sendClientMouseEvent(InputEventType event, int x, int y, int code, int modifiers) {
+ if (_client == null)
+ return;
+ updateFrontEndActivityTime();
+
+ int mousecode = mapMouseButton(code);
+ int modifier = mapMouseModifier(code, modifiers);
+
+ /*if (event == InputEventType.MOUSE_DOWN) {
+ _mouseEventSource.mousePressed(new MouseEvent(_canvas, MouseEvent.MOUSE_PRESSED, System.currentTimeMillis(), modifier, x, y, 1, false, mousecode));
+ }
+
+ if (event == InputEventType.MOUSE_UP) {
+ _mouseEventSource.mouseReleased((new MouseEvent(_canvas, MouseEvent.MOUSE_RELEASED, System.currentTimeMillis(), modifier, x, y, 1, false, mousecode)));
+ }
+
+ if (event == InputEventType.MOUSE_DBLCLICK) {
+ _mouseEventSource.mouseReleased((new MouseEvent(_canvas, MouseEvent.MOUSE_RELEASED, System.currentTimeMillis(), modifier, x, y, 2, false, mousecode)));
+ }*/
+ }
+
+ public int mapMouseModifier(int code, int modifiers) {
+ int mod = mapModifier(modifiers);
+ switch (code) {
+ case 0:
+ return mod = mod | MouseEvent.BUTTON1_DOWN_MASK;
+ case 2:
+ return mod = mod | MouseEvent.BUTTON3_DOWN_MASK;
+ default:
+ }
+ return mod;
+ }
+
+ private int mapModifier(int modifiers) {
+ int mod = 0;
+ if ((modifiers & SHIFT_KEY_MASK) != (_lastModifierStates & SHIFT_KEY_MASK)) {
+ if ((modifiers & SHIFT_KEY_MASK) != 0)
+ mod = mod | InputEvent.SHIFT_DOWN_MASK;
+ }
+
+ if ((modifiers & CTRL_KEY_MASK) != (_lastModifierStates & CTRL_KEY_MASK)) {
+ if ((modifiers & CTRL_KEY_MASK) != 0)
+ mod = mod | InputEvent.CTRL_DOWN_MASK;
+ }
+
+ if ((modifiers & META_KEY_MASK) != (_lastModifierStates & META_KEY_MASK)) {
+ if ((modifiers & META_KEY_MASK) != 0)
+ mod = mod | InputEvent.META_DOWN_MASK;
+ }
+
+ if ((modifiers & ALT_KEY_MASK) != (_lastModifierStates & ALT_KEY_MASK)) {
+ if ((modifiers & ALT_KEY_MASK) != 0)
+ mod = mod | InputEvent.ALT_DOWN_MASK;
+ }
+ _lastModifierStates = mod;
+ return mod;
+ }
+
+ public int mapMouseButton(int code) {
+ switch (code) {
+ case 0:
+ return MouseEvent.BUTTON1;
+ case 2:
+ return MouseEvent.BUTTON3;
+ default:
+ return MouseEvent.BUTTON2;
+ }
+
+ }
+
+ @Override
+ public void initClient(final ConsoleProxyClientParam param) {
+ _workerDone = false;
+
+ int canvasWidth = 1024;
+ int canvasHeight = 768;
+ setClientParam(param);
+
+ final String host = param.getHypervHost();
+ final String password = param.getPassword();
+ final String instanceId = param.getClientHostAddress();
+ final int port = param.getClientHostPort();
+
+ _screen = new ScreenDescription();
+ _canvas = new RdpBufferedImageCanvas(this, canvasWidth, canvasHeight);
+ onFramebufferSizeChange(canvasWidth, canvasHeight);
+
+ _screen.addSizeChangeListener(new SizeChangeListener() {
+ @Override
+ public void sizeChanged(int width, int height) {
+ if (_canvas != null) {
+ _canvas.setCanvasSize(width, height);
+ }
+ }
+ });
+
+ final SSLState sslState = new SSLState();
+
+ final String username = param.getUsername();
+ String name = null;
+ String domain = null;
+ if (username.contains("\\")) {
+ String[] tokens = username.split("\\\\");
+ name = tokens[1];
+ domain = tokens[0];
+ } else {
+ name = username;
+ domain = "Workgroup";
+ }
+
+ _client = new RdpClient("client", host, domain, name, password, instanceId, _screen, _canvas,
+ sslState);
+
+ _mouseEventSource = _client.getMouseEventSource();
+ _keyEventSource = _client.getKeyEventSource();
+
+ _worker = new Thread(new Runnable() {
+ @Override
+ public void run() {
+ _socket = new AprSocketWrapperImpl("socket", sslState);
+ Pipeline pipeline = new PipelineImpl("Client");
+ pipeline.add(_socket, _client);
+ pipeline.link("socket", _client.getId(), "socket");
+ pipeline.validate();
+
+ InetSocketAddress address = new InetSocketAddress(host, port);
+ ConsoleProxy.ensureRoute(host);
+
+ try {
+ // Connect socket to remote server and run main loop(s)
+ _socket.connect(address);
+ } catch (IOException e) {
+ e.printStackTrace();
+ } finally {
+ shutdown();
+ }
+
+ s_logger.info("Receiver thread stopped.");
+ _workerDone = true;
+ }
+ });
+ _worker.setDaemon(true);
+ _worker.start();
+ }
+
+ @Override
+ public void closeClient() {
+ _workerDone = true;
+ shutdown();
+ }
+
+ @Override
+ protected FrameBufferCanvas getFrameBufferCavas() {
+ return _canvas;
+ }
+
+ protected void shutdown() {
+ if (_socket != null)
+ _socket.shutdown();
+ }
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5941ac46/services/console-proxy/server/src/com/cloud/consoleproxy/rdp/KeysymToKeycode.java
----------------------------------------------------------------------
diff --git a/services/console-proxy/server/src/com/cloud/consoleproxy/rdp/KeysymToKeycode.java b/services/console-proxy/server/src/com/cloud/consoleproxy/rdp/KeysymToKeycode.java
new file mode 100644
index 0000000..10282ad
--- /dev/null
+++ b/services/console-proxy/server/src/com/cloud/consoleproxy/rdp/KeysymToKeycode.java
@@ -0,0 +1,115 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+package com.cloud.consoleproxy.rdp;
+
+import java.awt.event.KeyEvent;
+
+public class KeysymToKeycode {
+
+ // this keymap is taken from http://openwonderland.googlecode.com/svn/trunk/modules/foundation/xremwin/src/classes/org/jdesktop/wonderland/modules/xremwin/client/KeycodeToKeysym.java
+ private final static int[][] map = {
+ /* XK_BackSpace */{0xFF08, KeyEvent.VK_BACK_SPACE},
+ /* XK_Tab */{0xFF09, KeyEvent.VK_TAB},
+ /* XK_Clear */{0xFF0B, KeyEvent.VK_CLEAR},
+ /* XK_Return */{0xFF0D, KeyEvent.VK_ENTER},
+ /* XK_Pause */{0xFF13, KeyEvent.VK_PAUSE},
+ /* XK_Scroll_Lock */{0xFF14, KeyEvent.VK_SCROLL_LOCK},
+ /* XK_Escape */{0xFF1B, KeyEvent.VK_ESCAPE},
+ /* XK_Delete */{0xFFFF, KeyEvent.VK_DELETE},
+ /* XK_Home */{0xFF50, KeyEvent.VK_HOME},
+ /* XK_Left */{0xFF51, KeyEvent.VK_LEFT},
+ /* XK_Up */{0xFF52, KeyEvent.VK_UP},
+ /* XK_Right */{0xFF53, KeyEvent.VK_RIGHT},
+ /* XK_Down */{0xFF54, KeyEvent.VK_DOWN},
+ /* XK_Page_Up */{0xFF55, KeyEvent.VK_PAGE_UP},
+ /* XK_Page_Down */{0xFF56, KeyEvent.VK_PAGE_DOWN},
+ /* XK_End */{0xFF57, KeyEvent.VK_END},
+ /* XK_Print */{0xFF61, KeyEvent.VK_PRINTSCREEN},
+ /* XK_Insert */{0xFF63, KeyEvent.VK_INSERT},
+ /* XK_Undo */{0xFF65, KeyEvent.VK_UNDO},
+ /* XK_Find */{0xFF68, KeyEvent.VK_FIND},
+ /* XK_Cancel */{0xFF69, KeyEvent.VK_CANCEL},
+ /* XK_Help */{0xFF6A, KeyEvent.VK_HELP},
+ /* XK_Mode_switch */{0xFF7E, KeyEvent.VK_MODECHANGE},
+ /* XK_Num_Lock */{0xFF7F, KeyEvent.VK_NUM_LOCK},
+ /* XK_F1 */{0xFFBE, KeyEvent.VK_F1},
+ /* XK_F2 */{0xFFBF, KeyEvent.VK_F2},
+ /* XK_F3 */{0xFFC0, KeyEvent.VK_F3},
+ /* XK_F4 */{0xFFC1, KeyEvent.VK_F4},
+ /* XK_F5 */{0xFFC2, KeyEvent.VK_F5},
+ /* XK_F6 */{0xFFC3, KeyEvent.VK_F6},
+ /* XK_F7 */{0xFFC4, KeyEvent.VK_F7},
+ /* XK_F8 */{0xFFC5, KeyEvent.VK_F8},
+ /* XK_F9 */{0xFFC6, KeyEvent.VK_F9},
+ /* XK_F10 */{0xFFC7, KeyEvent.VK_F10},
+ /* XK_F11 */{0xFFC8, KeyEvent.VK_F11},
+ /* XK_F12 */{0xFFC9, KeyEvent.VK_F12},
+ /* XK_F13 */{0xFFCA, KeyEvent.VK_F13},
+ /* XK_F14 */{0xFFCB, KeyEvent.VK_F14},
+ /* XK_F15 */{0xFFCC, KeyEvent.VK_F15},
+ /* XK_F16 */{0xFFCD, KeyEvent.VK_F16},
+ /* XK_F17 */{0xFFCE, KeyEvent.VK_F17},
+ /* XK_F18 */{0xFFCF, KeyEvent.VK_F18},
+ /* XK_F19 */{0xFFD0, KeyEvent.VK_F19},
+ /* XK_F20 */{0xFFD1, KeyEvent.VK_F20},
+ /* XK_F21 */{0xFFD2, KeyEvent.VK_F21},
+ /* XK_F22 */{0xFFD3, KeyEvent.VK_F22},
+ /* XK_F23 */{0xFFD4, KeyEvent.VK_F23},
+ /* XK_F24 */{0xFFD5, KeyEvent.VK_F24},
+ /* XK_Shift_L */{0xFFE1, KeyEvent.VK_SHIFT},
+ /* XK_Control_L */{0xFFE3, KeyEvent.VK_CONTROL},
+ /* XK_Caps_Lock */{0xFFE5, KeyEvent.VK_CAPS_LOCK},
+ /* XK_Meta_L */{0xFFE7, KeyEvent.VK_META},
+ /* XK_Alt_L */{0xFFE9, KeyEvent.VK_ALT},
+ /* XK_a */{0x0061, KeyEvent.VK_A},
+ /* XK_b */{0x0062, KeyEvent.VK_B},
+ /* XK_c */{0x0063, KeyEvent.VK_C},
+ /* XK_d */{0x0064, KeyEvent.VK_D},
+ /* XK_e */{0x0065, KeyEvent.VK_E},
+ /* XK_f */{0x0066, KeyEvent.VK_F},
+ /* XK_g */{0x0067, KeyEvent.VK_G},
+ /* XK_h */{0x0068, KeyEvent.VK_H},
+ /* XK_i */{0x0069, KeyEvent.VK_I},
+ /* XK_j */{0x006a, KeyEvent.VK_J},
+ /* XK_k */{0x006b, KeyEvent.VK_K},
+ /* XK_l */{0x006c, KeyEvent.VK_L},
+ /* XK_m */{0x006d, KeyEvent.VK_M},
+ /* XK_n */{0x006e, KeyEvent.VK_N},
+ /* XK_o */{0x006f, KeyEvent.VK_O},
+ /* XK_p */{0x0070, KeyEvent.VK_P},
+ /* XK_q */{0x0071, KeyEvent.VK_Q},
+ /* XK_r */{0x0072, KeyEvent.VK_R},
+ /* XK_s */{0x0073, KeyEvent.VK_S},
+ /* XK_t */{0x0074, KeyEvent.VK_T},
+ /* XK_u */{0x0075, KeyEvent.VK_U},
+ /* XK_v */{0x0076, KeyEvent.VK_V},
+ /* XK_w */{0x0077, KeyEvent.VK_W},
+ /* XK_x */{0x0078, KeyEvent.VK_X},
+ /* XK_y */{0x0079, KeyEvent.VK_Y},
+ /* XK_z */{0x007a, KeyEvent.VK_Z},
+ };
+
+ public static int getKeycode(int keysym) {
+ for (int i = 0; i < (map.length - 1); i++) {
+ if (map[i][0] == keysym) {
+ return map[i][1];
+ }
+ }
+ return keysym;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5941ac46/services/console-proxy/server/src/com/cloud/consoleproxy/rdp/RdpBufferedImageCanvas.java
----------------------------------------------------------------------
diff --git a/services/console-proxy/server/src/com/cloud/consoleproxy/rdp/RdpBufferedImageCanvas.java b/services/console-proxy/server/src/com/cloud/consoleproxy/rdp/RdpBufferedImageCanvas.java
new file mode 100644
index 0000000..6dabe05
--- /dev/null
+++ b/services/console-proxy/server/src/com/cloud/consoleproxy/rdp/RdpBufferedImageCanvas.java
@@ -0,0 +1,103 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+package com.cloud.consoleproxy.rdp;
+
+import java.awt.Graphics2D;
+import java.awt.Image;
+import java.awt.Rectangle;
+import java.awt.image.BufferedImage;
+import java.io.IOException;
+import java.util.List;
+
+import com.cloud.consoleproxy.ConsoleProxyRdpClient;
+import com.cloud.consoleproxy.util.ImageHelper;
+import com.cloud.consoleproxy.util.TileInfo;
+import com.cloud.consoleproxy.vnc.FrameBufferCanvas;
+
+import common.BufferedImageCanvas;
+
+public class RdpBufferedImageCanvas extends BufferedImageCanvas implements FrameBufferCanvas {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ private final ConsoleProxyRdpClient _rdpClient;
+
+ public RdpBufferedImageCanvas(ConsoleProxyRdpClient client, int width, int height) {
+ super(width, height);
+ _rdpClient = client;
+ }
+
+ @Override
+ public Image getFrameBufferScaledImage(int width, int height) {
+ if (offlineImage != null)
+ return offlineImage.getScaledInstance(width, height, Image.SCALE_DEFAULT);
+ return null;
+ }
+
+ @Override
+ public byte[] getFrameBufferJpeg() {
+ int width = offlineImage.getWidth();
+ int height = offlineImage.getHeight();
+
+ BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);
+ Graphics2D g = bufferedImage.createGraphics();
+ synchronized (offlineImage) {
+ g.drawImage(offlineImage, 0, 0, width, height, 0, 0, width, height, null);
+ g.dispose();
+ }
+
+ byte[] imgBits = null;
+ try {
+ imgBits = ImageHelper.jpegFromImage(bufferedImage);
+ } catch (IOException e) {
+ }
+
+ return imgBits;
+ }
+
+ @Override
+ public byte[] getTilesMergedJpeg(List<TileInfo> tileList, int tileWidth, int tileHeight) {
+ int width = Math.max(tileWidth, tileWidth * tileList.size());
+
+ BufferedImage bufferedImage = new BufferedImage(width, tileHeight, BufferedImage.TYPE_3BYTE_BGR);
+ Graphics2D g = bufferedImage.createGraphics();
+
+ synchronized (offlineImage) {
+ int i = 0;
+ for (TileInfo tile : tileList) {
+ Rectangle rc = tile.getTileRect();
+ g.drawImage(offlineImage, i * tileWidth, 0, i * tileWidth + rc.width, rc.height, rc.x, rc.y, rc.x + rc.width, rc.y + rc.height, null);
+ i++;
+ }
+ }
+
+ byte[] imgBits = null;
+ try {
+ imgBits = ImageHelper.jpegFromImage(bufferedImage);
+ } catch (IOException e) {
+ }
+ return imgBits;
+ }
+
+ @Override
+ public void updateFrameBuffer(int x, int y, int w, int h) {
+ _rdpClient.onFramebufferUpdate(x, y, w, h);
+ }
+
+}
[4/6] git commit: updated refs/heads/master to 62ef617
Posted by ra...@apache.org.
CLOUDSTACK-5702: Fixed mouse doesn't work for console
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/3e2f7dda
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/3e2f7dda
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/3e2f7dda
Branch: refs/heads/master
Commit: 3e2f7dda9eee384e85e7b2bc3cecc91b233b0bf2
Parents: 5941ac4
Author: Anshul Gangwar <an...@citrix.com>
Authored: Wed Jan 1 12:16:23 2014 +0530
Committer: Rajesh Battala <ra...@citrix.com>
Committed: Thu Jan 23 10:54:08 2014 +0530
----------------------------------------------------------------------
.../consoleproxy/ConsoleProxyRdpClient.java | 29 ++++++++++++++------
1 file changed, 21 insertions(+), 8 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/3e2f7dda/services/console-proxy/server/src/com/cloud/consoleproxy/ConsoleProxyRdpClient.java
----------------------------------------------------------------------
diff --git a/services/console-proxy/server/src/com/cloud/consoleproxy/ConsoleProxyRdpClient.java b/services/console-proxy/server/src/com/cloud/consoleproxy/ConsoleProxyRdpClient.java
index 73c00be..6b317ff 100644
--- a/services/console-proxy/server/src/com/cloud/consoleproxy/ConsoleProxyRdpClient.java
+++ b/services/console-proxy/server/src/com/cloud/consoleproxy/ConsoleProxyRdpClient.java
@@ -161,22 +161,23 @@ public class ConsoleProxyRdpClient extends ConsoleProxyClientBase {
updateFrontEndActivityTime();
int mousecode = mapMouseButton(code);
- int modifier = mapMouseModifier(code, modifiers);
- /*if (event == InputEventType.MOUSE_DOWN) {
- _mouseEventSource.mousePressed(new MouseEvent(_canvas, MouseEvent.MOUSE_PRESSED, System.currentTimeMillis(), modifier, x, y, 1, false, mousecode));
+ if (event == InputEventType.MOUSE_DOWN) {
+ _mouseEventSource.mousePressed(new MouseEvent(_canvas, MouseEvent.MOUSE_PRESSED, System.currentTimeMillis(), mapMouseDownModifier(code, modifiers), x, y, 1, false,
+ mousecode));
}
if (event == InputEventType.MOUSE_UP) {
- _mouseEventSource.mouseReleased((new MouseEvent(_canvas, MouseEvent.MOUSE_RELEASED, System.currentTimeMillis(), modifier, x, y, 1, false, mousecode)));
+ _mouseEventSource.mouseReleased((new MouseEvent(_canvas, MouseEvent.MOUSE_RELEASED, System.currentTimeMillis(), mapMouseUpModifier(code, modifiers), x, y, 1, false,
+ mousecode)));
}
- if (event == InputEventType.MOUSE_DBLCLICK) {
- _mouseEventSource.mouseReleased((new MouseEvent(_canvas, MouseEvent.MOUSE_RELEASED, System.currentTimeMillis(), modifier, x, y, 2, false, mousecode)));
- }*/
+ if (event == InputEventType.MOUSE_MOVE) {
+ _mouseEventSource.mouseMoved(new MouseEvent(_canvas, MouseEvent.MOUSE_MOVED, System.currentTimeMillis(), mapModifier(modifiers), x, y, 0, false));
+ }
}
- public int mapMouseModifier(int code, int modifiers) {
+ public int mapMouseDownModifier(int code, int modifiers) {
int mod = mapModifier(modifiers);
switch (code) {
case 0:
@@ -188,6 +189,18 @@ public class ConsoleProxyRdpClient extends ConsoleProxyClientBase {
return mod;
}
+ public int mapMouseUpModifier(int code, int modifiers) {
+ int mod = mapModifier(modifiers);
+ switch (code) {
+ case 0:
+ return mod = mod | MouseEvent.BUTTON1_MASK;
+ case 2:
+ return mod = mod | MouseEvent.BUTTON3_MASK;
+ default:
+ }
+ return mod;
+ }
+
private int mapModifier(int modifiers) {
int mod = 0;
if ((modifiers & SHIFT_KEY_MASK) != (_lastModifierStates & SHIFT_KEY_MASK)) {