Unify encomsp request control code

This commit is contained in:
Armin Novak 2022-09-12 13:23:06 +02:00 committed by akallabeth
parent 320bda4a05
commit 707b9348ee
12 changed files with 111 additions and 280 deletions

View File

@ -32,39 +32,6 @@
#include "tf_channels.h"
#include "tf_freerdp.h"
/**
* Function description
*
* @return 0 on success, otherwise a Win32 error code
*/
static UINT
tf_encomsp_participant_created(EncomspClientContext* context,
const ENCOMSP_PARTICIPANT_CREATED_PDU* participantCreated)
{
WINPR_UNUSED(context);
WINPR_UNUSED(participantCreated);
return CHANNEL_RC_OK;
}
static void tf_encomsp_init(tfContext* tf, EncomspClientContext* encomsp)
{
tf->encomsp = encomsp;
encomsp->custom = (void*)tf;
encomsp->ParticipantCreated = tf_encomsp_participant_created;
}
static void tf_encomsp_uninit(tfContext* tf, EncomspClientContext* encomsp)
{
if (encomsp)
{
encomsp->custom = NULL;
encomsp->ParticipantCreated = NULL;
}
if (tf)
tf->encomsp = NULL;
}
static UINT tf_update_surfaces(RdpgfxClientContext* context)
{
WINPR_UNUSED(context);
@ -87,10 +54,6 @@ void tf_OnChannelConnectedEventHandler(void* context, const ChannelConnectedEven
WINPR_ASSERT(clip);
clip->custom = context;
}
else if (strcmp(e->name, ENCOMSP_SVC_CHANNEL_NAME) == 0)
{
tf_encomsp_init(tf, (EncomspClientContext*)e->pInterface);
}
else
freerdp_client_OnChannelConnectedEventHandler(context, e);
}
@ -111,10 +74,6 @@ void tf_OnChannelDisconnectedEventHandler(void* context, const ChannelDisconnect
WINPR_ASSERT(clip);
clip->custom = NULL;
}
else if (strcmp(e->name, ENCOMSP_SVC_CHANNEL_NAME) == 0)
{
tf_encomsp_uninit(tf, (EncomspClientContext*)e->pInterface);
}
else
freerdp_client_OnChannelDisconnectedEventHandler(context, e);
}

View File

@ -26,14 +26,12 @@
#include <freerdp/client/rail.h>
#include <freerdp/client/cliprdr.h>
#include <freerdp/client/rdpgfx.h>
#include <freerdp/client/encomsp.h>
typedef struct
{
rdpClientContext common;
/* Channels */
EncomspClientContext* encomsp;
} tfContext;
#endif /* FREERDP_CLIENT_SAMPLE_H */

View File

@ -28,77 +28,6 @@
#include "wlf_disp.h"
#include "wlfreerdp.h"
static BOOL encomsp_toggle_control(EncomspClientContext* encomsp, BOOL control)
{
ENCOMSP_CHANGE_PARTICIPANT_CONTROL_LEVEL_PDU pdu;
if (!encomsp)
return FALSE;
pdu.ParticipantId = 0;
pdu.Flags = ENCOMSP_REQUEST_VIEW;
if (control)
pdu.Flags |= ENCOMSP_REQUEST_INTERACT;
encomsp->ChangeParticipantControlLevel(encomsp, &pdu);
return TRUE;
}
/**
* Function description
*
* @return 0 on success, otherwise a Win32 error code
*/
static UINT
wlf_encomsp_participant_created(EncomspClientContext* context,
const ENCOMSP_PARTICIPANT_CREATED_PDU* participantCreated)
{
wlfContext* wlf;
rdpSettings* settings;
BOOL request;
if (!context || !context->custom || !participantCreated)
return ERROR_INVALID_PARAMETER;
wlf = (wlfContext*)context->custom;
WINPR_ASSERT(wlf);
settings = wlf->common.context.settings;
if (!settings)
return ERROR_INVALID_PARAMETER;
request = freerdp_settings_get_bool(settings, FreeRDP_RemoteAssistanceRequestControl);
if (request && (participantCreated->Flags & ENCOMSP_MAY_VIEW) &&
!(participantCreated->Flags & ENCOMSP_MAY_INTERACT))
{
if (!encomsp_toggle_control(context, TRUE))
return ERROR_INTERNAL_ERROR;
}
return CHANNEL_RC_OK;
}
static void wlf_encomsp_init(wlfContext* wlf, EncomspClientContext* encomsp)
{
wlf->encomsp = encomsp;
encomsp->custom = (void*)wlf;
encomsp->ParticipantCreated = wlf_encomsp_participant_created;
}
static void wlf_encomsp_uninit(wlfContext* wlf, EncomspClientContext* encomsp)
{
if (encomsp)
{
encomsp->custom = NULL;
encomsp->ParticipantCreated = NULL;
}
if (wlf)
wlf->encomsp = NULL;
}
void wlf_OnChannelConnectedEventHandler(void* context, const ChannelConnectedEventArgs* e)
{
wlfContext* wlf = (wlfContext*)context;
@ -116,10 +45,6 @@ void wlf_OnChannelConnectedEventHandler(void* context, const ChannelConnectedEve
{
wlf_cliprdr_init(wlf->clipboard, (CliprdrClientContext*)e->pInterface);
}
else if (strcmp(e->name, ENCOMSP_SVC_CHANNEL_NAME) == 0)
{
wlf_encomsp_init(wlf, (EncomspClientContext*)e->pInterface);
}
else if (strcmp(e->name, DISP_DVC_CHANNEL_NAME) == 0)
{
wlf_disp_init(wlf->disp, (DispClientContext*)e->pInterface);
@ -145,10 +70,6 @@ void wlf_OnChannelDisconnectedEventHandler(void* context, const ChannelDisconnec
{
wlf_cliprdr_uninit(wlf->clipboard, (CliprdrClientContext*)e->pInterface);
}
else if (strcmp(e->name, ENCOMSP_SVC_CHANNEL_NAME) == 0)
{
wlf_encomsp_uninit(wlf, (EncomspClientContext*)e->pInterface);
}
else if (strcmp(e->name, DISP_DVC_CHANNEL_NAME) == 0)
{
wlf_disp_uninit(wlf->disp, (DispClientContext*)e->pInterface);

View File

@ -20,7 +20,6 @@
#ifndef FREERDP_CLIENT_WAYLAND_FREERDP_H
#define FREERDP_CLIENT_WAYLAND_FREERDP_H
#include <freerdp/client/encomsp.h>
#include <freerdp/client/rdpei.h>
#include <freerdp/gdi/gfx.h>
#include <freerdp/freerdp.h>
@ -55,7 +54,6 @@ typedef struct
BOOL focusing;
/* Channels */
EncomspClientContext* encomsp;
wfClipboard* clipboard;
wlfDispContext* disp;
wLog* log;

View File

@ -31,70 +31,6 @@
#include <freerdp/log.h>
#define TAG CLIENT_TAG("windows")
static BOOL encomsp_toggle_control(EncomspClientContext* encomsp, BOOL control)
{
ENCOMSP_CHANGE_PARTICIPANT_CONTROL_LEVEL_PDU pdu;
if (!encomsp)
return FALSE;
pdu.ParticipantId = 0;
pdu.Flags = ENCOMSP_REQUEST_VIEW;
if (control)
pdu.Flags |= ENCOMSP_REQUEST_INTERACT;
encomsp->ChangeParticipantControlLevel(encomsp, &pdu);
return TRUE;
}
static UINT
wf_encomsp_participant_created(EncomspClientContext* context,
const ENCOMSP_PARTICIPANT_CREATED_PDU* participantCreated)
{
wfContext* wf;
rdpSettings* settings;
BOOL request;
if (!context || !context->custom || !participantCreated)
return ERROR_INVALID_PARAMETER;
wf = (wfContext*)context->custom;
WINPR_ASSERT(wf);
settings = wf->common.context.settings;
WINPR_ASSERT(settings);
request = freerdp_settings_get_bool(settings, FreeRDP_RemoteAssistanceRequestControl);
if (request && (participantCreated->Flags & ENCOMSP_MAY_VIEW) &&
!(participantCreated->Flags & ENCOMSP_MAY_INTERACT))
{
if (!encomsp_toggle_control(context, TRUE))
return ERROR_INTERNAL_ERROR;
}
return CHANNEL_RC_OK;
}
static void wf_encomsp_init(wfContext* wf, EncomspClientContext* encomsp)
{
wf->encomsp = encomsp;
encomsp->custom = (void*)wf;
encomsp->ParticipantCreated = wf_encomsp_participant_created;
}
static void wf_encomsp_uninit(wfContext* wf, EncomspClientContext* encomsp)
{
if (encomsp)
{
encomsp->custom = NULL;
encomsp->ParticipantCreated = NULL;
}
if (wf)
wf->encomsp = NULL;
}
void wf_OnChannelConnectedEventHandler(void* context, const ChannelConnectedEventArgs* e)
{
wfContext* wfc = (wfContext*)context;
@ -114,10 +50,6 @@ void wf_OnChannelConnectedEventHandler(void* context, const ChannelConnectedEven
{
wf_cliprdr_init(wfc, (CliprdrClientContext*)e->pInterface);
}
else if (strcmp(e->name, ENCOMSP_SVC_CHANNEL_NAME) == 0)
{
wf_encomsp_init(wfc, (EncomspClientContext*)e->pInterface);
}
else if (strcmp(e->name, DISP_DVC_CHANNEL_NAME) == 0)
{
wfc->disp = (DispClientContext*)e->pInterface;
@ -145,10 +77,6 @@ void wf_OnChannelDisconnectedEventHandler(void* context, const ChannelDisconnect
{
wf_cliprdr_uninit(wfc, (CliprdrClientContext*)e->pInterface);
}
else if (strcmp(e->name, ENCOMSP_SVC_CHANNEL_NAME) == 0)
{
wf_encomsp_uninit(wfc, (EncomspClientContext*)e->pInterface);
}
else if (strcmp(e->name, DISP_DVC_CHANNEL_NAME) == 0)
{
wfc->disp = NULL;

View File

@ -130,8 +130,6 @@ extern "C"
void* clipboard;
CliprdrClientContext* cliprdr;
EncomspClientContext* encomsp;
wfFloatBar* floatbar;
RailClientContext* rail;

View File

@ -68,10 +68,6 @@ void xf_OnChannelConnectedEventHandler(void* context, const ChannelConnectedEven
{
xf_cliprdr_init(xfc, (CliprdrClientContext*)e->pInterface);
}
else if (strcmp(e->name, ENCOMSP_SVC_CHANNEL_NAME) == 0)
{
xf_encomsp_init(xfc, (EncomspClientContext*)e->pInterface);
}
else if (strcmp(e->name, DISP_DVC_CHANNEL_NAME) == 0)
{
xf_disp_init(xfc->xfDisp, (DispClientContext*)e->pInterface);
@ -124,10 +120,6 @@ void xf_OnChannelDisconnectedEventHandler(void* context, const ChannelDisconnect
{
xf_cliprdr_uninit(xfc, (CliprdrClientContext*)e->pInterface);
}
else if (strcmp(e->name, ENCOMSP_SVC_CHANNEL_NAME) == 0)
{
xf_encomsp_uninit(xfc, (EncomspClientContext*)e->pInterface);
}
else if (strcmp(e->name, VIDEO_CONTROL_DVC_CHANNEL_NAME) == 0)
{
if (settings->SoftwareGdi)

View File

@ -822,71 +822,6 @@ void xf_toggle_fullscreen(xfContext* xfc)
PubSub_OnWindowStateChange(context->pubSub, context, &e);
}
BOOL xf_toggle_control(xfContext* xfc)
{
EncomspClientContext* encomsp;
ENCOMSP_CHANGE_PARTICIPANT_CONTROL_LEVEL_PDU pdu;
encomsp = xfc->encomsp;
if (!encomsp)
return FALSE;
pdu.ParticipantId = 0;
pdu.Flags = ENCOMSP_REQUEST_VIEW;
if (!xfc->controlToggle)
pdu.Flags |= ENCOMSP_REQUEST_INTERACT;
encomsp->ChangeParticipantControlLevel(encomsp, &pdu);
xfc->controlToggle = !xfc->controlToggle;
return TRUE;
}
/**
* Function description
*
* @return 0 on success, otherwise a Win32 error code
*/
static UINT
xf_encomsp_participant_created(EncomspClientContext* context,
const ENCOMSP_PARTICIPANT_CREATED_PDU* participantCreated)
{
xfContext* xfc;
rdpSettings* settings;
BOOL request;
if (!context || !context->custom || !participantCreated)
return ERROR_INVALID_PARAMETER;
xfc = context->custom;
WINPR_ASSERT(xfc);
settings = xfc->common.context.settings;
if (!settings)
return ERROR_INVALID_PARAMETER;
request = freerdp_settings_get_bool(settings, FreeRDP_RemoteAssistanceRequestControl);
if (request && (participantCreated->Flags & ENCOMSP_MAY_VIEW) &&
!(participantCreated->Flags & ENCOMSP_MAY_INTERACT))
xf_toggle_control(xfc);
return CHANNEL_RC_OK;
}
void xf_encomsp_init(xfContext* xfc, EncomspClientContext* encomsp)
{
xfc->encomsp = encomsp;
encomsp->custom = (void*)xfc;
encomsp->ParticipantCreated = xf_encomsp_participant_created;
}
void xf_encomsp_uninit(xfContext* xfc, EncomspClientContext* encomsp)
{
WINPR_UNUSED(encomsp);
xfc->encomsp = NULL;
}
void xf_lock_x11_(xfContext* xfc, const char* fkt)
{

View File

@ -590,7 +590,7 @@ BOOL xf_keyboard_handle_special_keys(xfContext* xfc, KeySym keysym)
if (mod.Ctrl && mod.Alt)
{
/* Ctrl-Alt-C: toggle control */
if (xf_toggle_control(xfc))
if (freerdp_client_encomsp_toggle_control(xfc->common.encomsp))
return TRUE;
}
}
@ -696,7 +696,7 @@ void xf_keyboard_handle_special_keys_release(xfContext* xfc, KeySym keysym)
{
if (!xfc->fullscreen)
{
xf_toggle_control(xfc);
freerdp_client_encomsp_toggle_control(xfc->common.encomsp);
}
xfc->mouse_active = FALSE;

View File

@ -203,7 +203,6 @@ struct xf_context
BOOL focused;
BOOL mouse_active;
BOOL fullscreen_toggle;
BOOL controlToggle;
UINT32 KeyboardLayout;
BOOL KeyboardState[256];
XModifierKeymap* modifierMap;
@ -268,7 +267,6 @@ struct xf_context
xfClipboard* clipboard;
CliprdrClientContext* cliprdr;
xfVideoContext* xfVideo;
EncomspClientContext* encomsp;
xfDispContext* xfDisp;
RailClientContext* rail;
@ -302,10 +300,6 @@ struct xf_context
BOOL xf_create_window(xfContext* xfc);
void xf_toggle_fullscreen(xfContext* xfc);
BOOL xf_toggle_control(xfContext* xfc);
void xf_encomsp_init(xfContext* xfc, EncomspClientContext* encomsp);
void xf_encomsp_uninit(xfContext* xfc, EncomspClientContext* encomsp);
enum XF_EXIT_CODE
{

View File

@ -963,6 +963,87 @@ int freerdp_client_common_stop(rdpContext* context)
return 0;
}
BOOL freerdp_client_encomsp_toggle_control(EncomspClientContext* encomsp)
{
rdpClientContext* cctx;
BOOL state;
WINPR_ASSERT(encomsp);
cctx = (rdpClientContext*)encomsp->custom;
state = cctx->controlToggle;
cctx->controlToggle = !cctx->controlToggle;
return freerdp_client_encomsp_set_control(encomsp, state);
}
BOOL freerdp_client_encomsp_set_control(EncomspClientContext* encomsp, BOOL control)
{
#if defined(CHANNEL_ENCOMSP_CLIENT)
ENCOMSP_CHANGE_PARTICIPANT_CONTROL_LEVEL_PDU pdu = { 0 };
if (!encomsp)
return FALSE;
pdu.ParticipantId = 0;
pdu.Flags = ENCOMSP_REQUEST_VIEW;
if (control)
pdu.Flags |= ENCOMSP_REQUEST_INTERACT;
encomsp->ChangeParticipantControlLevel(encomsp, &pdu);
#endif
return TRUE;
}
#if defined(CHANNEL_ENCOMSP_CLIENT)
static UINT
client_encomsp_participant_created(EncomspClientContext* context,
const ENCOMSP_PARTICIPANT_CREATED_PDU* participantCreated)
{
rdpClientContext* cctx;
rdpSettings* settings;
BOOL request;
if (!context || !context->custom || !participantCreated)
return ERROR_INVALID_PARAMETER;
cctx = (rdpClientContext*)context->custom;
WINPR_ASSERT(cctx);
settings = cctx->context.settings;
WINPR_ASSERT(settings);
request = freerdp_settings_get_bool(settings, FreeRDP_RemoteAssistanceRequestControl);
if (request && (participantCreated->Flags & ENCOMSP_MAY_VIEW) &&
!(participantCreated->Flags & ENCOMSP_MAY_INTERACT))
{
if (!freerdp_client_encomsp_set_control(context, TRUE))
return ERROR_INTERNAL_ERROR;
}
return CHANNEL_RC_OK;
}
static void client_encomsp_init(rdpClientContext* cctx, EncomspClientContext* encomsp)
{
cctx->encomsp = encomsp;
encomsp->custom = (void*)cctx;
encomsp->ParticipantCreated = client_encomsp_participant_created;
}
static void client_encomsp_uninit(rdpClientContext* cctx, EncomspClientContext* encomsp)
{
if (encomsp)
{
encomsp->custom = NULL;
encomsp->ParticipantCreated = NULL;
}
if (cctx)
cctx->encomsp = NULL;
}
#endif
void freerdp_client_OnChannelConnectedEventHandler(void* context,
const ChannelConnectedEventArgs* e)
{
@ -1006,6 +1087,12 @@ void freerdp_client_OnChannelConnectedEventHandler(void* context,
gdi_video_data_init(cctx->context.gdi, (VideoClientContext*)e->pInterface);
}
#endif
#if defined(CHANNEL_ENCOMSP_CLIENT)
else if (strcmp(e->name, ENCOMSP_SVC_CHANNEL_NAME) == 0)
{
client_encomsp_init(cctx, (EncomspClientContext*)e->pInterface);
}
#endif
}
void freerdp_client_OnChannelDisconnectedEventHandler(void* context,
@ -1051,6 +1138,12 @@ void freerdp_client_OnChannelDisconnectedEventHandler(void* context,
gdi_video_data_uninit(cctx->context.gdi, (VideoClientContext*)e->pInterface);
}
#endif
#if defined(CHANNEL_ENCOMSP_CLIENT)
else if (strcmp(e->name, ENCOMSP_SVC_CHANNEL_NAME) == 0)
{
client_encomsp_uninit(cctx, (EncomspClientContext*)e->pInterface);
}
#endif
}
BOOL freerdp_client_send_wheel_event(rdpClientContext* cctx, UINT16 mflags)

View File

@ -33,6 +33,10 @@
#include <freerdp/client/rdpei.h>
#endif
#if defined(CHANNEL_ENCOMSP_CLIENT)
#include <freerdp/client/encomsp.h>
#endif
#ifdef __cplusplus
extern "C"
{
@ -95,7 +99,14 @@ extern "C"
ALIGN64 INT32 lastX; /**< (offset 3) */
ALIGN64 INT32 lastY; /**< (offset 4) */
ALIGN64 BOOL mouse_grabbed; /** < (offset 5) */
UINT64 reserved[128 - 6]; /**< (offset 6) */
#if defined(CHANNEL_ENCOMSP_CLIENT)
ALIGN64 EncomspClientContext* encomsp; /** < (offset 6) */
ALIGN64 BOOL controlToggle; /**< (offset 7) */
#else
UINT64 reserved3[2];
#endif
UINT64 reserved[128 - 8]; /**< (offset 8) */
};
/* Common client functions */
@ -195,6 +206,10 @@ extern "C"
FREERDP_API BOOL freerdp_client_load_channels(freerdp* instance);
FREERDP_API BOOL freerdp_client_encomsp_toggle_control(EncomspClientContext* encomsp);
FREERDP_API BOOL freerdp_client_encomsp_set_control(EncomspClientContext* encomsp,
BOOL control);
#ifdef __cplusplus
}
#endif