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#include <freerdp/server/rdpgfx.h>
40
41#include <freerdp/codec/color.h>
42#include <freerdp/codec/region.h>
43
44#include <winpr/crt.h>
45#include <winpr/synch.h>
46#include <winpr/collections.h>
47#include <winpr/cmdline.h>
48
49#ifdef __cplusplus
50extern "C"
51{
52#endif
53
54 typedef struct rdp_shadow_client rdpShadowClient;
55 typedef struct rdp_shadow_server rdpShadowServer;
56 typedef struct rdp_shadow_screen rdpShadowScreen;
57 typedef struct rdp_shadow_surface rdpShadowSurface;
58 typedef struct rdp_shadow_encoder rdpShadowEncoder;
59 typedef struct rdp_shadow_capture rdpShadowCapture;
60 typedef struct rdp_shadow_subsystem rdpShadowSubsystem;
61 typedef struct rdp_shadow_multiclient_event rdpShadowMultiClientEvent;
62
63 typedef struct S_RDP_SHADOW_ENTRY_POINTS RDP_SHADOW_ENTRY_POINTS;
64 typedef int (*pfnShadowSubsystemEntry)(RDP_SHADOW_ENTRY_POINTS* pEntryPoints);
65
66 typedef rdpShadowSubsystem* (*pfnShadowSubsystemNew)(void);
67 typedef void (*pfnShadowSubsystemFree)(rdpShadowSubsystem* subsystem);
68
69 typedef int (*pfnShadowSubsystemInit)(rdpShadowSubsystem* subsystem);
70 typedef int (*pfnShadowSubsystemUninit)(rdpShadowSubsystem* subsystem);
71
72 typedef int (*pfnShadowSubsystemStart)(rdpShadowSubsystem* subsystem);
73 typedef int (*pfnShadowSubsystemStop)(rdpShadowSubsystem* subsystem);
74
75 typedef UINT32 (*pfnShadowEnumMonitors)(MONITOR_DEF* monitors, UINT32 maxMonitors);
76
77 typedef int (*pfnShadowAuthenticate)(rdpShadowSubsystem* subsystem, rdpShadowClient* client,
78 const char* user, const char* domain,
79 const char* password);
80 typedef BOOL (*pfnShadowClientConnect)(rdpShadowSubsystem* subsystem, rdpShadowClient* client);
81 typedef void (*pfnShadowClientDisconnect)(rdpShadowSubsystem* subsystem,
82 rdpShadowClient* client);
83 typedef BOOL (*pfnShadowClientCapabilities)(rdpShadowSubsystem* subsystem,
84 rdpShadowClient* client);
85
86 typedef BOOL (*pfnShadowSynchronizeEvent)(rdpShadowSubsystem* subsystem,
87 rdpShadowClient* client, UINT32 flags);
88 typedef BOOL (*pfnShadowKeyboardEvent)(rdpShadowSubsystem* subsystem, rdpShadowClient* client,
89 UINT16 flags, UINT8 code);
90 typedef BOOL (*pfnShadowUnicodeKeyboardEvent)(rdpShadowSubsystem* subsystem,
91 rdpShadowClient* client, UINT16 flags,
92 UINT16 code);
93 typedef BOOL (*pfnShadowMouseEvent)(rdpShadowSubsystem* subsystem, rdpShadowClient* client,
94 UINT16 flags, UINT16 x, UINT16 y);
95 typedef BOOL (*pfnShadowRelMouseEvent)(rdpShadowSubsystem* subsystem, rdpShadowClient* client,
96 UINT16 flags, INT16 xDelta,
97 INT16 yDelta);
99 typedef BOOL (*pfnShadowExtendedMouseEvent)(rdpShadowSubsystem* subsystem,
100 rdpShadowClient* client, UINT16 flags, UINT16 x,
101 UINT16 y);
102
103 typedef BOOL (*pfnShadowChannelAudinServerReceiveSamples)(rdpShadowSubsystem* subsystem,
104 rdpShadowClient* client,
105 const AUDIO_FORMAT* format,
106 wStream* data);
107
109 {
110 rdpContext context;
111
112 HANDLE thread;
113 BOOL activated;
114 BOOL first_frame;
115 BOOL inLobby;
116 BOOL mayView;
117 BOOL mayInteract;
118 BOOL suppressOutput;
119 UINT16 surfaceId;
120 wMessageQueue* MsgQueue;
121 CRITICAL_SECTION lock;
122 REGION16 invalidRegion;
123 rdpShadowServer* server;
124 rdpShadowEncoder* encoder;
125 rdpShadowSubsystem* subsystem;
126
127 UINT32 pointerX;
128 UINT32 pointerY;
129
130 HANDLE vcm;
131 EncomspServerContext* encomsp;
132 RemdeskServerContext* remdesk;
133 RdpsndServerContext* rdpsnd;
134#if defined(CHANNEL_AUDIN_SERVER)
135 audin_server_context* audin;
136#endif
137 RdpgfxServerContext* rdpgfx;
138
139 BOOL resizeRequested;
140 UINT32 resizeWidth;
141 UINT32 resizeHeight;
142 BOOL areGfxCapsReady;
143 };
144
146 {
147 void* ext;
148 HANDLE thread;
149 HANDLE StopEvent;
150 wArrayList* clients;
151 rdpSettings* settings;
152 rdpShadowScreen* screen;
153 rdpShadowSurface* surface;
154 rdpShadowSurface* lobby;
155 rdpShadowCapture* capture;
156 rdpShadowSubsystem* subsystem;
157
158 DWORD port;
159 BOOL mayView;
160 BOOL mayInteract;
161 BOOL shareSubRect;
162 BOOL authentication;
163 UINT32 selectedMonitor;
164 RECTANGLE_16 subRect;
165
166 /* Codec settings */
167 RLGR_MODE rfxMode; /* unused */
168 H264_RATECONTROL_MODE h264RateControlMode;
169 UINT32 h264BitRate;
170 UINT32 h264FrameRate;
171 UINT32 h264QP;
172
173 char* ipcSocket;
174 char* ConfigPath;
175 char* CertificateFile;
176 char* PrivateKeyFile;
177 CRITICAL_SECTION lock;
178 freerdp_listener* listener;
179
180 size_t maxClientsConnected;
181 BOOL SupportMultiRectBitmapUpdates;
183 };
184
186 {
187 rdpShadowServer* server;
188
189 UINT16 x;
190 UINT16 y;
191 UINT32 width;
192 UINT32 height;
193 UINT32 scanline;
194 DWORD format;
195 BYTE* data;
196
197 CRITICAL_SECTION lock;
198 REGION16 invalidRegion;
199 };
200
202 {
203 WINPR_ATTR_NODISCARD pfnShadowSubsystemNew New;
204 pfnShadowSubsystemFree Free;
205
206 WINPR_ATTR_NODISCARD pfnShadowSubsystemInit Init;
207 pfnShadowSubsystemUninit Uninit;
208
209 WINPR_ATTR_NODISCARD pfnShadowSubsystemStart Start;
210 pfnShadowSubsystemStop Stop;
211
212 WINPR_ATTR_NODISCARD pfnShadowEnumMonitors EnumMonitors;
213 };
214
216 {
217 RDP_SHADOW_ENTRY_POINTS ep;
218 HANDLE event;
219 UINT32 numMonitors;
220 UINT32 captureFrameRate;
221 UINT32 selectedMonitor;
222 MONITOR_DEF monitors[16];
223 MONITOR_DEF virtualScreen;
224
225 /* This event indicates that we have graphic change */
226 /* such as screen update and resize. It should not be */
227 /* used by subsystem implementation directly */
228 rdpShadowMultiClientEvent* updateEvent;
229
230 wMessagePipe* MsgPipe;
231 UINT32 pointerX;
232 UINT32 pointerY;
233
234 AUDIO_FORMAT* rdpsndFormats;
235 size_t nRdpsndFormats;
236 AUDIO_FORMAT* audinFormats;
237 size_t nAudinFormats;
238
239 WINPR_ATTR_NODISCARD pfnShadowSynchronizeEvent SynchronizeEvent;
240 WINPR_ATTR_NODISCARD pfnShadowKeyboardEvent KeyboardEvent;
241 WINPR_ATTR_NODISCARD pfnShadowUnicodeKeyboardEvent UnicodeKeyboardEvent;
242 WINPR_ATTR_NODISCARD pfnShadowMouseEvent MouseEvent;
243 WINPR_ATTR_NODISCARD pfnShadowExtendedMouseEvent ExtendedMouseEvent;
244 WINPR_ATTR_NODISCARD pfnShadowChannelAudinServerReceiveSamples AudinServerReceiveSamples;
245
246 WINPR_ATTR_NODISCARD pfnShadowAuthenticate Authenticate;
247 WINPR_ATTR_NODISCARD pfnShadowClientConnect ClientConnect;
248 pfnShadowClientDisconnect ClientDisconnect;
249 WINPR_ATTR_NODISCARD pfnShadowClientCapabilities ClientCapabilities;
250
251 rdpShadowServer* server;
252
253 WINPR_ATTR_NODISCARD pfnShadowRelMouseEvent RelMouseEvent;
254 };
255
256/* Definition of message between subsystem and clients */
257#define SHADOW_MSG_IN_REFRESH_REQUEST_ID 1001
258
259 typedef struct S_SHADOW_MSG_OUT SHADOW_MSG_OUT;
260 typedef void (*MSG_OUT_FREE_FN)(UINT32 id,
261 SHADOW_MSG_OUT* msg); /* function to free SHADOW_MSG_OUT */
262
264 {
265 int refCount;
266 MSG_OUT_FREE_FN Free;
267 };
268
269#define SHADOW_MSG_OUT_POINTER_POSITION_UPDATE_ID 2001
270#define SHADOW_MSG_OUT_POINTER_ALPHA_UPDATE_ID 2002
271#define SHADOW_MSG_OUT_AUDIO_OUT_SAMPLES_ID 2003
272#define SHADOW_MSG_OUT_AUDIO_OUT_VOLUME_ID 2004
273
274 typedef struct
275 {
276 SHADOW_MSG_OUT common;
277 UINT32 xPos;
278 UINT32 yPos;
280
281 typedef struct
282 {
283 SHADOW_MSG_OUT common;
284 UINT32 xHot;
285 UINT32 yHot;
286 UINT32 width;
287 UINT32 height;
288 UINT32 lengthAndMask;
289 UINT32 lengthXorMask;
290 BYTE* xorMaskData;
291 BYTE* andMaskData;
293
294 typedef struct
295 {
296 SHADOW_MSG_OUT common;
297 AUDIO_FORMAT* audio_format;
298 void* buf;
299 size_t nFrames;
300 UINT16 wTimestamp;
302
303 typedef struct
304 {
305 SHADOW_MSG_OUT common;
306 UINT16 left;
307 UINT16 right;
309
310 FREERDP_API void shadow_subsystem_set_entry_builtin(const char* name);
311 FREERDP_API void shadow_subsystem_set_entry(pfnShadowSubsystemEntry pEntry);
312
313#if !defined(WITHOUT_FREERDP_3x_DEPRECATED)
314 WINPR_DEPRECATED_VAR(
315 "[since 3.4.0] Use shadow_subsystem_pointer_convert_alpha_pointer_data_to_format instead",
316 WINPR_ATTR_NODISCARD FREERDP_API int shadow_subsystem_pointer_convert_alpha_pointer_data(
317 const BYTE* WINPR_RESTRICT pixels, BOOL premultiplied, UINT32 width, UINT32 height,
318 SHADOW_MSG_OUT_POINTER_ALPHA_UPDATE* WINPR_RESTRICT pointerColor));
319#endif
320
334 WINPR_ATTR_NODISCARD
335 FREERDP_API int shadow_subsystem_pointer_convert_alpha_pointer_data_to_format(
336 const BYTE* WINPR_RESTRICT pixels, UINT32 format, BOOL premultiplied, UINT32 width,
337 UINT32 height, SHADOW_MSG_OUT_POINTER_ALPHA_UPDATE* WINPR_RESTRICT pointerColor);
338
339 WINPR_ATTR_NODISCARD
340 FREERDP_API int shadow_server_parse_command_line(rdpShadowServer* server, int argc, char** argv,
342
343 WINPR_ATTR_NODISCARD
344 FREERDP_API int shadow_server_command_line_status_print(rdpShadowServer* server, int argc,
345 char** argv, int status,
346 const COMMAND_LINE_ARGUMENT_A* cargs);
347
348 WINPR_ATTR_NODISCARD
349 FREERDP_API int shadow_server_start(rdpShadowServer* server);
350
351 FREERDP_API int shadow_server_stop(rdpShadowServer* server);
352
353 WINPR_ATTR_NODISCARD
354 FREERDP_API int shadow_server_init(rdpShadowServer* server);
355
356 FREERDP_API int shadow_server_uninit(rdpShadowServer* server);
357
358 WINPR_ATTR_NODISCARD
359 FREERDP_API UINT32 shadow_enum_monitors(MONITOR_DEF* monitors, UINT32 maxMonitors);
360
361 FREERDP_API void shadow_server_free(rdpShadowServer* server);
362
363 WINPR_ATTR_MALLOC(shadow_server_free, 1)
364 WINPR_ATTR_NODISCARD
365 FREERDP_API rdpShadowServer* shadow_server_new(void);
366
367 WINPR_ATTR_NODISCARD
368 FREERDP_API int shadow_capture_align_clip_rect(RECTANGLE_16* rect, const RECTANGLE_16* clip);
369
370#if !defined(WITHOUT_FREERDP_3x_DEPRECATED)
371 WINPR_DEPRECATED_VAR("[since 3.4.0] Use shadow_capture_compare_with_format",
372 WINPR_ATTR_NODISCARD FREERDP_API int shadow_capture_compare(
373 const BYTE* WINPR_RESTRICT pData1, UINT32 nStep1, UINT32 nWidth,
374 UINT32 nHeight, const BYTE* WINPR_RESTRICT pData2, UINT32 nStep2,
375 RECTANGLE_16* WINPR_RESTRICT rect));
376#endif
377
394 WINPR_ATTR_NODISCARD
395 FREERDP_API int shadow_capture_compare_with_format(const BYTE* WINPR_RESTRICT pData1,
396 UINT32 format1, UINT32 nStep1, UINT32 nWidth,
397 UINT32 nHeight,
398 const BYTE* WINPR_RESTRICT pData2,
399 UINT32 format2, UINT32 nStep2,
400 RECTANGLE_16* WINPR_RESTRICT rect);
401
402 FREERDP_API void shadow_subsystem_frame_update(rdpShadowSubsystem* subsystem);
403
404 WINPR_ATTR_NODISCARD
405 FREERDP_API BOOL shadow_client_post_msg(rdpShadowClient* client, void* context, UINT32 type,
406 SHADOW_MSG_OUT* msg, void* lParam);
407
408 WINPR_ATTR_NODISCARD
409 FREERDP_API int shadow_client_boardcast_msg(rdpShadowServer* server, void* context, UINT32 type,
410 SHADOW_MSG_OUT* msg, void* lParam);
411
412 WINPR_ATTR_NODISCARD
413 FREERDP_API int shadow_client_boardcast_quit(rdpShadowServer* server, int nExitCode);
414
415 WINPR_ATTR_NODISCARD
416 FREERDP_API UINT32 shadow_encoder_preferred_fps(rdpShadowEncoder* encoder);
417
418 WINPR_ATTR_NODISCARD
419 FREERDP_API UINT32 shadow_encoder_inflight_frames(rdpShadowEncoder* encoder);
420
421 WINPR_ATTR_NODISCARD
422 FREERDP_API BOOL shadow_screen_resize(rdpShadowScreen* screen);
423
424#ifdef __cplusplus
425}
426#endif
427
428#endif /* FREERDP_SERVER_SHADOW_H */