[channels,printer] use freerdp_getApplicationDetailsString

Use proper vendor/product name for job name
This commit is contained in:
Armin Novak
2026-02-09 11:54:12 +01:00
parent 1ebc39f22f
commit 5f410772b6
2 changed files with 53 additions and 27 deletions

View File

@@ -23,6 +23,7 @@
#include <winpr/assert.h> #include <winpr/assert.h>
#include <freerdp/config.h> #include <freerdp/config.h>
#include <freerdp/utils/helpers.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
@@ -103,18 +104,26 @@ typedef struct
rdpCupsPrintJob* printjob; rdpCupsPrintJob* printjob;
} rdpCupsPrinter; } rdpCupsPrinter;
static void printer_cups_get_printjob_name(char* buf, size_t size, size_t id) WINPR_ATTR_MALLOC(free, 1)
static char* printer_cups_get_printjob_name(size_t id)
{ {
struct tm tres = { 0 }; struct tm tres = { 0 };
const time_t tt = time(NULL); const time_t tt = time(NULL);
const struct tm* t = localtime_r(&tt, &tres); const struct tm* t = localtime_r(&tt, &tres);
WINPR_ASSERT(buf); char* str = NULL;
WINPR_ASSERT(size > 0); size_t len = 0;
const int rc =
winpr_asprintf(&str, &len, "%s Print %04d-%02d-%02d %02d-%02d-%02d - Job %" PRIuz,
freerdp_getApplicationDetailsString(), t->tm_year + 1900, t->tm_mon + 1,
t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec, id);
if (rc <= 0)
{
free(str);
return NULL;
}
(void)sprintf_s(buf, size - 1, "FreeRDP Print %04d-%02d-%02d %02d-%02d-%02d - Job %" PRIuz, return str;
t->tm_year + 1900, t->tm_mon + 1, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec,
id);
} }
static bool http_status_ok(http_status_t status) static bool http_status_ok(http_status_t status)
@@ -197,8 +206,6 @@ static rdpPrintJob* printer_cups_create_printjob(rdpPrinter* printer, UINT32 id)
cups_printjob->printjob.Close = printer_cups_close_printjob; cups_printjob->printjob.Close = printer_cups_close_printjob;
{ {
char buf[100] = { 0 };
cups_printjob->printjob_object = httpConnect2(cupsServer(), ippPort(), NULL, AF_UNSPEC, cups_printjob->printjob_object = httpConnect2(cupsServer(), ippPort(), NULL, AF_UNSPEC,
HTTP_ENCRYPT_IF_REQUESTED, 1, 10000, NULL); HTTP_ENCRYPT_IF_REQUESTED, 1, 10000, NULL);
@@ -209,10 +216,16 @@ static rdpPrintJob* printer_cups_create_printjob(rdpPrinter* printer, UINT32 id)
return NULL; return NULL;
} }
printer_cups_get_printjob_name(buf, sizeof(buf), cups_printjob->printjob.id); char* jobTitle = printer_cups_get_printjob_name(cups_printjob->printjob.id);
if (!jobTitle)
{
httpClose(cups_printjob->printjob_object);
free(cups_printjob);
return NULL;
}
cups_printjob->printjob_id = cups_printjob->printjob_id =
cupsCreateJob(cups_printjob->printjob_object, printer->name, buf, 0, NULL); cupsCreateJob(cups_printjob->printjob_object, printer->name, jobTitle, 0, NULL);
if (!cups_printjob->printjob_id) if (!cups_printjob->printjob_id)
{ {
@@ -220,11 +233,14 @@ static rdpPrintJob* printer_cups_create_printjob(rdpPrinter* printer, UINT32 id)
printer->driver); printer->driver);
httpClose(cups_printjob->printjob_object); httpClose(cups_printjob->printjob_object);
free(cups_printjob); free(cups_printjob);
free(jobTitle);
return NULL; return NULL;
} }
http_status_t rc = cupsStartDocument(cups_printjob->printjob_object, printer->name, http_status_t rc =
cups_printjob->printjob_id, buf, CUPS_FORMAT_AUTO, 1); cupsStartDocument(cups_printjob->printjob_object, printer->name,
cups_printjob->printjob_id, jobTitle, CUPS_FORMAT_AUTO, 1);
free(jobTitle);
if (!http_status_ok(rc)) if (!http_status_ok(rc))
WLog_WARN(TAG, "cupsStartDocument [printer '%s', driver '%s'] returned %s", WLog_WARN(TAG, "cupsStartDocument [printer '%s', driver '%s'] returned %s",
printer->name, printer->driver, httpStatus(rc)); printer->name, printer->driver, httpStatus(rc));

View File

@@ -72,27 +72,37 @@ typedef struct
rdpWinPrintJob* printjob; rdpWinPrintJob* printjob;
} rdpWinPrinter; } rdpWinPrinter;
WINPR_ATTR_MALLOC(free, 1)
static WCHAR* printer_win_get_printjob_name(size_t id) static WCHAR* printer_win_get_printjob_name(size_t id)
{ {
time_t tt;
struct tm tres; struct tm tres;
errno_t err; WCHAR* str = NULL;
WCHAR* str; size_t len = 0;
size_t len = 1024;
int rc;
tt = time(NULL); const time_t tt = time(NULL);
err = localtime_s(&tres, &tt); const errno_t err = localtime_s(&tres, &tt);
str = calloc(len, sizeof(WCHAR)); do
if (!str) {
return NULL; if (len > 0)
{
str = calloc(len + 1, sizeof(WCHAR));
if (!str)
return NULL;
}
rc = swprintf_s(str, len, const int rc = swprintf_s(
WIDEN("FreeRDP Print %04d-%02d-%02d% 02d-%02d-%02d - Job %") WIDEN(PRIuz) str, len,
WIDEN("\0"), WIDEN("%s Print %04d-%02d-%02d% 02d-%02d-%02d - Job %") WIDEN(PRIuz) WIDEN("\0"),
tres.tm_year + 1900, tres.tm_mon + 1, tres.tm_mday, tres.tm_hour, tres.tm_min, freerdp_getApplicationDetailsStringW(), tres.tm_year + 1900, tres.tm_mon + 1,
tres.tm_sec, id); tres.tm_mday, tres.tm_hour, tres.tm_min, tres.tm_sec, id);
if (rc <= 0)
{
free(str);
return NULL;
}
len = WINPR_ASSERTING_INT_CAST(size_t, rc) + 1ull;
} while (!str);
return str; return str;
} }