mirror of https://github.com/FreeRDP/FreeRDP
Merge pull request #4710 from akallabeth/reconnect_fixes
Reconnect fixes
This commit is contained in:
commit
eb1727bb87
|
@ -1043,7 +1043,6 @@ static VOID VCAPITYPE cliprdr_virtual_channel_open_event_ex(LPVOID lpUserParam,
|
|||
break;
|
||||
|
||||
case CHANNEL_EVENT_WRITE_COMPLETE:
|
||||
Stream_Free((wStream*) pData, TRUE);
|
||||
break;
|
||||
|
||||
case CHANNEL_EVENT_USER:
|
||||
|
|
|
@ -1207,7 +1207,6 @@ static void VCAPITYPE drdynvc_virtual_channel_open_event_ex(LPVOID lpUserParam,
|
|||
if (!drdynvc || (drdynvc->OpenHandle != openHandle))
|
||||
{
|
||||
WLog_ERR(TAG, "drdynvc_virtual_channel_open_event: error no match");
|
||||
Stream_Free((wStream*) pData, TRUE);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -1222,7 +1221,6 @@ static void VCAPITYPE drdynvc_virtual_channel_open_event_ex(LPVOID lpUserParam,
|
|||
break;
|
||||
|
||||
case CHANNEL_EVENT_WRITE_COMPLETE:
|
||||
Stream_Free((wStream*) pData, TRUE);
|
||||
break;
|
||||
|
||||
case CHANNEL_EVENT_USER:
|
||||
|
|
|
@ -998,7 +998,6 @@ static VOID VCAPITYPE encomsp_virtual_channel_open_event_ex(LPVOID lpUserParam,
|
|||
break;
|
||||
|
||||
case CHANNEL_EVENT_WRITE_COMPLETE:
|
||||
Stream_Free((wStream*) pData, TRUE);
|
||||
break;
|
||||
|
||||
case CHANNEL_EVENT_USER:
|
||||
|
|
|
@ -680,7 +680,6 @@ static VOID VCAPITYPE rail_virtual_channel_open_event_ex(LPVOID lpUserParam, DWO
|
|||
break;
|
||||
|
||||
case CHANNEL_EVENT_WRITE_COMPLETE:
|
||||
Stream_Free((wStream*) pData, TRUE);
|
||||
break;
|
||||
|
||||
case CHANNEL_EVENT_USER:
|
||||
|
|
|
@ -1609,7 +1609,6 @@ static VOID VCAPITYPE rdpdr_virtual_channel_open_event_ex(LPVOID lpUserParam, DW
|
|||
break;
|
||||
|
||||
case CHANNEL_EVENT_WRITE_COMPLETE:
|
||||
Stream_Free((wStream*) pData, TRUE);
|
||||
break;
|
||||
|
||||
case CHANNEL_EVENT_USER:
|
||||
|
|
|
@ -1045,7 +1045,6 @@ static VOID VCAPITYPE rdpsnd_virtual_channel_open_event_ex(LPVOID lpUserParam, D
|
|||
break;
|
||||
|
||||
case CHANNEL_EVENT_WRITE_COMPLETE:
|
||||
Stream_Free((wStream*) pData, TRUE);
|
||||
break;
|
||||
|
||||
case CHANNEL_EVENT_USER:
|
||||
|
|
|
@ -788,7 +788,6 @@ static VOID VCAPITYPE remdesk_virtual_channel_open_event_ex(LPVOID lpUserParam,
|
|||
break;
|
||||
|
||||
case CHANNEL_EVENT_WRITE_COMPLETE:
|
||||
Stream_Free((wStream*) pData, TRUE);
|
||||
break;
|
||||
|
||||
case CHANNEL_EVENT_USER:
|
||||
|
|
|
@ -32,9 +32,6 @@
|
|||
#include <freerdp/client/geometry.h>
|
||||
#include <freerdp/client/video.h>
|
||||
|
||||
int xf_on_channel_connected(freerdp* instance, const char* name, void* pInterface);
|
||||
int xf_on_channel_disconnected(freerdp* instance, const char* name, void* pInterface);
|
||||
|
||||
void xf_OnChannelConnectedEventHandler(void* context, ChannelConnectedEventArgs* e);
|
||||
void xf_OnChannelDisconnectedEventHandler(void* context, ChannelDisconnectedEventArgs* e);
|
||||
|
||||
|
|
|
@ -240,7 +240,9 @@ struct rdp_freerdp
|
|||
Callback for context deallocation
|
||||
Can be set before calling freerdp_context_free() to have it executed before deallocation.
|
||||
Must be set to NULL if not needed. */
|
||||
UINT64 paddingC[48 - 35]; /* 35 */
|
||||
UINT64 paddingC[47 - 35]; /* 35 */
|
||||
|
||||
ALIGN64 UINT ConnectionCallbackState; /* 47 */
|
||||
|
||||
ALIGN64 pPreConnect PreConnect; /**< (offset 48)
|
||||
Callback for pre-connect operations.
|
||||
|
|
|
@ -347,11 +347,11 @@ UINT freerdp_channels_post_connect(rdpChannels* channels, freerdp* instance)
|
|||
UINT error = CHANNEL_RC_OK;
|
||||
UINT index;
|
||||
char* hostname;
|
||||
int hostnameLength;
|
||||
size_t hostnameLength;
|
||||
CHANNEL_CLIENT_DATA* pChannelClientData;
|
||||
channels->connected = TRUE;
|
||||
hostname = instance->settings->ServerHostname;
|
||||
hostnameLength = (int) strlen(hostname);
|
||||
hostnameLength = strlen(hostname);
|
||||
|
||||
for (index = 0; index < channels->clientDataCount; index++)
|
||||
{
|
||||
|
|
|
@ -357,7 +357,6 @@ BOOL rdp_client_redirect(rdpRdp* rdp)
|
|||
rdpSettings* settings;
|
||||
rdpContext* context;
|
||||
rdpChannels* channels;
|
||||
BOOL connected;
|
||||
|
||||
if (!rdp || !rdp->context || !rdp->context->channels)
|
||||
return FALSE;
|
||||
|
@ -365,7 +364,6 @@ BOOL rdp_client_redirect(rdpRdp* rdp)
|
|||
settings = rdp->settings;
|
||||
context = rdp->context;
|
||||
channels = context->channels;
|
||||
connected = channels->connected;
|
||||
|
||||
if (!rdp_client_disconnect_and_clear(rdp))
|
||||
return FALSE;
|
||||
|
@ -426,7 +424,7 @@ BOOL rdp_client_redirect(rdpRdp* rdp)
|
|||
|
||||
status = rdp_client_connect(rdp);
|
||||
|
||||
if (status && connected)
|
||||
if (status && (context->instance->ConnectionCallbackState == CLIENT_STATE_POSTCONNECT_PASSED))
|
||||
status = (freerdp_channels_post_connect(context->channels, context->instance) == CHANNEL_RC_OK);
|
||||
|
||||
return status;
|
||||
|
@ -437,21 +435,19 @@ BOOL rdp_client_reconnect(rdpRdp* rdp)
|
|||
BOOL status;
|
||||
rdpContext* context;
|
||||
rdpChannels* channels;
|
||||
BOOL connected;
|
||||
|
||||
if (!rdp || !rdp->context || !rdp->context->channels)
|
||||
return FALSE;
|
||||
|
||||
context = rdp->context;
|
||||
channels = context->channels;
|
||||
connected = channels->connected;
|
||||
|
||||
if (!rdp_client_disconnect_and_clear(rdp))
|
||||
return FALSE;
|
||||
|
||||
status = rdp_client_connect(rdp);
|
||||
|
||||
if (status && connected)
|
||||
if (status && (context->instance->ConnectionCallbackState == CLIENT_STATE_POSTCONNECT_PASSED))
|
||||
status = (freerdp_channels_post_connect(channels, context->instance) == CHANNEL_RC_OK);
|
||||
|
||||
return status;
|
||||
|
|
|
@ -49,6 +49,14 @@ enum CONNECTION_STATE
|
|||
CONNECTION_STATE_ACTIVE
|
||||
};
|
||||
|
||||
enum CLIENT_CONNECTION_STATE
|
||||
{
|
||||
CLIENT_STATE_INITIAL,
|
||||
CLIENT_STATE_PRECONNECT_PASSED,
|
||||
CLIENT_STATE_POSTCONNECT_PASSED,
|
||||
CLIENT_STATE_POSTDISCONNECT_PASSED
|
||||
};
|
||||
|
||||
FREERDP_LOCAL BOOL rdp_client_connect(rdpRdp* rdp);
|
||||
FREERDP_LOCAL BOOL rdp_client_disconnect(rdpRdp* rdp);
|
||||
FREERDP_LOCAL BOOL rdp_client_disconnect_and_clear(rdpRdp* rdp);
|
||||
|
|
|
@ -157,6 +157,7 @@ BOOL freerdp_connect(freerdp* instance)
|
|||
return FALSE;
|
||||
|
||||
/* We always set the return code to 0 before we start the connect sequence*/
|
||||
instance->ConnectionCallbackState = CLIENT_STATE_INITIAL;
|
||||
connectErrorCode = 0;
|
||||
instance->context->LastError = FREERDP_ERROR_SUCCESS;
|
||||
clearChannelError(instance->context);
|
||||
|
@ -165,6 +166,7 @@ BOOL freerdp_connect(freerdp* instance)
|
|||
settings = instance->settings;
|
||||
instance->context->codecs = codecs_new(instance->context);
|
||||
IFCALLRET(instance->PreConnect, status, instance);
|
||||
instance->ConnectionCallbackState = CLIENT_STATE_PRECONNECT_PASSED;
|
||||
|
||||
if (status)
|
||||
status2 = freerdp_channels_pre_connect(instance->context->channels,
|
||||
|
@ -212,6 +214,7 @@ BOOL freerdp_connect(freerdp* instance)
|
|||
}
|
||||
|
||||
IFCALLRET(instance->PostConnect, status, instance);
|
||||
instance->ConnectionCallbackState = CLIENT_STATE_POSTCONNECT_PASSED;
|
||||
|
||||
if (status)
|
||||
status2 = freerdp_channels_post_connect(instance->context->channels, instance);
|
||||
|
@ -501,6 +504,7 @@ BOOL freerdp_disconnect(freerdp* instance)
|
|||
}
|
||||
|
||||
IFCALL(instance->PostDisconnect, instance);
|
||||
instance->ConnectionCallbackState = CLIENT_STATE_POSTDISCONNECT_PASSED;
|
||||
|
||||
if (instance->update->pcap_rfx)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue