client/common: automatically register fake rdpsnd channel when device redirection is in use

This commit is contained in:
Marc-André Moreau 2012-11-21 09:30:06 -05:00
parent 15008297be
commit 091f9f3034
5 changed files with 75 additions and 40 deletions

View File

@ -173,8 +173,9 @@ static void rdpdr_send_device_list_announce_request(rdpdrPlugin* rdpdr, BOOL use
* 2. smartcard devices should be always sent
* 3. other devices are sent only after user_loggedon
*/
if (rdpdr->versionMinor == 0x0005 ||
device->type == RDPDR_DTYP_SMARTCARD || user_loggedon)
if ((rdpdr->versionMinor == 0x0005) ||
(device->type == RDPDR_DTYP_SMARTCARD) || user_loggedon)
{
data_len = (device->data == NULL ? 0 : stream_get_length(device->data));
stream_check_size(data_out, 20 + data_len);

View File

@ -572,7 +572,12 @@ static void rdpsnd_process_connect(rdpSvcPlugin* plugin)
rdpsnd_process_addin_args(rdpsnd, args);
if (rdpsnd->subsystem)
{
if (strcmp(rdpsnd->subsystem, "fake") == 0)
return;
rdpsnd_load_device_plugin(rdpsnd, rdpsnd->subsystem, args);
}
if (!rdpsnd->device)
{

View File

@ -831,68 +831,63 @@ int freerdp_client_parse_command_line_arguments(int argc, char** argv, rdpSettin
return 1;
}
int freerdp_client_load_addins(rdpChannels* channels, rdpSettings* settings)
int freerdp_client_load_static_channel_addin(rdpChannels* channels, rdpSettings* settings, char* name, void* data)
{
int index;
void* entry = NULL;
void* entry;
for (index = 0; index < settings->StaticChannelCount; index++)
entry = freerdp_load_channel_addin_entry(name, NULL, NULL, 0);
if (entry)
{
ADDIN_ARGV* args;
args = settings->StaticChannelArray[index];
entry = freerdp_load_channel_addin_entry(args->argv[0], NULL, NULL, 0);
if (entry)
if (freerdp_channels_client_load(channels, settings, entry, data) == 0)
{
if (freerdp_channels_client_load(channels, settings, entry, args) == 0)
printf("loading channel %s\n", args->argv[0]);
printf("loading channel %s\n", name);
return 0;
}
}
return -1;
}
int freerdp_client_load_addins(rdpChannels* channels, rdpSettings* settings)
{
int index;
ADDIN_ARGV* args;
if (settings->DeviceRedirection)
{
entry = freerdp_load_channel_addin_entry("rdpdr", NULL, NULL, 0);
freerdp_client_load_static_channel_addin(channels, settings, "rdpdr", settings);
if (entry)
if (!freerdp_static_channel_collection_find(settings, "rdpsnd"))
{
if (freerdp_channels_client_load(channels, settings, entry, settings) == 0)
printf("loading channel %s\n", "rdpdr");
char* params[2];
params[0] = "rdpsnd";
params[1] = "sys:fake";
freerdp_client_add_static_channel(settings, 2, (char**) params);
}
}
for (index = 0; index < settings->StaticChannelCount; index++)
{
args = settings->StaticChannelArray[index];
freerdp_client_load_static_channel_addin(channels, settings, args->argv[0], args);
}
if (settings->RedirectClipboard)
{
entry = freerdp_load_channel_addin_entry("cliprdr", NULL, NULL, 0);
if (entry)
{
if (freerdp_channels_client_load(channels, settings, entry, settings) == 0)
printf("loading channel %s\n", "cliprdr");
}
freerdp_client_load_static_channel_addin(channels, settings, "cliprdr", settings);
}
if (settings->RemoteApplicationMode)
{
entry = freerdp_load_channel_addin_entry("rail", NULL, NULL, 0);
if (entry)
{
if (freerdp_channels_client_load(channels, settings, entry, settings) == 0)
printf("loading channel %s\n", "rail");
}
freerdp_client_load_static_channel_addin(channels, settings, "rail", settings);
}
if (settings->DynamicChannelCount)
{
entry = freerdp_load_channel_addin_entry("drdynvc", NULL, NULL, 0);
if (entry)
{
if (freerdp_channels_client_load(channels, settings, entry, settings) == 0)
printf("loading channel %s\n", "drdynvc");
}
freerdp_client_load_static_channel_addin(channels, settings, "drdynvc", settings);
}
return 1;

View File

@ -969,9 +969,11 @@ FREERDP_API void freerdp_device_collection_add(rdpSettings* settings, RDPDR_DEVI
FREERDP_API void freerdp_device_collection_free(rdpSettings* settings);
FREERDP_API void freerdp_static_channel_collection_add(rdpSettings* settings, ADDIN_ARGV* channel);
FREERDP_API ADDIN_ARGV* freerdp_static_channel_collection_find(rdpSettings* settings, const char* name);
FREERDP_API void freerdp_static_channel_collection_free(rdpSettings* settings);
FREERDP_API void freerdp_dynamic_channel_collection_add(rdpSettings* settings, ADDIN_ARGV* channel);
FREERDP_API ADDIN_ARGV* freerdp_dynamic_channel_collection_find(rdpSettings* settings, const char* name);
FREERDP_API void freerdp_dynamic_channel_collection_free(rdpSettings* settings);
#endif /* FREERDP_SETTINGS_H */

View File

@ -92,6 +92,22 @@ void freerdp_static_channel_collection_add(rdpSettings* settings, ADDIN_ARGV* ch
settings->StaticChannelArray[settings->StaticChannelCount++] = channel;
}
ADDIN_ARGV* freerdp_static_channel_collection_find(rdpSettings* settings, const char* name)
{
int index;
ADDIN_ARGV* channel;
for (index = 0; index < settings->StaticChannelCount; index++)
{
channel = settings->StaticChannelArray[index];
if (strcmp(channel->argv[0], name) == 0)
return channel;
}
return NULL;
}
void freerdp_static_channel_collection_free(rdpSettings* settings)
{
int index;
@ -120,6 +136,22 @@ void freerdp_dynamic_channel_collection_add(rdpSettings* settings, ADDIN_ARGV* c
settings->DynamicChannelArray[settings->DynamicChannelCount++] = channel;
}
ADDIN_ARGV* freerdp_dynamic_channel_collection_find(rdpSettings* settings, const char* name)
{
int index;
ADDIN_ARGV* channel;
for (index = 0; index < settings->DynamicChannelCount; index++)
{
channel = settings->DynamicChannelArray[index];
if (strcmp(channel->argv[0], name) == 0)
return channel;
}
return NULL;
}
void freerdp_dynamic_channel_collection_free(rdpSettings* settings)
{
int index;