2 * FreeRDP: A Remote Desktop Protocol Implementation
5 * Copyright 2014 Marc-Andre Moreau <marcandre.moreau@gmail.com>
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
20 #ifndef FREERDP_SERVER_SHADOW_H
21 #define FREERDP_SERVER_SHADOW_H
23 #include <freerdp/api.h>
24 #include <freerdp/types.h>
26 #include <freerdp/settings.h>
27 #include <freerdp/listener.h>
29 #include <freerdp/channels/wtsvc.h>
30 #include <freerdp/channels/channels.h>
32 #include <freerdp/server/encomsp.h>
33 #include <freerdp/server/remdesk.h>
34 #include <freerdp/server/rdpsnd.h>
35 #include <freerdp/server/audin.h>
37 #include <freerdp/codec/color.h>
38 #include <freerdp/codec/region.h>
40 #include <winpr/crt.h>
41 #include <winpr/synch.h>
42 #include <winpr/collections.h>
44 typedef struct rdp_shadow_client rdpShadowClient;
45 typedef struct rdp_shadow_server rdpShadowServer;
46 typedef struct rdp_shadow_screen rdpShadowScreen;
47 typedef struct rdp_shadow_surface rdpShadowSurface;
48 typedef struct rdp_shadow_encoder rdpShadowEncoder;
49 typedef struct rdp_shadow_capture rdpShadowCapture;
50 typedef struct rdp_shadow_subsystem rdpShadowSubsystem;
51 typedef struct rdp_shadow_multiclient_event rdpShadowMultiClientEvent;
53 typedef struct _RDP_SHADOW_ENTRY_POINTS RDP_SHADOW_ENTRY_POINTS;
54 typedef int (*pfnShadowSubsystemEntry)(RDP_SHADOW_ENTRY_POINTS* pEntryPoints);
56 typedef rdpShadowSubsystem* (*pfnShadowSubsystemNew)(void);
57 typedef void (*pfnShadowSubsystemFree)(rdpShadowSubsystem* subsystem);
59 typedef int (*pfnShadowSubsystemInit)(rdpShadowSubsystem* subsystem);
60 typedef int (*pfnShadowSubsystemUninit)(rdpShadowSubsystem* subsystem);
62 typedef int (*pfnShadowSubsystemStart)(rdpShadowSubsystem* subsystem);
63 typedef int (*pfnShadowSubsystemStop)(rdpShadowSubsystem* subsystem);
65 typedef int (*pfnShadowEnumMonitors)(MONITOR_DEF* monitors, int maxMonitors);
67 typedef int (*pfnShadowAuthenticate)(rdpShadowSubsystem* subsystem,
68 const char* user, const char* domain, const char* password);
70 typedef int (*pfnShadowSynchronizeEvent)(rdpShadowSubsystem* subsystem, UINT32 flags);
71 typedef int (*pfnShadowKeyboardEvent)(rdpShadowSubsystem* subsystem, UINT16 flags, UINT16 code);
72 typedef int (*pfnShadowUnicodeKeyboardEvent)(rdpShadowSubsystem* subsystem, UINT16 flags, UINT16 code);
73 typedef int (*pfnShadowMouseEvent)(rdpShadowSubsystem* subsystem, UINT16 flags, UINT16 x, UINT16 y);
74 typedef int (*pfnShadowExtendedMouseEvent)(rdpShadowSubsystem* subsystem, UINT16 flags, UINT16 x, UINT16 y);
76 typedef void (*pfnShadowChannelAudinServerReceiveSamples)(rdpShadowSubsystem* subsystem, const void* buf, int nframes);
78 struct rdp_shadow_client
87 wMessageQueue* MsgQueue;
88 CRITICAL_SECTION lock;
89 REGION16 invalidRegion;
90 rdpShadowServer* server;
91 rdpShadowSurface* lobby;
92 rdpShadowEncoder* encoder;
93 rdpShadowSubsystem* subsystem;
99 EncomspServerContext* encomsp;
100 RemdeskServerContext* remdesk;
101 RdpsndServerContext* rdpsnd;
102 audin_server_context* audin;
105 struct rdp_shadow_server
111 rdpShadowScreen* screen;
112 rdpShadowSurface* surface;
113 rdpShadowCapture* capture;
114 rdpShadowSubsystem* subsystem;
122 RECTANGLE_16 subRect;
125 char* CertificateFile;
126 char* PrivateKeyFile;
127 CRITICAL_SECTION lock;
128 freerdp_listener* listener;
131 struct _RDP_SHADOW_ENTRY_POINTS
133 pfnShadowSubsystemNew New;
134 pfnShadowSubsystemFree Free;
136 pfnShadowSubsystemInit Init;
137 pfnShadowSubsystemUninit Uninit;
139 pfnShadowSubsystemStart Start;
140 pfnShadowSubsystemStop Stop;
142 pfnShadowEnumMonitors EnumMonitors;
145 #define RDP_SHADOW_SUBSYSTEM_COMMON() \
146 RDP_SHADOW_ENTRY_POINTS ep; \
149 int captureFrameRate; \
150 int selectedMonitor; \
151 MONITOR_DEF monitors[16]; \
152 MONITOR_DEF virtualScreen; \
153 rdpShadowMultiClientEvent* updateEvent; \
154 BOOL suppressOutput; \
155 REGION16 invalidRegion; \
156 wMessagePipe* MsgPipe; \
160 const AUDIO_FORMAT* rdpsndFormats; \
161 int nRdpsndFormats; \
162 const AUDIO_FORMAT* audinFormats; \
165 pfnShadowSynchronizeEvent SynchronizeEvent; \
166 pfnShadowKeyboardEvent KeyboardEvent; \
167 pfnShadowUnicodeKeyboardEvent UnicodeKeyboardEvent; \
168 pfnShadowMouseEvent MouseEvent; \
169 pfnShadowExtendedMouseEvent ExtendedMouseEvent; \
170 pfnShadowChannelAudinServerReceiveSamples AudinServerReceiveSamples; \
172 pfnShadowAuthenticate Authenticate; \
174 rdpShadowServer* server
176 struct rdp_shadow_subsystem
178 RDP_SHADOW_SUBSYSTEM_COMMON();
181 /* Definition of message between subsystem and clients */
182 #define SHADOW_MSG_IN_REFRESH_OUTPUT_ID 1001
183 #define SHADOW_MSG_IN_SUPPRESS_OUTPUT_ID 1002
185 struct _SHADOW_MSG_IN_REFRESH_OUTPUT
190 typedef struct _SHADOW_MSG_IN_REFRESH_OUTPUT SHADOW_MSG_IN_REFRESH_OUTPUT;
192 struct _SHADOW_MSG_IN_SUPPRESS_OUTPUT
197 typedef struct _SHADOW_MSG_IN_SUPPRESS_OUTPUT SHADOW_MSG_IN_SUPPRESS_OUTPUT;
199 typedef struct _SHADOW_MSG_OUT SHADOW_MSG_OUT;
200 typedef void (*MSG_OUT_FREE_FN)(UINT32 id, SHADOW_MSG_OUT* msg);
201 #define RDP_SHADOW_MSG_OUT_COMMON() \
203 MSG_OUT_FREE_FN Free; /* function to free SHADOW_MSG_OUT */
205 struct _SHADOW_MSG_OUT
207 RDP_SHADOW_MSG_OUT_COMMON();
210 #define SHADOW_MSG_OUT_POINTER_POSITION_UPDATE_ID 2001
211 #define SHADOW_MSG_OUT_POINTER_ALPHA_UPDATE_ID 2002
212 #define SHADOW_MSG_OUT_AUDIO_OUT_SAMPLES_ID 2003
213 #define SHADOW_MSG_OUT_AUDIO_OUT_VOLUME_ID 2004
215 struct _SHADOW_MSG_OUT_POINTER_POSITION_UPDATE
217 RDP_SHADOW_MSG_OUT_COMMON();
221 typedef struct _SHADOW_MSG_OUT_POINTER_POSITION_UPDATE SHADOW_MSG_OUT_POINTER_POSITION_UPDATE;
223 struct _SHADOW_MSG_OUT_POINTER_ALPHA_UPDATE
225 RDP_SHADOW_MSG_OUT_COMMON();
234 typedef struct _SHADOW_MSG_OUT_POINTER_ALPHA_UPDATE SHADOW_MSG_OUT_POINTER_ALPHA_UPDATE;
236 struct _SHADOW_MSG_OUT_AUDIO_OUT_SAMPLES
238 RDP_SHADOW_MSG_OUT_COMMON();
239 AUDIO_FORMAT audio_format;
244 typedef struct _SHADOW_MSG_OUT_AUDIO_OUT_SAMPLES SHADOW_MSG_OUT_AUDIO_OUT_SAMPLES;
246 struct _SHADOW_MSG_OUT_AUDIO_OUT_VOLUME
248 RDP_SHADOW_MSG_OUT_COMMON();
252 typedef struct _SHADOW_MSG_OUT_AUDIO_OUT_VOLUME SHADOW_MSG_OUT_AUDIO_OUT_VOLUME;
258 FREERDP_API int shadow_server_parse_command_line(rdpShadowServer* server, int argc, char** argv);
259 FREERDP_API int shadow_server_command_line_status_print(rdpShadowServer* server, int argc, char** argv, int status);
261 FREERDP_API int shadow_server_start(rdpShadowServer* server);
262 FREERDP_API int shadow_server_stop(rdpShadowServer* server);
264 FREERDP_API int shadow_server_init(rdpShadowServer* server);
265 FREERDP_API int shadow_server_uninit(rdpShadowServer* server);
267 FREERDP_API int shadow_enum_monitors(MONITOR_DEF* monitors, int maxMonitors, const char* name);
269 FREERDP_API rdpShadowServer* shadow_server_new();
270 FREERDP_API void shadow_server_free(rdpShadowServer* server);
272 FREERDP_API BOOL shadow_client_post_msg(rdpShadowClient* client, void* context, UINT32 type, SHADOW_MSG_OUT* msg, void* lParam);
273 FREERDP_API int shadow_client_boardcast_msg(rdpShadowServer* server, void* context, UINT32 type, SHADOW_MSG_OUT* msg, void* lParam);
274 FREERDP_API int shadow_client_boardcast_quit(rdpShadowServer* server, int nExitCode);
280 #endif /* FREERDP_SERVER_SHADOW_H */