Module: wine Branch: master Commit: da4d55db4b8c667090f95bd657d97fa4b16622f9 URL: https://gitlab.winehq.org/wine/wine/-/commit/da4d55db4b8c667090f95bd657d97fa...
Author: Piotr Caban piotr@codeweavers.com Date: Thu Dec 1 16:05:15 2022 +0100
localspl: Use separate structure to store printserver handles.
---
dlls/localspl/provider.c | 41 ++++++++++++++++++++++++++++++----------- 1 file changed, 30 insertions(+), 11 deletions(-)
diff --git a/dlls/localspl/provider.c b/dlls/localspl/provider.c index f1303508d80..236cf7aaf6e 100644 --- a/dlls/localspl/provider.c +++ b/dlls/localspl/provider.c @@ -248,6 +248,8 @@ typedef struct { } type; } handle_header_t;
+typedef handle_header_t server_t; + typedef struct { handle_header_t header; monitor_t *pm; @@ -1536,6 +1538,24 @@ static HMODULE driver_load(const printenv_t * env, LPWSTR dllname) return hui; }
+static HANDLE server_alloc_handle(const WCHAR *name, BOOL *stop_search) +{ + server_t *server; + + *stop_search = FALSE; + if (name) + return NULL; + + server = malloc(sizeof(*server)); + if (!server) + { + *stop_search = TRUE; + return NULL; + } + server->type = HANDLE_SERVER; + return (HANDLE)server; +} + static HANDLE xcv_alloc_handle(const WCHAR *name, PRINTER_DEFAULTSW *def, BOOL *stop_search) { static const WCHAR xcv_monitor[] = L"XcvMonitor "; @@ -1544,7 +1564,7 @@ static HANDLE xcv_alloc_handle(const WCHAR *name, PRINTER_DEFAULTSW *def, BOOL * xcv_t *xcv;
*stop_search = FALSE; - if (!name || name[0] != ',') + if (name[0] != ',') return NULL;
name++; @@ -1613,13 +1633,6 @@ static HANDLE printer_alloc_handle(const WCHAR *name, const WCHAR *basename, return NULL; }
- if (!basename) - { - TRACE("using the local printserver\n"); - printer->header.type = HANDLE_SERVER; - return (HANDLE)printer; - } - printer->info = get_printer_info(basename); if (!printer->info) { @@ -2646,7 +2659,9 @@ static BOOL WINAPI fpOpenPrinter(WCHAR *name, HANDLE *hprinter, return FALSE; }
- *hprinter = xcv_alloc_handle(basename, def, &stop_search); + *hprinter = server_alloc_handle(basename, &stop_search); + if (!*hprinter && !stop_search) + *hprinter = xcv_alloc_handle(basename, def, &stop_search); if (!*hprinter && !stop_search) *hprinter = printer_alloc_handle(name, basename, def);
@@ -3417,7 +3432,11 @@ static BOOL WINAPI fpClosePrinter(HANDLE hprinter) if (!header) return FALSE;
- if (header->type == HANDLE_XCV) + if (header->type == HANDLE_SERVER) + { + free(header); + } + else if (header->type == HANDLE_XCV) { xcv_t *xcv = (xcv_t *)hprinter;
@@ -3427,7 +3446,7 @@ static BOOL WINAPI fpClosePrinter(HANDLE hprinter) monitor_unload(xcv->pm); free(xcv); } - else if (header->type == HANDLE_SERVER || header->type == HANDLE_PRINTER) + else if (header->type == HANDLE_PRINTER) { printer_t *printer = (printer_t *)hprinter;