mirror of https://github.com/apache/cloudstack.git
100 lines
3.3 KiB
Java
100 lines
3.3 KiB
Java
// 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.packet.server;
|
|
|
|
import java.io.DataInputStream;
|
|
import java.io.IOException;
|
|
|
|
import com.cloud.consoleproxy.ConsoleProxyClientListener;
|
|
import com.cloud.consoleproxy.vnc.BufferedImageCanvas;
|
|
import com.cloud.consoleproxy.vnc.RfbConstants;
|
|
import com.cloud.consoleproxy.vnc.VncScreenDescription;
|
|
import com.cloud.consoleproxy.vnc.packet.server.CopyRect;
|
|
import com.cloud.consoleproxy.vnc.packet.server.RawRect;
|
|
import com.cloud.consoleproxy.vnc.packet.server.Rect;
|
|
|
|
public class FramebufferUpdatePacket {
|
|
|
|
private final VncScreenDescription screen;
|
|
private final BufferedImageCanvas canvas;
|
|
private final ConsoleProxyClientListener clientListener;
|
|
|
|
public FramebufferUpdatePacket(BufferedImageCanvas canvas, VncScreenDescription screen, DataInputStream is,
|
|
ConsoleProxyClientListener clientListener) throws IOException {
|
|
|
|
this.screen = screen;
|
|
this.canvas = canvas;
|
|
this.clientListener = clientListener;
|
|
readPacketData(is);
|
|
}
|
|
|
|
private void readPacketData(DataInputStream is) throws IOException {
|
|
is.skipBytes(1);// Skip padding
|
|
|
|
// Read number of rectangles
|
|
int numberOfRectangles = is.readUnsignedShort();
|
|
|
|
// For all rectangles
|
|
for (int i = 0; i < numberOfRectangles; i++) {
|
|
|
|
// Read coordinate of rectangle
|
|
int x = is.readUnsignedShort();
|
|
int y = is.readUnsignedShort();
|
|
int width = is.readUnsignedShort();
|
|
int height = is.readUnsignedShort();
|
|
|
|
int encodingType = is.readInt();
|
|
|
|
// Process rectangle
|
|
Rect rect;
|
|
switch (encodingType) {
|
|
|
|
case RfbConstants.ENCODING_RAW: {
|
|
rect = new RawRect(screen, x, y, width, height, is);
|
|
break;
|
|
}
|
|
|
|
case RfbConstants.ENCODING_COPY_RECT: {
|
|
rect = new CopyRect(x, y, width, height, is);
|
|
break;
|
|
}
|
|
|
|
case RfbConstants.ENCODING_DESKTOP_SIZE: {
|
|
rect = new FrameBufferSizeChangeRequest(canvas, width, height);
|
|
if(this.clientListener != null)
|
|
this.clientListener.onFramebufferSizeChange(width, height);
|
|
break;
|
|
}
|
|
|
|
default:
|
|
throw new RuntimeException("Unsupported ecnoding: " + encodingType);
|
|
}
|
|
|
|
paint(rect, canvas);
|
|
|
|
if(this.clientListener != null)
|
|
this.clientListener.onFramebufferUpdate(rect.getX(), rect.getY(), rect.getWidth(), rect.getHeight());
|
|
}
|
|
|
|
}
|
|
|
|
public void paint(Rect rect, BufferedImageCanvas canvas) {
|
|
// Draw rectangle on offline buffer
|
|
rect.paint(canvas.getOfflineImage(), canvas.getOfflineGraphics());
|
|
|
|
// Request update of repainted area
|
|
canvas.repaint(rect.getX(), rect.getY(), rect.getWidth(), rect.getHeight());
|
|
}
|
|
|
|
}
|