24#include <freerdp/api.h>
25#include <freerdp/scancode.h>
26#include <freerdp/server/proxy/proxy_modules_api.h>
28#define TAG MODULE_TAG("demo")
30struct demo_custom_data
32 proxyPluginsManager* mgr;
36static constexpr char plugin_name[] =
"demo";
37static constexpr char plugin_desc[] =
"this is a test plugin";
39static BOOL demo_plugin_unload([[maybe_unused]] proxyPlugin* plugin)
43 std::cout <<
"C++ demo plugin: unloading..." << std::endl;
47 delete static_cast<struct demo_custom_data*
>(plugin->custom);
52static BOOL demo_client_init_connect([[maybe_unused]] proxyPlugin* plugin,
53 [[maybe_unused]] proxyData* pdata,
54 [[maybe_unused]]
void* custom)
60 WLog_INFO(TAG,
"called");
64static BOOL demo_client_uninit_connect([[maybe_unused]] proxyPlugin* plugin,
65 [[maybe_unused]] proxyData* pdata,
66 [[maybe_unused]]
void* custom)
72 WLog_INFO(TAG,
"called");
76static BOOL demo_client_pre_connect([[maybe_unused]] proxyPlugin* plugin,
77 [[maybe_unused]] proxyData* pdata,
78 [[maybe_unused]]
void* custom)
84 WLog_INFO(TAG,
"called");
88static BOOL demo_client_post_connect([[maybe_unused]] proxyPlugin* plugin,
89 [[maybe_unused]] proxyData* pdata,
90 [[maybe_unused]]
void* custom)
96 WLog_INFO(TAG,
"called");
100static BOOL demo_client_post_disconnect([[maybe_unused]] proxyPlugin* plugin,
101 [[maybe_unused]] proxyData* pdata,
102 [[maybe_unused]]
void* custom)
104 WINPR_ASSERT(plugin);
106 WINPR_ASSERT(custom);
108 WLog_INFO(TAG,
"called");
112static BOOL demo_client_x509_certificate([[maybe_unused]] proxyPlugin* plugin,
113 [[maybe_unused]] proxyData* pdata,
114 [[maybe_unused]]
void* custom)
116 WINPR_ASSERT(plugin);
118 WINPR_ASSERT(custom);
120 WLog_INFO(TAG,
"called");
124static BOOL demo_client_login_failure([[maybe_unused]] proxyPlugin* plugin,
125 [[maybe_unused]] proxyData* pdata,
126 [[maybe_unused]]
void* custom)
128 WINPR_ASSERT(plugin);
130 WINPR_ASSERT(custom);
132 WLog_INFO(TAG,
"called");
136static BOOL demo_client_end_paint([[maybe_unused]] proxyPlugin* plugin,
137 [[maybe_unused]] proxyData* pdata, [[maybe_unused]]
void* custom)
139 WINPR_ASSERT(plugin);
141 WINPR_ASSERT(custom);
143 WLog_INFO(TAG,
"called");
147static BOOL demo_client_redirect([[maybe_unused]] proxyPlugin* plugin,
148 [[maybe_unused]] proxyData* pdata, [[maybe_unused]]
void* custom)
150 WINPR_ASSERT(plugin);
152 WINPR_ASSERT(custom);
154 WLog_INFO(TAG,
"called");
158static BOOL demo_server_post_connect([[maybe_unused]] proxyPlugin* plugin,
159 [[maybe_unused]] proxyData* pdata,
160 [[maybe_unused]]
void* custom)
162 WINPR_ASSERT(plugin);
164 WINPR_ASSERT(custom);
166 WLog_INFO(TAG,
"called");
170static BOOL demo_server_peer_activate([[maybe_unused]] proxyPlugin* plugin,
171 [[maybe_unused]] proxyData* pdata,
172 [[maybe_unused]]
void* custom)
174 WINPR_ASSERT(plugin);
176 WINPR_ASSERT(custom);
178 WLog_INFO(TAG,
"called");
182static BOOL demo_server_channels_init([[maybe_unused]] proxyPlugin* plugin,
183 [[maybe_unused]] proxyData* pdata,
184 [[maybe_unused]]
void* custom)
186 WINPR_ASSERT(plugin);
188 WINPR_ASSERT(custom);
190 WLog_INFO(TAG,
"called");
194static BOOL demo_server_channels_free([[maybe_unused]] proxyPlugin* plugin,
195 [[maybe_unused]] proxyData* pdata,
196 [[maybe_unused]]
void* custom)
198 WINPR_ASSERT(plugin);
200 WINPR_ASSERT(custom);
202 WLog_INFO(TAG,
"called");
206static BOOL demo_server_session_end([[maybe_unused]] proxyPlugin* plugin,
207 [[maybe_unused]] proxyData* pdata,
208 [[maybe_unused]]
void* custom)
210 WINPR_ASSERT(plugin);
212 WINPR_ASSERT(custom);
214 WLog_INFO(TAG,
"called");
218static BOOL demo_filter_keyboard_event([[maybe_unused]] proxyPlugin* plugin,
219 [[maybe_unused]] proxyData* pdata,
220 [[maybe_unused]]
void* param)
222 proxyPluginsManager* mgr =
nullptr;
225 WINPR_ASSERT(plugin);
227 WINPR_ASSERT(event_data);
232 if (event_data ==
nullptr)
235 if (event_data->rdp_scan_code == RDP_SCANCODE_KEY_B)
238 std::cout <<
"C++ demo plugin: aborting connection" << std::endl;
239 mgr->AbortConnect(mgr, pdata);
245static BOOL demo_filter_unicode_event([[maybe_unused]] proxyPlugin* plugin,
246 [[maybe_unused]] proxyData* pdata,
247 [[maybe_unused]]
void* param)
249 proxyPluginsManager* mgr =
nullptr;
252 WINPR_ASSERT(plugin);
254 WINPR_ASSERT(event_data);
259 if (event_data ==
nullptr)
262 if (event_data->code ==
'b')
265 std::cout <<
"C++ demo plugin: aborting connection" << std::endl;
266 mgr->AbortConnect(mgr, pdata);
272static BOOL demo_mouse_event([[maybe_unused]] proxyPlugin* plugin,
273 [[maybe_unused]] proxyData* pdata, [[maybe_unused]]
void* param)
277 WINPR_ASSERT(plugin);
279 WINPR_ASSERT(event_data);
281 WLog_INFO(TAG,
"called %p", event_data);
285static BOOL demo_mouse_ex_event([[maybe_unused]] proxyPlugin* plugin,
286 [[maybe_unused]] proxyData* pdata, [[maybe_unused]]
void* param)
290 WINPR_ASSERT(plugin);
292 WINPR_ASSERT(event_data);
294 WLog_INFO(TAG,
"called %p", event_data);
298static BOOL demo_client_channel_data([[maybe_unused]] proxyPlugin* plugin,
299 [[maybe_unused]] proxyData* pdata,
300 [[maybe_unused]]
void* param)
304 WINPR_ASSERT(plugin);
306 WINPR_ASSERT(channel);
308 WLog_INFO(TAG,
"%s [0x%04" PRIx16
"] got %" PRIuz, channel->channel_name, channel->channel_id,
313static BOOL demo_server_channel_data([[maybe_unused]] proxyPlugin* plugin,
314 [[maybe_unused]] proxyData* pdata,
315 [[maybe_unused]]
void* param)
319 WINPR_ASSERT(plugin);
321 WINPR_ASSERT(channel);
323 WLog_WARN(TAG,
"%s [0x%04" PRIx16
"] got %" PRIuz, channel->channel_name, channel->channel_id,
328static BOOL demo_dynamic_channel_create([[maybe_unused]] proxyPlugin* plugin,
329 [[maybe_unused]] proxyData* pdata,
330 [[maybe_unused]]
void* param)
334 WINPR_ASSERT(plugin);
336 WINPR_ASSERT(channel);
338 WLog_WARN(TAG,
"%s [0x%04" PRIx16
"]", channel->channel_name, channel->channel_id);
342static BOOL demo_server_fetch_target_addr([[maybe_unused]] proxyPlugin* plugin,
343 [[maybe_unused]] proxyData* pdata,
344 [[maybe_unused]]
void* param)
348 WINPR_ASSERT(plugin);
350 WINPR_ASSERT(event_data);
352 WLog_INFO(TAG,
"called %p", event_data);
356static BOOL demo_server_peer_logon([[maybe_unused]] proxyPlugin* plugin,
357 [[maybe_unused]] proxyData* pdata, [[maybe_unused]]
void* param)
360 WINPR_ASSERT(plugin);
363 WINPR_ASSERT(info->identity);
365 WLog_INFO(TAG,
"%d", info->automatic);
369static BOOL demo_dyn_channel_intercept_list([[maybe_unused]] proxyPlugin* plugin,
370 [[maybe_unused]] proxyData* pdata,
371 [[maybe_unused]]
void* arg)
375 WINPR_ASSERT(plugin);
379 WLog_INFO(TAG,
"%s: %p", __func__, data);
383static BOOL demo_static_channel_intercept_list([[maybe_unused]] proxyPlugin* plugin,
384 [[maybe_unused]] proxyData* pdata,
385 [[maybe_unused]]
void* arg)
389 WINPR_ASSERT(plugin);
393 WLog_INFO(TAG,
"%s: %p", __func__, data);
397static BOOL demo_dyn_channel_intercept([[maybe_unused]] proxyPlugin* plugin,
398 [[maybe_unused]] proxyData* pdata,
399 [[maybe_unused]]
void* arg)
403 WINPR_ASSERT(plugin);
407 WLog_INFO(TAG,
"%s: %p", __func__, data);
415 FREERDP_API BOOL proxy_module_entry_point(proxyPluginsManager* plugins_manager,
void* userdata);
420BOOL proxy_module_entry_point(proxyPluginsManager* plugins_manager,
void* userdata)
422 struct demo_custom_data* custom =
nullptr;
423 proxyPlugin plugin = {};
425 plugin.name = plugin_name;
426 plugin.description = plugin_desc;
427 plugin.PluginUnload = demo_plugin_unload;
428 plugin.ClientInitConnect = demo_client_init_connect;
429 plugin.ClientUninitConnect = demo_client_uninit_connect;
430 plugin.ClientPreConnect = demo_client_pre_connect;
431 plugin.ClientPostConnect = demo_client_post_connect;
432 plugin.ClientPostDisconnect = demo_client_post_disconnect;
433 plugin.ClientX509Certificate = demo_client_x509_certificate;
434 plugin.ClientLoginFailure = demo_client_login_failure;
435 plugin.ClientEndPaint = demo_client_end_paint;
436 plugin.ClientRedirect = demo_client_redirect;
437 plugin.ServerPostConnect = demo_server_post_connect;
438 plugin.ServerPeerActivate = demo_server_peer_activate;
439 plugin.ServerChannelsInit = demo_server_channels_init;
440 plugin.ServerChannelsFree = demo_server_channels_free;
441 plugin.ServerSessionEnd = demo_server_session_end;
442 plugin.KeyboardEvent = demo_filter_keyboard_event;
443 plugin.UnicodeEvent = demo_filter_unicode_event;
444 plugin.MouseEvent = demo_mouse_event;
445 plugin.MouseExEvent = demo_mouse_ex_event;
446 plugin.ClientChannelData = demo_client_channel_data;
447 plugin.ServerChannelData = demo_server_channel_data;
448 plugin.DynamicChannelCreate = demo_dynamic_channel_create;
449 plugin.ServerFetchTargetAddr = demo_server_fetch_target_addr;
450 plugin.ServerPeerLogon = demo_server_peer_logon;
452 plugin.StaticChannelToIntercept = demo_static_channel_intercept_list;
453 plugin.DynChannelToIntercept = demo_dyn_channel_intercept_list;
454 plugin.DynChannelIntercept = demo_dyn_channel_intercept;
456 plugin.userdata = userdata;
458 custom =
new (
struct demo_custom_data);
462 custom->mgr = plugins_manager;
463 custom->somesetting = 42;
465 plugin.custom = custom;
466 plugin.userdata = userdata;
468 return plugins_manager->RegisterPlugin(plugins_manager, &plugin);