VirtualBox

source: vbox/trunk/src/VBox/Main/include/ConsoleVRDPServer.h@ 12866

Last change on this file since 12866 was 12126, checked in by vboxsync, 16 years ago

Drop existing RDP connection and allow the new client to connect, configurable, default off.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 10.0 KB
Line 
1/** @file
2 *
3 * VBox Console VRDP Helper class and implementation of IRemoteDisplayInfo
4 */
5
6/*
7 * Copyright (C) 2006-2007 Sun Microsystems, Inc.
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.virtualbox.org. This file is free software;
11 * you can redistribute it and/or modify it under the terms of the GNU
12 * General Public License (GPL) as published by the Free Software
13 * Foundation, in version 2 as it comes in the "COPYING" file of the
14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16 *
17 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
18 * Clara, CA 95054 USA or visit http://www.sun.com if you need
19 * additional information or have any questions.
20 */
21
22#ifndef ____H_CONSOLEVRDPSERVER
23#define ____H_CONSOLEVRDPSERVER
24
25#include "RemoteUSBBackend.h"
26#include <hgcm/HGCM.h>
27
28#include <VBox/VRDPAuth.h>
29
30#include <VBox/HostServices/VBoxClipboardExt.h>
31
32#include "SchemaDefs.h"
33
34// ConsoleVRDPServer
35///////////////////////////////////////////////////////////////////////////////
36
37#ifdef VBOX_WITH_VRDP
38typedef struct _VRDPInputSynch
39{
40 int cGuestNumLockAdaptions;
41 int cGuestCapsLockAdaptions;
42
43 bool fGuestNumLock;
44 bool fGuestCapsLock;
45 bool fGuestScrollLock;
46
47 bool fClientNumLock;
48 bool fClientCapsLock;
49 bool fClientScrollLock;
50} VRDPInputSynch;
51#endif /* VBOX_WITH_VRDP */
52
53/* Member of Console. Helper class for VRDP server management. Not a COM class. */
54class ConsoleVRDPServer
55{
56public:
57 ConsoleVRDPServer (Console *console);
58 ~ConsoleVRDPServer ();
59
60 int Launch (void);
61
62 void NotifyAbsoluteMouse (bool fGuestWantsAbsolute)
63 {
64#ifdef VBOX_WITH_VRDP
65 m_fGuestWantsAbsolute = fGuestWantsAbsolute;
66#else
67 NOREF(fGuestWantsAbsolute);
68#endif /* VBOX_WITH_VRDP */
69 }
70
71 void NotifyKeyboardLedsChange (BOOL fNumLock, BOOL fCapsLock, BOOL fScrollLock)
72 {
73#ifdef VBOX_WITH_VRDP
74 bool fGuestNumLock = (fNumLock != FALSE);
75 bool fGuestCapsLock = (fCapsLock != FALSE);
76 bool fGuestScrollLock = (fScrollLock != FALSE);
77
78 /* Might need to resynch in case the guest itself changed the LED status. */
79 if (m_InputSynch.fClientNumLock != fGuestNumLock)
80 {
81 m_InputSynch.cGuestNumLockAdaptions = 2;
82 }
83
84 if (m_InputSynch.fClientCapsLock != fGuestCapsLock)
85 {
86 m_InputSynch.cGuestCapsLockAdaptions = 2;
87 }
88
89 m_InputSynch.fGuestNumLock = fGuestNumLock;
90 m_InputSynch.fGuestCapsLock = fGuestCapsLock;
91 m_InputSynch.fGuestScrollLock = fGuestScrollLock;
92#else
93 NOREF(fNumLock);
94 NOREF(fCapsLock);
95 NOREF(fScrollLock);
96#endif /* VBOX_WITH_VRDP */
97 }
98
99 void EnableConnections (void);
100 void DisconnectClient (uint32_t u32ClientId, bool fReconnect);
101 void MousePointerUpdate (const VRDPCOLORPOINTER *pPointer);
102 void MousePointerHide (void);
103
104 void Stop (void);
105
106 VRDPAuthResult Authenticate (const Guid &uuid, VRDPAuthGuestJudgement guestJudgement,
107 const char *pszUser, const char *pszPassword, const char *pszDomain,
108 uint32_t u32ClientId);
109
110 void AuthDisconnect (const Guid &uuid, uint32_t u32ClientId);
111
112 void USBBackendCreate (uint32_t u32ClientId, void **ppvIntercept);
113 void USBBackendDelete (uint32_t u32ClientId);
114
115 void *USBBackendRequestPointer (uint32_t u32ClientId, const Guid *pGuid);
116 void USBBackendReleasePointer (const Guid *pGuid);
117
118 /* Private interface for the RemoteUSBBackend destructor. */
119 void usbBackendRemoveFromList (RemoteUSBBackend *pRemoteUSBBackend);
120
121 /* Private methods for the Remote USB thread. */
122 RemoteUSBBackend *usbBackendGetNext (RemoteUSBBackend *pRemoteUSBBackend);
123
124 void notifyRemoteUSBThreadRunning (RTTHREAD thread);
125 bool isRemoteUSBThreadRunning (void);
126 void waitRemoteUSBThreadEvent (unsigned cMillies);
127
128 void ClipboardCreate (uint32_t u32ClientId);
129 void ClipboardDelete (uint32_t u32ClientId);
130
131 /*
132 * Forwarders to VRDP server library.
133 */
134 void SendUpdate (unsigned uScreenId, void *pvUpdate, uint32_t cbUpdate) const;
135 void SendResize (void) const;
136 void SendUpdateBitmap (unsigned uScreenId, uint32_t x, uint32_t y, uint32_t w, uint32_t h) const;
137
138 void SendAudioSamples (void *pvSamples, uint32_t cSamples, VRDPAUDIOFORMAT format) const;
139 void SendAudioVolume (uint16_t left, uint16_t right) const;
140 void SendUSBRequest (uint32_t u32ClientId, void *pvParms, uint32_t cbParms) const;
141
142 void QueryInfo (uint32_t index, void *pvBuffer, uint32_t cbBuffer, uint32_t *pcbOut) const;
143
144private:
145 /* Note: This is not a ComObjPtr here, because the ConsoleVRDPServer object
146 * is actually just a part of the Console.
147 */
148 Console *mConsole;
149
150#ifdef VBOX_WITH_VRDP
151 HVRDPSERVER mhServer;
152
153 static bool loadVRDPLibrary (void);
154
155 /** Static because will never load this more than once! */
156 static RTLDRMOD mVRDPLibrary;
157
158 static PFNVRDPCREATESERVER mpfnVRDPCreateServer;
159
160 static VRDPENTRYPOINTS_1 *mpEntryPoints;
161 static VRDPCALLBACKS_1 mCallbacks;
162
163 static DECLCALLBACK(int) VRDPCallbackQueryProperty (void *pvCallback, uint32_t index, void *pvBuffer, uint32_t cbBuffer, uint32_t *pcbOut);
164 static DECLCALLBACK(int) VRDPCallbackClientLogon (void *pvCallback, uint32_t u32ClientId, const char *pszUser, const char *pszPassword, const char *pszDomain);
165 static DECLCALLBACK(void) VRDPCallbackClientConnect (void *pvCallback, uint32_t u32ClientId);
166 static DECLCALLBACK(void) VRDPCallbackClientDisconnect (void *pvCallback, uint32_t u32ClientId, uint32_t fu32Intercepted);
167 static DECLCALLBACK(int) VRDPCallbackIntercept (void *pvCallback, uint32_t u32ClientId, uint32_t fu32Intercept, void **ppvIntercept);
168 static DECLCALLBACK(int) VRDPCallbackUSB (void *pvCallback, void *pvIntercept, uint32_t u32ClientId, uint8_t u8Code, const void *pvRet, uint32_t cbRet);
169 static DECLCALLBACK(int) VRDPCallbackClipboard (void *pvCallback, void *pvIntercept, uint32_t u32ClientId, uint32_t u32Function, uint32_t u32Format, const void *pvData, uint32_t cbData);
170 static DECLCALLBACK(bool) VRDPCallbackFramebufferQuery (void *pvCallback, unsigned uScreenId, VRDPFRAMEBUFFERINFO *pInfo);
171 static DECLCALLBACK(void) VRDPCallbackFramebufferLock (void *pvCallback, unsigned uScreenId);
172 static DECLCALLBACK(void) VRDPCallbackFramebufferUnlock (void *pvCallback, unsigned uScreenId);
173 static DECLCALLBACK(void) VRDPCallbackInput (void *pvCallback, int type, const void *pvInput, unsigned cbInput);
174 static DECLCALLBACK(void) VRDPCallbackVideoModeHint (void *pvCallback, unsigned cWidth, unsigned cHeight, unsigned cBitsPerPixel, unsigned uScreenId);
175
176 bool m_fGuestWantsAbsolute;
177 int m_mousex;
178 int m_mousey;
179
180 IFramebuffer *maFramebuffers[SchemaDefs::MaxGuestMonitors];
181
182 IConsoleCallback *mConsoleCallback;
183
184 VRDPInputSynch m_InputSynch;
185#endif /* VBOX_WITH_VRDP */
186
187 RTCRITSECT mCritSect;
188
189 int lockConsoleVRDPServer (void);
190 void unlockConsoleVRDPServer (void);
191
192 int mcClipboardRefs;
193 HGCMSVCEXTHANDLE mhClipboard;
194 PFNVRDPCLIPBOARDEXTCALLBACK mpfnClipboardCallback;
195
196 static DECLCALLBACK(int) ClipboardCallback (void *pvCallback, uint32_t u32ClientId, uint32_t u32Function, uint32_t u32Format, const void *pvData, uint32_t cbData);
197 static DECLCALLBACK(int) ClipboardServiceExtension (void *pvExtension, uint32_t u32Function, void *pvParm, uint32_t cbParms);
198
199#ifdef VBOX_WITH_USB
200 RemoteUSBBackend *usbBackendFindByUUID (const Guid *pGuid);
201 RemoteUSBBackend *usbBackendFind (uint32_t u32ClientId);
202
203 typedef struct _USBBackends
204 {
205 RemoteUSBBackend *pHead;
206 RemoteUSBBackend *pTail;
207
208 RTTHREAD thread;
209
210 bool fThreadRunning;
211
212 RTSEMEVENT event;
213 } USBBackends;
214
215 USBBackends mUSBBackends;
216
217 void remoteUSBThreadStart (void);
218 void remoteUSBThreadStop (void);
219#endif /* VBOX_WITH_USB */
220
221 /* External authentication library handle. The library is loaded in the
222 * Authenticate method and unloaded at the object destructor.
223 */
224 RTLDRMOD mAuthLibrary;
225 PVRDPAUTHENTRY mpfnAuthEntry;
226 PVRDPAUTHENTRY2 mpfnAuthEntry2;
227};
228
229
230class Console;
231
232class ATL_NO_VTABLE RemoteDisplayInfo :
233 public VirtualBoxSupportErrorInfoImpl <RemoteDisplayInfo, IRemoteDisplayInfo>,
234 public VirtualBoxSupportTranslation <RemoteDisplayInfo>,
235 public VirtualBoxBase,
236 public IRemoteDisplayInfo
237{
238public:
239
240 DECLARE_NOT_AGGREGATABLE(RemoteDisplayInfo)
241
242 DECLARE_PROTECT_FINAL_CONSTRUCT()
243
244 BEGIN_COM_MAP(RemoteDisplayInfo)
245 COM_INTERFACE_ENTRY(ISupportErrorInfo)
246 COM_INTERFACE_ENTRY(IRemoteDisplayInfo)
247 END_COM_MAP()
248
249 NS_DECL_ISUPPORTS
250
251 HRESULT FinalConstruct();
252 void FinalRelease();
253
254 /* Public initializer/uninitializer for internal purposes only. */
255 HRESULT init (Console *aParent);
256 void uninit();
257
258 /* IRemoteDisplayInfo properties */
259 #define DECL_GETTER(_aType, _aName) STDMETHOD(COMGETTER(_aName)) (_aType *a##_aName)
260 DECL_GETTER (BOOL, Active);
261 DECL_GETTER (ULONG, NumberOfClients);
262 DECL_GETTER (LONG64, BeginTime);
263 DECL_GETTER (LONG64, EndTime);
264 DECL_GETTER (ULONG64, BytesSent);
265 DECL_GETTER (ULONG64, BytesSentTotal);
266 DECL_GETTER (ULONG64, BytesReceived);
267 DECL_GETTER (ULONG64, BytesReceivedTotal);
268 DECL_GETTER (BSTR, User);
269 DECL_GETTER (BSTR, Domain);
270 DECL_GETTER (BSTR, ClientName);
271 DECL_GETTER (BSTR, ClientIP);
272 DECL_GETTER (ULONG, ClientVersion);
273 DECL_GETTER (ULONG, EncryptionStyle);
274 #undef DECL_GETTER
275
276 /* For VirtualBoxSupportErrorInfoImpl. */
277 static const wchar_t *getComponentName() { return L"RemoteDisplayInfo"; }
278
279private:
280
281 ComObjPtr <Console, ComWeakRef> mParent;
282};
283
284#endif // ____H_CONSOLEVRDPSERVER
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette