channels/drdynvc: call OnChannelDisconnected
authorMarc-André Moreau <marcandre.moreau@gmail.com>
Mon, 20 May 2013 19:23:54 +0000 (15:23 -0400)
committerMarc-André Moreau <marcandre.moreau@gmail.com>
Mon, 20 May 2013 19:23:54 +0000 (15:23 -0400)
channels/drdynvc/client/dvcman.c
channels/drdynvc/client/dvcman.h
client/X11/xf_channels.c
libfreerdp/core/transport.c

index f106376..ac897a6 100644 (file)
@@ -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;
 }
index 9b181f0..ca886f3 100644 (file)
@@ -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;
index 5b95a2d..84a70b1 100644 (file)
@@ -30,8 +30,6 @@ int xf_on_channel_connected(freerdp* instance, const char* name, void* pInterfac
 {
        xfInfo* xfi = ((xfContext*) instance->context)->xfi;
 
-       printf("OnChannelConnected: %s\n", name);
-
        if (strcmp(name, RDPEI_DVC_CHANNEL_NAME) == 0)
        {
                xfi->rdpei = (RdpeiClientContext*) pInterface;
index 136d569..ba8f9c8 100644 (file)
@@ -793,7 +793,6 @@ static void* transport_client_thread(void* arg)
        {
                nCount = 0;
                events[nCount++] = transport->stopEvent;
-
                events[nCount] = transport->connectedEvent;
 
                status = WaitForMultipleObjects(nCount + 1, events, FALSE, INFINITE);