FreeRDP
Loading...
Searching...
No Matches
include/freerdp/server/shadow.h
1
20#ifndef FREERDP_SERVER_SHADOW_H
21#define FREERDP_SERVER_SHADOW_H
22
23#include <freerdp/api.h>
24#include <freerdp/types.h>
25
26#include <freerdp/freerdp.h>
27#include <freerdp/settings.h>
28#include <freerdp/listener.h>
29
30#include <freerdp/channels/wtsvc.h>
31#include <freerdp/channels/channels.h>
32
33#include <freerdp/server/encomsp.h>
34#include <freerdp/server/remdesk.h>
35#include <freerdp/server/rdpsnd.h>
36#if defined(CHANNEL_AUDIN_SERVER)
37#include <freerdp/server/audin.h>
38#endif
39#if defined(CHANNEL_CLIPRDR_SERVER)
40#include <freerdp/server/cliprdr.h>
41#endif
42#include <freerdp/server/rdpgfx.h>
43
44#include <freerdp/codec/color.h>
45#include <freerdp/codec/region.h>
46
47#include <winpr/crt.h>
48#include <winpr/synch.h>
49#include <winpr/collections.h>
50#include <winpr/cmdline.h>
51
52#ifdef __cplusplus
53extern "C"
54{
55#endif
56
57 typedef struct rdp_shadow_client rdpShadowClient;
58 typedef struct rdp_shadow_server rdpShadowServer;
59 typedef struct rdp_shadow_screen rdpShadowScreen;
60 typedef struct rdp_shadow_surface rdpShadowSurface;
61 typedef struct rdp_shadow_encoder rdpShadowEncoder;
62 typedef struct rdp_shadow_capture rdpShadowCapture;
63 typedef struct rdp_shadow_subsystem rdpShadowSubsystem;
64 typedef struct rdp_shadow_multiclient_event rdpShadowMultiClientEvent;
65 typedef struct rdp_shadow_clipboard rdpShadowClipboard;
67 typedef struct S_RDP_SHADOW_ENTRY_POINTS RDP_SHADOW_ENTRY_POINTS;
68 typedef int (*pfnShadowSubsystemEntry)(RDP_SHADOW_ENTRY_POINTS* pEntryPoints);
69
70 typedef rdpShadowSubsystem* (*pfnShadowSubsystemNew)(void);
71 typedef void (*pfnShadowSubsystemFree)(rdpShadowSubsystem* subsystem);
72
73 typedef int (*pfnShadowSubsystemInit)(rdpShadowSubsystem* subsystem);
74 typedef int (*pfnShadowSubsystemUninit)(rdpShadowSubsystem* subsystem);
75
76 typedef int (*pfnShadowSubsystemStart)(rdpShadowSubsystem* subsystem);
77 typedef int (*pfnShadowSubsystemStop)(rdpShadowSubsystem* subsystem);
78
79 typedef UINT32 (*pfnShadowEnumMonitors)(MONITOR_DEF* monitors, UINT32 maxMonitors);
80
81 typedef int (*pfnShadowAuthenticate)(rdpShadowSubsystem* subsystem, rdpShadowClient* client,
82 const char* user, const char* domain,
83 const char* password);
84 typedef BOOL (*pfnShadowClientConnect)(rdpShadowSubsystem* subsystem, rdpShadowClient* client);
85 typedef void (*pfnShadowClientDisconnect)(rdpShadowSubsystem* subsystem,
86 rdpShadowClient* client);
87 typedef BOOL (*pfnShadowClientCapabilities)(rdpShadowSubsystem* subsystem,
88 rdpShadowClient* client);
89
90 typedef BOOL (*pfnShadowSynchronizeEvent)(rdpShadowSubsystem* subsystem,
91 rdpShadowClient* client, UINT32 flags);
92 typedef BOOL (*pfnShadowKeyboardEvent)(rdpShadowSubsystem* subsystem, rdpShadowClient* client,
93 UINT16 flags, UINT8 code);
94 typedef BOOL (*pfnShadowUnicodeKeyboardEvent)(rdpShadowSubsystem* subsystem,
95 rdpShadowClient* client, UINT16 flags,
96 UINT16 code);
97 typedef BOOL (*pfnShadowMouseEvent)(rdpShadowSubsystem* subsystem, rdpShadowClient* client,
98 UINT16 flags, UINT16 x, UINT16 y);
99 typedef BOOL (*pfnShadowRelMouseEvent)(rdpShadowSubsystem* subsystem, rdpShadowClient* client,
100 UINT16 flags, INT16 xDelta,
101 INT16 yDelta);
103 typedef BOOL (*pfnShadowExtendedMouseEvent)(rdpShadowSubsystem* subsystem,
104 rdpShadowClient* client, UINT16 flags, UINT16 x,
105 UINT16 y);
106
107 typedef BOOL (*pfnShadowChannelAudinServerReceiveSamples)(rdpShadowSubsystem* subsystem,
108 rdpShadowClient* client,
109 const AUDIO_FORMAT* format,
110 wStream* data);
111
119#define SHADOW_CLIPBOARD_MAX_SIZE (256ull * 1024ull * 1024ull)
120
123 typedef BOOL (*pfnShadowClipboardOffer)(rdpShadowSubsystem* subsystem,
124 const char* const* mimeTypes, size_t count);
125
128 typedef BOOL (*pfnShadowClipboardRead)(rdpShadowSubsystem* subsystem, const char* mimeType);
129
132 typedef BOOL (*pfnShadowClipboardProvide)(rdpShadowSubsystem* subsystem, UINT32 request,
133 const BYTE* data, size_t size);
134
136 {
137 rdpContext context;
138
139 HANDLE thread;
140 BOOL activated;
141 BOOL first_frame;
142 BOOL inLobby;
143 BOOL mayView;
144 BOOL mayInteract;
145 BOOL suppressOutput;
146 UINT16 surfaceId;
147 wMessageQueue* MsgQueue;
148 CRITICAL_SECTION lock;
149 REGION16 invalidRegion;
150 rdpShadowServer* server;
151 rdpShadowEncoder* encoder;
152 rdpShadowSubsystem* subsystem;
153
154 UINT32 pointerX;
155 UINT32 pointerY;
156
157 HANDLE vcm;
158 EncomspServerContext* encomsp;
159 RemdeskServerContext* remdesk;
160 RdpsndServerContext* rdpsnd;
161#if defined(CHANNEL_AUDIN_SERVER)
162 audin_server_context* audin;
163#endif
164 RdpgfxServerContext* rdpgfx;
165#if defined(CHANNEL_CLIPRDR_SERVER)
166 CliprdrServerContext* cliprdr;
167#endif
168
169 BOOL resizeRequested;
170 UINT32 resizeWidth;
171 UINT32 resizeHeight;
172 BOOL areGfxCapsReady;
177 wMessageQueue* SoundQueue;
178 HANDLE soundThread;
184 BYTE keysDown[128];
185 };
186
188 {
189 void* ext;
190 HANDLE thread;
191 HANDLE StopEvent;
192 wArrayList* clients;
193 rdpSettings* settings;
194 rdpShadowScreen* screen;
195 rdpShadowSurface* surface;
196 rdpShadowSurface* lobby;
197 rdpShadowCapture* capture;
198 rdpShadowSubsystem* subsystem;
199
200 DWORD port;
201 BOOL mayView;
202 BOOL mayInteract;
203 BOOL shareSubRect;
204 BOOL authentication;
205 UINT32 selectedMonitor;
206 RECTANGLE_16 subRect;
207
208 /* Codec settings */
209 RLGR_MODE rfxMode; /* unused */
210 H264_RATECONTROL_MODE h264RateControlMode;
211 UINT32 h264BitRate;
212 UINT32 h264FrameRate;
213 UINT32 h264QP;
214
215 char* ipcSocket;
216 char* ConfigPath;
217 char* CertificateFile;
218 char* PrivateKeyFile;
219 CRITICAL_SECTION lock;
220 freerdp_listener* listener;
221
222 size_t maxClientsConnected;
223 BOOL SupportMultiRectBitmapUpdates;
225#if defined(WITH_GFX_AV1)
226 FREERDP_AV1_RATECONTROL AV1RateControlMode;
227 UINT32 AV1BitRate;
228#else
229 UINT32 reservedAV1[2];
230#endif
231 BOOL h264HwAccel;
234 UINT16 keysHeld[0x400];
235#if defined(WITH_GFX_AV2)
236 FREERDP_AV2_RATECONTROL AV2RateControlMode;
237 UINT32 AV2BitRate;
238#else
239 UINT32 reservedAV2[2];
240#endif
241 rdpShadowClipboard* clipboard;
242 };
243
245 {
246 rdpShadowServer* server;
247
248 UINT16 x;
249 UINT16 y;
250 UINT32 width;
251 UINT32 height;
252 UINT32 scanline;
253 DWORD format;
254 BYTE* data;
255
256 CRITICAL_SECTION lock;
257 REGION16 invalidRegion;
258 };
259
261 {
262 WINPR_ATTR_NODISCARD pfnShadowSubsystemNew New;
263 pfnShadowSubsystemFree Free;
264
265 WINPR_ATTR_NODISCARD pfnShadowSubsystemInit Init;
266 pfnShadowSubsystemUninit Uninit;
267
268 WINPR_ATTR_NODISCARD pfnShadowSubsystemStart Start;
269 pfnShadowSubsystemStop Stop;
270
271 WINPR_ATTR_NODISCARD pfnShadowEnumMonitors EnumMonitors;
272 };
273
275 {
276 RDP_SHADOW_ENTRY_POINTS ep;
277 HANDLE event;
278 UINT32 numMonitors;
279 UINT32 captureFrameRate;
280 UINT32 selectedMonitor;
281 MONITOR_DEF monitors[16];
282 MONITOR_DEF virtualScreen;
283
284 /* This event indicates that we have graphic change */
285 /* such as screen update and resize. It should not be */
286 /* used by subsystem implementation directly */
287 rdpShadowMultiClientEvent* updateEvent;
288
289 wMessagePipe* MsgPipe;
290 UINT32 pointerX;
291 UINT32 pointerY;
292
293 AUDIO_FORMAT* rdpsndFormats;
294 size_t nRdpsndFormats;
295 AUDIO_FORMAT* audinFormats;
296 size_t nAudinFormats;
297
298 WINPR_ATTR_NODISCARD pfnShadowSynchronizeEvent SynchronizeEvent;
299 WINPR_ATTR_NODISCARD pfnShadowKeyboardEvent KeyboardEvent;
300 WINPR_ATTR_NODISCARD pfnShadowUnicodeKeyboardEvent UnicodeKeyboardEvent;
301 WINPR_ATTR_NODISCARD pfnShadowMouseEvent MouseEvent;
302 WINPR_ATTR_NODISCARD pfnShadowExtendedMouseEvent ExtendedMouseEvent;
303 WINPR_ATTR_NODISCARD pfnShadowChannelAudinServerReceiveSamples AudinServerReceiveSamples;
304
305 WINPR_ATTR_NODISCARD pfnShadowAuthenticate Authenticate;
306 WINPR_ATTR_NODISCARD pfnShadowClientConnect ClientConnect;
307 pfnShadowClientDisconnect ClientDisconnect;
308 WINPR_ATTR_NODISCARD pfnShadowClientCapabilities ClientCapabilities;
309
310 rdpShadowServer* server;
311
312 WINPR_ATTR_NODISCARD pfnShadowRelMouseEvent RelMouseEvent;
314 /* all three, or a client gets no clipboard channel from the core */
315 WINPR_ATTR_NODISCARD pfnShadowClipboardOffer ClipboardOffer;
316 WINPR_ATTR_NODISCARD pfnShadowClipboardRead ClipboardRead;
317 WINPR_ATTR_NODISCARD pfnShadowClipboardProvide
319 };
320
321/* Definition of message between subsystem and clients */
322#define SHADOW_MSG_IN_REFRESH_REQUEST_ID 1001
323
324 typedef struct S_SHADOW_MSG_OUT SHADOW_MSG_OUT;
325 typedef void (*MSG_OUT_FREE_FN)(UINT32 id,
326 SHADOW_MSG_OUT* msg); /* function to free SHADOW_MSG_OUT */
327
329 {
330 LONG refCount; /* InterlockedIncrement() and InterlockedDecrement() take a LONG* */
331 MSG_OUT_FREE_FN Free;
332 };
333
334#define SHADOW_MSG_OUT_POINTER_POSITION_UPDATE_ID 2001
335#define SHADOW_MSG_OUT_POINTER_ALPHA_UPDATE_ID 2002
336#define SHADOW_MSG_OUT_AUDIO_OUT_SAMPLES_ID 2003
337#define SHADOW_MSG_OUT_AUDIO_OUT_VOLUME_ID 2004
338
339 typedef struct
340 {
341 SHADOW_MSG_OUT common;
342 UINT32 xPos;
343 UINT32 yPos;
345
346 typedef struct
347 {
348 SHADOW_MSG_OUT common;
349 UINT32 xHot;
350 UINT32 yHot;
351 UINT32 width;
352 UINT32 height;
353 UINT32 lengthAndMask;
354 UINT32 lengthXorMask;
355 BYTE* xorMaskData;
356 BYTE* andMaskData;
358
359 typedef struct
360 {
361 SHADOW_MSG_OUT common;
362 AUDIO_FORMAT* audio_format;
363 void* buf;
364 size_t nFrames;
365 UINT16 wTimestamp;
367
368 typedef struct
369 {
370 SHADOW_MSG_OUT common;
371 UINT16 left;
372 UINT16 right;
374
375 FREERDP_API void shadow_subsystem_set_entry_builtin(const char* name);
376 FREERDP_API void shadow_subsystem_set_entry(pfnShadowSubsystemEntry pEntry);
377
391 WINPR_ATTR_NODISCARD
392 FREERDP_API BOOL shadow_subsystem_add_entry(const char* name, pfnShadowSubsystemEntry pEntry);
393
394#if !defined(WITHOUT_FREERDP_3x_DEPRECATED)
395 WINPR_DEPRECATED_VAR(
396 "[since 3.4.0] Use shadow_subsystem_pointer_convert_alpha_pointer_data_to_format instead",
397 WINPR_ATTR_NODISCARD FREERDP_API int shadow_subsystem_pointer_convert_alpha_pointer_data(
398 const BYTE* WINPR_RESTRICT pixels, BOOL premultiplied, UINT32 width, UINT32 height,
399 SHADOW_MSG_OUT_POINTER_ALPHA_UPDATE* WINPR_RESTRICT pointerColor));
400#endif
401
415 WINPR_ATTR_NODISCARD
416 FREERDP_API int shadow_subsystem_pointer_convert_alpha_pointer_data_to_format(
417 const BYTE* WINPR_RESTRICT pixels, UINT32 format, BOOL premultiplied, UINT32 width,
418 UINT32 height, SHADOW_MSG_OUT_POINTER_ALPHA_UPDATE* WINPR_RESTRICT pointerColor);
419
420 WINPR_ATTR_NODISCARD
421 FREERDP_API int shadow_server_parse_command_line(rdpShadowServer* server, int argc, char** argv,
423
424 WINPR_ATTR_NODISCARD
425 FREERDP_API int shadow_server_command_line_status_print(rdpShadowServer* server, int argc,
426 char** argv, int status,
427 const COMMAND_LINE_ARGUMENT_A* cargs);
428
429 WINPR_ATTR_NODISCARD
430 FREERDP_API int shadow_server_start(rdpShadowServer* server);
431
432 FREERDP_API int shadow_server_stop(rdpShadowServer* server);
433
434 WINPR_ATTR_NODISCARD
435 FREERDP_API int shadow_server_init(rdpShadowServer* server);
436
437 FREERDP_API int shadow_server_uninit(rdpShadowServer* server);
438
439 WINPR_ATTR_NODISCARD
440 FREERDP_API UINT32 shadow_enum_monitors(MONITOR_DEF* monitors, UINT32 maxMonitors);
441
442 FREERDP_API void shadow_server_free(rdpShadowServer* server);
443
444 WINPR_ATTR_MALLOC(shadow_server_free, 1)
445 WINPR_ATTR_NODISCARD
446 FREERDP_API rdpShadowServer* shadow_server_new(void);
447
448 WINPR_ATTR_NODISCARD
449 FREERDP_API int shadow_capture_align_clip_rect(RECTANGLE_16* rect, const RECTANGLE_16* clip);
450
451#if !defined(WITHOUT_FREERDP_3x_DEPRECATED)
452 WINPR_DEPRECATED_VAR("[since 3.4.0] Use shadow_capture_compare_with_format",
453 WINPR_ATTR_NODISCARD FREERDP_API int shadow_capture_compare(
454 const BYTE* WINPR_RESTRICT pData1, UINT32 nStep1, UINT32 nWidth,
455 UINT32 nHeight, const BYTE* WINPR_RESTRICT pData2, UINT32 nStep2,
456 RECTANGLE_16* WINPR_RESTRICT rect));
457#endif
458
475 WINPR_ATTR_NODISCARD
476 FREERDP_API int shadow_capture_compare_with_format(const BYTE* WINPR_RESTRICT pData1,
477 UINT32 format1, UINT32 nStep1, UINT32 nWidth,
478 UINT32 nHeight,
479 const BYTE* WINPR_RESTRICT pData2,
480 UINT32 format2, UINT32 nStep2,
481 RECTANGLE_16* WINPR_RESTRICT rect);
482
483 FREERDP_API void shadow_subsystem_frame_update(rdpShadowSubsystem* subsystem);
484
485 WINPR_ATTR_NODISCARD
486 FREERDP_API BOOL shadow_client_post_msg(rdpShadowClient* client, void* context, UINT32 type,
487 SHADOW_MSG_OUT* msg, void* lParam);
488
489 WINPR_ATTR_NODISCARD
490 FREERDP_API int shadow_client_boardcast_msg(rdpShadowServer* server, void* context, UINT32 type,
491 SHADOW_MSG_OUT* msg, void* lParam);
492
493 WINPR_ATTR_NODISCARD
494 FREERDP_API int shadow_client_boardcast_quit(rdpShadowServer* server, int nExitCode);
495
505 WINPR_ATTR_NODISCARD
506 FREERDP_API BOOL shadow_clipboard_session_changed(rdpShadowServer* server,
507 const char* const* mimeTypes, size_t count);
508
518 WINPR_ATTR_NODISCARD
519 FREERDP_API BOOL shadow_clipboard_session_data(rdpShadowServer* server, const BYTE* data,
520 size_t size);
521
531 WINPR_ATTR_NODISCARD
532 FREERDP_API BOOL shadow_clipboard_session_request(rdpShadowServer* server, UINT32 request,
533 const char* mimeType);
534
535 WINPR_ATTR_NODISCARD
536 FREERDP_API UINT32 shadow_encoder_preferred_fps(rdpShadowEncoder* encoder);
537
538 WINPR_ATTR_NODISCARD
539 FREERDP_API UINT32 shadow_encoder_inflight_frames(rdpShadowEncoder* encoder);
540
541 WINPR_ATTR_NODISCARD
542 FREERDP_API BOOL shadow_screen_resize(rdpShadowScreen* screen);
543
544#ifdef __cplusplus
545}
546#endif
547
548#endif /* FREERDP_SERVER_SHADOW_H */
WINPR_ATTR_NODISCARD pfnShadowClipboardRead ClipboardRead
WINPR_ATTR_NODISCARD pfnShadowClipboardOffer ClipboardOffer
WINPR_ATTR_NODISCARD pfnShadowClipboardProvide ClipboardProvide