Manage default printer for the win backend (#8177)

* printer_win: Retrieve default printer name

* printer_win: Declare the local default printer as default

* printer_cups: Retrieve default printer name

* printer_cups: Declare the local default printer as default
This commit is contained in:
Simon Nivault 2022-09-09 09:13:37 +02:00 committed by GitHub
parent fd96ed0acd
commit 06827774b6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 37 additions and 11 deletions

View File

@ -46,6 +46,7 @@ typedef struct
int id_sequence; int id_sequence;
size_t references; size_t references;
char* defaultPrinter;
} rdpCupsPrinterDriver; } rdpCupsPrinterDriver;
typedef struct typedef struct
@ -276,7 +277,7 @@ static void printer_cups_release_ref_printer(rdpPrinter* printer)
} }
static rdpPrinter* printer_cups_new_printer(rdpCupsPrinterDriver* cups_driver, const char* name, static rdpPrinter* printer_cups_new_printer(rdpCupsPrinterDriver* cups_driver, const char* name,
const char* driverName, BOOL is_default) const char* driverName)
{ {
rdpCupsPrinter* cups_printer; rdpCupsPrinter* cups_printer;
@ -298,7 +299,7 @@ static rdpPrinter* printer_cups_new_printer(rdpCupsPrinterDriver* cups_driver, c
if (!cups_printer->printer.driver) if (!cups_printer->printer.driver)
goto fail; goto fail;
cups_printer->printer.is_default = is_default; cups_printer->printer.is_default = strcmp(name, cups_driver->defaultPrinter) == 0;
cups_printer->printer.CreatePrintJob = printer_cups_create_printjob; cups_printer->printer.CreatePrintJob = printer_cups_create_printjob;
cups_printer->printer.FindPrintJob = printer_cups_find_printjob; cups_printer->printer.FindPrintJob = printer_cups_find_printjob;
@ -351,8 +352,8 @@ static rdpPrinter** printer_cups_enum_printers(rdpPrinterDriver* driver)
{ {
if (dest->instance == NULL) if (dest->instance == NULL)
{ {
rdpPrinter* current = printer_cups_new_printer((rdpCupsPrinterDriver*)driver, rdpPrinter* current =
dest->name, NULL, dest->is_default); printer_cups_new_printer((rdpCupsPrinterDriver*)driver, dest->name, NULL);
if (!current) if (!current)
{ {
printer_cups_release_enum_printers(printers); printer_cups_release_enum_printers(printers);
@ -383,8 +384,7 @@ static rdpPrinter* printer_cups_get_printer(rdpPrinterDriver* driver, const char
rdpCupsPrinterDriver* cups_driver = (rdpCupsPrinterDriver*)driver; rdpCupsPrinterDriver* cups_driver = (rdpCupsPrinterDriver*)driver;
WINPR_ASSERT(cups_driver); WINPR_ASSERT(cups_driver);
return printer_cups_new_printer(cups_driver, name, driverName, return printer_cups_new_printer(cups_driver, name, driverName);
cups_driver->id_sequence == 1 ? TRUE : FALSE);
} }
static void printer_cups_add_ref_driver(rdpPrinterDriver* driver) static void printer_cups_add_ref_driver(rdpPrinterDriver* driver)
@ -407,6 +407,7 @@ static void printer_cups_release_ref_driver(rdpPrinterDriver* driver)
{ {
if (uniq_cups_driver == cups_driver) if (uniq_cups_driver == cups_driver)
uniq_cups_driver = NULL; uniq_cups_driver = NULL;
free(cups_driver->defaultPrinter);
free(cups_driver); free(cups_driver);
} }
else else
@ -430,6 +431,13 @@ rdpPrinterDriver* cups_freerdp_printer_client_subsystem_entry(void)
uniq_cups_driver->driver.ReleaseRef = printer_cups_release_ref_driver; uniq_cups_driver->driver.ReleaseRef = printer_cups_release_ref_driver;
uniq_cups_driver->id_sequence = 1; uniq_cups_driver->id_sequence = 1;
uniq_cups_driver->defaultPrinter = _strdup(cupsGetDefault());
if (!uniq_cups_driver->defaultPrinter)
{
free(uniq_cups_driver);
return NULL;
}
} }
WINPR_ASSERT(uniq_cups_driver->driver.AddRef); WINPR_ASSERT(uniq_cups_driver->driver.AddRef);

View File

@ -52,6 +52,7 @@ typedef struct
size_t id_sequence; size_t id_sequence;
size_t references; size_t references;
LPWSTR defaultPrinter;
} rdpWinPrinterDriver; } rdpWinPrinterDriver;
typedef struct typedef struct
@ -233,7 +234,7 @@ static void printer_win_release_ref_printer(rdpPrinter* printer)
} }
static rdpPrinter* printer_win_new_printer(rdpWinPrinterDriver* win_driver, const WCHAR* name, static rdpPrinter* printer_win_new_printer(rdpWinPrinterDriver* win_driver, const WCHAR* name,
const WCHAR* drivername, BOOL is_default) const WCHAR* drivername)
{ {
rdpWinPrinter* win_printer; rdpWinPrinter* win_printer;
DWORD needed = 0; DWORD needed = 0;
@ -251,7 +252,7 @@ static rdpPrinter* printer_win_new_printer(rdpWinPrinterDriver* win_driver, cons
if (!win_printer->printer.name) if (!win_printer->printer.name)
goto fail; goto fail;
win_printer->printer.is_default = is_default; win_printer->printer.is_default = _wcscmp(name, win_driver->defaultPrinter) == 0;
win_printer->printer.CreatePrintJob = printer_win_create_printjob; win_printer->printer.CreatePrintJob = printer_win_create_printjob;
win_printer->printer.FindPrintJob = printer_win_find_printjob; win_printer->printer.FindPrintJob = printer_win_find_printjob;
@ -345,7 +346,7 @@ static rdpPrinter** printer_win_enum_printers(rdpPrinterDriver* driver)
{ {
rdpPrinter* current = printers[num_printers]; rdpPrinter* current = printers[num_printers];
current = printer_win_new_printer((rdpWinPrinterDriver*)driver, prninfo[i].pPrinterName, current = printer_win_new_printer((rdpWinPrinterDriver*)driver, prninfo[i].pPrinterName,
prninfo[i].pDriverName, 0); prninfo[i].pDriverName);
if (!current) if (!current)
{ {
printer_win_release_enum_printers(printers); printer_win_release_enum_printers(printers);
@ -385,8 +386,7 @@ static rdpPrinter* printer_win_get_printer(rdpPrinterDriver* driver, const char*
return NULL; return NULL;
} }
myPrinter = printer_win_new_printer(win_driver, nameW, driverNameW, myPrinter = printer_win_new_printer(win_driver, nameW, driverNameW);
win_driver->id_sequence == 1 ? TRUE : FALSE);
free(driverNameW); free(driverNameW);
free(nameW); free(nameW);
@ -408,6 +408,7 @@ static void printer_win_release_ref_driver(rdpPrinterDriver* driver)
rdpWinPrinterDriver* win = (rdpWinPrinterDriver*)driver; rdpWinPrinterDriver* win = (rdpWinPrinterDriver*)driver;
if (win->references <= 1) if (win->references <= 1)
{ {
free(win->defaultPrinter);
free(win); free(win);
win_driver = NULL; win_driver = NULL;
} }
@ -417,6 +418,8 @@ static void printer_win_release_ref_driver(rdpPrinterDriver* driver)
rdpPrinterDriver* win_freerdp_printer_client_subsystem_entry(void) rdpPrinterDriver* win_freerdp_printer_client_subsystem_entry(void)
{ {
DWORD size;
if (!win_driver) if (!win_driver)
{ {
win_driver = (rdpWinPrinterDriver*)calloc(1, sizeof(rdpWinPrinterDriver)); win_driver = (rdpWinPrinterDriver*)calloc(1, sizeof(rdpWinPrinterDriver));
@ -432,6 +435,21 @@ rdpPrinterDriver* win_freerdp_printer_client_subsystem_entry(void)
win_driver->driver.ReleaseRef = printer_win_release_ref_driver; win_driver->driver.ReleaseRef = printer_win_release_ref_driver;
win_driver->id_sequence = 1; win_driver->id_sequence = 1;
GetDefaultPrinter(NULL, &size);
if (size)
{
win_driver->defaultPrinter = (LPWSTR)calloc(size, sizeof(WCHAR));
if (!win_driver->defaultPrinter)
{
free(win_driver);
return NULL;
}
if (!GetDefaultPrinter(win_driver->defaultPrinter, &size))
win_driver->defaultPrinter[0] = "\0";
}
} }
win_driver->driver.AddRef(&win_driver->driver); win_driver->driver.AddRef(&win_driver->driver);