FramebufferVNC.h revision 566ba99f1b0ecc5a63b18d296c467e3e2d3d9826
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/* $Id$ */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/** @file
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * VBox Remote Desktop Protocol - VNC server interface.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/*
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync * Contributed by Ivo Smits <Ivo@UFO-Net.nl>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Copyright (C) 2006-2007 Sun Microsystems, Inc.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * available from http://www.virtualbox.org. This file is free software;
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * you can redistribute it and/or modify it under the terms of the GNU
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * General Public License (GPL) as published by the Free Software
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync *
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Clara, CA 95054 USA or visit http://www.sun.com if you need
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * additional information or have any questions.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include <VBox/com/VirtualBox.h>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include <iprt/uuid.h>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include <VBox/com/com.h>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include <VBox/com/string.h>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include <iprt/initterm.h>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include <iprt/critsect.h>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include <rfb/rfb.h>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include <pthread.h>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncclass VNCFB : VBOX_SCRIPTABLE_IMPL(IFramebuffer)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncpublic:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync VNCFB(ComPtr <IConsole> console, int port, char const *password);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync virtual ~VNCFB();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#ifndef VBOX_WITH_XPCOM
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync STDMETHOD_(ULONG, AddRef)() {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return ::InterlockedIncrement (&refcnt);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync STDMETHOD_(ULONG, Release)() {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync long cnt = ::InterlockedDecrement (&refcnt);
223cf005b18af2c21352a70693ebaf0582f68ebcvboxsync if (cnt == 0) delete this;
223cf005b18af2c21352a70693ebaf0582f68ebcvboxsync return cnt;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync VBOX_SCRIPTABLE_DISPATCH_IMPL(IFramebuffer)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync NS_DECL_ISUPPORTS
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
afed5ab737f4aacfae3fe73776f40e989190a7cavboxsync // public methods only for internal purposes
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync HRESULT init ();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync STDMETHOD(COMGETTER(Width))(ULONG *width);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync STDMETHOD(COMGETTER(Height))(ULONG *height);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync STDMETHOD(Lock)();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync STDMETHOD(Unlock)();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync STDMETHOD(COMGETTER(Address))(BYTE **address);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync STDMETHOD(COMGETTER(BitsPerPixel))(ULONG *bitsPerPixel);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync STDMETHOD(COMGETTER(BytesPerLine))(ULONG *bytesPerLine);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync STDMETHOD(COMGETTER(PixelFormat)) (ULONG *pixelFormat);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync STDMETHOD(COMGETTER(UsesGuestVRAM)) (BOOL *usesGuestVRAM);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync STDMETHOD(COMGETTER(HeightReduction)) (ULONG *heightReduction);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync STDMETHOD(COMGETTER(Overlay)) (IFramebufferOverlay **aOverlay);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync STDMETHOD(COMGETTER(WinId)) (ULONG64 *winId);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync STDMETHOD(NotifyUpdate)(ULONG x, ULONG y, ULONG w, ULONG h);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync STDMETHOD(RequestResize)(ULONG aScreenId, ULONG pixelFormat, BYTE *vram,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ULONG bitsPerPixel, ULONG bytesPerLine,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ULONG w, ULONG h, BOOL *finished);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync STDMETHOD(VideoModeSupported)(ULONG width, ULONG height, ULONG bpp, BOOL *supported);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync STDMETHOD(GetVisibleRegion)(BYTE *rectangles, ULONG count, ULONG *countCopied);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync STDMETHOD(SetVisibleRegion)(BYTE *rectangles, ULONG count);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync STDMETHOD(ProcessVHWACommand)(BYTE *pCommand);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncprivate:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /** Guest framebuffer pixel format */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ULONG mPixelFormat;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /** Guest framebuffer color depth */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ULONG mBitsPerPixel;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /** Guest framebuffer line length */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ULONG mBytesPerLine;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync //Our own framebuffer, in case we can't use the VRAM
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync uint8_t *mRGBBuffer;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync //The source framebuffer (either our own mRGBBuffer or the guest VRAM)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync uint8_t *mBufferAddress;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync //VNC display framebuffer (RGB -> BGR converted)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync uint8_t *mScreenBuffer;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync int mVncPort;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ComPtr<IConsole> mConsole;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ComPtr<IKeyboard> mKeyboard;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ComPtr<IMouse> mMouse;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync int kbdShiftState;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync void kbdSetShift(int state);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync void kbdPutCode(int code);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync void kbdPutCode(int code, int down);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync void kbdPutCodeShift(int shift, int code, int down);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ULONG mWidth, mHeight;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync RTCRITSECT mCritSect;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
fdea543f71872a3ec3909536a4fce37ab7aa3a8bvboxsync rfbScreenInfoPtr vncServer;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync RTTHREAD mVncThread;
fdea543f71872a3ec3909536a4fce37ab7aa3a8bvboxsync static DECLCALLBACK(int) vncThreadFn(RTTHREAD hThreadSelf, void *pvUser);
fdea543f71872a3ec3909536a4fce37ab7aa3a8bvboxsync /** The password that was passed to the constructor. NULL if no
fdea543f71872a3ec3909536a4fce37ab7aa3a8bvboxsync * authentication required. */
fdea543f71872a3ec3909536a4fce37ab7aa3a8bvboxsync char const *mVncPassword;
fdea543f71872a3ec3909536a4fce37ab7aa3a8bvboxsync
fdea543f71872a3ec3909536a4fce37ab7aa3a8bvboxsync static void vncKeyboardEvent(rfbBool down, rfbKeySym keySym, rfbClientPtr cl);
8f7bc6ad2b7bbcb4b3b96248cd2478e45f2e3b88vboxsync static void vncMouseEvent(int buttonMask, int x, int y, rfbClientPtr cl);
8f7bc6ad2b7bbcb4b3b96248cd2478e45f2e3b88vboxsync static void vncReleaseKeysEvent(rfbClientPtr cl);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync void handleVncKeyboardEvent(int down, int keySym);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync void handleVncMouseEvent(int buttonMask, int x, int y);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync void handleVncKeyboardReleaseEvent();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync int mouseX, mouseY;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#ifndef VBOX_WITH_XPCOM
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync long refcnt;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync};
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync