diff options
author | Marc-André Moreau <marcandre.moreau@gmail.com> | 2013-05-20 15:23:54 -0400 |
---|---|---|
committer | Marc-André Moreau <marcandre.moreau@gmail.com> | 2013-05-20 15:23:54 -0400 |
commit | 8095bec3ec07bdbccede923f83ade1da8d02fcde (patch) | |
tree | 59887484a480fb67f9ea620594924c8dcb921c44 /channels | |
parent | 73f782b871291b3fa75ca9a9b84cbccf15c1dedc (diff) | |
download | freerdp-8095bec3ec07bdbccede923f83ade1da8d02fcde.tar.gz freerdp-8095bec3ec07bdbccede923f83ade1da8d02fcde.tar.bz2 freerdp-8095bec3ec07bdbccede923f83ade1da8d02fcde.zip |
channels/drdynvc: call OnChannelDisconnected
Diffstat (limited to 'channels')
-rw-r--r-- | channels/drdynvc/client/dvcman.c | 39 | ||||
-rw-r--r-- | channels/drdynvc/client/dvcman.h | 3 |
2 files changed, 33 insertions, 9 deletions
diff --git a/channels/drdynvc/client/dvcman.c b/channels/drdynvc/client/dvcman.c index f10637689..ac897a669 100644 --- a/channels/drdynvc/client/dvcman.c +++ b/channels/drdynvc/client/dvcman.c @@ -335,19 +335,21 @@ int dvcman_create_channel(IWTSVirtualChannelManager* pChannelMgr, UINT32 Channel IWTSVirtualChannelCallback* pCallback; DVCMAN* dvcman = (DVCMAN*) pChannelMgr; + channel = (DVCMAN_CHANNEL*) malloc(sizeof(DVCMAN_CHANNEL)); + ZeroMemory(channel, sizeof(DVCMAN_CHANNEL)); + + channel->dvcman = dvcman; + channel->channel_id = ChannelId; + channel->channel_name = _strdup(ChannelName); + for (i = 0; i < dvcman->num_listeners; i++) { listener = (DVCMAN_LISTENER*) dvcman->listeners[i]; if (strcmp(listener->channel_name, ChannelName) == 0) { - channel = (DVCMAN_CHANNEL*) malloc(sizeof(DVCMAN_CHANNEL)); - ZeroMemory(channel, sizeof(DVCMAN_CHANNEL)); - channel->iface.Write = dvcman_write_channel; channel->iface.Close = dvcman_close_channel_iface; - channel->dvcman = dvcman; - channel->channel_id = ChannelId; channel->dvc_chan_mutex = CreateMutex(NULL, FALSE, NULL); bAccept = 1; @@ -359,7 +361,10 @@ int dvcman_create_channel(IWTSVirtualChannelManager* pChannelMgr, UINT32 Channel DEBUG_DVC("listener %s created new channel %d", listener->channel_name, channel->channel_id); + channel->status = 0; channel->channel_callback = pCallback; + channel->pInterface = listener->iface.pInterface; + ArrayList_Add(dvcman->channels, channel); context = dvcman->drdynvc->context; @@ -370,12 +375,17 @@ int dvcman_create_channel(IWTSVirtualChannelManager* pChannelMgr, UINT32 Channel else { DEBUG_WARN("channel rejected by plugin"); - dvcman_channel_free(channel); + + channel->status = 1; + ArrayList_Add(dvcman->channels, channel); return 1; } } } + channel->status = 1; + ArrayList_Add(dvcman->channels, channel); + return 1; } @@ -383,6 +393,8 @@ int dvcman_close_channel(IWTSVirtualChannelManager* pChannelMgr, UINT32 ChannelI { DVCMAN_CHANNEL* channel; IWTSVirtualChannel* ichannel; + DrdynvcClientContext* context; + DVCMAN* dvcman = (DVCMAN*) pChannelMgr; channel = (DVCMAN_CHANNEL*) dvcman_find_channel_by_id(pChannelMgr, ChannelId); @@ -398,9 +410,18 @@ int dvcman_close_channel(IWTSVirtualChannelManager* pChannelMgr, UINT32 ChannelI channel->dvc_data = NULL; } - DEBUG_DVC("dvcman_close_channel: channel %d closed", ChannelId); - ichannel = (IWTSVirtualChannel*) channel; - ichannel->Close(ichannel); + if (channel->status == 0) + { + context = dvcman->drdynvc->context; + + IFCALL(context->OnChannelDisconnected, context, channel->channel_name, channel->pInterface); + + DEBUG_DVC("dvcman_close_channel: channel %d closed", ChannelId); + ichannel = (IWTSVirtualChannel*) channel; + ichannel->Close(ichannel); + } + + free(channel->channel_name); return 0; } diff --git a/channels/drdynvc/client/dvcman.h b/channels/drdynvc/client/dvcman.h index 9b181f06a..ca886f3af 100644 --- a/channels/drdynvc/client/dvcman.h +++ b/channels/drdynvc/client/dvcman.h @@ -70,8 +70,11 @@ struct _DVCMAN_CHANNEL { IWTSVirtualChannel iface; + int status; DVCMAN* dvcman; + void* pInterface; UINT32 channel_id; + char* channel_name; IWTSVirtualChannelCallback* channel_callback; wStream* dvc_data; |