mirror of
https://github.com/FreeRDP/FreeRDP.git
synced 2025-06-03 00:00:20 +00:00
Add peer SetState function to manually set state
Expose internal state machine manipulation to allow skipping parts of a peer connection state
This commit is contained in:
parent
453d3b4c8b
commit
f7b6d3be73
@ -72,6 +72,7 @@ typedef int (*psPeerVirtualChannelWrite)(freerdp_peer* peer, HANDLE hChannel, co
|
||||
UINT32 length);
|
||||
typedef void* (*psPeerVirtualChannelGetData)(freerdp_peer* peer, HANDLE hChannel);
|
||||
typedef int (*psPeerVirtualChannelSetData)(freerdp_peer* peer, HANDLE hChannel, void* data);
|
||||
typedef BOOL (*psPeerSetState)(freerdp_peer* peer, CONNECTION_STATE state);
|
||||
|
||||
/** @brief the result of the license callback */
|
||||
typedef enum
|
||||
@ -151,6 +152,18 @@ struct rdp_freerdp_peer
|
||||
ALIGN64 psPeerLicenseCallback LicenseCallback;
|
||||
|
||||
ALIGN64 psPeerSendChannelPacket SendChannelPacket;
|
||||
|
||||
/**
|
||||
* @brief SetState Function pointer allowing to manually set the state of the
|
||||
* internal state machine.
|
||||
*
|
||||
* This is useful if certain parts of a RDP connection must be skipped (e.g.
|
||||
* when replaying a RDP connection dump the authentication/negotiate parts
|
||||
* must be skipped)
|
||||
*
|
||||
* \note Must be called after \b Initialize as that also modifies the state.
|
||||
*/
|
||||
ALIGN64 psPeerSetState SetState;
|
||||
};
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
@ -216,6 +216,13 @@ static int freerdp_peer_virtual_channel_set_data(freerdp_peer* client, HANDLE hC
|
||||
return 1;
|
||||
}
|
||||
|
||||
static BOOL freerdp_peer_set_state(freerdp_peer* client, CONNECTION_STATE state)
|
||||
{
|
||||
WINPR_ASSERT(client);
|
||||
WINPR_ASSERT(client->context);
|
||||
return rdp_server_transition_to_state(client->context->rdp, state) >= 0;
|
||||
}
|
||||
|
||||
static BOOL freerdp_peer_initialize(freerdp_peer* client)
|
||||
{
|
||||
rdpRdp* rdp;
|
||||
@ -233,7 +240,7 @@ static BOOL freerdp_peer_initialize(freerdp_peer* client)
|
||||
settings->ServerMode = TRUE;
|
||||
settings->FrameAcknowledge = 0;
|
||||
settings->LocalConnection = client->local;
|
||||
rdp_server_transition_to_state(rdp, CONNECTION_STATE_INITIAL);
|
||||
rdp_server_transition_to_state(rdp, CONNECTION_STATE_MCS_CONNECT);
|
||||
|
||||
if (settings->RdpKeyFile)
|
||||
{
|
||||
@ -978,6 +985,7 @@ freerdp_peer* freerdp_peer_new(int sockfd)
|
||||
client->VirtualChannelRead = NULL; /* must be defined by server application */
|
||||
client->VirtualChannelGetData = freerdp_peer_virtual_channel_get_data;
|
||||
client->VirtualChannelSetData = freerdp_peer_virtual_channel_set_data;
|
||||
client->SetState = freerdp_peer_set_state;
|
||||
}
|
||||
|
||||
return client;
|
||||
|
Loading…
Reference in New Issue
Block a user