summaryrefslogtreecommitdiff
path: root/channels
diff options
context:
space:
mode:
authorMarc-André Moreau <marcandre.moreau@gmail.com>2013-05-20 15:23:54 -0400
committerMarc-André Moreau <marcandre.moreau@gmail.com>2013-05-20 15:23:54 -0400
commit8095bec3ec07bdbccede923f83ade1da8d02fcde (patch)
tree59887484a480fb67f9ea620594924c8dcb921c44 /channels
parent73f782b871291b3fa75ca9a9b84cbccf15c1dedc (diff)
downloadfreerdp-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.c39
-rw-r--r--channels/drdynvc/client/dvcman.h3
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;