VirtualBox

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

Last change on this file since 92154 was 91312, checked in by vboxsync, 3 years ago

Main: bugref:1909: Prepared the API translation engine to using in ExtPacks and VBoxManage. Added using API translation engine in ExtPacks. Allowed VBox compilation with NLS enabled and GUI disabled. Allowed ExtPacks only compilation with NLS translation enabled.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 17.6 KB
Line 
1/* $Id: ConsoleVRDPServer.h 91312 2021-09-20 11:06:57Z vboxsync $ */
2/** @file
3 * VBox Console VRDE Server Helper class and implementation of IVRDEServerInfo
4 */
5
6/*
7 * Copyright (C) 2006-2020 Oracle Corporation
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
18#ifndef MAIN_INCLUDED_ConsoleVRDPServer_h
19#define MAIN_INCLUDED_ConsoleVRDPServer_h
20#ifndef RT_WITHOUT_PRAGMA_ONCE
21# pragma once
22#endif
23
24#include "VRDEServerInfoWrap.h"
25#include "RemoteUSBBackend.h"
26#include "HGCM.h"
27
28#include "AuthLibrary.h"
29
30#include <VBox/RemoteDesktop/VRDEImage.h>
31#include <VBox/RemoteDesktop/VRDEMousePtr.h>
32#include <VBox/RemoteDesktop/VRDESCard.h>
33#include <VBox/RemoteDesktop/VRDETSMF.h>
34#define VRDE_VIDEOIN_WITH_VRDEINTERFACE /* Get the VRDE interface definitions. */
35#include <VBox/RemoteDesktop/VRDEVideoIn.h>
36#include <VBox/RemoteDesktop/VRDEInput.h>
37
38#include <VBox/HostServices/VBoxClipboardExt.h>
39#include <VBox/HostServices/VBoxHostChannel.h>
40
41#include "SchemaDefs.h"
42
43// ConsoleVRDPServer
44///////////////////////////////////////////////////////////////////////////////
45
46class EmWebcam;
47
48typedef struct _VRDPInputSynch
49{
50 int cGuestNumLockAdaptions;
51 int cGuestCapsLockAdaptions;
52
53 bool fGuestNumLock;
54 bool fGuestCapsLock;
55 bool fGuestScrollLock;
56
57 bool fClientNumLock;
58 bool fClientCapsLock;
59 bool fClientScrollLock;
60} VRDPInputSynch;
61
62/* Member of Console. Helper class for VRDP server management. Not a COM class. */
63class ConsoleVRDPServer
64{
65public:
66 DECLARE_TRANSLATE_METHODS(ConsoleVRDPServer)
67
68 ConsoleVRDPServer (Console *console);
69 ~ConsoleVRDPServer ();
70
71 int Launch (void);
72
73 void NotifyAbsoluteMouse (bool fGuestWantsAbsolute)
74 {
75 m_fGuestWantsAbsolute = fGuestWantsAbsolute;
76 }
77
78 void NotifyKeyboardLedsChange (BOOL fNumLock, BOOL fCapsLock, BOOL fScrollLock)
79 {
80 bool fGuestNumLock = (fNumLock != FALSE);
81 bool fGuestCapsLock = (fCapsLock != FALSE);
82 bool fGuestScrollLock = (fScrollLock != FALSE);
83
84 /* Might need to resync in case the guest itself changed the LED status. */
85 if (m_InputSynch.fClientNumLock != fGuestNumLock)
86 {
87 m_InputSynch.cGuestNumLockAdaptions = 2;
88 }
89
90 if (m_InputSynch.fClientCapsLock != fGuestCapsLock)
91 {
92 m_InputSynch.cGuestCapsLockAdaptions = 2;
93 }
94
95 m_InputSynch.fGuestNumLock = fGuestNumLock;
96 m_InputSynch.fGuestCapsLock = fGuestCapsLock;
97 m_InputSynch.fGuestScrollLock = fGuestScrollLock;
98 }
99
100 void EnableConnections (void);
101 void DisconnectClient (uint32_t u32ClientId, bool fReconnect);
102 int MousePointer(BOOL alpha, ULONG xHot, ULONG yHot, ULONG width, ULONG height, const uint8_t *pu8Shape);
103 void MousePointerUpdate (const VRDECOLORPOINTER *pPointer);
104 void MousePointerHide (void);
105
106 void Stop (void);
107
108 AuthResult Authenticate (const Guid &uuid, AuthGuestJudgement guestJudgement,
109 const char *pszUser, const char *pszPassword, const char *pszDomain,
110 uint32_t u32ClientId);
111
112 void AuthDisconnect (const Guid &uuid, uint32_t u32ClientId);
113
114 void USBBackendCreate (uint32_t u32ClientId, void **ppvIntercept);
115 void USBBackendDelete (uint32_t u32ClientId);
116
117 void *USBBackendRequestPointer (uint32_t u32ClientId, const Guid *pGuid);
118 void USBBackendReleasePointer (const Guid *pGuid);
119
120 /* Private interface for the RemoteUSBBackend destructor. */
121 void usbBackendRemoveFromList (RemoteUSBBackend *pRemoteUSBBackend);
122
123 /* Private methods for the Remote USB thread. */
124 RemoteUSBBackend *usbBackendGetNext (RemoteUSBBackend *pRemoteUSBBackend);
125
126 void notifyRemoteUSBThreadRunning (RTTHREAD thread);
127 bool isRemoteUSBThreadRunning (void);
128 void waitRemoteUSBThreadEvent (RTMSINTERVAL cMillies);
129
130 void ClipboardCreate (uint32_t u32ClientId);
131 void ClipboardDelete (uint32_t u32ClientId);
132
133 /*
134 * Forwarders to VRDP server library.
135 */
136 void SendUpdate (unsigned uScreenId, void *pvUpdate, uint32_t cbUpdate) const;
137 void SendResize (void);
138 void SendUpdateBitmap (unsigned uScreenId, uint32_t x, uint32_t y, uint32_t w, uint32_t h) const;
139
140 void SendAudioSamples (void const *pvSamples, uint32_t cSamples, VRDEAUDIOFORMAT format) const;
141 void SendAudioVolume (uint16_t left, uint16_t right) const;
142 void SendUSBRequest (uint32_t u32ClientId, void *pvParms, uint32_t cbParms) const;
143
144 void QueryInfo (uint32_t index, void *pvBuffer, uint32_t cbBuffer, uint32_t *pcbOut) const;
145
146 int SendAudioInputBegin(void **ppvUserCtx,
147 void *pvContext,
148 uint32_t cSamples,
149 uint32_t iSampleHz,
150 uint32_t cChannels,
151 uint32_t cBits);
152
153 void SendAudioInputEnd(void *pvUserCtx);
154
155 int SCardRequest(void *pvUser, uint32_t u32Function, const void *pvData, uint32_t cbData);
156
157 int VideoInDeviceAttach(const VRDEVIDEOINDEVICEHANDLE *pDeviceHandle, void *pvDeviceCtx);
158 int VideoInDeviceDetach(const VRDEVIDEOINDEVICEHANDLE *pDeviceHandle);
159 int VideoInGetDeviceDesc(void *pvUser, const VRDEVIDEOINDEVICEHANDLE *pDeviceHandle);
160 int VideoInControl(void *pvUser, const VRDEVIDEOINDEVICEHANDLE *pDeviceHandle,
161 const VRDEVIDEOINCTRLHDR *pReq, uint32_t cbReq);
162
163 Console *getConsole(void) { return mConsole; }
164
165 void onMousePointerShapeChange(BOOL visible, BOOL alpha, ULONG xHot, ULONG yHot,
166 ULONG width, ULONG height, ComSafeArrayIn(BYTE,shape));
167
168private:
169 /* Note: This is not a ComObjPtr here, because the ConsoleVRDPServer object
170 * is actually just a part of the Console.
171 */
172 Console *mConsole;
173
174 HVRDESERVER mhServer;
175 int mServerInterfaceVersion;
176
177 int32_t volatile mcInResize; /* Do not Stop the server if this is not 0. */
178
179 static int loadVRDPLibrary (const char *pszLibraryName);
180
181 /** Static because will never load this more than once! */
182 static RTLDRMOD mVRDPLibrary;
183
184 static PFNVRDECREATESERVER mpfnVRDECreateServer;
185
186 static VRDEENTRYPOINTS_4 mEntryPoints;
187 static VRDEENTRYPOINTS_4 *mpEntryPoints;
188 static VRDECALLBACKS_4 mCallbacks;
189
190 static DECLCALLBACK(int) VRDPCallbackQueryProperty (void *pvCallback, uint32_t index, void *pvBuffer, uint32_t cbBuffer, uint32_t *pcbOut);
191 static DECLCALLBACK(int) VRDPCallbackClientLogon (void *pvCallback, uint32_t u32ClientId, const char *pszUser, const char *pszPassword, const char *pszDomain);
192 static DECLCALLBACK(void) VRDPCallbackClientConnect (void *pvCallback, uint32_t u32ClientId);
193 static DECLCALLBACK(void) VRDPCallbackClientDisconnect (void *pvCallback, uint32_t u32ClientId, uint32_t fu32Intercepted);
194 static DECLCALLBACK(int) VRDPCallbackIntercept (void *pvCallback, uint32_t u32ClientId, uint32_t fu32Intercept, void **ppvIntercept);
195 static DECLCALLBACK(int) VRDPCallbackUSB (void *pvCallback, void *pvIntercept, uint32_t u32ClientId, uint8_t u8Code, const void *pvRet, uint32_t cbRet);
196 static DECLCALLBACK(int) VRDPCallbackClipboard (void *pvCallback, void *pvIntercept, uint32_t u32ClientId, uint32_t u32Function, uint32_t u32Format, const void *pvData, uint32_t cbData);
197 static DECLCALLBACK(bool) VRDPCallbackFramebufferQuery (void *pvCallback, unsigned uScreenId, VRDEFRAMEBUFFERINFO *pInfo);
198 static DECLCALLBACK(void) VRDPCallbackFramebufferLock (void *pvCallback, unsigned uScreenId);
199 static DECLCALLBACK(void) VRDPCallbackFramebufferUnlock (void *pvCallback, unsigned uScreenId);
200 static DECLCALLBACK(void) VRDPCallbackInput (void *pvCallback, int type, const void *pvInput, unsigned cbInput);
201 static DECLCALLBACK(void) VRDPCallbackVideoModeHint (void *pvCallback, unsigned cWidth, unsigned cHeight, unsigned cBitsPerPixel, unsigned uScreenId);
202 static DECLCALLBACK(void) VRDECallbackAudioIn (void *pvCallback, void *pvCtx, uint32_t u32ClientId, uint32_t u32Event, const void *pvData, uint32_t cbData);
203
204 void fetchCurrentState(void);
205
206 bool m_fGuestWantsAbsolute;
207 int m_mousex;
208 int m_mousey;
209
210 ComPtr<IDisplaySourceBitmap> maSourceBitmaps[SchemaDefs::MaxGuestMonitors];
211
212 ComPtr<IEventListener> mConsoleListener;
213
214 VRDPInputSynch m_InputSynch;
215
216 int32_t mVRDPBindPort;
217
218 RTCRITSECT mCritSect;
219
220 int lockConsoleVRDPServer (void);
221 void unlockConsoleVRDPServer (void);
222
223 int mcClipboardRefs;
224 HGCMSVCEXTHANDLE mhClipboard;
225 PFNVRDPCLIPBOARDEXTCALLBACK mpfnClipboardCallback;
226
227 static DECLCALLBACK(int) ClipboardCallback (void *pvCallback, uint32_t u32ClientId, uint32_t u32Function, uint32_t u32Format, const void *pvData, uint32_t cbData);
228 static DECLCALLBACK(int) ClipboardServiceExtension(void *pvExtension, uint32_t u32Function, void *pvParms, uint32_t cbParms);
229
230#ifdef VBOX_WITH_USB
231 RemoteUSBBackend *usbBackendFindByUUID (const Guid *pGuid);
232 RemoteUSBBackend *usbBackendFind (uint32_t u32ClientId);
233
234 typedef struct _USBBackends
235 {
236 RemoteUSBBackend *pHead;
237 RemoteUSBBackend *pTail;
238
239 RTTHREAD thread;
240
241 bool fThreadRunning;
242
243 RTSEMEVENT event;
244 } USBBackends;
245
246 USBBackends mUSBBackends;
247
248 void remoteUSBThreadStart (void);
249 void remoteUSBThreadStop (void);
250#endif /* VBOX_WITH_USB */
251
252#ifndef VBOX_WITH_VRDEAUTH_IN_VBOXSVC
253 /* External authentication library context. The library is loaded in the
254 * Authenticate method and unloaded at the object destructor.
255 */
256 AUTHLIBRARYCONTEXT mAuthLibCtx;
257#endif
258
259 uint32_t volatile mu32AudioInputClientId;
260
261 int32_t volatile mcClients;
262
263#if 0 /** @todo Chromium got removed (see @bugref{9529}) and this is not available for VMSVGA yet. */
264 static DECLCALLBACK(void) H3DORBegin(const void *pvContext, void **ppvInstance,
265 const char *pszFormat);
266 static DECLCALLBACK(void) H3DORGeometry(void *pvInstance,
267 int32_t x, int32_t y, uint32_t w, uint32_t h);
268 static DECLCALLBACK(void) H3DORVisibleRegion(void *pvInstance,
269 uint32_t cRects, const RTRECT *paRects);
270 static DECLCALLBACK(void) H3DORFrame(void *pvInstance,
271 void *pvData, uint32_t cbData);
272 static DECLCALLBACK(void) H3DOREnd(void *pvInstance);
273 static DECLCALLBACK(int) H3DORContextProperty(const void *pvContext, uint32_t index,
274 void *pvBuffer, uint32_t cbBuffer, uint32_t *pcbOut);
275#endif
276
277 void remote3DRedirect(bool fEnable);
278
279 /*
280 * VRDE server optional interfaces.
281 */
282
283 /* Image update interface. */
284 bool m_fInterfaceImage;
285 VRDEIMAGECALLBACKS m_interfaceCallbacksImage;
286 VRDEIMAGEINTERFACE m_interfaceImage;
287 static DECLCALLBACK(int) VRDEImageCbNotify (void *pvContext,
288 void *pvUser,
289 HVRDEIMAGE hVideo,
290 uint32_t u32Id,
291 void *pvData,
292 uint32_t cbData);
293 /* Mouse pointer interface. */
294 VRDEMOUSEPTRINTERFACE m_interfaceMousePtr;
295
296 /* Smartcard interface. */
297 VRDESCARDINTERFACE m_interfaceSCard;
298 VRDESCARDCALLBACKS m_interfaceCallbacksSCard;
299 static DECLCALLBACK(int) VRDESCardCbNotify(void *pvContext,
300 uint32_t u32Id,
301 void *pvData,
302 uint32_t cbData);
303 static DECLCALLBACK(int) VRDESCardCbResponse(void *pvContext,
304 int rcRequest,
305 void *pvUser,
306 uint32_t u32Function,
307 void *pvData,
308 uint32_t cbData);
309
310 /* TSMF interface. */
311 VRDETSMFINTERFACE m_interfaceTSMF;
312 VRDETSMFCALLBACKS m_interfaceCallbacksTSMF;
313 static DECLCALLBACK(void) VRDETSMFCbNotify(void *pvContext,
314 uint32_t u32Notification,
315 void *pvChannel,
316 const void *pvParm,
317 uint32_t cbParm);
318 void setupTSMF(void);
319
320 static DECLCALLBACK(int) tsmfHostChannelAttach(void *pvProvider, void **ppvInstance, uint32_t u32Flags,
321 VBOXHOSTCHANNELCALLBACKS *pCallbacks, void *pvCallbacks);
322 static DECLCALLBACK(void) tsmfHostChannelDetach(void *pvInstance);
323 static DECLCALLBACK(int) tsmfHostChannelSend(void *pvInstance, const void *pvData, uint32_t cbData);
324 static DECLCALLBACK(int) tsmfHostChannelRecv(void *pvInstance, void *pvData, uint32_t cbData,
325 uint32_t *pcbReturned, uint32_t *pcbRemaining);
326 static DECLCALLBACK(int) tsmfHostChannelControl(void *pvInstance, uint32_t u32Code,
327 const void *pvParm, uint32_t cbParm,
328 const void *pvData, uint32_t cbData, uint32_t *pcbDataReturned);
329 int tsmfLock(void);
330 void tsmfUnlock(void);
331 RTCRITSECT mTSMFLock;
332
333 /* Video input interface. */
334 VRDEVIDEOININTERFACE m_interfaceVideoIn;
335 VRDEVIDEOINCALLBACKS m_interfaceCallbacksVideoIn;
336 static DECLCALLBACK(void) VRDECallbackVideoInNotify(void *pvCallback,
337 uint32_t u32Id,
338 const void *pvData,
339 uint32_t cbData);
340 static DECLCALLBACK(void) VRDECallbackVideoInDeviceDesc(void *pvCallback,
341 int rcRequest,
342 void *pDeviceCtx,
343 void *pvUser,
344 const VRDEVIDEOINDEVICEDESC *pDeviceDesc,
345 uint32_t cbDevice);
346 static DECLCALLBACK(void) VRDECallbackVideoInControl(void *pvCallback,
347 int rcRequest,
348 void *pDeviceCtx,
349 void *pvUser,
350 const VRDEVIDEOINCTRLHDR *pControl,
351 uint32_t cbControl);
352 static DECLCALLBACK(void) VRDECallbackVideoInFrame(void *pvCallback,
353 int rcRequest,
354 void *pDeviceCtx,
355 const VRDEVIDEOINPAYLOADHDR *pFrame,
356 uint32_t cbFrame);
357 EmWebcam *mEmWebcam;
358
359 /* Input interface. */
360 VRDEINPUTINTERFACE m_interfaceInput;
361 VRDEINPUTCALLBACKS m_interfaceCallbacksInput;
362 static DECLCALLBACK(void) VRDECallbackInputSetup(void *pvCallback,
363 int rcRequest,
364 uint32_t u32Method,
365 const void *pvResult,
366 uint32_t cbResult);
367 static DECLCALLBACK(void) VRDECallbackInputEvent(void *pvCallback,
368 uint32_t u32Method,
369 const void *pvEvent,
370 uint32_t cbEvent);
371 uint64_t mu64TouchInputTimestampMCS;
372};
373
374
375class Console;
376
377class ATL_NO_VTABLE VRDEServerInfo :
378 public VRDEServerInfoWrap
379{
380public:
381 DECLARE_NOT_AGGREGATABLE(VRDEServerInfo)
382
383 DECLARE_COMMON_CLASS_METHODS(VRDEServerInfo)
384
385 HRESULT FinalConstruct();
386 void FinalRelease();
387
388 /* Public initializer/uninitializer for internal purposes only. */
389 HRESULT init(Console *aParent);
390 void uninit();
391
392private:
393 // wrapped IVRDEServerInfo properties
394#define DECL_GETTER(_aType, _aName) virtual HRESULT get##_aName(_aType *a##_aName)
395#define DECL_GETTER_REF(_aType, _aName) virtual HRESULT get##_aName(_aType &a##_aName)
396 DECL_GETTER(BOOL, Active);
397 DECL_GETTER(LONG, Port);
398 DECL_GETTER(ULONG, NumberOfClients);
399 DECL_GETTER(LONG64, BeginTime);
400 DECL_GETTER(LONG64, EndTime);
401 DECL_GETTER(LONG64, BytesSent);
402 DECL_GETTER(LONG64, BytesSentTotal);
403 DECL_GETTER(LONG64, BytesReceived);
404 DECL_GETTER(LONG64, BytesReceivedTotal);
405 DECL_GETTER_REF(com::Utf8Str, User);
406 DECL_GETTER_REF(com::Utf8Str, Domain);
407 DECL_GETTER_REF(com::Utf8Str, ClientName);
408 DECL_GETTER_REF(com::Utf8Str, ClientIP);
409 DECL_GETTER(ULONG, ClientVersion);
410 DECL_GETTER(ULONG, EncryptionStyle);
411#undef DECL_GETTER_REF
412#undef DECL_GETTER
413
414 Console * const mParent;
415};
416
417#endif /* !MAIN_INCLUDED_ConsoleVRDPServer_h */
418/* vi: set tabstop=4 shiftwidth=4 expandtab: */
Note: See TracBrowser for help on using the repository browser.

© 2023 Oracle
ContactPrivacy policyTerms of Use