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";
40static BOOL demo_plugin_unload([[maybe_unused]] proxyPlugin* plugin)
44 std::cout <<
"C++ demo plugin: unloading..." << std::endl;
48 delete static_cast<struct demo_custom_data*
>(plugin->custom);
54static BOOL demo_client_init_connect([[maybe_unused]] proxyPlugin* plugin,
55 [[maybe_unused]] proxyData* pdata,
56 [[maybe_unused]]
void* custom)
62 WLog_INFO(TAG,
"called");
67static BOOL demo_client_uninit_connect([[maybe_unused]] proxyPlugin* plugin,
68 [[maybe_unused]] proxyData* pdata,
69 [[maybe_unused]]
void* custom)
75 WLog_INFO(TAG,
"called");
80static BOOL demo_client_pre_connect([[maybe_unused]] proxyPlugin* plugin,
81 [[maybe_unused]] proxyData* pdata,
82 [[maybe_unused]]
void* custom)
88 WLog_INFO(TAG,
"called");
93static BOOL demo_client_post_connect([[maybe_unused]] proxyPlugin* plugin,
94 [[maybe_unused]] proxyData* pdata,
95 [[maybe_unused]]
void* custom)
101 WLog_INFO(TAG,
"called");
106static BOOL demo_client_post_disconnect([[maybe_unused]] proxyPlugin* plugin,
107 [[maybe_unused]] proxyData* pdata,
108 [[maybe_unused]]
void* custom)
110 WINPR_ASSERT(plugin);
112 WINPR_ASSERT(custom);
114 WLog_INFO(TAG,
"called");
119static BOOL demo_client_x509_certificate([[maybe_unused]] proxyPlugin* plugin,
120 [[maybe_unused]] proxyData* pdata,
121 [[maybe_unused]]
void* custom)
123 WINPR_ASSERT(plugin);
125 WINPR_ASSERT(custom);
127 WLog_INFO(TAG,
"called");
132static BOOL demo_client_login_failure([[maybe_unused]] proxyPlugin* plugin,
133 [[maybe_unused]] proxyData* pdata,
134 [[maybe_unused]]
void* custom)
136 WINPR_ASSERT(plugin);
138 WINPR_ASSERT(custom);
140 WLog_INFO(TAG,
"called");
145static BOOL demo_client_end_paint([[maybe_unused]] proxyPlugin* plugin,
146 [[maybe_unused]] proxyData* pdata, [[maybe_unused]]
void* custom)
148 WINPR_ASSERT(plugin);
150 WINPR_ASSERT(custom);
152 WLog_INFO(TAG,
"called");
157static BOOL demo_client_redirect([[maybe_unused]] proxyPlugin* plugin,
158 [[maybe_unused]] proxyData* pdata, [[maybe_unused]]
void* custom)
160 WINPR_ASSERT(plugin);
162 WINPR_ASSERT(custom);
164 WLog_INFO(TAG,
"called");
169static BOOL demo_server_post_connect([[maybe_unused]] proxyPlugin* plugin,
170 [[maybe_unused]] proxyData* pdata,
171 [[maybe_unused]]
void* custom)
173 WINPR_ASSERT(plugin);
175 WINPR_ASSERT(custom);
177 WLog_INFO(TAG,
"called");
182static BOOL demo_server_peer_activate([[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");
195static BOOL demo_server_channels_init([[maybe_unused]] proxyPlugin* plugin,
196 [[maybe_unused]] proxyData* pdata,
197 [[maybe_unused]]
void* custom)
199 WINPR_ASSERT(plugin);
201 WINPR_ASSERT(custom);
203 WLog_INFO(TAG,
"called");
208static BOOL demo_server_channels_free([[maybe_unused]] proxyPlugin* plugin,
209 [[maybe_unused]] proxyData* pdata,
210 [[maybe_unused]]
void* custom)
212 WINPR_ASSERT(plugin);
214 WINPR_ASSERT(custom);
216 WLog_INFO(TAG,
"called");
221static BOOL demo_server_session_end([[maybe_unused]] proxyPlugin* plugin,
222 [[maybe_unused]] proxyData* pdata,
223 [[maybe_unused]]
void* custom)
225 WINPR_ASSERT(plugin);
227 WINPR_ASSERT(custom);
229 WLog_INFO(TAG,
"called");
234static BOOL demo_filter_keyboard_event([[maybe_unused]] proxyPlugin* plugin,
235 [[maybe_unused]] proxyData* pdata,
236 [[maybe_unused]]
void* param)
238 proxyPluginsManager* mgr =
nullptr;
241 WINPR_ASSERT(plugin);
243 WINPR_ASSERT(event_data);
248 if (event_data ==
nullptr)
251 if (event_data->rdp_scan_code == RDP_SCANCODE_KEY_B)
254 std::cout <<
"C++ demo plugin: aborting connection" << std::endl;
255 mgr->AbortConnect(mgr, pdata);
262static BOOL demo_filter_unicode_event([[maybe_unused]] proxyPlugin* plugin,
263 [[maybe_unused]] proxyData* pdata,
264 [[maybe_unused]]
void* param)
266 proxyPluginsManager* mgr =
nullptr;
269 WINPR_ASSERT(plugin);
271 WINPR_ASSERT(event_data);
276 if (event_data ==
nullptr)
279 if (event_data->code ==
'b')
282 std::cout <<
"C++ demo plugin: aborting connection" << std::endl;
283 mgr->AbortConnect(mgr, pdata);
290static BOOL demo_mouse_event([[maybe_unused]] proxyPlugin* plugin,
291 [[maybe_unused]] proxyData* pdata, [[maybe_unused]]
void* param)
295 WINPR_ASSERT(plugin);
297 WINPR_ASSERT(event_data);
299 WLog_INFO(TAG,
"called %p", WINPR_CXX_COMPAT_CAST(
const void*, event_data));
304static BOOL demo_mouse_ex_event([[maybe_unused]] proxyPlugin* plugin,
305 [[maybe_unused]] proxyData* pdata, [[maybe_unused]]
void* param)
309 WINPR_ASSERT(plugin);
311 WINPR_ASSERT(event_data);
313 WLog_INFO(TAG,
"called %p", WINPR_CXX_COMPAT_CAST(
const void*, event_data));
318static BOOL demo_client_channel_data([[maybe_unused]] proxyPlugin* plugin,
319 [[maybe_unused]] proxyData* pdata,
320 [[maybe_unused]]
void* param)
324 WINPR_ASSERT(plugin);
326 WINPR_ASSERT(channel);
328 WLog_INFO(TAG,
"%s [0x%04" PRIx16
"] got %" PRIuz, channel->channel_name, channel->channel_id,
334static BOOL demo_server_channel_data([[maybe_unused]] proxyPlugin* plugin,
335 [[maybe_unused]] proxyData* pdata,
336 [[maybe_unused]]
void* param)
340 WINPR_ASSERT(plugin);
342 WINPR_ASSERT(channel);
344 WLog_WARN(TAG,
"%s [0x%04" PRIx16
"] got %" PRIuz, channel->channel_name, channel->channel_id,
350static BOOL demo_dynamic_channel_create([[maybe_unused]] proxyPlugin* plugin,
351 [[maybe_unused]] proxyData* pdata,
352 [[maybe_unused]]
void* param)
356 WINPR_ASSERT(plugin);
358 WINPR_ASSERT(channel);
360 WLog_WARN(TAG,
"%s [0x%04" PRIx16
"]", channel->channel_name, channel->channel_id);
365static BOOL demo_server_fetch_target_addr([[maybe_unused]] proxyPlugin* plugin,
366 [[maybe_unused]] proxyData* pdata,
367 [[maybe_unused]]
void* param)
371 WINPR_ASSERT(plugin);
373 WINPR_ASSERT(event_data);
375 WLog_INFO(TAG,
"called %p", WINPR_CXX_COMPAT_CAST(
const void*, event_data));
380static BOOL demo_server_peer_logon([[maybe_unused]] proxyPlugin* plugin,
381 [[maybe_unused]] proxyData* pdata, [[maybe_unused]]
void* param)
384 WINPR_ASSERT(plugin);
387 WINPR_ASSERT(info->identity);
389 WLog_INFO(TAG,
"%d", info->automatic);
394static BOOL demo_dyn_channel_intercept_list([[maybe_unused]] proxyPlugin* plugin,
395 [[maybe_unused]] proxyData* pdata,
396 [[maybe_unused]]
void* arg)
400 WINPR_ASSERT(plugin);
404 WLog_INFO(TAG,
"%s: %p", __func__, WINPR_CXX_COMPAT_CAST(
const void*, data));
409static BOOL demo_static_channel_intercept_list([[maybe_unused]] proxyPlugin* plugin,
410 [[maybe_unused]] proxyData* pdata,
411 [[maybe_unused]]
void* arg)
415 WINPR_ASSERT(plugin);
419 WLog_INFO(TAG,
"%s: %p", __func__, WINPR_CXX_COMPAT_CAST(
const void*, data));
424static BOOL demo_dyn_channel_intercept([[maybe_unused]] proxyPlugin* plugin,
425 [[maybe_unused]] proxyData* pdata,
426 [[maybe_unused]]
void* arg)
430 WINPR_ASSERT(plugin);
434 WLog_INFO(TAG,
"%s: %p", __func__, WINPR_CXX_COMPAT_CAST(
const void*, data));
439static BOOL int_proxy_module_entry_point(proxyPluginsManager* plugins_manager,
void* userdata)
441 struct demo_custom_data* custom =
nullptr;
442 proxyPlugin plugin = {};
444 plugin.name = plugin_name;
445 plugin.description = plugin_desc;
446 plugin.PluginUnload = demo_plugin_unload;
447 plugin.ClientInitConnect = demo_client_init_connect;
448 plugin.ClientUninitConnect = demo_client_uninit_connect;
449 plugin.ClientPreConnect = demo_client_pre_connect;
450 plugin.ClientPostConnect = demo_client_post_connect;
451 plugin.ClientPostDisconnect = demo_client_post_disconnect;
452 plugin.ClientX509Certificate = demo_client_x509_certificate;
453 plugin.ClientLoginFailure = demo_client_login_failure;
454 plugin.ClientEndPaint = demo_client_end_paint;
455 plugin.ClientRedirect = demo_client_redirect;
456 plugin.ServerPostConnect = demo_server_post_connect;
457 plugin.ServerPeerActivate = demo_server_peer_activate;
458 plugin.ServerChannelsInit = demo_server_channels_init;
459 plugin.ServerChannelsFree = demo_server_channels_free;
460 plugin.ServerSessionEnd = demo_server_session_end;
461 plugin.KeyboardEvent = demo_filter_keyboard_event;
462 plugin.UnicodeEvent = demo_filter_unicode_event;
463 plugin.MouseEvent = demo_mouse_event;
464 plugin.MouseExEvent = demo_mouse_ex_event;
465 plugin.ClientChannelData = demo_client_channel_data;
466 plugin.ServerChannelData = demo_server_channel_data;
467 plugin.DynamicChannelCreate = demo_dynamic_channel_create;
468 plugin.ServerFetchTargetAddr = demo_server_fetch_target_addr;
469 plugin.ServerPeerLogon = demo_server_peer_logon;
471 plugin.StaticChannelToIntercept = demo_static_channel_intercept_list;
472 plugin.DynChannelToIntercept = demo_dyn_channel_intercept_list;
473 plugin.DynChannelIntercept = demo_dyn_channel_intercept;
475 plugin.userdata = userdata;
477 custom =
new (
struct demo_custom_data);
481 custom->mgr = plugins_manager;
482 custom->somesetting = 42;
484 plugin.custom = custom;
485 plugin.userdata = userdata;
487 return plugins_manager->RegisterPlugin(plugins_manager, &plugin);
494#if defined(BUILD_SHARED_LIBS)
496 FREERDP_API BOOL proxy_module_entry_point(proxyPluginsManager* plugins_manager,
void* userdata);
498 BOOL proxy_module_entry_point(proxyPluginsManager* plugins_manager,
void* userdata)
500 return int_proxy_module_entry_point(plugins_manager, userdata);
504FREERDP_API BOOL demo_proxy_module_entry_point(proxyPluginsManager* plugins_manager,
506BOOL demo_proxy_module_entry_point(proxyPluginsManager* plugins_manager,
void* userdata)
508 return int_proxy_module_entry_point(plugins_manager, userdata);