Merge pull request #4079 from akallabeth/channel_pubsub_fix

Dynamic channel signal disconnect after the fact.
This commit is contained in:
David Fort 2017-08-31 10:22:43 +02:00 committed by GitHub
commit 3b8352690e
3 changed files with 36 additions and 44 deletions

View File

@ -297,27 +297,43 @@ static DVCMAN_CHANNEL* dvcman_channel_new(IWTSVirtualChannelManager*
static void dvcman_channel_free(void* arg)
{
DVCMAN_CHANNEL* channel = (DVCMAN_CHANNEL*) arg;
UINT error = CHANNEL_RC_OK;
if (channel->channel_callback)
if (channel)
{
channel->channel_callback->OnClose(channel->channel_callback);
channel->channel_callback = NULL;
}
if (channel->channel_callback)
{
IFCALL(channel->channel_callback->OnClose,
channel->channel_callback);
}
if (channel->dvc_data)
{
Stream_Release(channel->dvc_data);
channel->dvc_data = NULL;
}
if (channel->status == CHANNEL_RC_OK)
{
IWTSVirtualChannel* ichannel = (IWTSVirtualChannel*) channel;
DeleteCriticalSection(&(channel->lock));
if (channel->dvcman && channel->dvcman->drdynvc)
{
DrdynvcClientContext* context = channel->dvcman->drdynvc->context;
if (context)
{
IFCALLRET(context->OnChannelDisconnected, error,
context, channel->channel_name,
channel->pInterface);
}
}
error = IFCALLRESULT(CHANNEL_RC_OK, ichannel->Close, ichannel);
if (error != CHANNEL_RC_OK)
WLog_ERR(TAG, "Close failed with error %"PRIu32"!", error);
}
if (channel->dvc_data)
Stream_Release(channel->dvc_data);
DeleteCriticalSection(&(channel->lock));
if (channel->channel_name)
{
free(channel->channel_name);
channel->channel_name = NULL;
}
free(channel);
}
@ -408,6 +424,7 @@ static UINT dvcman_write_channel(IWTSVirtualChannel* pChannel, ULONG cbSize,
*/
static UINT dvcman_close_channel_iface(IWTSVirtualChannel* pChannel)
{
DVCMAN_CHANNEL* channel = (DVCMAN_CHANNEL*) pChannel;
if (!channel)
@ -440,7 +457,7 @@ static UINT dvcman_create_channel(IWTSVirtualChannelManager* pChannelMgr,
return CHANNEL_RC_NO_MEMORY;
}
channel->status = 1;
channel->status = ERROR_NOT_CONNECTED;
ArrayList_Add(dvcman->channels, channel);
for (i = 0; i < dvcman->num_listeners; i++)
@ -461,7 +478,7 @@ static UINT dvcman_create_channel(IWTSVirtualChannelManager* pChannelMgr,
{
WLog_DBG(TAG, "listener %s created new channel %"PRIu32"",
listener->channel_name, channel->channel_id);
channel->status = 0;
channel->status = CHANNEL_RC_OK;
channel->channel_callback = pCallback;
channel->pInterface = listener->iface.pInterface;
context = dvcman->drdynvc->context;
@ -536,10 +553,9 @@ static UINT dvcman_close_channel(IWTSVirtualChannelManager* pChannelMgr,
UINT32 ChannelId)
{
DVCMAN_CHANNEL* channel;
IWTSVirtualChannel* ichannel;
DrdynvcClientContext* context;
DVCMAN* dvcman = (DVCMAN*) pChannelMgr;
UINT error = CHANNEL_RC_OK;
DVCMAN* dvcman = (DVCMAN*) pChannelMgr;
channel = (DVCMAN_CHANNEL*) dvcman_find_channel_by_id(pChannelMgr, ChannelId);
if (!channel)
@ -552,30 +568,8 @@ static UINT dvcman_close_channel(IWTSVirtualChannelManager* pChannelMgr,
return CHANNEL_RC_OK;
}
if (channel->status == CHANNEL_RC_OK)
{
context = dvcman->drdynvc->context;
IFCALLRET(context->OnChannelDisconnected, error, context, channel->channel_name,
channel->pInterface);
if (error)
{
WLog_ERR(TAG, "OnChannelDisconnected returned with error %"PRIu32"!", error);
return error;
}
WLog_DBG(TAG, "dvcman_close_channel: channel %"PRIu32" closed", ChannelId);
ichannel = (IWTSVirtualChannel*) channel;
if ((ichannel->Close) && (error = ichannel->Close(ichannel)))
{
WLog_ERR(TAG, "Close failed with error %"PRIu32"!", error);
return error;
}
}
ArrayList_Remove(dvcman->channels, channel);
return CHANNEL_RC_OK;
return error;
}
/**

View File

@ -518,7 +518,6 @@ struct rdp_gdi
BOOL inGfxFrame;
BOOL graphicsReset;
UINT16 outputSurfaceId;
REGION16 invalidRegion;
RdpgfxClientContext* gfx;
wLog* log;

View File

@ -1155,7 +1155,6 @@ void gdi_graphics_pipeline_init(rdpGdi* gdi, RdpgfxClientContext* gfx)
void gdi_graphics_pipeline_uninit(rdpGdi* gdi, RdpgfxClientContext* gfx)
{
region16_uninit(&(gdi->invalidRegion));
gdi->gfx = NULL;
gfx->custom = NULL;
PROFILER_PRINT_HEADER;