From e9d362b58ea6cb29ae48a65388e80c1991034f29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Mon, 20 May 2013 15:50:22 -0400 Subject: [PATCH] channels/printer: fix printer redirection and test with cups-pdf --- channels/printer/client/printer_main.c | 10 ++++++++ channels/rdpsnd/client/rdpsnd_main.c | 5 ++-- client/common/cmdline.c | 33 +++++++++++++++++++------- 3 files changed, 37 insertions(+), 11 deletions(-) diff --git a/channels/printer/client/printer_main.c b/channels/printer/client/printer_main.c index 0ecd3e8c6..89e2ffb81 100644 --- a/channels/printer/client/printer_main.c +++ b/channels/printer/client/printer_main.c @@ -141,6 +141,12 @@ static void printer_process_irp_write(PRINTER_DEVICE* printer_dev, IRP* irp) irp->Complete(irp); } +static void printer_process_irp_device_control(PRINTER_DEVICE* printer_dev, IRP* irp) +{ + Stream_Write_UINT32(irp->output, 0); /* OutputBufferLength */ + irp->Complete(irp); +} + static void printer_process_irp(PRINTER_DEVICE* printer_dev, IRP* irp) { switch (irp->MajorFunction) @@ -157,6 +163,10 @@ static void printer_process_irp(PRINTER_DEVICE* printer_dev, IRP* irp) printer_process_irp_write(printer_dev, irp); break; + case IRP_MJ_DEVICE_CONTROL: + printer_process_irp_device_control(printer_dev, irp); + break; + default: DEBUG_WARN("MajorFunction 0x%X not supported", irp->MajorFunction); irp->IoStatus = STATUS_NOT_SUPPORTED; diff --git a/channels/rdpsnd/client/rdpsnd_main.c b/channels/rdpsnd/client/rdpsnd_main.c index d7ee92927..e895b9901 100644 --- a/channels/rdpsnd/client/rdpsnd_main.c +++ b/channels/rdpsnd/client/rdpsnd_main.c @@ -199,9 +199,10 @@ void rdpsnd_send_client_audio_formats(rdpsndPlugin* rdpsnd) UINT16 wNumberOfFormats; AUDIO_FORMAT* clientFormat; - if (rdpsnd->device->GetVolume) + if (rdpsnd->device) { - dwVolume = rdpsnd->device->GetVolume(rdpsnd->device); + if (rdpsnd->device->GetVolume) + dwVolume = rdpsnd->device->GetVolume(rdpsnd->device); } else { diff --git a/client/common/cmdline.c b/client/common/cmdline.c index 55f35eb66..a373946dc 100644 --- a/client/common/cmdline.c +++ b/client/common/cmdline.c @@ -87,7 +87,7 @@ COMMAND_LINE_ARGUMENT_A args[] = { "serial", COMMAND_LINE_VALUE_REQUIRED, NULL, NULL, NULL, -1, "tty", "Redirect serial device" }, { "parallel", COMMAND_LINE_VALUE_REQUIRED, NULL, NULL, NULL, -1, NULL, "Redirect parallel device" }, { "smartcard", COMMAND_LINE_VALUE_REQUIRED, NULL, NULL, NULL, -1, NULL, "Redirect smartcard device" }, - { "printer", COMMAND_LINE_VALUE_REQUIRED, NULL, NULL, NULL, -1, NULL, "Redirect printer device" }, + { "printer", COMMAND_LINE_VALUE_OPTIONAL, NULL, NULL, NULL, -1, NULL, "Redirect printer device" }, { "usb", COMMAND_LINE_VALUE_REQUIRED, NULL, NULL, NULL, -1, NULL, "Redirect USB device" }, { "multitouch", COMMAND_LINE_VALUE_BOOL, NULL, BoolValueFalse, NULL, -1, NULL, "Redirect multitouch input" }, { "echo", COMMAND_LINE_VALUE_FLAG, NULL, NULL, NULL, -1, "echo", "Echo channel" }, @@ -291,14 +291,16 @@ int freerdp_client_add_device_channel(rdpSettings* settings, int count, char** p { RDPDR_PRINTER* printer; - if (count < 2) + if (count < 1) return -1; printer = (RDPDR_PRINTER*) malloc(sizeof(RDPDR_PRINTER)); ZeroMemory(printer, sizeof(RDPDR_PRINTER)); printer->Type = RDPDR_DTYP_PRINT; - printer->Name = _strdup(params[1]); + + if (count > 1) + printer->Name = _strdup(params[1]); if (count > 2) printer->DriverName = _strdup(params[2]); @@ -547,15 +549,28 @@ int freerdp_client_command_line_post_filter(void* context, COMMAND_LINE_ARGUMENT } CommandLineSwitchCase(arg, "printer") { - char** p; - int count; + if (arg->Flags & COMMAND_LINE_VALUE_PRESENT) + { + char** p; + int count; - p = freerdp_command_line_parse_comma_separated_values_offset(arg->Value, &count); - p[0] = "printer"; + p = freerdp_command_line_parse_comma_separated_values_offset(arg->Value, &count); + p[0] = "printer"; - freerdp_client_add_device_channel(settings, count, p); + freerdp_client_add_device_channel(settings, count, p); - free(p); + free(p); + } + else + { + char* p[1]; + int count; + + count = 1; + p[0] = "printer"; + + freerdp_client_add_device_channel(settings, count, p); + } } CommandLineSwitchCase(arg, "usb") {