Huw Davies : winspool: Call the ppd retrieval function from add_printer_driver().

Alexandre Julliard julliard at winehq.org
Tue Oct 26 16:19:19 CDT 2021


Module: wine
Branch: master
Commit: 9d8bf3bf9678cbcd20e26c6ae94dd1d0af2c054f
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=9d8bf3bf9678cbcd20e26c6ae94dd1d0af2c054f

Author: Huw Davies <huw at codeweavers.com>
Date:   Tue Oct 26 11:18:09 2021 +0100

winspool: Call the ppd retrieval function from add_printer_driver().

Signed-off-by: Huw Davies <huw at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/winspool.drv/info.c | 197 ++++++++++++++++++-----------------------------
 1 file changed, 77 insertions(+), 120 deletions(-)

diff --git a/dlls/winspool.drv/info.c b/dlls/winspool.drv/info.c
index badde6ea5ae..9d2af8cec94 100644
--- a/dlls/winspool.drv/info.c
+++ b/dlls/winspool.drv/info.c
@@ -750,43 +750,6 @@ static DWORD WINSPOOL_GetOpenedPrinterRegKey(HANDLE hPrinter, HKEY *phkey)
     return open_printer_reg_key( name, phkey );
 }
 
-static BOOL add_printer_driver(const WCHAR *name, WCHAR *ppd)
-{
-    DRIVER_INFO_3W di3;
-    unsigned int i;
-    BOOL res;
-
-    ZeroMemory(&di3, sizeof(DRIVER_INFO_3W));
-    di3.cVersion         = 3;
-    di3.pName            = (WCHAR*)name;
-    di3.pDriverPath      = driver_nt;
-    di3.pDataFile        = ppd;
-    di3.pConfigFile      = driver_nt;
-    di3.pDefaultDataType = rawW;
-
-    for (i = 0; i < ARRAY_SIZE(all_printenv); i++)
-    {
-        di3.pEnvironment = (WCHAR *) all_printenv[i]->envname;
-        if (all_printenv[i]->envname == envname_win40W)
-        {
-            /* We use wineps16.drv as driver for 16 bit */
-            di3.pDriverPath      = driver_9x;
-            di3.pConfigFile      = driver_9x;
-        }
-        res = AddPrinterDriverExW( NULL, 3, (LPBYTE)&di3, APD_COPY_NEW_FILES | APD_COPY_FROM_DIRECTORY );
-        TRACE("got %d and %d for %s (%s)\n", res, GetLastError(), debugstr_w(name), debugstr_w(di3.pEnvironment));
-
-        if (!res && (GetLastError() != ERROR_PRINTER_DRIVER_ALREADY_INSTALLED))
-        {
-            ERR("failed with %u for %s (%s) %s\n", GetLastError(), debugstr_w(name),
-                debugstr_w(di3.pEnvironment), debugstr_w(di3.pDriverPath));
-                return FALSE;
-        }
-    }
-
-    return TRUE;
-}
-
 static BOOL copy_file( const char *src, const char *dst )
 {
     int fds[2] = {-1, -1}, num;
@@ -852,6 +815,69 @@ static WCHAR *get_ppd_filename( const WCHAR *dir, const WCHAR *file_name )
     return ppd;
 }
 
+static char *get_dest_name( const WCHAR *printer )
+{
+    int len = WideCharToMultiByte( CP_UNIXCP, 0, printer, -1, NULL, 0, NULL, NULL );
+    char *dest = heap_alloc( len );
+
+    if (dest) WideCharToMultiByte( CP_UNIXCP, 0, printer, -1, dest, len, NULL, NULL );
+    return dest;
+}
+
+static BOOL get_cups_ppd( const char *printer_name, const WCHAR *ppd );
+static void unlink_ppd( const WCHAR *ppd );
+
+static BOOL add_printer_driver( const WCHAR *name, const WCHAR *ppd_dir )
+{
+    WCHAR *ppd = get_ppd_filename( ppd_dir, name );
+    char *dest_name;
+    DRIVER_INFO_3W di3;
+    unsigned int i;
+    BOOL res = FALSE;
+
+    if (!ppd) return FALSE;
+    dest_name = get_dest_name( name );
+    if (!dest_name) goto end;
+
+    res = get_cups_ppd( dest_name, ppd ) || get_internal_fallback_ppd( ppd );
+    if (!res) goto end;
+
+    memset( &di3, 0, sizeof(DRIVER_INFO_3W) );
+    di3.cVersion         = 3;
+    di3.pName            = (WCHAR *)name;
+    di3.pDriverPath      = driver_nt;
+    di3.pDataFile        = ppd;
+    di3.pConfigFile      = driver_nt;
+    di3.pDefaultDataType = rawW;
+
+    for (i = 0; i < ARRAY_SIZE(all_printenv); i++)
+    {
+        di3.pEnvironment = (WCHAR *)all_printenv[i]->envname;
+        if (all_printenv[i]->envname == envname_win40W)
+        {
+            /* We use wineps16.drv as driver for 16 bit */
+            di3.pDriverPath = driver_9x;
+            di3.pConfigFile = driver_9x;
+        }
+        res = AddPrinterDriverExW( NULL, 3, (BYTE *)&di3, APD_COPY_NEW_FILES | APD_COPY_FROM_DIRECTORY );
+        TRACE( "got %d and %d for %s (%s)\n", res, GetLastError(), debugstr_w( name ), debugstr_w( di3.pEnvironment ) );
+
+        if (!res && (GetLastError() != ERROR_PRINTER_DRIVER_ALREADY_INSTALLED))
+        {
+            ERR( "failed with %u for %s (%s) %s\n", GetLastError(), debugstr_w( name ),
+                 debugstr_w( di3.pEnvironment ), debugstr_w( di3.pDriverPath ) );
+            break;
+        }
+        res = TRUE;
+    }
+    unlink_ppd( ppd );
+
+end:
+    heap_free( dest_name );
+    heap_free( ppd );
+    return res;
+}
+
 static WCHAR *get_ppd_dir( void )
 {
     static const WCHAR wine_ppds[] = {'w','i','n','e','_','p','p','d','s','\\',0};
@@ -953,11 +979,7 @@ static BOOL get_cups_ppd( const char *printer_name, const WCHAR *ppd )
     if (http_status != HTTP_OK) unlink( unix_name );
     HeapFree( GetProcessHeap(), 0, unix_name );
 
-    if (http_status == HTTP_OK) return TRUE;
-
-    TRACE( "failed to get ppd for printer %s from cups (status %d), calling fallback\n",
-           debugstr_a(printer_name), http_status );
-    return get_internal_fallback_ppd( ppd );
+    return http_status == HTTP_OK;
 }
 
 static WCHAR *get_cups_option( const char *name, int num_options, cups_option_t *options )
@@ -996,7 +1018,7 @@ static BOOL CUPS_LoadPrinters(void)
     BOOL                  hadprinter = FALSE, haddefault = FALSE;
     cups_dest_t          *dests;
     PRINTER_INFO_2W       pi2;
-    WCHAR *port, *ppd_dir = NULL, *ppd;
+    WCHAR *port, *ppd_dir = NULL;
     HKEY hkeyPrinter, hkeyPrinters;
     WCHAR   nameW[MAX_PATH];
     HANDLE  added_printer;
@@ -1024,7 +1046,8 @@ static BOOL CUPS_LoadPrinters(void)
             continue;
         }
 
-        if(RegOpenKeyW(hkeyPrinters, nameW, &hkeyPrinter) == ERROR_SUCCESS) {
+        if (RegOpenKeyW( hkeyPrinters, nameW, &hkeyPrinter ) == ERROR_SUCCESS)
+        {
             DWORD status = get_dword_from_reg( hkeyPrinter, StatusW );
             /* Printer already in registry, delete the tag added in WINSPOOL_LoadSystemPrinters
                and continue */
@@ -1033,19 +1056,11 @@ static BOOL CUPS_LoadPrinters(void)
             /* flag that the PPD file should be checked for an update */
             set_reg_DWORD( hkeyPrinter, StatusW, status | PRINTER_STATUS_DRIVER_UPDATE_NEEDED );
             RegCloseKey(hkeyPrinter);
-        } else {
-            BOOL added_driver = FALSE;
-
+        }
+        else
+        {
             if (!ppd_dir && !(ppd_dir = get_ppd_dir())) break;
-
-            ppd = get_ppd_filename( ppd_dir, nameW );
-            if (get_cups_ppd( dests[i].name, ppd ))
-            {
-                added_driver = add_printer_driver( nameW, ppd );
-                unlink_ppd( ppd );
-            }
-            HeapFree( GetProcessHeap(), 0, ppd );
-            if (!added_driver) continue;
+            if (!add_printer_driver( nameW, ppd_dir )) continue;
 
             port = heap_alloc( sizeof(CUPS_Port) + lstrlenW( nameW ) * sizeof(WCHAR) );
             lstrcpyW( port, CUPS_Port );
@@ -1097,43 +1112,6 @@ static BOOL CUPS_LoadPrinters(void)
 
 #endif
 
-static char *get_queue_name( HANDLE printer, BOOL *cups )
-{
-    WCHAR *port, *name = NULL;
-    DWORD err, needed, type;
-    char *ret = NULL;
-    HKEY key;
-
-    *cups = FALSE;
-
-    err = WINSPOOL_GetOpenedPrinterRegKey( printer, &key );
-    if (err) return NULL;
-    err = RegQueryValueExW( key, PortW, 0, &type, NULL, &needed );
-    if (err) goto end;
-    port = HeapAlloc( GetProcessHeap(), 0, needed );
-    if (!port) goto end;
-    RegQueryValueExW( key, PortW, 0, &type, (BYTE*)port, &needed );
-
-    if (!strncmpW( port, CUPS_Port, ARRAY_SIZE( CUPS_Port ) -1 ))
-    {
-        name = port + ARRAY_SIZE( CUPS_Port ) - 1;
-        *cups = TRUE;
-    }
-    else if (!strncmpW( port, LPR_Port, ARRAY_SIZE( LPR_Port ) -1 ))
-        name = port + ARRAY_SIZE( LPR_Port ) - 1;
-    if (name)
-    {
-        needed = WideCharToMultiByte( CP_UNIXCP, 0, name, -1, NULL, 0, NULL, NULL );
-        ret = HeapAlloc( GetProcessHeap(), 0, needed );
-        if(ret) WideCharToMultiByte( CP_UNIXCP, 0, name, -1, ret, needed, NULL, NULL );
-    }
-    HeapFree( GetProcessHeap(), 0, port );
-end:
-    RegCloseKey( key );
-    return ret;
-}
-
-
 static void set_ppd_overrides( HANDLE printer )
 {
     WCHAR *wstr = NULL;
@@ -1180,38 +1158,17 @@ end:
 
 static BOOL update_driver( HANDLE printer )
 {
-    BOOL ret, is_cups;
+    BOOL ret;
     const WCHAR *name = get_opened_printer_name( printer );
-    WCHAR *ppd_dir, *ppd;
-    char *queue_name;
+    WCHAR *ppd_dir;
 
     if (!name) return FALSE;
-    queue_name = get_queue_name( printer, &is_cups );
-    if (!queue_name) return FALSE;
-
-    if (!(ppd_dir = get_ppd_dir()))
-    {
-        HeapFree( GetProcessHeap(), 0, queue_name );
-        return FALSE;
-    }
-    ppd = get_ppd_filename( ppd_dir, name );
+    if (!(ppd_dir = get_ppd_dir())) return FALSE;
 
-#ifdef SONAME_LIBCUPS
-    if (is_cups)
-        ret = get_cups_ppd( queue_name, ppd );
-    else
-#endif
-        ret = get_internal_fallback_ppd( ppd );
+    TRACE( "updating driver %s\n", debugstr_w( name ) );
+    ret = add_printer_driver( name, ppd_dir );
 
-    if (ret)
-    {
-        TRACE( "updating driver %s\n", debugstr_w( name ) );
-        ret = add_printer_driver( name, ppd );
-        unlink_ppd( ppd );
-    }
-    HeapFree( GetProcessHeap(), 0, ppd_dir );
-    HeapFree( GetProcessHeap(), 0, ppd );
-    HeapFree( GetProcessHeap(), 0, queue_name );
+    heap_free( ppd_dir );
 
     set_ppd_overrides( printer );
 




More information about the wine-cvs mailing list