24#include <winpr/assert.h>
27#include <freerdp/server/proxy/proxy_config.h>
28#include <freerdp/server/proxy/proxy_context.h>
30#include "proxy_modules.h"
33static BOOL pf_server_check_and_sync_input_state(pClientContext* pc)
37 if (!freerdp_is_active_state(&pc->context))
39 if (pc->input_state_sync_pending)
41 BOOL rc = freerdp_input_send_synchronize_event(pc->context.input, pc->input_state);
43 pc->input_state_sync_pending = FALSE;
49static BOOL pf_server_synchronize_event(rdpInput* input, UINT32 flags)
52 pServerContext* ps = (pServerContext*)input->context;
54 WINPR_ASSERT(ps->pdata);
56 pClientContext* pc = ps->pdata->pc;
60 pc->input_state = flags;
61 pc->input_state_sync_pending = TRUE;
63 if (!pf_server_check_and_sync_input_state(pc))
69static BOOL pf_server_keyboard_event(rdpInput* input, UINT16 flags, UINT8 code)
74 pServerContext* ps = (pServerContext*)input->context;
76 WINPR_ASSERT(ps->pdata);
78 pClientContext* pc = ps->pdata->pc;
82 const proxyConfig* config = ps->pdata->config;
85 if (!pf_server_check_and_sync_input_state(pc))
88 if (!config->Keyboard)
92 event.rdp_scan_code = code;
94 if (pf_modules_run_filter(pc->pdata->module, FILTER_TYPE_KEYBOARD, pc->pdata, &event))
95 return freerdp_input_send_keyboard_event(pc->context.input, flags, code);
101static BOOL pf_server_unicode_keyboard_event(rdpInput* input, UINT16 flags, UINT16 code)
106 pServerContext* ps = (pServerContext*)input->context;
108 WINPR_ASSERT(ps->pdata);
110 pClientContext* pc = ps->pdata->pc;
114 const proxyConfig* config = ps->pdata->config;
115 WINPR_ASSERT(config);
117 if (!pf_server_check_and_sync_input_state(pc))
120 if (!config->Keyboard)
125 if (pf_modules_run_filter(pc->pdata->module, FILTER_TYPE_UNICODE, pc->pdata, &event))
126 return freerdp_input_send_unicode_keyboard_event(pc->context.input, flags, code);
131static BOOL pf_server_mouse_event(rdpInput* input, UINT16 flags, UINT16 x, UINT16 y)
136 pServerContext* ps = (pServerContext*)input->context;
138 WINPR_ASSERT(ps->pdata);
140 pClientContext* pc = ps->pdata->pc;
144 const proxyConfig* config = ps->pdata->config;
145 WINPR_ASSERT(config);
147 if (!pf_server_check_and_sync_input_state(pc))
157 if (pf_modules_run_filter(pc->pdata->module, FILTER_TYPE_MOUSE, pc->pdata, &event))
158 return freerdp_input_send_mouse_event(pc->context.input, flags, x, y);
164static BOOL pf_server_extended_mouse_event(rdpInput* input, UINT16 flags, UINT16 x, UINT16 y)
170 pServerContext* ps = (pServerContext*)input->context;
172 WINPR_ASSERT(ps->pdata);
174 pClientContext* pc = ps->pdata->pc;
178 const proxyConfig* config = ps->pdata->config;
179 WINPR_ASSERT(config);
181 if (!pf_server_check_and_sync_input_state(pc))
190 if (pf_modules_run_filter(pc->pdata->module, FILTER_TYPE_MOUSE, pc->pdata, &event))
191 return freerdp_input_send_extended_mouse_event(pc->context.input, flags, x, y);
195void pf_server_register_input_callbacks(rdpInput* input)
199 input->SynchronizeEvent = pf_server_synchronize_event;
200 input->KeyboardEvent = pf_server_keyboard_event;
201 input->UnicodeKeyboardEvent = pf_server_unicode_keyboard_event;
202 input->MouseEvent = pf_server_mouse_event;
203 input->ExtendedMouseEvent = pf_server_extended_mouse_event;