wtsvc: add extended channel handling functions
authorBernhard Miklautz <bernhard.miklautz@thincast.com>
Wed, 7 May 2014 18:20:02 +0000 (20:20 +0200)
committerBernhard Miklautz <bernhard.miklautz@thincast.com>
Wed, 7 May 2014 18:20:02 +0000 (20:20 +0200)
include/freerdp/channels/wtsvc.h
libfreerdp/core/server.c

index 5f78654..df6dead 100644 (file)
@@ -54,9 +54,19 @@ extern "C" {
 FREERDP_API void WTSVirtualChannelManagerGetFileDescriptor(HANDLE hServer, void** fds, int* fds_count);
 FREERDP_API BOOL WTSVirtualChannelManagerCheckFileDescriptor(HANDLE hServer);
 FREERDP_API HANDLE WTSVirtualChannelManagerGetEventHandle(HANDLE hServer);
-
 FREERDP_API BOOL WTSVirtualChannelManagerIsChannelJoined(HANDLE hServer, const char* name);
 
+/**
+ * Extended FreeRDP WTS functions for channel handling
+ */
+FREERDP_API UINT16 WTSChannelGetId(freerdp_peer *client, const char *channel_name);
+FREERDP_API BOOL WTSIsChannelJoinedByName(freerdp_peer *client, const char *channel_name);
+FREERDP_API BOOL WTSIsChannelJoinedById(freerdp_peer *client, const UINT16 channel_id);
+FREERDP_API BOOL WTSChannelSetHandleByName(freerdp_peer *client, const char *channel_name, void *handle);
+FREERDP_API BOOL WTSChannelSetHandleById(freerdp_peer *client, const UINT16 channel_id, void *handle);
+FREERDP_API void *WTSChannelGetHandleByName(freerdp_peer *client, const char *channel_name);
+FREERDP_API void *WTSChannelGetHandleById(freerdp_peer *client, const UINT16 channel_id);
+
 #ifdef __cplusplus
 }
 #endif
index 9f1e689..db80f46 100644 (file)
@@ -463,27 +463,132 @@ HANDLE WTSVirtualChannelManagerGetEventHandle(HANDLE hServer)
        return MessageQueue_Event(vcm->queue);
 }
 
-BOOL WTSVirtualChannelManagerIsChannelJoined(HANDLE hServer, const char* name)
+static rdpMcsChannel* wts_get_joined_channel_by_name(rdpMcs *mcs, const char *channel_name)
 {
-       rdpMcs* mcs;
        UINT32 index;
-       BOOL joined = FALSE;
-       WTSVirtualChannelManager* vcm = (WTSVirtualChannelManager*) hServer;
+       if (!mcs || !channel_name || !strlen(channel_name))
+               return NULL;
 
-       mcs = vcm->rdp->mcs;
+       for (index = 0; index < mcs->channelCount; index++)
+       {
+               if (mcs->channels[index].joined)
+               {
+                       if (strncasecmp(mcs->channels[index].Name, channel_name, strlen(channel_name)) == 0)
+                               return &mcs->channels[index];
+    }
+  }
+  return NULL;
+}
+
+static rdpMcsChannel* wts_get_joined_channel_by_id(rdpMcs *mcs, const UINT16 channel_id)
+{
+       UINT32 index;
+       if (!mcs || !channel_id)
+               return NULL;
 
        for (index = 0; index < mcs->channelCount; index++)
        {
                if (mcs->channels[index].joined)
                {
-                       if (strncmp(mcs->channels[index].Name, name, strlen(name)) == 0)
-                       {
-                               joined = TRUE;
-                       }
-               }
-       }
+                       if (mcs->channels[index].ChannelId == channel_id)
+                               return &mcs->channels[index];
+    }
+  }
+  return NULL;
+}
+
+BOOL WTSIsChannelJoinedByName(freerdp_peer *client, const char *channel_name)
+{
+       if (!client || !client->context || !client->context->rdp)
+               return FALSE;
+
+       return wts_get_joined_channel_by_name(client->context->rdp->mcs, channel_name) == NULL ? FALSE : TRUE;
+}
+
+BOOL WTSIsChannelJoinedById(freerdp_peer *client, const UINT16 channel_id)
+{
+       if (!client || !client->context || !client->context->rdp)
+               return FALSE;
+
+       return wts_get_joined_channel_by_id(client->context->rdp->mcs, channel_id) == NULL ? FALSE : TRUE;
+}
+
+BOOL WTSVirtualChannelManagerIsChannelJoined(HANDLE hServer, const char* name)
+{
+       WTSVirtualChannelManager* vcm = (WTSVirtualChannelManager*) hServer;
+
+       if (!vcm || !vcm->rdp)
+               return FALSE;
+
+       return wts_get_joined_channel_by_name(vcm->rdp->mcs, name) == NULL ? FALSE : TRUE;
+}
+
+UINT16 WTSChannelGetId(freerdp_peer *client, const char *channel_name)
+{
+       rdpMcsChannel *channel;
+
+       if (!client || !client->context || !client->context->rdp)
+               return 0;
+
+       channel = wts_get_joined_channel_by_name(client->context->rdp->mcs, channel_name);
+       if (!channel)
+               return 0;
+
+       return channel->ChannelId;
+}
+
+BOOL WTSChannelSetHandleByName(freerdp_peer *client, const char *channel_name, void *handle)
+{
+       rdpMcsChannel *channel;
+       if (!client || !client->context || !client->context->rdp)
+               return FALSE;
+
+       channel = wts_get_joined_channel_by_name(client->context->rdp->mcs, channel_name);
+       if (!channel)
+               return FALSE;
+
+       channel->handle = handle;
+       return TRUE;
+}
+
+BOOL WTSChannelSetHandleById(freerdp_peer *client, const UINT16 channel_id, void *handle)
+{
+       rdpMcsChannel *channel;
+       if (!client || !client->context || !client->context->rdp)
+               return FALSE;
+
+       channel = wts_get_joined_channel_by_id(client->context->rdp->mcs, channel_id);
+       if (!channel)
+               return FALSE;
+
+       channel->handle = handle;
+       return TRUE;
+}
+
+void *WTSChannelGetHandleByName(freerdp_peer *client, const char *channel_name)
+{
+       rdpMcsChannel *channel;
+       if (!client || !client->context || !client->context->rdp)
+               return NULL;
+
+       channel = wts_get_joined_channel_by_name(client->context->rdp->mcs, channel_name);
+       if (!channel)
+               return NULL;
+
+       return channel->handle;
+}
+
+void *WTSChannelGetHandleById(freerdp_peer *client, const UINT16 channel_id)
+{
+       rdpMcsChannel *channel;
+       if (!client || !client->context || !client->context->rdp)
+               return NULL;
+
+       channel = wts_get_joined_channel_by_id(client->context->rdp->mcs, channel_id);
+       if (!channel)
+               return NULL;
 
-       return joined;
+       return channel->handle;
 }
 
 BOOL WINAPI FreeRDP_WTSStartRemoteControlSessionW(LPWSTR pTargetServerName, ULONG TargetLogonId, BYTE HotkeyVk, USHORT HotkeyModifiers)