Merge pull request #4710 from akallabeth/reconnect_fixes

Reconnect fixes
This commit is contained in:
David Fort 2018-06-26 00:02:58 +02:00 committed by GitHub
commit eb1727bb87
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
13 changed files with 19 additions and 20 deletions

View File

@ -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:

View File

@ -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:

View File

@ -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:

View File

@ -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:

View File

@ -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:

View File

@ -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:

View File

@ -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:

View File

@ -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);

View File

@ -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.

View File

@ -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++)
{

View File

@ -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;

View File

@ -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);

View File

@ -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)
{