server/shadow: Integrate comment from @hardening: use switch to handle different...
[platform/upstream/freerdp.git] / include / freerdp / server / shadow.h
1 /**
2  * FreeRDP: A Remote Desktop Protocol Implementation
3  * Session Shadowing
4  *
5  * Copyright 2014 Marc-Andre Moreau <marcandre.moreau@gmail.com>
6  *
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
10  *
11  *     http://www.apache.org/licenses/LICENSE-2.0
12  *
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.
18  */
19
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/settings.h>
27 #include <freerdp/listener.h>
28
29 #include <freerdp/channels/wtsvc.h>
30 #include <freerdp/channels/channels.h>
31
32 #include <freerdp/server/encomsp.h>
33 #include <freerdp/server/remdesk.h>
34 #include <freerdp/server/rdpsnd.h>
35 #include <freerdp/server/audin.h>
36
37 #include <freerdp/codec/color.h>
38 #include <freerdp/codec/region.h>
39
40 #include <winpr/crt.h>
41 #include <winpr/synch.h>
42 #include <winpr/collections.h>
43
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;
52
53 typedef struct _RDP_SHADOW_ENTRY_POINTS RDP_SHADOW_ENTRY_POINTS;
54 typedef int (*pfnShadowSubsystemEntry)(RDP_SHADOW_ENTRY_POINTS* pEntryPoints);
55
56 typedef rdpShadowSubsystem* (*pfnShadowSubsystemNew)(void);
57 typedef void (*pfnShadowSubsystemFree)(rdpShadowSubsystem* subsystem);
58
59 typedef int (*pfnShadowSubsystemInit)(rdpShadowSubsystem* subsystem);
60 typedef int (*pfnShadowSubsystemUninit)(rdpShadowSubsystem* subsystem);
61
62 typedef int (*pfnShadowSubsystemStart)(rdpShadowSubsystem* subsystem);
63 typedef int (*pfnShadowSubsystemStop)(rdpShadowSubsystem* subsystem);
64
65 typedef int (*pfnShadowEnumMonitors)(MONITOR_DEF* monitors, int maxMonitors);
66
67 typedef int (*pfnShadowAuthenticate)(rdpShadowSubsystem* subsystem,
68                 const char* user, const char* domain, const char* password);
69
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);
75
76 typedef void (*pfnShadowChannelAudinServerReceiveSamples)(rdpShadowSubsystem* subsystem, const void* buf, int nframes);
77
78 struct rdp_shadow_client
79 {
80         rdpContext context;
81
82         HANDLE thread;
83         BOOL activated;
84         BOOL inLobby;
85         BOOL mayView;
86         BOOL mayInteract;
87         wMessageQueue* MsgQueue;
88         CRITICAL_SECTION lock;
89         REGION16 invalidRegion;
90         rdpShadowServer* server;
91         rdpShadowSurface* lobby;
92         rdpShadowEncoder* encoder;
93         rdpShadowSubsystem* subsystem;
94
95         UINT32 pointerX;
96         UINT32 pointerY;
97
98         HANDLE vcm;
99         EncomspServerContext* encomsp;
100         RemdeskServerContext* remdesk;
101         RdpsndServerContext* rdpsnd;
102         audin_server_context* audin;
103 };
104
105 struct rdp_shadow_server
106 {
107         void* ext;
108         HANDLE thread;
109         HANDLE StopEvent;
110         wArrayList* clients;
111         rdpShadowScreen* screen;
112         rdpShadowSurface* surface;
113         rdpShadowCapture* capture;
114         rdpShadowSubsystem* subsystem;
115
116         DWORD port;
117         BOOL mayView;
118         BOOL mayInteract;
119         BOOL shareSubRect;
120         BOOL authentication;
121         int selectedMonitor;
122         RECTANGLE_16 subRect;
123         char* ipcSocket;
124         char* ConfigPath;
125         char* CertificateFile;
126         char* PrivateKeyFile;
127         CRITICAL_SECTION lock;
128         freerdp_listener* listener;
129 };
130
131 struct _RDP_SHADOW_ENTRY_POINTS
132 {
133         pfnShadowSubsystemNew New;
134         pfnShadowSubsystemFree Free;
135
136         pfnShadowSubsystemInit Init;
137         pfnShadowSubsystemUninit Uninit;
138
139         pfnShadowSubsystemStart Start;
140         pfnShadowSubsystemStop Stop;
141
142         pfnShadowEnumMonitors EnumMonitors;
143 };
144
145 #define RDP_SHADOW_SUBSYSTEM_COMMON() \
146         RDP_SHADOW_ENTRY_POINTS ep; \
147         HANDLE event; \
148         int numMonitors; \
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; \
157         UINT32 pointerX; \
158         UINT32 pointerY; \
159         \
160         const AUDIO_FORMAT* rdpsndFormats; \
161         int nRdpsndFormats; \
162         const AUDIO_FORMAT* audinFormats; \
163         int nAudinFormats; \
164         \
165         pfnShadowSynchronizeEvent SynchronizeEvent; \
166         pfnShadowKeyboardEvent KeyboardEvent; \
167         pfnShadowUnicodeKeyboardEvent UnicodeKeyboardEvent; \
168         pfnShadowMouseEvent MouseEvent; \
169         pfnShadowExtendedMouseEvent ExtendedMouseEvent; \
170         pfnShadowChannelAudinServerReceiveSamples AudinServerReceiveSamples; \
171         \
172         pfnShadowAuthenticate Authenticate; \
173         \
174         rdpShadowServer* server
175
176 struct rdp_shadow_subsystem
177 {
178         RDP_SHADOW_SUBSYSTEM_COMMON();
179 };
180
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
184
185 struct _SHADOW_MSG_IN_REFRESH_OUTPUT
186 {
187         UINT32 numRects;
188         RECTANGLE_16* rects;
189 };
190 typedef struct _SHADOW_MSG_IN_REFRESH_OUTPUT SHADOW_MSG_IN_REFRESH_OUTPUT;
191
192 struct _SHADOW_MSG_IN_SUPPRESS_OUTPUT
193 {
194         BOOL allow;
195         RECTANGLE_16 rect;
196 };
197 typedef struct _SHADOW_MSG_IN_SUPPRESS_OUTPUT SHADOW_MSG_IN_SUPPRESS_OUTPUT;
198
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() \
202         int refCount; \
203         MSG_OUT_FREE_FN Free; /* function to free SHADOW_MSG_OUT */
204
205 struct _SHADOW_MSG_OUT
206 {
207         RDP_SHADOW_MSG_OUT_COMMON();
208 };
209
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
214
215 struct _SHADOW_MSG_OUT_POINTER_POSITION_UPDATE
216 {
217         RDP_SHADOW_MSG_OUT_COMMON();
218         UINT32 xPos;
219         UINT32 yPos;
220 };
221 typedef struct _SHADOW_MSG_OUT_POINTER_POSITION_UPDATE SHADOW_MSG_OUT_POINTER_POSITION_UPDATE;
222
223 struct _SHADOW_MSG_OUT_POINTER_ALPHA_UPDATE
224 {
225         RDP_SHADOW_MSG_OUT_COMMON();
226         UINT32 xHot;
227         UINT32 yHot;
228         UINT32 width;
229         UINT32 height;
230         BYTE* pixels;
231         int scanline;
232         BOOL premultiplied;
233 };
234 typedef struct _SHADOW_MSG_OUT_POINTER_ALPHA_UPDATE SHADOW_MSG_OUT_POINTER_ALPHA_UPDATE;
235
236 struct _SHADOW_MSG_OUT_AUDIO_OUT_SAMPLES
237 {
238         RDP_SHADOW_MSG_OUT_COMMON();
239         AUDIO_FORMAT audio_format;
240         void* buf;
241         int nFrames;
242         UINT16 wTimestamp;
243 };
244 typedef struct _SHADOW_MSG_OUT_AUDIO_OUT_SAMPLES SHADOW_MSG_OUT_AUDIO_OUT_SAMPLES;
245
246 struct _SHADOW_MSG_OUT_AUDIO_OUT_VOLUME
247 {
248         RDP_SHADOW_MSG_OUT_COMMON();
249         int left;
250         int right;
251 };
252 typedef struct _SHADOW_MSG_OUT_AUDIO_OUT_VOLUME SHADOW_MSG_OUT_AUDIO_OUT_VOLUME;
253
254 #ifdef __cplusplus
255 extern "C" {
256 #endif
257
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);
260
261 FREERDP_API int shadow_server_start(rdpShadowServer* server);
262 FREERDP_API int shadow_server_stop(rdpShadowServer* server);
263
264 FREERDP_API int shadow_server_init(rdpShadowServer* server);
265 FREERDP_API int shadow_server_uninit(rdpShadowServer* server);
266
267 FREERDP_API int shadow_enum_monitors(MONITOR_DEF* monitors, int maxMonitors, const char* name);
268
269 FREERDP_API rdpShadowServer* shadow_server_new();
270 FREERDP_API void shadow_server_free(rdpShadowServer* server);
271
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);
275
276 #ifdef __cplusplus
277 }
278 #endif
279
280 #endif /* FREERDP_SERVER_SHADOW_H */
281