You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by de...@apache.org on 2014/01/02 08:53:23 UTC
[21/21] git commit: updated refs/heads/master to 48c4710
CLOUDSTACK-5344: Updated to allow rdp console to access hyper-v vm virtual framebuffer.
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/48c47101
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/48c47101
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/48c47101
Branch: refs/heads/master
Commit: 48c47101aa9996c68851de878cb2229cf70dcf2b
Parents: 97ede25
Author: Donal Lafferty <dl...@gmail.com>
Authored: Wed Nov 27 14:38:51 2013 +0000
Committer: Devdeep Singh <de...@gmail.com>
Committed: Thu Jan 2 13:06:10 2014 +0530
----------------------------------------------------------------------
.../console-proxy-rdp/rdpconsole/README.txt | 54 +-
services/console-proxy-rdp/rdpconsole/pom.xml | 9 +-
.../console-proxy-rdp/rdpconsole/rdp-config.bat | 2 +-
.../src/main/java/common/AwtBellAdapter.java | 77 --
.../src/main/java/common/AwtCanvasAdapter.java | 166 ---
.../main/java/common/AwtClipboardAdapter.java | 56 -
.../src/main/java/common/AwtKeyEventSource.java | 0
.../main/java/common/AwtMouseEventSource.java | 0
.../src/main/java/common/BitmapOrder.java | 3 +-
.../src/main/java/common/BitmapRectangle.java | 6 +-
.../main/java/common/BufferedImageCanvas.java | 2 +-
.../common/BufferedImageCopyRectAdapter.java | 32 +-
.../java/common/BufferedImagePixelsAdapter.java | 46 +-
.../rdpconsole/src/main/java/common/Client.java | 283 ++++-
.../src/main/java/common/CopyRectOrder.java | 0
.../src/main/java/common/KeyOrder.java | 0
.../src/main/java/common/MouseOrder.java | 0
.../src/main/java/common/OrderType.java | 0
.../src/main/java/common/ScreenDescription.java | 56 +-
.../main/java/common/SizeChangeListener.java | 0
.../java/common/adapter/AwtBellAdapter.java | 77 ++
.../java/common/adapter/AwtCanvasAdapter.java | 171 +++
.../common/adapter/AwtClipboardAdapter.java | 57 +
.../src/main/java/common/asn1/Any.java | 78 ++
.../main/java/common/asn1/Asn1Constants.java | 83 ++
.../src/main/java/common/asn1/Asn1Integer.java | 116 ++
.../src/main/java/common/asn1/BerType.java | 40 +
.../src/main/java/common/asn1/BitString.java | 67 ++
.../src/main/java/common/asn1/ObjectID.java | 67 ++
.../src/main/java/common/asn1/OctetString.java | 80 ++
.../src/main/java/common/asn1/Sequence.java | 143 +++
.../src/main/java/common/asn1/SequenceOf.java | 82 ++
.../src/main/java/common/asn1/Tag.java | 462 +++++++
.../main/java/common/opt/IncrementalOption.java | 28 +
.../src/main/java/common/opt/IntOption.java | 41 +
.../opt/NoArgumentForOptionException.java | 26 +
.../src/main/java/common/opt/Option.java | 102 ++
.../src/main/java/common/opt/OptionParser.java | 147 +++
.../common/opt/OptionRequiredException.java | 26 +
.../main/java/common/opt/StringArrayOption.java | 38 +
.../common/opt/StringEnumerationOption.java | 72 ++
.../src/main/java/common/opt/StringOption.java | 41 +
.../java/common/opt/UnknownOptionException.java | 27 +
.../java/rdpclient/AwtRdpKeyboardAdapter.java | 350 ------
.../main/java/rdpclient/AwtRdpMouseAdapter.java | 179 ---
.../java/rdpclient/ClientConfirmActivePDU.java | 1129 -----------------
.../main/java/rdpclient/ClientFastPathPDU.java | 55 -
.../src/main/java/rdpclient/ClientInfoPDU.java | 455 -------
.../rdpclient/ClientMCSAttachUserRequest.java | 103 --
...lJoinRequestServerMCSChannelConfirmPDUs.java | 222 ----
.../java/rdpclient/ClientMCSConnectInitial.java | 669 -----------
.../rdpclient/ClientMCSErectDomainRequest.java | 189 ---
.../java/rdpclient/ClientPacketSniffer.java | 49 -
.../java/rdpclient/ClientSynchronizePDU.java | 248 ----
.../src/main/java/rdpclient/ClientTpkt.java | 54 -
.../ClientX224ConnectionRequestPDU.java | 156 ---
.../main/java/rdpclient/ClientX224DataPdu.java | 52 -
.../src/main/java/rdpclient/HandshakeEnd.java | 27 -
.../src/main/java/rdpclient/MockServer.java | 198 ---
.../src/main/java/rdpclient/PacketSniffer.java | 75 --
.../java/rdpclient/RLEBitmapDecompression.java | 985 ---------------
.../src/main/java/rdpclient/RdpClient.java | 297 ++++-
.../src/main/java/rdpclient/RdpConstants.java | 70 --
.../src/main/java/rdpclient/RdpState.java | 33 -
.../main/java/rdpclient/ServerBitmapUpdate.java | 200 ----
.../java/rdpclient/ServerChannel1003Router.java | 533 ---------
.../rdpclient/ServerControlPDUCooperate.java | 117 --
.../ServerControlPDUGrantedControl.java | 114 --
.../java/rdpclient/ServerDemandActivePDU.java | 660 ----------
.../src/main/java/rdpclient/ServerFastPath.java | 258 ----
.../ServerLicenseErrorPDUValidClient.java | 121 --
.../ServerMCSAttachUserConfirmPDU.java | 134 ---
.../ServerMCSChannelJoinConfirmPDU.java | 89 --
.../rdpclient/ServerMCSConnectResponse.java | 283 -----
.../src/main/java/rdpclient/ServerMCSPDU.java | 149 ---
.../java/rdpclient/ServerPacketSniffer.java | 50 -
.../java/rdpclient/ServerPaletteUpdate.java | 77 --
.../java/rdpclient/ServerSynchronizePDU.java | 115 --
.../src/main/java/rdpclient/ServerTpkt.java | 70 --
.../ServerX224ConnectionConfirmPDU.java | 237 ----
.../main/java/rdpclient/ServerX224DataPdu.java | 64 -
.../rdpclient/TrustAllX509TrustManager.java | 40 -
.../main/java/rdpclient/UpgradeSocketToSSL.java | 44 -
.../adapter/AwtRdpKeyboardAdapter.java | 350 ++++++
.../rdpclient/adapter/AwtRdpMouseAdapter.java | 179 +++
.../rdpclient/clip/ClipboardDataFormat.java | 143 +++
.../java/rdpclient/clip/ClipboardState.java | 70 ++
.../clip/ServerClipRdrChannelRouter.java | 193 +++
.../clip/ServerClipboardCapabilitiesPDU.java | 180 +++
.../clip/ServerFormatDataResponsePDU.java | 97 ++
.../rdpclient/clip/ServerFormatListPDU.java | 237 ++++
.../rdpclient/clip/ServerMonitorReadyPDU.java | 85 ++
.../rdpclient/debug/ClientPacketSniffer.java | 51 +
.../java/rdpclient/debug/PacketSniffer.java | 75 ++
.../rdpclient/debug/ServerPacketSniffer.java | 49 +
.../hyperv/ClientPreConnectionBlob.java | 121 ++
.../ntlmssp/ClientNtlmsspNegotiate.java | 177 +++
.../ntlmssp/ClientNtlmsspPubKeyAuth.java | 680 +++++++++++
.../ntlmssp/ClientNtlmsspUserCredentials.java | 128 ++
.../java/rdpclient/ntlmssp/CryptoAlgos.java | 361 ++++++
.../main/java/rdpclient/ntlmssp/NegoFlags.java | 492 ++++++++
.../java/rdpclient/ntlmssp/NtlmCompute.java | 24 +
.../java/rdpclient/ntlmssp/NtlmConstants.java | 157 +++
.../main/java/rdpclient/ntlmssp/NtlmState.java | 887 ++++++++++++++
.../main/java/rdpclient/ntlmssp/SecBuffer.java | 21 +
.../ntlmssp/ServerNtlmsspChallenge.java | 293 +++++
.../ntlmssp/ServerNtlmsspPubKeyPlus1.java | 125 ++
.../ntlmssp/asn1/AlgorithmIdentifier.java | 40 +
.../java/rdpclient/ntlmssp/asn1/NegoData.java | 64 +
.../java/rdpclient/ntlmssp/asn1/NegoItem.java | 73 ++
.../ntlmssp/asn1/SubjectPublicKeyInfo.java | 35 +
.../rdpclient/ntlmssp/asn1/TSCredentials.java | 62 +
.../rdpclient/ntlmssp/asn1/TSCspDataDetail.java | 98 ++
.../rdpclient/ntlmssp/asn1/TSPasswordCreds.java | 76 ++
.../java/rdpclient/ntlmssp/asn1/TSRequest.java | 201 ++++
.../ntlmssp/asn1/TSSmartCardCreds.java | 90 ++
.../java/rdpclient/ntlmssp/package-info.java | 71 ++
.../rdpclient/rdp/ClientConfirmActivePDU.java | 1131 ++++++++++++++++++
.../java/rdpclient/rdp/ClientFastPathPDU.java | 55 +
.../main/java/rdpclient/rdp/ClientInfoPDU.java | 456 +++++++
.../rdp/ClientMCSAttachUserRequest.java | 103 ++
...lJoinRequestServerMCSChannelConfirmPDUs.java | 223 ++++
.../rdpclient/rdp/ClientMCSConnectInitial.java | 696 +++++++++++
.../rdp/ClientMCSErectDomainRequest.java | 189 +++
.../rdpclient/rdp/ClientSynchronizePDU.java | 248 ++++
.../src/main/java/rdpclient/rdp/ClientTpkt.java | 54 +
.../rdp/ClientX224ConnectionRequestPDU.java | 162 +++
.../java/rdpclient/rdp/ClientX224DataPDU.java | 52 +
.../rdpclient/rdp/RLEBitmapDecompression.java | 1014 ++++++++++++++++
.../main/java/rdpclient/rdp/RdpConstants.java | 91 ++
.../src/main/java/rdpclient/rdp/RdpState.java | 33 +
.../java/rdpclient/rdp/ServerBitmapUpdate.java | 199 +++
.../rdp/ServerControlPDUCooperate.java | 117 ++
.../rdp/ServerControlPDUGrantedControl.java | 114 ++
.../rdpclient/rdp/ServerDemandActivePDU.java | 660 ++++++++++
.../main/java/rdpclient/rdp/ServerFastPath.java | 315 +++++
.../rdpclient/rdp/ServerIOChannelRouter.java | 534 +++++++++
.../rdp/ServerLicenseErrorPDUValidClient.java | 121 ++
.../rdp/ServerMCSAttachUserConfirmPDU.java | 116 ++
.../rdp/ServerMCSChannelJoinConfirmPDU.java | 89 ++
.../rdpclient/rdp/ServerMCSConnectResponse.java | 283 +++++
.../main/java/rdpclient/rdp/ServerMCSPDU.java | 149 +++
.../java/rdpclient/rdp/ServerPaletteUpdate.java | 77 ++
.../rdpclient/rdp/ServerSynchronizePDU.java | 115 ++
.../src/main/java/rdpclient/rdp/ServerTpkt.java | 70 ++
.../rdp/ServerX224ConnectionConfirmPDU.java | 234 ++++
.../java/rdpclient/rdp/ServerX224DataPdu.java | 64 +
.../main/java/streamer/AssertingByteBuffer.java | 107 --
.../src/main/java/streamer/BaseElement.java | 98 +-
.../src/main/java/streamer/BufferPool.java | 0
.../src/main/java/streamer/ByteBuffer.java | 466 ++++++--
.../src/main/java/streamer/DataSink.java | 0
.../src/main/java/streamer/DataSource.java | 0
.../src/main/java/streamer/Direction.java | 0
.../src/main/java/streamer/Element.java | 2 +-
.../src/main/java/streamer/Event.java | 3 +-
.../src/main/java/streamer/FakeSink.java | 69 --
.../src/main/java/streamer/FakeSource.java | 125 --
.../main/java/streamer/InputStreamSource.java | 36 +-
.../rdpconsole/src/main/java/streamer/Link.java | 0
.../src/main/java/streamer/MockSink.java | 113 --
.../src/main/java/streamer/MockSource.java | 89 --
.../src/main/java/streamer/OneTimeSwitch.java | 3 +
.../src/main/java/streamer/Order.java | 0
.../main/java/streamer/OutputStreamSink.java | 42 +-
.../src/main/java/streamer/Pipeline.java | 2 +
.../src/main/java/streamer/PipelineImpl.java | 77 +-
.../src/main/java/streamer/Queue.java | 28 +-
.../src/main/java/streamer/SocketWrapper.java | 216 +---
.../main/java/streamer/SocketWrapperImpl.java | 249 ++++
.../src/main/java/streamer/SyncLink.java | 123 +-
.../main/java/streamer/apr/AprSocketSink.java | 129 ++
.../main/java/streamer/apr/AprSocketSource.java | 171 +++
.../java/streamer/apr/AprSocketWrapperImpl.java | 281 +++++
.../java/streamer/bco/BcoSocketWrapperImpl.java | 119 ++
.../streamer/debug/AssertingByteBuffer.java | 109 ++
.../src/main/java/streamer/debug/Dumper.java | 28 +
.../src/main/java/streamer/debug/FakeSink.java | 77 ++
.../main/java/streamer/debug/FakeSource.java | 138 +++
.../main/java/streamer/debug/MockServer.java | 203 ++++
.../src/main/java/streamer/debug/MockSink.java | 154 +++
.../main/java/streamer/debug/MockSource.java | 95 ++
.../src/main/java/streamer/ssl/SSLState.java | 26 +
.../streamer/ssl/TrustAllX509TrustManager.java | 52 +
.../java/streamer/ssl/UpgradeSocketToSSL.java | 44 +
.../vncclient/AwtKeyboardEventToVncAdapter.java | 368 ------
.../vncclient/AwtMouseEventToVncAdapter.java | 71 --
.../main/java/vncclient/EncodingsMessage.java | 63 -
.../vncclient/FrameBufferUpdateRequest.java | 126 --
.../vncclient/RGB888LE32PixelFormatRequest.java | 89 --
.../src/main/java/vncclient/RfbConstants.java | 85 --
.../java/vncclient/Vnc33Authentication.java | 292 -----
.../src/main/java/vncclient/Vnc33Hello.java | 116 --
.../src/main/java/vncclient/VncClient.java | 58 +-
.../src/main/java/vncclient/VncInitializer.java | 245 ----
.../main/java/vncclient/VncMessageHandler.java | 420 -------
.../adapter/AwtVncKeyboardAdapter.java | 369 ++++++
.../vncclient/adapter/AwtVncMouseAdapter.java | 71 ++
.../java/vncclient/vnc/EncodingsMessage.java | 63 +
.../vncclient/vnc/FrameBufferUpdateRequest.java | 126 ++
.../vnc/RGB888LE32PixelFormatRequest.java | 89 ++
.../main/java/vncclient/vnc/RfbConstants.java | 85 ++
.../java/vncclient/vnc/Vnc33Authentication.java | 292 +++++
.../src/main/java/vncclient/vnc/Vnc33Hello.java | 116 ++
.../main/java/vncclient/vnc/VncInitializer.java | 245 ++++
.../java/vncclient/vnc/VncMessageHandler.java | 420 +++++++
.../src/main/resources/jaas_ntlm_config.txt | 21 +
.../rdpconsole/src/test/doc/README.txt | 2 +
.../rdpconsole/src/test/doc/dev-rdp-config.bat | 13 +
.../src/test/doc/freerdp-debug-log.txt | 772 ++++++++++++
.../rdpconsole/src/test/doc/rdp.pfx | Bin 0 -> 2572 bytes
.../src/test/java/rdpclient/MockServerTest.java | 9 +-
212 files changed, 21655 insertions(+), 12007 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48c47101/services/console-proxy-rdp/rdpconsole/README.txt
----------------------------------------------------------------------
diff --git a/services/console-proxy-rdp/rdpconsole/README.txt b/services/console-proxy-rdp/rdpconsole/README.txt
old mode 100644
new mode 100755
index 15029d4..546746c
--- a/services/console-proxy-rdp/rdpconsole/README.txt
+++ b/services/console-proxy-rdp/rdpconsole/README.txt
@@ -14,28 +14,38 @@
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
-This project contains code for basic VNC and RDP clients.
-
-VNC client can be invoked using following command:
-
- mvn exec:java -Dexec.mainClass="common.Client" -Dexec.args="vnc 192.168.0.101 5901 password"
-
-where
- * vnc - name of protcol;
- * 192.168.0.101 - IP of VNC server;
- * 5901 - port of VNC server screen (5900+display number);
- * password - VNC server password.
-
-
-RDP client can be invoked using following command:
-
- mvn exec:java -Dexec.mainClass="common.Client" -Dexec.args="rdp 192.168.0.101 3389 Administrator"
-
-where
- * rdp - name of protcol;
- * 192.168.0.101 - IP of RDP server;
- * 3389 - port of RDP server;
- * Administrator - user name for loging dialog.
+This project contains code for basic VNC, RDP, and HyperV (RDP) clients.
+
+Usage:
+ java common.Client vnc|rdp|hyperv OPTIONS
+
+Common options:
+ --help|-h Show this help text.
+ --debug-link|-DL Print debugging messages when packets are trasnferred via links.
+ --debug-element|-DE Print debugging messages when packets are received or sended by elements.
+ --debug-pipeline|-DP Print debugging messages in pipelines.
+ --host|-n|--host-name VALUE Name or IP address of host to connect to. Required.
+ --width|-W VALUE Width of canvas. Default value is "1024".
+ --height|-H VALUE Height of canvas. Default value is "768".
+
+VNC options:
+ --port|-p VALUE Port of VNC display server to connect to. Calculate as 5900 + display number, e.g. 5900 for display #0, 5901 for display #1, and so on. Default value is "5901".
+ --password|-P VALUE Password to use. Required.
+
+RDP options:
+ --ssl-implementation|-j jre|apr|bco Select SSL engine to use: JRE standard implementation, Apache Portable Runtime native library, BonuncyCastle.org implementation. Default value is "apr".
+ --port|-p VALUE Port of RDP server to connect to. Default value is "3389".
+ --domain|-D VALUE NTLM domain to login into. Default value is "Workgroup".
+ --user|-U VALUE User name to use. Default value is "Administrator".
+ --password|-P VALUE Password to use. If omitted, then login screen will be shown.
+
+HyperV options:
+ --ssl-implementation|-j jre|apr|bco Select SSL engine to use: JRE standard implementation, Apache Portable Runtime native library, BonuncyCastle.org implementation. Default value is "apr".
+ --port|-p VALUE Port of HyperV server to connect to. Default value is "2179".
+ --instance|-i VALUE HyperV instance ID to use. Required.
+ --domain|-D VALUE NTLM domain to login into. Default value is "Workgroup".
+ --user|-U VALUE User name to use. Default value is "Administrator".
+ --password|-P VALUE Password to use. Required.
Limitations of VNC client:
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48c47101/services/console-proxy-rdp/rdpconsole/pom.xml
----------------------------------------------------------------------
diff --git a/services/console-proxy-rdp/rdpconsole/pom.xml b/services/console-proxy-rdp/rdpconsole/pom.xml
old mode 100644
new mode 100755
index d25329a..5737a85
--- a/services/console-proxy-rdp/rdpconsole/pom.xml
+++ b/services/console-proxy-rdp/rdpconsole/pom.xml
@@ -61,11 +61,18 @@
<version>3.8.1</version>
<scope>test</scope>
</dependency>
+ <!-- Apache Portable Runtime implementation of SSL protocol, which is compatible with broken MS RDP SSL suport.
+ NOTE: tomcat-native package with /usr/lib/libtcnative-1.so library is necessary for APR to work. -->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-core</artifactId>
<version>7.0.30</version>
- <scope>test</scope>
+ </dependency>
+ <!-- Another implementation of SSL protocol. Does not work with broken MS RDP SSL too. -->
+ <dependency>
+ <groupId>org.bouncycastle</groupId>
+ <artifactId>bcprov-jdk16</artifactId>
+ <version>1.46</version>
</dependency>
</dependencies>
</project>
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48c47101/services/console-proxy-rdp/rdpconsole/rdp-config.bat
----------------------------------------------------------------------
diff --git a/services/console-proxy-rdp/rdpconsole/rdp-config.bat b/services/console-proxy-rdp/rdpconsole/rdp-config.bat
old mode 100644
new mode 100755
index e951014..f19b00d
--- a/services/console-proxy-rdp/rdpconsole/rdp-config.bat
+++ b/services/console-proxy-rdp/rdpconsole/rdp-config.bat
@@ -16,7 +16,7 @@ rem specific language governing permissions and limitations
rem under the License.
rem
-rem Configure and start RDP service.
+rem Configure and start RDP service. Run this script on RDP server.
rem
rem Turn off firewall
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48c47101/services/console-proxy-rdp/rdpconsole/src/main/java/common/AwtBellAdapter.java
----------------------------------------------------------------------
diff --git a/services/console-proxy-rdp/rdpconsole/src/main/java/common/AwtBellAdapter.java b/services/console-proxy-rdp/rdpconsole/src/main/java/common/AwtBellAdapter.java
deleted file mode 100644
index 5970abb..0000000
--- a/services/console-proxy-rdp/rdpconsole/src/main/java/common/AwtBellAdapter.java
+++ /dev/null
@@ -1,77 +0,0 @@
-// 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 common;
-
-import java.awt.Toolkit;
-
-import streamer.BaseElement;
-import streamer.ByteBuffer;
-import streamer.Element;
-import streamer.FakeSource;
-import streamer.Link;
-import streamer.Pipeline;
-import streamer.PipelineImpl;
-
-public class AwtBellAdapter extends BaseElement {
-
- public AwtBellAdapter(String id) {
- super(id);
- declarePads();
- }
-
- private void declarePads() {
- inputPads.put(STDIN, null);
- }
-
- @Override
- public void handleData(ByteBuffer buf, Link link) {
- if (verbose)
- System.out.println("[" + this + "] INFO: Data received: " + buf + ".");
-
- if (buf == null)
- return;
-
- Toolkit.getDefaultToolkit().beep();
- }
-
- @Override
- public String toString() {
- return "Bell(" + id + ")";
- }
-
- /**
- * Example.
- */
- public static void main(String args[]) {
- System.setProperty("streamer.Element.debug", "true");
-
- Element source = new FakeSource("source") {
- {
- this.incommingBufLength = 0;
- this.delay = 1000;
- this.numBuffers = 3;
- }
- };
-
- Element sink = new AwtBellAdapter("sink");
-
- Pipeline pipeline = new PipelineImpl("test");
- pipeline.addAndLink(source, sink);
- pipeline.runMainLoop("source", STDOUT, false, false);
- }
-
-}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48c47101/services/console-proxy-rdp/rdpconsole/src/main/java/common/AwtCanvasAdapter.java
----------------------------------------------------------------------
diff --git a/services/console-proxy-rdp/rdpconsole/src/main/java/common/AwtCanvasAdapter.java b/services/console-proxy-rdp/rdpconsole/src/main/java/common/AwtCanvasAdapter.java
deleted file mode 100644
index 8adee49..0000000
--- a/services/console-proxy-rdp/rdpconsole/src/main/java/common/AwtCanvasAdapter.java
+++ /dev/null
@@ -1,166 +0,0 @@
-// 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 common;
-
-import java.awt.Graphics2D;
-import java.awt.image.BufferedImage;
-import java.awt.image.WritableRaster;
-
-import rdpclient.ServerBitmapUpdate;
-import streamer.BaseElement;
-import streamer.ByteBuffer;
-import streamer.Element;
-import streamer.Link;
-import streamer.Order;
-import streamer.Pipeline;
-import streamer.PipelineImpl;
-
-public class AwtCanvasAdapter extends BaseElement {
-
- protected ScreenDescription screen;
-
- public AwtCanvasAdapter(String id, BufferedImageCanvas canvas, ScreenDescription screen) {
- super(id);
- this.canvas = canvas;
- this.screen = screen;
- }
-
- protected BufferedImageCanvas canvas;
-
- @Override
- public String toString() {
- return "AwtRdpAdapter(" + id + ")";
- }
-
- @Override
- public void handleData(ByteBuffer buf, Link link) {
- if (verbose)
- System.out.println("[" + this + "] INFO: Data received: " + buf + ".");
-
- Order order = buf.getOrder();
- switch ((OrderType)order.type) {
-
- case BITMAP_UPDATE:
- handleBitmap((BitmapOrder)order, buf);
- break;
-
- case COPY_RECT:
- handleCopyRect((CopyRectOrder)order, buf);
- break;
-
- default:
- throw new RuntimeException("Order is not implemented: " + buf + ".");
- // break;
- }
-
- buf.unref();
- }
-
- 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.repaint(order.x, order.y, order.width, order.height);
-
- }
-
- private void handleBitmap(BitmapOrder order, ByteBuffer buf) {
- // Draw rectangle on offline buffer
- BufferedImage image = canvas.getOfflineImage();
- Graphics2D g = (Graphics2D)image.getGraphics();
-
- for (BitmapRectangle rectangle : order.rectangles) {
- // *DEBUG*/System.out.println("["+this+"] DEBUG: Rectangle: " +
- // rectangle.toString());
-
- int x = rectangle.x;
- int y = rectangle.y;
- int width = rectangle.width;
- int height = rectangle.height;
- int bufferWidth = rectangle.bufferWidth;
- int bufferHeight = rectangle.bufferHeight;
-
- BufferedImage rectImage;
- switch (rectangle.colorDepth) {
- case 8: {
- rectImage = new BufferedImage(bufferWidth, height, BufferedImage.TYPE_BYTE_INDEXED, screen.colorMap);
- WritableRaster raster = rectImage.getRaster();
- raster.setDataElements(0, 0, bufferWidth, bufferHeight, rectangle.bitmapDataStream.toByteArray());
- break;
- }
- case 15: {
- rectImage = new BufferedImage(bufferWidth, height, BufferedImage.TYPE_USHORT_555_RGB);
- WritableRaster raster = rectImage.getRaster();
- raster.setDataElements(0, 0, bufferWidth, bufferHeight, rectangle.bitmapDataStream.toShortArray());
- break;
- }
- case 16: {
- rectImage = new BufferedImage(bufferWidth, height, BufferedImage.TYPE_USHORT_565_RGB);
- WritableRaster raster = rectImage.getRaster();
- raster.setDataElements(0, 0, bufferWidth, bufferHeight, rectangle.bitmapDataStream.toShortArray());
- break;
- }
- case 24:
- case 32: {
- rectImage = new BufferedImage(bufferWidth, height, BufferedImage.TYPE_INT_RGB);
- WritableRaster raster = rectImage.getRaster();
- raster.setDataElements(0, 0, bufferWidth, bufferHeight, rectangle.bitmapDataStream.toIntLEArray());
- break;
- }
- default:
- throw new RuntimeException("Unsupported color depth: " + rectangle.colorDepth + ".");
- }
-
- g.setClip(x, y, width, height);
- g.drawImage(rectImage, x, y, null);
-
- // Request update of repainted area
- canvas.repaint(x, y, width, height);
- }
-
- }
-
- /**
- * Example.
- */
- public static void main(String args[]) {
- // System.setProperty("streamer.Link.debug", "true");
- // System.setProperty("streamer.Element.debug", "true");
- // System.setProperty("streamer.Pipeline.debug", "true");
- ByteBuffer packet =
- new ByteBuffer(new byte[] {0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x10, 0x00, 0x01, 0x00, 0x10, 0x00, 0x01, 0x04, 0x0a,
- 0x00, 0x0c, (byte)0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00});
-
- Pipeline pipeline = new PipelineImpl("test");
-
- Element bitmap = new ServerBitmapUpdate("bitmap");
-
- BufferedImageCanvas canvas = new BufferedImageCanvas(1024, 768);
- Element adapter = new AwtCanvasAdapter("test", canvas, null) {
- {
- verbose = true;
- }
- };
- pipeline.addAndLink(bitmap, adapter);
-
- bitmap.handleData(packet, null);
-
- }
-
-}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48c47101/services/console-proxy-rdp/rdpconsole/src/main/java/common/AwtClipboardAdapter.java
----------------------------------------------------------------------
diff --git a/services/console-proxy-rdp/rdpconsole/src/main/java/common/AwtClipboardAdapter.java b/services/console-proxy-rdp/rdpconsole/src/main/java/common/AwtClipboardAdapter.java
deleted file mode 100644
index 75dc1b9..0000000
--- a/services/console-proxy-rdp/rdpconsole/src/main/java/common/AwtClipboardAdapter.java
+++ /dev/null
@@ -1,56 +0,0 @@
-// 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 common;
-
-import java.awt.Toolkit;
-import java.awt.datatransfer.StringSelection;
-
-import streamer.BaseElement;
-import streamer.ByteBuffer;
-import streamer.Link;
-import vncclient.VncMessageHandler;
-
-public class AwtClipboardAdapter extends BaseElement {
-
- public AwtClipboardAdapter(String id) {
- super(id);
- declarePads();
- }
-
- private void declarePads() {
- inputPads.put(STDIN, null);
- }
-
- @Override
- public void handleData(ByteBuffer buf, Link link) {
- if (verbose)
- System.out.println("[" + this + "] INFO: Data received: " + buf + ".");
-
- if (buf == null)
- return;
-
- String content = (String)buf.getMetadata(VncMessageHandler.CLIPBOARD_CONTENT);
- StringSelection contents = new StringSelection(content);
- Toolkit.getDefaultToolkit().getSystemClipboard().setContents(contents, null);
- }
-
- @Override
- public String toString() {
- return "Clipboard(" + id + ")";
- }
-
-}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48c47101/services/console-proxy-rdp/rdpconsole/src/main/java/common/AwtKeyEventSource.java
----------------------------------------------------------------------
diff --git a/services/console-proxy-rdp/rdpconsole/src/main/java/common/AwtKeyEventSource.java b/services/console-proxy-rdp/rdpconsole/src/main/java/common/AwtKeyEventSource.java
old mode 100644
new mode 100755
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48c47101/services/console-proxy-rdp/rdpconsole/src/main/java/common/AwtMouseEventSource.java
----------------------------------------------------------------------
diff --git a/services/console-proxy-rdp/rdpconsole/src/main/java/common/AwtMouseEventSource.java b/services/console-proxy-rdp/rdpconsole/src/main/java/common/AwtMouseEventSource.java
old mode 100644
new mode 100755
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48c47101/services/console-proxy-rdp/rdpconsole/src/main/java/common/BitmapOrder.java
----------------------------------------------------------------------
diff --git a/services/console-proxy-rdp/rdpconsole/src/main/java/common/BitmapOrder.java b/services/console-proxy-rdp/rdpconsole/src/main/java/common/BitmapOrder.java
old mode 100644
new mode 100755
index 3a25c8f..8d64331
--- a/services/console-proxy-rdp/rdpconsole/src/main/java/common/BitmapOrder.java
+++ b/services/console-proxy-rdp/rdpconsole/src/main/java/common/BitmapOrder.java
@@ -40,7 +40,8 @@ public class BitmapOrder extends Order {
@Override
public String toString() {
final int maxLen = 10;
- return String.format("BitmapUpdateOrder [rectangles=%s]", rectangles != null ? Arrays.asList(rectangles).subList(0, Math.min(rectangles.length, maxLen)) : null);
+ return String.format("BitmapUpdateOrder [rectangles=%s]", rectangles != null ? Arrays.asList(rectangles).subList(0, Math.min(rectangles.length, maxLen))
+ : null);
}
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48c47101/services/console-proxy-rdp/rdpconsole/src/main/java/common/BitmapRectangle.java
----------------------------------------------------------------------
diff --git a/services/console-proxy-rdp/rdpconsole/src/main/java/common/BitmapRectangle.java b/services/console-proxy-rdp/rdpconsole/src/main/java/common/BitmapRectangle.java
old mode 100644
new mode 100755
index 08dcbf6..1685114
--- a/services/console-proxy-rdp/rdpconsole/src/main/java/common/BitmapRectangle.java
+++ b/services/console-proxy-rdp/rdpconsole/src/main/java/common/BitmapRectangle.java
@@ -65,8 +65,10 @@ public class BitmapRectangle {
@Override
public String toString() {
- return String.format("BitmapUpdateRectangle [x=%s, y=%s, width=%s, height=%s, bitsPerPixel=%s, bitmapDataStream=%s]", x, y, width, height, colorDepth,
- bitmapDataStream);
+ return String
+ .format(
+ "BitmapUpdateRectangle [x=%s, y=%s, width=%s, height=%s, bitsPerPixel=%s, bitmapDataStream=%s]",
+ x, y, width, height, colorDepth, bitmapDataStream);
}
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48c47101/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
old mode 100644
new mode 100755
index 2418de3..43abb27
--- a/services/console-proxy-rdp/rdpconsole/src/main/java/common/BufferedImageCanvas.java
+++ b/services/console-proxy-rdp/rdpconsole/src/main/java/common/BufferedImageCanvas.java
@@ -49,7 +49,7 @@ public class BufferedImageCanvas extends Canvas {
}
public void setCanvasSize(int width, int height) {
- this.offlineImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
+ offlineImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
graphics = offlineImage.createGraphics();
setSize(offlineImage.getWidth(), offlineImage.getHeight());
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48c47101/services/console-proxy-rdp/rdpconsole/src/main/java/common/BufferedImageCopyRectAdapter.java
----------------------------------------------------------------------
diff --git a/services/console-proxy-rdp/rdpconsole/src/main/java/common/BufferedImageCopyRectAdapter.java b/services/console-proxy-rdp/rdpconsole/src/main/java/common/BufferedImageCopyRectAdapter.java
old mode 100644
new mode 100755
index 28bf640..804cab7
--- a/services/console-proxy-rdp/rdpconsole/src/main/java/common/BufferedImageCopyRectAdapter.java
+++ b/services/console-proxy-rdp/rdpconsole/src/main/java/common/BufferedImageCopyRectAdapter.java
@@ -81,23 +81,23 @@ public class BufferedImageCopyRectAdapter extends BaseElement {
Element renderer = new BufferedImageCopyRectAdapter("renderer", canvas);
int[] pixelsBeforeCopy = new int[] {
- // 0
- 1, 2, 3, 4,
- // 1
- 5, 6, 7, 8,
- // 2
- 9, 10, 11, 12,
- // 3
- 13, 14, 15, 16};
+ // 0
+ 1, 2, 3, 4,
+ // 1
+ 5, 6, 7, 8,
+ // 2
+ 9, 10, 11, 12,
+ // 3
+ 13, 14, 15, 16};
int[] pixelsAfterCopy = new int[] {
- // 0
- 11, 12, 3, 4,
- // 1
- 15, 16, 7, 8,
- // 2
- 9, 10, 11, 12,
- // 3
- 13, 14, 15, 16};
+ // 0
+ 11, 12, 3, 4,
+ // 1
+ 15, 16, 7, 8,
+ // 2
+ 9, 10, 11, 12,
+ // 3
+ 13, 14, 15, 16};
// Initalize image
int[] data = ((DataBufferInt)canvas.getOfflineImage().getRaster().getDataBuffer()).getData();
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48c47101/services/console-proxy-rdp/rdpconsole/src/main/java/common/BufferedImagePixelsAdapter.java
----------------------------------------------------------------------
diff --git a/services/console-proxy-rdp/rdpconsole/src/main/java/common/BufferedImagePixelsAdapter.java b/services/console-proxy-rdp/rdpconsole/src/main/java/common/BufferedImagePixelsAdapter.java
old mode 100644
new mode 100755
index e93df3e..396bdd4
--- a/services/console-proxy-rdp/rdpconsole/src/main/java/common/BufferedImagePixelsAdapter.java
+++ b/services/console-proxy-rdp/rdpconsole/src/main/java/common/BufferedImagePixelsAdapter.java
@@ -82,32 +82,32 @@ public class BufferedImagePixelsAdapter extends BaseElement {
switch (dataBuf.getDataType()) {
- case DataBuffer.TYPE_INT: {
+ case DataBuffer.TYPE_INT: {
- // Convert array of bytes to array of int's
- int[] intArray = buf.toIntLEArray();
+ // Convert array of bytes to array of int's
+ int[] intArray = buf.toIntLEArray();
- // We chose RGB888 model, so Raster will use DataBufferInt type
- DataBufferInt dataBuffer = (DataBufferInt)dataBuf;
+ // We chose RGB888 model, so Raster will use DataBufferInt type
+ DataBufferInt dataBuffer = (DataBufferInt)dataBuf;
- int imageWidth = image.getWidth();
- int imageHeight = image.getHeight();
+ int imageWidth = image.getWidth();
+ int imageHeight = image.getHeight();
- // Paint rectangle directly on buffer, line by line
- int[] imageBuffer = dataBuffer.getData();
+ // Paint rectangle directly on buffer, line by line
+ int[] imageBuffer = dataBuffer.getData();
- for (int srcLine = 0, dstLine = y; srcLine < rectHeight && dstLine < imageHeight; srcLine++, dstLine++) {
- try {
- System.arraycopy(intArray, srcLine * rectWidth, imageBuffer, x + dstLine * imageWidth, rectWidth);
- } catch (IndexOutOfBoundsException e) {
- }
+ for (int srcLine = 0, dstLine = y; srcLine < rectHeight && dstLine < imageHeight; srcLine++, dstLine++) {
+ try {
+ System.arraycopy(intArray, srcLine * rectWidth, imageBuffer, x + dstLine * imageWidth, rectWidth);
+ } catch (IndexOutOfBoundsException e) {
}
- break;
}
+ break;
+ }
- default:
- throw new RuntimeException("Unsupported data buffer in buffered image: expected data buffer of type int (DataBufferInt). Actual data buffer type: " +
- dataBuf.getClass().getSimpleName());
+ default:
+ throw new RuntimeException("Unsupported data buffer in buffered image: expected data buffer of type int (DataBufferInt). Actual data buffer type: "
+ + dataBuf.getClass().getSimpleName());
}
// Request update of repainted area
@@ -123,13 +123,11 @@ public class BufferedImagePixelsAdapter extends BaseElement {
Element renderer = new BufferedImagePixelsAdapter("renderer", canvas);
- byte[] pixels =
- new byte[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,
- 12, 13, 14, 15, 16, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
+ byte[] pixels = new byte[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 1, 2, 3, 4, 5,
+ 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
- int[] pixelsLE =
- new int[] {0x04030201, 0x08070605, 0x0c0b0a09, 0x100f0e0d, 0x04030201, 0x08070605, 0x0c0b0a09, 0x100f0e0d, 0x04030201, 0x08070605, 0x0c0b0a09, 0x100f0e0d,
- 0x04030201, 0x08070605, 0x0c0b0a09, 0x100f0e0d};
+ int[] pixelsLE = new int[] {0x04030201, 0x08070605, 0x0c0b0a09, 0x100f0e0d, 0x04030201, 0x08070605, 0x0c0b0a09, 0x100f0e0d, 0x04030201, 0x08070605,
+ 0x0c0b0a09, 0x100f0e0d, 0x04030201, 0x08070605, 0x0c0b0a09, 0x100f0e0d};
ByteBuffer buf = new ByteBuffer(pixels);
buf.putMetadata(TARGET_X, 0);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48c47101/services/console-proxy-rdp/rdpconsole/src/main/java/common/Client.java
----------------------------------------------------------------------
diff --git a/services/console-proxy-rdp/rdpconsole/src/main/java/common/Client.java b/services/console-proxy-rdp/rdpconsole/src/main/java/common/Client.java
old mode 100644
new mode 100755
index b6dc4a2..688693b
--- a/services/console-proxy-rdp/rdpconsole/src/main/java/common/Client.java
+++ b/services/console-proxy-rdp/rdpconsole/src/main/java/common/Client.java
@@ -22,46 +22,216 @@ import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.net.InetSocketAddress;
+import java.util.Arrays;
import rdpclient.RdpClient;
import streamer.Element;
import streamer.Pipeline;
import streamer.PipelineImpl;
import streamer.SocketWrapper;
+import streamer.SocketWrapperImpl;
+import streamer.apr.AprSocketWrapperImpl;
+import streamer.bco.BcoSocketWrapperImpl;
+import streamer.ssl.SSLState;
import vncclient.VncClient;
+import common.opt.IntOption;
+import common.opt.Option;
+import common.opt.OptionParser;
+import common.opt.StringEnumerationOption;
+import common.opt.StringOption;
public class Client {
+ enum Protocol {
+ NONE, VNC, RDP, HYPERV
+ }
+
+ // Common options
+ private Option help = new Option() {
+ {
+ name = "--help";
+ alias = "-h";
+ description = "Show this help text.";
+ }
+ };
+ private Option debugLink = new Option() {
+ {
+ name = "--debug-link";
+ alias = "-DL";
+ description = "Print debugging messages when packets are trasnferred via links.";
+ }
+ };
+ private Option debugElement = new Option() {
+ {
+ name = "--debug-element";
+ alias = "-DE";
+ description = "Print debugging messages when packets are received or sended by elements.";
+ }
+ };
+ private Option debugPipeline = new Option() {
+ {
+ name = "--debug-pipeline";
+ alias = "-DP";
+ description = "Print debugging messages in pipelines.";
+ }
+ };
+
+ private StringOption hostName = new StringOption() {
+ {
+ name = "--host";
+ alias = "-n";
+ aliases = new String[] {"--host-name"};
+ required = true;
+ description = "Name or IP address of host to connect to.";
+ }
+ };
+ private IntOption canvasWidth = new IntOption() {
+ {
+ name = "--width";
+ alias = "-W";
+ value = 1024;
+ description = "Width of canvas.";
+ }
+ };
+
+ private IntOption canvasHeight = new IntOption() {
+ {
+ name = "--height";
+ alias = "-H";
+ value = 768;
+ description = "Height of canvas.";
+ }
+ };
+
+ // Protocol specific options
+
+ private IntOption vncPort = new IntOption() {
+ {
+ name = "--port";
+ alias = "-p";
+ value = 5901;
+ description = "Port of VNC display server to connect to. Calculate as 5900 + display number, e.g. 5900 for display #0, 5901 for display #1, and so on.";
+ }
+ };
+
+ private IntOption rdpPort = new IntOption() {
+ {
+ name = "--port";
+ alias = "-p";
+ value = 3389;
+ description = "Port of RDP server to connect to.";
+ }
+ };
+
+ private IntOption hyperVPort = new IntOption() {
+ {
+ name = "--port";
+ alias = "-p";
+ value = 2179;
+ description = "Port of HyperV server to connect to.";
+ }
+ };
+
+ private StringOption password = new StringOption() {
+ {
+ name = "--password";
+ alias = "-P";
+ required = true;
+ description = "Password to use.";
+ }
+ };
+
+ private StringOption rdpPassword = new StringOption() {
+ {
+ name = "--password";
+ alias = "-P";
+ required = false;
+ description = "Password to use. If omitted, then login screen will be shown.";
+ }
+ };
+
+ private StringOption userName = new StringOption() {
+ {
+ name = "--user";
+ alias = "-U";
+ value = "Administrator";
+ description = "User name to use.";
+ }
+ };
+
+ private StringOption domain = new StringOption() {
+ {
+ name = "--domain";
+ alias = "-D";
+ value = "Workgroup";
+ description = "NTLM domain to login into.";
+ }
+ };
+
+ private StringOption hyperVInstanceId = new StringOption() {
+ {
+ name = "--instance";
+ alias = "-i";
+ required = true;
+ description = "HyperV instance ID to use.";
+ }
+ };
+ private StringEnumerationOption sslImplementation = new StringEnumerationOption() {
+ {
+ name = "--ssl-implementation";
+ alias = "-j";
+ value = "apr";
+ choices = new String[] {"jre", "apr", "bco"};
+ description = "Select SSL engine to use: JRE standard implementation, Apache Portable Runtime native library, BonuncyCastle.org implementation.";
+ }
+ };
+
+ private final Option[] commonOptions = new Option[] {help, debugLink, debugElement, debugPipeline, hostName, canvasWidth, canvasHeight};
+ private final Option[] vncOptions = new Option[] {vncPort, password};
+ private final Option[] rdpOptions = new Option[] {sslImplementation, rdpPort, domain, userName, rdpPassword};
+ private final Option[] hyperVOptions = new Option[] {sslImplementation, hyperVPort, hyperVInstanceId, domain, userName, password};
+
private static Frame frame;
private static SocketWrapper socket;
private static ScrollPane scroller;
private static ScreenDescription screen;
private static BufferedImageCanvas canvas;
- public static void main(String args[]) {
- // System.setProperty("streamer.Link.debug", "true");
- // System.setProperty("streamer.Element.debug", "true");
- // System.setProperty("streamer.Pipeline.debug", "true");
+ private void help() {
+ System.out.println("Usage: \n java common.Client vnc|rdp|hyperv OPTIONS\n");
+ System.out.println(Option.toHelp("Common options", commonOptions));
+ System.out.println(Option.toHelp("VNC options", vncOptions));
+ System.out.println(Option.toHelp("RDP options", rdpOptions));
+ System.out.println(Option.toHelp("HyperV options", hyperVOptions));
+ }
+
+ public void runClient(String[] args) {
try {
- if (args.length < 4) {
- System.out.println("Usage: \n java common.Client vnc IP PORT PASSWORD\n java common.Client rdp IP PORT username\n");
- System.exit(0);
- }
- String connectionType = args[0];
- String hostname = args[1];
- int port = Integer.parseInt(args[2]);
- String userNameOrPassword = args[3];
+ Protocol protocol = parseOptions(args);
+ if (protocol == Protocol.NONE)
+ return;
- // Create address from arguments
- InetSocketAddress address = new InetSocketAddress(hostname, port);
+ System.setProperty("streamer.Link.debug", "" + debugLink.used);
+ System.setProperty("streamer.Element.debug", "" + debugElement.used);
+ System.setProperty("streamer.Pipeline.debug", "" + debugPipeline.used);
+
+ SSLState sslState = new SSLState();
// Create socket wrapper
- socket = new SocketWrapper("socket");
+ if ("jre".equals(sslImplementation.value)) {
+ socket = new SocketWrapperImpl("socket", sslState);
+ } else if ("apr".equals(sslImplementation.value)) {
+ socket = new AprSocketWrapperImpl("socket", sslState);
+ } else if ("bco".equals(sslImplementation.value)) {
+ socket = new BcoSocketWrapperImpl("socket", sslState);
+ } else {
+ throw new RuntimeException("Unexpected option value: \"" + sslImplementation.value + "\". " + sslImplementation.help());
+ }
screen = new ScreenDescription();
- canvas = new BufferedImageCanvas(1024, 768);
+ canvas = new BufferedImageCanvas(canvasWidth.value, canvasHeight.value);
screen.addSizeChangeListener(new SizeChangeListener() {
@Override
public void sizeChanged(int width, int height) {
@@ -74,13 +244,24 @@ public class Client {
});
// Assemble pipeline
+ InetSocketAddress address;
Element main;
- if ("vnc".equals(connectionType)) {
- main = new VncClient("client", userNameOrPassword, screen, canvas);
- } else if ("rdp".equals(connectionType)) {
- main = new RdpClient("client", userNameOrPassword, screen, canvas);
- } else {
- throw new RuntimeException("Unknown connection type. Expected value: \"vnc\" or \"rdp\", actual value: \"" + connectionType + "\".");
+ switch (protocol) {
+ case VNC:
+ address = new InetSocketAddress(hostName.value, vncPort.value);
+ main = new VncClient("client", password.value, screen, canvas);
+ break;
+ case RDP:
+ address = new InetSocketAddress(hostName.value, rdpPort.value);
+ main = new RdpClient("client", hostName.value, domain.value, userName.value, rdpPassword.value, null, screen, canvas, sslState);
+ break;
+ case HYPERV:
+ address = new InetSocketAddress(hostName.value, hyperVPort.value);
+ main = new RdpClient("client", hostName.value, domain.value, userName.value, password.value, hyperVInstanceId.value, screen, canvas, sslState);
+ break;
+ default:
+ address = null;
+ main = null;
}
Pipeline pipeline = new PipelineImpl("Client");
@@ -89,7 +270,7 @@ public class Client {
pipeline.validate();
- frame = createVncClientMainWindow(canvas, "VNC", new WindowAdapter() {
+ frame = createVncClientMainWindow(canvas, protocol.toString() + " " + hostName.value, new WindowAdapter() {
@Override
public void windowClosing(WindowEvent evt) {
shutdown();
@@ -108,6 +289,41 @@ public class Client {
}
}
+ private Protocol parseOptions(String[] args) {
+ String protocolName = (args.length > 0) ? args[0] : "";
+ Protocol protocol = Protocol.NONE;
+
+ Option[] options;
+ if (protocolName.equals("vnc")) {
+ protocol = Protocol.VNC;
+ options = join(commonOptions, vncOptions);
+ } else if (protocolName.equals("rdp")) {
+ protocol = Protocol.RDP;
+ options = join(commonOptions, rdpOptions);
+ } else if (protocolName.equals("hyperv")) {
+ protocol = Protocol.HYPERV;
+ options = join(commonOptions, hyperVOptions);
+ } else {
+ help();
+ return Protocol.NONE;
+ }
+
+ // Parse all options for given protocol
+ String[] arguments = OptionParser.parseOptions(args, 1, options);
+
+ if (arguments.length > 0) {
+ System.err.println("[Client] ERROR: Arguments are not allowed here. Check command syntax. Extra arguments: \"" + Arrays.toString(arguments) + "\".");
+ help();
+ return Protocol.NONE;
+ }
+
+ if (help.used) {
+ help();
+ return Protocol.NONE;
+ }
+ return protocol;
+ }
+
protected static void shutdown() {
if (frame != null) {
frame.setVisible(false);
@@ -135,4 +351,25 @@ public class Client {
return frame;
}
+ /**
+ * Join two arrays with options and return new array.
+ */
+ private Option[] join(Option[] a1, Option[] a2) {
+ // Extend first array
+ Option[] result = Arrays.copyOf(a1, a1.length + a2.length);
+
+ // Append second array to first
+ for (int i = 0, p = a1.length; i < a2.length; i++, p++)
+ result[p] = a2[i];
+
+ return result;
+ }
+
+ public static void main(String args[]) {
+ // *DEBUG*/System.setProperty("javax.net.debug", "ssl");
+ // * DEBUG */System.setProperty("javax.net.debug", "ssl:record:packet");
+
+ new Client().runClient(args);
+ }
+
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48c47101/services/console-proxy-rdp/rdpconsole/src/main/java/common/CopyRectOrder.java
----------------------------------------------------------------------
diff --git a/services/console-proxy-rdp/rdpconsole/src/main/java/common/CopyRectOrder.java b/services/console-proxy-rdp/rdpconsole/src/main/java/common/CopyRectOrder.java
old mode 100644
new mode 100755
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48c47101/services/console-proxy-rdp/rdpconsole/src/main/java/common/KeyOrder.java
----------------------------------------------------------------------
diff --git a/services/console-proxy-rdp/rdpconsole/src/main/java/common/KeyOrder.java b/services/console-proxy-rdp/rdpconsole/src/main/java/common/KeyOrder.java
old mode 100644
new mode 100755
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48c47101/services/console-proxy-rdp/rdpconsole/src/main/java/common/MouseOrder.java
----------------------------------------------------------------------
diff --git a/services/console-proxy-rdp/rdpconsole/src/main/java/common/MouseOrder.java b/services/console-proxy-rdp/rdpconsole/src/main/java/common/MouseOrder.java
old mode 100644
new mode 100755
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48c47101/services/console-proxy-rdp/rdpconsole/src/main/java/common/OrderType.java
----------------------------------------------------------------------
diff --git a/services/console-proxy-rdp/rdpconsole/src/main/java/common/OrderType.java b/services/console-proxy-rdp/rdpconsole/src/main/java/common/OrderType.java
old mode 100644
new mode 100755
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48c47101/services/console-proxy-rdp/rdpconsole/src/main/java/common/ScreenDescription.java
----------------------------------------------------------------------
diff --git a/services/console-proxy-rdp/rdpconsole/src/main/java/common/ScreenDescription.java b/services/console-proxy-rdp/rdpconsole/src/main/java/common/ScreenDescription.java
old mode 100644
new mode 100755
index a9155e8..1c33a63
--- a/services/console-proxy-rdp/rdpconsole/src/main/java/common/ScreenDescription.java
+++ b/services/console-proxy-rdp/rdpconsole/src/main/java/common/ScreenDescription.java
@@ -56,12 +56,12 @@ public class ScreenDescription {
* Store information about server pixel format.
*/
public void setPixelFormat(int bitsPerPixel, int depth, boolean bigEndianFlag, boolean trueColorFlag, int redMax, int greenMax, int blueMax, int redShift,
- int greenShift, int blueShift) {
+ int greenShift, int blueShift) {
- this.bytesPerPixel = (bitsPerPixel + 7) / 8;
+ bytesPerPixel = (bitsPerPixel + 7) / 8;
this.bitsPerPixel = bitsPerPixel;
- this.colorDepth = depth;
+ colorDepth = depth;
this.bigEndianFlag = bigEndianFlag;
this.trueColorFlag = trueColorFlag;
@@ -79,23 +79,23 @@ public class ScreenDescription {
public void setPixelFormatRGBTrueColor(int bitsPerPixel) {
switch (bitsPerPixel) {
- case 8:
- setPixelFormat(8, 8, false, false, -1, -1, -1, -1, -1, -1);
- break;
- case 15:
- setPixelFormat(16, 15, false, true, 31, 31, 31, 0, 5, 10);
- break;
- case 16:
- setPixelFormat(16, 16, false, true, 31, 63, 31, 0, 5, 11);
- break;
- case 24:
- setPixelFormat(24, 24, false, true, 255, 255, 255, 0, 8, 16);
- break;
- case 32:
- setPixelFormat(32, 24, false, true, 255, 255, 255, 0, 8, 16);
- break;
- default:
- throw new RuntimeException("Unknown color depth.");
+ case 8:
+ setPixelFormat(8, 8, false, false, -1, -1, -1, -1, -1, -1);
+ break;
+ case 15:
+ setPixelFormat(16, 15, false, true, 31, 31, 31, 0, 5, 10);
+ break;
+ case 16:
+ setPixelFormat(16, 16, false, true, 31, 63, 31, 0, 5, 11);
+ break;
+ case 24:
+ setPixelFormat(24, 24, false, true, 255, 255, 255, 0, 8, 16);
+ break;
+ case 32:
+ setPixelFormat(32, 24, false, true, 255, 255, 255, 0, 8, 16);
+ break;
+ default:
+ throw new RuntimeException("Unknown color depth.");
}
}
@@ -107,8 +107,8 @@ public class ScreenDescription {
if (height <= 0 || width <= 0)
throw new RuntimeException("Incorrect framebuffer size: " + width + "x" + height + ".");
- this.framebufferWidth = width;
- this.framebufferHeight = height;
+ framebufferWidth = width;
+ framebufferHeight = height;
callSizeChangeListeners(width, height);
}
@@ -145,16 +145,16 @@ public class ScreenDescription {
}
public boolean isRGB888_32_LE() {
- return (colorDepth == 24 && bitsPerPixel == 32 && redShift == 0 && greenShift == 8 && blueShift == 16 && redMax == 255 && greenMax == 255 && blueMax == 255 &&
- !bigEndianFlag && trueColorFlag);
+ return (colorDepth == 24 && bitsPerPixel == 32 && redShift == 0 && greenShift == 8 && blueShift == 16 && redMax == 255 && greenMax == 255 && blueMax == 255
+ && !bigEndianFlag && trueColorFlag);
}
@Override
public String toString() {
- return "ScreenDescription [framebufferWidth=" + framebufferWidth + ", framebufferHeight=" + framebufferHeight + ", desktopName=" + desktopName +
- ", bytesPerPixel=" + bytesPerPixel + ", depth=" + colorDepth + ", bitsPerPixel=" + bitsPerPixel + ", redShift=" + redShift + ", greenShift=" + greenShift +
- ", blueShift=" + blueShift + ", redMax=" + redMax + ", greenMax=" + greenMax + ", blueMax=" + blueMax + ", bigEndianFlag=" + bigEndianFlag +
- ", trueColorFlag=" + trueColorFlag + "]";
+ return "ScreenDescription [framebufferWidth=" + framebufferWidth + ", framebufferHeight=" + framebufferHeight + ", desktopName=" + desktopName
+ + ", bytesPerPixel=" + bytesPerPixel + ", depth=" + colorDepth + ", bitsPerPixel=" + bitsPerPixel + ", redShift=" + redShift + ", greenShift=" + greenShift
+ + ", blueShift=" + blueShift + ", redMax=" + redMax + ", greenMax=" + greenMax + ", blueMax=" + blueMax + ", bigEndianFlag=" + bigEndianFlag
+ + ", trueColorFlag=" + trueColorFlag + "]";
}
public void addSizeChangeListener(SizeChangeListener sizeChangeListener) {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48c47101/services/console-proxy-rdp/rdpconsole/src/main/java/common/SizeChangeListener.java
----------------------------------------------------------------------
diff --git a/services/console-proxy-rdp/rdpconsole/src/main/java/common/SizeChangeListener.java b/services/console-proxy-rdp/rdpconsole/src/main/java/common/SizeChangeListener.java
old mode 100644
new mode 100755
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48c47101/services/console-proxy-rdp/rdpconsole/src/main/java/common/adapter/AwtBellAdapter.java
----------------------------------------------------------------------
diff --git a/services/console-proxy-rdp/rdpconsole/src/main/java/common/adapter/AwtBellAdapter.java b/services/console-proxy-rdp/rdpconsole/src/main/java/common/adapter/AwtBellAdapter.java
new file mode 100755
index 0000000..c25b07f
--- /dev/null
+++ b/services/console-proxy-rdp/rdpconsole/src/main/java/common/adapter/AwtBellAdapter.java
@@ -0,0 +1,77 @@
+// 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 common.adapter;
+
+import java.awt.Toolkit;
+
+import streamer.BaseElement;
+import streamer.ByteBuffer;
+import streamer.Element;
+import streamer.Link;
+import streamer.Pipeline;
+import streamer.PipelineImpl;
+import streamer.debug.FakeSource;
+
+public class AwtBellAdapter extends BaseElement {
+
+ public AwtBellAdapter(String id) {
+ super(id);
+ declarePads();
+ }
+
+ private void declarePads() {
+ inputPads.put(STDIN, null);
+ }
+
+ @Override
+ public void handleData(ByteBuffer buf, Link link) {
+ if (verbose)
+ System.out.println("[" + this + "] INFO: Data received: " + buf + ".");
+
+ if (buf == null)
+ return;
+
+ Toolkit.getDefaultToolkit().beep();
+ }
+
+ @Override
+ public String toString() {
+ return "Bell(" + id + ")";
+ }
+
+ /**
+ * Example.
+ */
+ public static void main(String args[]) {
+ System.setProperty("streamer.Element.debug", "true");
+
+ Element source = new FakeSource("source") {
+ {
+ incommingBufLength = 0;
+ delay = 1000;
+ numBuffers = 3;
+ }
+ };
+
+ Element sink = new AwtBellAdapter("sink");
+
+ Pipeline pipeline = new PipelineImpl("test");
+ pipeline.addAndLink(source, sink);
+ pipeline.runMainLoop("source", STDOUT, false, false);
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48c47101/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
new file mode 100755
index 0000000..55ca8fd
--- /dev/null
+++ b/services/console-proxy-rdp/rdpconsole/src/main/java/common/adapter/AwtCanvasAdapter.java
@@ -0,0 +1,171 @@
+// 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 common.adapter;
+
+import java.awt.Graphics2D;
+import java.awt.image.BufferedImage;
+import java.awt.image.WritableRaster;
+
+import rdpclient.rdp.ServerBitmapUpdate;
+import streamer.BaseElement;
+import streamer.ByteBuffer;
+import streamer.Element;
+import streamer.Link;
+import streamer.Order;
+import streamer.Pipeline;
+import streamer.PipelineImpl;
+import common.BitmapOrder;
+import common.BitmapRectangle;
+import common.BufferedImageCanvas;
+import common.CopyRectOrder;
+import common.OrderType;
+import common.ScreenDescription;
+
+public class AwtCanvasAdapter extends BaseElement {
+
+ protected ScreenDescription screen;
+
+ public AwtCanvasAdapter(String id, BufferedImageCanvas canvas, ScreenDescription screen) {
+ super(id);
+ this.canvas = canvas;
+ this.screen = screen;
+ }
+
+ protected BufferedImageCanvas canvas;
+
+ @Override
+ public String toString() {
+ return "AwtRdpAdapter(" + id + ")";
+ }
+
+ @Override
+ public void handleData(ByteBuffer buf, Link link) {
+ if (verbose)
+ System.out.println("[" + this + "] INFO: Data received: " + buf + ".");
+
+ Order order = buf.getOrder();
+ switch ((OrderType)order.type) {
+
+ case BITMAP_UPDATE:
+ handleBitmap((BitmapOrder)order, buf);
+ break;
+
+ case COPY_RECT:
+ handleCopyRect((CopyRectOrder)order, buf);
+ break;
+
+ default:
+ throw new RuntimeException("Order is not implemented: " + buf + ".");
+ // break;
+ }
+
+ buf.unref();
+ }
+
+ 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.repaint(order.x, order.y, order.width, order.height);
+
+ }
+
+ private void handleBitmap(BitmapOrder order, ByteBuffer buf) {
+ // Draw rectangle on offline buffer
+ BufferedImage image = canvas.getOfflineImage();
+ Graphics2D g = (Graphics2D)image.getGraphics();
+
+ for (BitmapRectangle rectangle : order.rectangles) {
+ // *DEBUG*/System.out.println("["+this+"] DEBUG: Rectangle: " +
+ // rectangle.toString());
+
+ int x = rectangle.x;
+ int y = rectangle.y;
+ int width = rectangle.width;
+ int height = rectangle.height;
+ int bufferWidth = rectangle.bufferWidth;
+ int bufferHeight = rectangle.bufferHeight;
+
+ BufferedImage rectImage;
+ switch (rectangle.colorDepth) {
+ case 8: {
+ rectImage = new BufferedImage(bufferWidth, height, BufferedImage.TYPE_BYTE_INDEXED, screen.colorMap);
+ WritableRaster raster = rectImage.getRaster();
+ raster.setDataElements(0, 0, bufferWidth, bufferHeight, rectangle.bitmapDataStream.toByteArray());
+ break;
+ }
+ case 15: {
+ rectImage = new BufferedImage(bufferWidth, height, BufferedImage.TYPE_USHORT_555_RGB);
+ WritableRaster raster = rectImage.getRaster();
+ raster.setDataElements(0, 0, bufferWidth, bufferHeight, rectangle.bitmapDataStream.toShortArray());
+ break;
+ }
+ case 16: {
+ rectImage = new BufferedImage(bufferWidth, height, BufferedImage.TYPE_USHORT_565_RGB);
+ WritableRaster raster = rectImage.getRaster();
+ raster.setDataElements(0, 0, bufferWidth, bufferHeight, rectangle.bitmapDataStream.toShortArray());
+ break;
+ }
+ case 24:
+ case 32: {
+ rectImage = new BufferedImage(bufferWidth, height, BufferedImage.TYPE_INT_RGB);
+ WritableRaster raster = rectImage.getRaster();
+ raster.setDataElements(0, 0, bufferWidth, bufferHeight, rectangle.bitmapDataStream.toIntLEArray());
+ break;
+ }
+ default:
+ throw new RuntimeException("Unsupported color depth: " + rectangle.colorDepth + ".");
+ }
+
+ g.setClip(x, y, width, height);
+ g.drawImage(rectImage, x, y, null);
+
+ // Request update of repainted area
+ canvas.repaint(x, y, width, height);
+ }
+
+ }
+
+ /**
+ * Example.
+ */
+ public static void main(String args[]) {
+ // System.setProperty("streamer.Link.debug", "true");
+ // System.setProperty("streamer.Element.debug", "true");
+ // System.setProperty("streamer.Pipeline.debug", "true");
+ ByteBuffer packet = new ByteBuffer(new byte[] {0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x10, 0x00, 0x01, 0x00, 0x10, 0x00,
+ 0x01, 0x04, 0x0a, 0x00, 0x0c, (byte)0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00});
+
+ Pipeline pipeline = new PipelineImpl("test");
+
+ Element bitmap = new ServerBitmapUpdate("bitmap");
+
+ BufferedImageCanvas canvas = new BufferedImageCanvas(1024, 768);
+ Element adapter = new AwtCanvasAdapter("test", canvas, null) {
+ {
+ verbose = true;
+ }
+ };
+ pipeline.addAndLink(bitmap, adapter);
+
+ bitmap.handleData(packet, null);
+
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48c47101/services/console-proxy-rdp/rdpconsole/src/main/java/common/adapter/AwtClipboardAdapter.java
----------------------------------------------------------------------
diff --git a/services/console-proxy-rdp/rdpconsole/src/main/java/common/adapter/AwtClipboardAdapter.java b/services/console-proxy-rdp/rdpconsole/src/main/java/common/adapter/AwtClipboardAdapter.java
new file mode 100755
index 0000000..cc7f330
--- /dev/null
+++ b/services/console-proxy-rdp/rdpconsole/src/main/java/common/adapter/AwtClipboardAdapter.java
@@ -0,0 +1,57 @@
+// 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 common.adapter;
+
+import java.awt.Toolkit;
+import java.awt.datatransfer.StringSelection;
+
+import streamer.BaseElement;
+import streamer.ByteBuffer;
+import streamer.Link;
+
+public class AwtClipboardAdapter extends BaseElement {
+
+ public static final String CLIPBOARD_CONTENT = "content";
+
+ public AwtClipboardAdapter(String id) {
+ super(id);
+ declarePads();
+ }
+
+ private void declarePads() {
+ inputPads.put(STDIN, null);
+ }
+
+ @Override
+ public void handleData(ByteBuffer buf, Link link) {
+ if (verbose)
+ System.out.println("[" + this + "] INFO: Data received: " + buf + ".");
+
+ if (buf == null)
+ return;
+
+ String content = (String)buf.getMetadata(CLIPBOARD_CONTENT);
+ StringSelection contents = new StringSelection(content);
+ Toolkit.getDefaultToolkit().getSystemClipboard().setContents(contents, null);
+ }
+
+ @Override
+ public String toString() {
+ return "ClipboardAdapter(" + id + ")";
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48c47101/services/console-proxy-rdp/rdpconsole/src/main/java/common/asn1/Any.java
----------------------------------------------------------------------
diff --git a/services/console-proxy-rdp/rdpconsole/src/main/java/common/asn1/Any.java b/services/console-proxy-rdp/rdpconsole/src/main/java/common/asn1/Any.java
new file mode 100755
index 0000000..2ef7c69
--- /dev/null
+++ b/services/console-proxy-rdp/rdpconsole/src/main/java/common/asn1/Any.java
@@ -0,0 +1,78 @@
+// 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 common.asn1;
+
+import streamer.ByteBuffer;
+
+/**
+ * Any type. Don't forget to set type.
+ */
+public class Any extends Tag {
+
+ /**
+ * Raw bytes of any value.
+ */
+ public ByteBuffer value;
+
+ public Any(String name) {
+ super(name);
+ }
+
+ @Override
+ public boolean isValueSet() {
+ return value != null;
+ }
+
+ @Override
+ public long calculateLengthOfValuePayload() {
+ return value.length;
+ }
+
+ @Override
+ public void writeTagValuePayload(ByteBuffer buf) {
+ buf.writeBytes(value);
+ }
+
+ @Override
+ public void readTagValue(ByteBuffer buf, BerType typeAndFlags) {
+ long length = buf.readBerLength();
+
+ value = buf.readBytes((int)length);
+ }
+
+ @Override
+ public Tag deepCopy(String suffix) {
+ return new Any(name + suffix).copyFrom(this);
+ }
+
+ @Override
+ public Tag copyFrom(Tag tag) {
+ super.copyFrom(tag);
+ tagType = tag.tagType;
+ value = new ByteBuffer(((Any)tag).value.toByteArray());
+ return this;
+ }
+
+ @Override
+ public boolean isTypeValid(BerType typeAndFlags, boolean explicit) {
+ if (explicit)
+ return typeAndFlags.tagClass == tagClass && typeAndFlags.constructed && typeAndFlags.typeOrTagNumber == tagNumber;
+ else
+ return true;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48c47101/services/console-proxy-rdp/rdpconsole/src/main/java/common/asn1/Asn1Constants.java
----------------------------------------------------------------------
diff --git a/services/console-proxy-rdp/rdpconsole/src/main/java/common/asn1/Asn1Constants.java b/services/console-proxy-rdp/rdpconsole/src/main/java/common/asn1/Asn1Constants.java
new file mode 100755
index 0000000..6dacd60
--- /dev/null
+++ b/services/console-proxy-rdp/rdpconsole/src/main/java/common/asn1/Asn1Constants.java
@@ -0,0 +1,83 @@
+// 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 common.asn1;
+
+public interface Asn1Constants {
+
+ /**
+ * Universal class type.
+ */
+ public static final int UNIVERSAL_CLASS = 0x00;
+
+ /**
+ * Application class type.
+ */
+ public static final int APPLICATION_CLASS = 0x40;
+
+ public static final int CONTEXT_CLASS = 0x80;
+
+ public static final int PRIVATE_CLASS = 0xC0;
+
+ /**
+ * Constructed type.
+ */
+ public static final int CONSTRUCTED = 0x20;
+
+ /**
+ * Mask to extract class.
+ */
+ public static final int CLASS_MASK = 0xC0;
+
+ /**
+ * Mask to extract type.
+ */
+ public static final int TYPE_MASK = 0x1F;
+
+ public static final int EOF = 0x00;
+ public static final int BOOLEAN = 0x01;
+ /**
+ * Integer primitive.
+ */
+ public static final int INTEGER = 0x02;
+ public static final int BIT_STRING = 0x03;
+ /**
+ * Octet string primitive.
+ */
+ public static final int OCTET_STRING = 0x04;
+ public static final int NULL = 0x05;
+ public static final int OBJECT_ID = 0x06;
+ public static final int REAL = 0x09;
+ public static final int ENUMERATED = 0x0A;
+ /**
+ * Sequence primitive.
+ */
+ public static final int SEQUENCE = 0x10;
+ public static final int SET = 0x11;
+ public static final int NUMERIC_STRING = 0x12;
+ public static final int PRINTABLE_STRING = 0x13;
+ public static final int TELETEX_STRING = 0x14;
+ public static final int VIDEOTEXT_STRING = 0x15;
+ public static final int IA5_STRING = 0x16;
+ public static final int UTCTIME = 0x17;
+ public static final int GENERAL_TIME = 0x18;
+ public static final int GRAPHIC_STRING = 0x19;
+ public static final int VISIBLE_STRING = 0x1A;
+ public static final int GENERAL_STRING = 0x1B;
+
+ public static final int EXTENDED_TYPE = 0x1F;
+
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48c47101/services/console-proxy-rdp/rdpconsole/src/main/java/common/asn1/Asn1Integer.java
----------------------------------------------------------------------
diff --git a/services/console-proxy-rdp/rdpconsole/src/main/java/common/asn1/Asn1Integer.java b/services/console-proxy-rdp/rdpconsole/src/main/java/common/asn1/Asn1Integer.java
new file mode 100755
index 0000000..678e04e
--- /dev/null
+++ b/services/console-proxy-rdp/rdpconsole/src/main/java/common/asn1/Asn1Integer.java
@@ -0,0 +1,116 @@
+// 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 common.asn1;
+
+import streamer.ByteBuffer;
+
+/**
+ * Variable length integer.
+ */
+public class Asn1Integer extends Tag {
+
+ public Long value = null;
+
+ public Asn1Integer(String name) {
+ super(name);
+ tagType = INTEGER;
+ }
+
+ @Override
+ public void readTagValue(ByteBuffer buf, BerType typeAndFlags) {
+ // Type is already read by parent parser
+
+ long length = buf.readBerLength();
+ if (length > 8)
+ throw new RuntimeException("[" + this + "] ERROR: Integer value is too long: " + length + " bytes. Cannot handle integers more than 8 bytes long. Data: "
+ + buf + ".");
+
+ value = buf.readSignedVarInt((int)length);
+ }
+
+ @Override
+ public Tag deepCopy(String suffix) {
+ return new Asn1Integer(name + suffix).copyFrom(this);
+ }
+
+ @Override
+ public Tag copyFrom(Tag tag) {
+ super.copyFrom(tag);
+ value = ((Asn1Integer)tag).value;
+ return this;
+ }
+
+ @Override
+ public String toString() {
+ return super.toString() + "= " + value;
+ }
+
+ @Override
+ public long calculateLengthOfValuePayload() {
+ if (value <= 0xff)
+ return 1;
+ if (value <= 0xffFF)
+ return 2;
+ if (value <= 0xffFFff)
+ return 3;
+ if (value <= 0xffFFffFFL)
+ return 4;
+ if (value <= 0xffFFffFFffL)
+ return 5;
+ if (value <= 0xffFFffFFffFFL)
+ return 6;
+ if (value <= 0xffFFffFFffFFffL)
+ return 7;
+
+ return 8;
+ }
+
+ @Override
+ public void writeTagValuePayload(ByteBuffer buf) {
+ long value = this.value.longValue();
+
+ if (value < 0xff) {
+ buf.writeByte((int)value);
+ } else if (value <= 0xffFF) {
+ buf.writeShort((int)value);
+ } else if (value <= 0xffFFff) {
+ buf.writeByte((int)(value >> 16));
+ buf.writeShort((int)value);
+ } else if (value <= 0xffFFffFFL) {
+ buf.writeInt((int)value);
+ } else if (value <= 0xffFFffFFffL) {
+ buf.writeByte((int)(value >> 32));
+ buf.writeInt((int)value);
+ } else if (value <= 0xffFFffFFffFFL) {
+ buf.writeShort((int)(value >> 32));
+ buf.writeInt((int)value);
+ } else if (value <= 0xffFFffFFffFFffL) {
+ buf.writeByte((int)(value >> (32 + 16)));
+ buf.writeShort((int)(value >> 32));
+ buf.writeInt((int)value);
+ } else {
+ buf.writeInt((int)(value >> 32));
+ buf.writeInt((int)value);
+ }
+ }
+
+ @Override
+ public boolean isValueSet() {
+ return value != null;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48c47101/services/console-proxy-rdp/rdpconsole/src/main/java/common/asn1/BerType.java
----------------------------------------------------------------------
diff --git a/services/console-proxy-rdp/rdpconsole/src/main/java/common/asn1/BerType.java b/services/console-proxy-rdp/rdpconsole/src/main/java/common/asn1/BerType.java
new file mode 100755
index 0000000..8e53f24
--- /dev/null
+++ b/services/console-proxy-rdp/rdpconsole/src/main/java/common/asn1/BerType.java
@@ -0,0 +1,40 @@
+// 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 common.asn1;
+
+public class BerType {
+
+ public int tagClass;
+ public boolean constructed;
+ public int typeOrTagNumber;
+
+ public BerType() {
+ }
+
+ public BerType(int tagClass, boolean constructed, int typeOrTagNumber) {
+ this.tagClass = tagClass;
+ this.constructed = constructed;
+ this.typeOrTagNumber = typeOrTagNumber;
+ }
+
+ @Override
+ public String toString() {
+ return "BerType [tagClass=" + Tag.tagClassToString(tagClass) + ", constructed=" + constructed + ", type or tag number="
+ + Tag.tagTypeOrNumberToString(tagClass, typeOrTagNumber) + "]";
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48c47101/services/console-proxy-rdp/rdpconsole/src/main/java/common/asn1/BitString.java
----------------------------------------------------------------------
diff --git a/services/console-proxy-rdp/rdpconsole/src/main/java/common/asn1/BitString.java b/services/console-proxy-rdp/rdpconsole/src/main/java/common/asn1/BitString.java
new file mode 100755
index 0000000..3323c72
--- /dev/null
+++ b/services/console-proxy-rdp/rdpconsole/src/main/java/common/asn1/BitString.java
@@ -0,0 +1,67 @@
+// 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 common.asn1;
+
+import streamer.ByteBuffer;
+
+public class BitString extends Tag {
+
+ /**
+ * Bit string value.
+ */
+ public ByteBuffer value;
+
+ public BitString(String name) {
+ super(name);
+ tagType = BIT_STRING;
+ }
+
+ @Override
+ public boolean isValueSet() {
+ return value != null;
+ }
+
+ @Override
+ public long calculateLengthOfValuePayload() {
+ return value.length;
+ }
+
+ @Override
+ public void writeTagValuePayload(ByteBuffer buf) {
+ buf.writeBytes(value);
+ }
+
+ @Override
+ public void readTagValue(ByteBuffer buf, BerType typeAndFlags) {
+ long length = buf.readBerLength();
+
+ value = buf.readBytes((int)length);
+ }
+
+ @Override
+ public Tag deepCopy(String suffix) {
+ return new BitString(name + suffix).copyFrom(this);
+ }
+
+ @Override
+ public Tag copyFrom(Tag tag) {
+ super.copyFrom(tag);
+ value = new ByteBuffer(((BitString)tag).value.toByteArray());
+ return this;
+ }
+
+}