| // Copyright 2012 Citrix Systems, Inc. Licensed under the |
| // Apache License, Version 2.0 (the "License"); you may not use this |
| // file except in compliance with the License. Citrix Systems, Inc. |
| // reserves all rights not expressly granted by 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. |
| // |
| // Automatically generated by addcopyright.py at 04/03/2012 |
| package com.cloud.consoleproxy.vnc; |
| |
| import java.awt.Toolkit; |
| import java.awt.datatransfer.StringSelection; |
| import java.io.DataInputStream; |
| import java.io.IOException; |
| |
| import com.cloud.consoleproxy.ConsoleProxyClientListener; |
| import com.cloud.consoleproxy.util.Logger; |
| import com.cloud.consoleproxy.vnc.packet.server.FramebufferUpdatePacket; |
| import com.cloud.consoleproxy.vnc.packet.server.ServerCutText; |
| |
| public class VncServerPacketReceiver implements Runnable { |
| private static final Logger s_logger = Logger.getLogger(VncServerPacketReceiver.class); |
| |
| private final VncScreenDescription screen; |
| private BufferedImageCanvas canvas; |
| private DataInputStream is; |
| |
| private boolean connectionAlive = true; |
| private VncClient vncConnection; |
| private final FrameBufferUpdateListener fburListener; |
| private final ConsoleProxyClientListener clientListener; |
| |
| public VncServerPacketReceiver(DataInputStream is, BufferedImageCanvas canvas, VncScreenDescription screen, VncClient vncConnection, |
| FrameBufferUpdateListener fburListener, ConsoleProxyClientListener clientListener) { |
| this.screen = screen; |
| this.canvas = canvas; |
| this.is = is; |
| this.vncConnection = vncConnection; |
| this.fburListener = fburListener; |
| this.clientListener = clientListener; |
| } |
| |
| public BufferedImageCanvas getCanvas() { |
| return canvas; |
| } |
| |
| @Override |
| public void run() { |
| try { |
| while (connectionAlive) { |
| |
| // Read server message type |
| int messageType = is.readUnsignedByte(); |
| |
| // Invoke packet handler by packet type. |
| switch (messageType) { |
| |
| case RfbConstants.SERVER_FRAMEBUFFER_UPDATE: { |
| // Notify sender that frame buffer update is received, |
| // so it can send another frame buffer update request |
| fburListener.frameBufferPacketReceived(); |
| // Handle frame buffer update |
| new FramebufferUpdatePacket(canvas, screen, is, clientListener); |
| break; |
| } |
| |
| case RfbConstants.SERVER_BELL: { |
| serverBell(); |
| break; |
| } |
| |
| case RfbConstants.SERVER_CUT_TEXT: { |
| serverCutText(is); |
| break; |
| } |
| |
| default: |
| throw new RuntimeException("Unknown server packet type: " + messageType + "."); |
| } |
| } |
| } catch (Throwable e) { |
| s_logger.error("Unexpected exception: ", e); |
| if (connectionAlive) { |
| closeConnection(); |
| vncConnection.shutdown(); |
| } |
| } |
| } |
| |
| public void closeConnection() { |
| connectionAlive = false; |
| } |
| |
| public boolean isConnectionAlive() { |
| return connectionAlive; |
| } |
| |
| /** |
| * Handle server bell packet. |
| */ |
| private void serverBell() { |
| Toolkit.getDefaultToolkit().beep(); |
| } |
| |
| /** |
| * Handle packet with server clip-board. |
| */ |
| private void serverCutText(DataInputStream is) throws IOException { |
| ServerCutText clipboardContent = new ServerCutText(is); |
| StringSelection contents = new StringSelection(clipboardContent.getContent()); |
| Toolkit.getDefaultToolkit().getSystemClipboard().setContents(contents, null); |
| |
| s_logger.info("Server clipboard buffer: "+clipboardContent.getContent()); |
| } |
| } |