[proxy] add mouse ex and unicode event filters
This commit is contained in:
parent
f40522e34f
commit
6a0df205b0
@ -91,8 +91,9 @@ struct proxy_plugin
|
||||
proxyFilterFn ServerFetchTargetAddr; /* 133 */
|
||||
proxyFilterFn ServerPeerLogon; /* 134 */
|
||||
proxyFilterFn ChannelCreate; /* 135 passthrough drdynvc channel create data */
|
||||
|
||||
UINT64 reserved5[160 - 136]; /* 136-159 */
|
||||
proxyFilterFn UnicodeEvent; /* 136 */
|
||||
proxyFilterFn MouseExEvent; /* 137 */
|
||||
UINT64 reserved5[160 - 138]; /* 138-159 */
|
||||
|
||||
/* Runtime data fields */
|
||||
proxyPluginsManager* mgr; /* 160 */ /** Set during plugin registration */
|
||||
@ -140,6 +141,12 @@ typedef struct proxy_keyboard_event_info
|
||||
UINT16 rdp_scan_code;
|
||||
} proxyKeyboardEventInfo;
|
||||
|
||||
typedef struct proxy_unicode_event_info
|
||||
{
|
||||
UINT16 flags;
|
||||
UINT16 code;
|
||||
} proxyUnicodeEventInfo;
|
||||
|
||||
typedef struct proxy_mouse_event_info
|
||||
{
|
||||
UINT16 flags;
|
||||
@ -147,6 +154,13 @@ typedef struct proxy_mouse_event_info
|
||||
UINT16 y;
|
||||
} proxyMouseEventInfo;
|
||||
|
||||
typedef struct proxy_mouse_ex_event_info
|
||||
{
|
||||
UINT16 flags;
|
||||
UINT16 x;
|
||||
UINT16 y;
|
||||
} proxyMouseExEventInfo;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
/* channel metadata */
|
||||
|
@ -212,6 +212,31 @@ static BOOL demo_filter_keyboard_event(proxyPlugin* plugin, proxyData* pdata, vo
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static BOOL demo_filter_unicode_event(proxyPlugin* plugin, proxyData* pdata, void* param)
|
||||
{
|
||||
proxyPluginsManager* mgr;
|
||||
auto event_data = static_cast<const proxyUnicodeEventInfo*>(param);
|
||||
|
||||
WINPR_ASSERT(plugin);
|
||||
WINPR_ASSERT(pdata);
|
||||
WINPR_ASSERT(event_data);
|
||||
|
||||
mgr = plugin->mgr;
|
||||
WINPR_ASSERT(mgr);
|
||||
|
||||
if (event_data == nullptr)
|
||||
return FALSE;
|
||||
|
||||
if (event_data->code == 'b')
|
||||
{
|
||||
/* user typed 'B', that means bye :) */
|
||||
std::cout << "C++ demo plugin: aborting connection" << std::endl;
|
||||
mgr->AbortConnect(mgr, pdata);
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static BOOL demo_mouse_event(proxyPlugin* plugin, proxyData* pdata, void* param)
|
||||
{
|
||||
auto event_data = static_cast<const proxyMouseEventInfo*>(param);
|
||||
@ -224,6 +249,18 @@ static BOOL demo_mouse_event(proxyPlugin* plugin, proxyData* pdata, void* param)
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static BOOL demo_mouse_ex_event(proxyPlugin* plugin, proxyData* pdata, void* param)
|
||||
{
|
||||
auto event_data = static_cast<const proxyMouseExEventInfo*>(param);
|
||||
|
||||
WINPR_ASSERT(plugin);
|
||||
WINPR_ASSERT(pdata);
|
||||
WINPR_ASSERT(event_data);
|
||||
|
||||
WLog_INFO(TAG, "%s", __FUNCTION__);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static BOOL demo_client_channel_data(proxyPlugin* plugin, proxyData* pdata, void* param)
|
||||
{
|
||||
const proxyChannelDataEventInfo* channel = static_cast<const proxyChannelDataEventInfo*>(param);
|
||||
@ -319,7 +356,9 @@ BOOL proxy_module_entry_point(proxyPluginsManager* plugins_manager, void* userda
|
||||
plugin.ServerChannelsFree = demo_server_channels_free;
|
||||
plugin.ServerSessionEnd = demo_server_session_end;
|
||||
plugin.KeyboardEvent = demo_filter_keyboard_event;
|
||||
plugin.UnicodeEvent = demo_filter_unicode_event;
|
||||
plugin.MouseEvent = demo_mouse_event;
|
||||
plugin.MouseExEvent = demo_mouse_ex_event;
|
||||
plugin.ClientChannelData = demo_client_channel_data;
|
||||
plugin.ServerChannelData = demo_server_channel_data;
|
||||
plugin.DynamicChannelCreate = demo_dynamic_channel_create;
|
||||
|
@ -867,6 +867,30 @@ static BOOL config_plugin_keyboard_event(proxyPlugin* plugin, proxyData* pdata,
|
||||
return rc;
|
||||
}
|
||||
|
||||
static BOOL config_plugin_unicode_event(proxyPlugin* plugin, proxyData* pdata, void* param)
|
||||
{
|
||||
BOOL rc;
|
||||
const struct config_plugin_data* custom;
|
||||
const proxyConfig* cfg;
|
||||
const proxyUnicodeEventInfo* event_data = (const proxyUnicodeEventInfo*)(param);
|
||||
|
||||
WINPR_ASSERT(plugin);
|
||||
WINPR_ASSERT(pdata);
|
||||
WINPR_ASSERT(event_data);
|
||||
|
||||
WINPR_UNUSED(event_data);
|
||||
|
||||
custom = plugin->custom;
|
||||
WINPR_ASSERT(custom);
|
||||
|
||||
cfg = custom->config;
|
||||
WINPR_ASSERT(cfg);
|
||||
|
||||
rc = cfg->Keyboard;
|
||||
WLog_DBG(TAG, "%s: %s", __FUNCTION__, rc ? "TRUE" : "FALSE");
|
||||
return rc;
|
||||
}
|
||||
|
||||
static BOOL config_plugin_mouse_event(proxyPlugin* plugin, proxyData* pdata, void* param)
|
||||
{
|
||||
BOOL rc;
|
||||
@ -890,6 +914,29 @@ static BOOL config_plugin_mouse_event(proxyPlugin* plugin, proxyData* pdata, voi
|
||||
return rc;
|
||||
}
|
||||
|
||||
static BOOL config_plugin_mouse_ex_event(proxyPlugin* plugin, proxyData* pdata, void* param)
|
||||
{
|
||||
BOOL rc;
|
||||
const struct config_plugin_data* custom;
|
||||
const proxyConfig* cfg;
|
||||
const proxyMouseExEventInfo* event_data = (const proxyMouseExEventInfo*)(param);
|
||||
|
||||
WINPR_ASSERT(plugin);
|
||||
WINPR_ASSERT(pdata);
|
||||
WINPR_ASSERT(event_data);
|
||||
|
||||
WINPR_UNUSED(event_data);
|
||||
|
||||
custom = plugin->custom;
|
||||
WINPR_ASSERT(custom);
|
||||
|
||||
cfg = custom->config;
|
||||
WINPR_ASSERT(cfg);
|
||||
|
||||
rc = cfg->Mouse;
|
||||
return rc;
|
||||
}
|
||||
|
||||
static BOOL config_plugin_client_channel_data(proxyPlugin* plugin, proxyData* pdata, void* param)
|
||||
{
|
||||
const proxyChannelDataEventInfo* channel = (const proxyChannelDataEventInfo*)(param);
|
||||
@ -1048,7 +1095,9 @@ BOOL pf_config_plugin(proxyPluginsManager* plugins_manager, void* userdata)
|
||||
plugin.PluginUnload = config_plugin_unload;
|
||||
|
||||
plugin.KeyboardEvent = config_plugin_keyboard_event;
|
||||
plugin.UnicodeEvent = config_plugin_unicode_event;
|
||||
plugin.MouseEvent = config_plugin_mouse_event;
|
||||
plugin.MouseExEvent = config_plugin_mouse_ex_event;
|
||||
plugin.ClientChannelData = config_plugin_client_channel_data;
|
||||
plugin.ServerChannelData = config_plugin_server_channel_data;
|
||||
plugin.ChannelCreate = config_plugin_channel_create;
|
||||
|
@ -31,6 +31,8 @@
|
||||
|
||||
static BOOL pf_server_check_and_sync_input_state(pClientContext* pc)
|
||||
{
|
||||
WINPR_ASSERT(pc);
|
||||
|
||||
if (freerdp_get_state(&pc->context) < CONNECTION_STATE_ACTIVE)
|
||||
return FALSE;
|
||||
if (pc->input_state_sync_pending)
|
||||
@ -65,7 +67,7 @@ static BOOL pf_server_synchronize_event(rdpInput* input, UINT32 flags)
|
||||
static BOOL pf_server_keyboard_event(rdpInput* input, UINT16 flags, UINT8 code)
|
||||
{
|
||||
const proxyConfig* config;
|
||||
proxyKeyboardEventInfo event;
|
||||
proxyKeyboardEventInfo event = { 0 };
|
||||
pServerContext* ps;
|
||||
pClientContext* pc;
|
||||
|
||||
@ -98,6 +100,7 @@ static BOOL pf_server_keyboard_event(rdpInput* input, UINT16 flags, UINT8 code)
|
||||
static BOOL pf_server_unicode_keyboard_event(rdpInput* input, UINT16 flags, UINT16 code)
|
||||
{
|
||||
const proxyConfig* config;
|
||||
proxyUnicodeEventInfo event = { 0 };
|
||||
pServerContext* ps;
|
||||
pClientContext* pc;
|
||||
|
||||
@ -118,12 +121,16 @@ static BOOL pf_server_unicode_keyboard_event(rdpInput* input, UINT16 flags, UINT
|
||||
if (!config->Keyboard)
|
||||
return TRUE;
|
||||
|
||||
event.flags = flags;
|
||||
event.code = code;
|
||||
if (pf_modules_run_filter(pc->pdata->module, FILTER_TYPE_UNICODE, pc->pdata, &event))
|
||||
return freerdp_input_send_unicode_keyboard_event(pc->context.input, flags, code);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static BOOL pf_server_mouse_event(rdpInput* input, UINT16 flags, UINT16 x, UINT16 y)
|
||||
{
|
||||
proxyMouseEventInfo event;
|
||||
proxyMouseEventInfo event = { 0 };
|
||||
const proxyConfig* config;
|
||||
pServerContext* ps;
|
||||
pClientContext* pc;
|
||||
@ -158,6 +165,7 @@ static BOOL pf_server_mouse_event(rdpInput* input, UINT16 flags, UINT16 x, UINT1
|
||||
static BOOL pf_server_extended_mouse_event(rdpInput* input, UINT16 flags, UINT16 x, UINT16 y)
|
||||
{
|
||||
const proxyConfig* config;
|
||||
proxyMouseExEventInfo event = { 0 };
|
||||
pServerContext* ps;
|
||||
pClientContext* pc;
|
||||
|
||||
@ -178,7 +186,12 @@ static BOOL pf_server_extended_mouse_event(rdpInput* input, UINT16 flags, UINT16
|
||||
if (!config->Mouse)
|
||||
return TRUE;
|
||||
|
||||
event.flags = flags;
|
||||
event.x = x;
|
||||
event.y = y;
|
||||
if (pf_modules_run_filter(pc->pdata->module, FILTER_TYPE_MOUSE, pc->pdata, &event))
|
||||
return freerdp_input_send_extended_mouse_event(pc->context.input, flags, x, y);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void pf_server_register_input_callbacks(rdpInput* input)
|
||||
|
@ -52,8 +52,12 @@ static const char* pf_modules_get_filter_type_string(PF_FILTER_TYPE result)
|
||||
{
|
||||
case FILTER_TYPE_KEYBOARD:
|
||||
return "FILTER_TYPE_KEYBOARD";
|
||||
case FILTER_TYPE_UNICODE:
|
||||
return "FILTER_TYPE_UNICODE";
|
||||
case FILTER_TYPE_MOUSE:
|
||||
return "FILTER_TYPE_MOUSE";
|
||||
case FILTER_TYPE_MOUSE_EX:
|
||||
return "FILTER_TYPE_MOUSE_EX";
|
||||
case FILTER_TYPE_CLIENT_PASSTHROUGH_CHANNEL_DATA:
|
||||
return "FILTER_TYPE_CLIENT_PASSTHROUGH_CHANNEL_DATA";
|
||||
case FILTER_TYPE_SERVER_PASSTHROUGH_CHANNEL_DATA:
|
||||
@ -252,10 +256,18 @@ static BOOL pf_modules_ArrayList_ForEachFkt(void* data, size_t index, va_list ap
|
||||
result = IFCALLRESULT(TRUE, plugin->KeyboardEvent, plugin, pdata, param);
|
||||
break;
|
||||
|
||||
case FILTER_TYPE_UNICODE:
|
||||
result = IFCALLRESULT(TRUE, plugin->UnicodeEvent, plugin, pdata, param);
|
||||
break;
|
||||
|
||||
case FILTER_TYPE_MOUSE:
|
||||
result = IFCALLRESULT(TRUE, plugin->MouseEvent, plugin, pdata, param);
|
||||
break;
|
||||
|
||||
case FILTER_TYPE_MOUSE_EX:
|
||||
result = IFCALLRESULT(TRUE, plugin->MouseExEvent, plugin, pdata, param);
|
||||
break;
|
||||
|
||||
case FILTER_TYPE_CLIENT_PASSTHROUGH_CHANNEL_DATA:
|
||||
result = IFCALLRESULT(TRUE, plugin->ClientChannelData, plugin, pdata, param);
|
||||
break;
|
||||
|
@ -29,7 +29,9 @@
|
||||
typedef enum
|
||||
{
|
||||
FILTER_TYPE_KEYBOARD, /* proxyKeyboardEventInfo */
|
||||
FILTER_TYPE_UNICODE, /* proxyUnicodeEventInfo */
|
||||
FILTER_TYPE_MOUSE, /* proxyMouseEventInfo */
|
||||
FILTER_TYPE_MOUSE_EX, /* proxyMouseExEventInfo */
|
||||
FILTER_TYPE_CLIENT_PASSTHROUGH_CHANNEL_DATA, /* proxyChannelDataEventInfo */
|
||||
FILTER_TYPE_SERVER_PASSTHROUGH_CHANNEL_DATA, /* proxyChannelDataEventInfo */
|
||||
FILTER_TYPE_CLIENT_PASSTHROUGH_DYN_CHANNEL_CREATE, /* proxyChannelDataEventInfo */
|
||||
|
Loading…
Reference in New Issue
Block a user