Huw Davies : winspool: Simplify the code that checks for deleted printers and have it not call OpenPrinter unless it finds a printer that needs deletion .

Alexandre Julliard julliard at winehq.org
Thu Apr 19 13:27:53 CDT 2012


Module: wine
Branch: master
Commit: bd3a941b2059364b0e495f427c37dba1ced4e626
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=bd3a941b2059364b0e495f427c37dba1ced4e626

Author: Huw Davies <huw at codeweavers.com>
Date:   Thu Apr 19 13:43:25 2012 +0100

winspool: Simplify the code that checks for deleted printers and have it not call OpenPrinter unless it finds a printer that needs deletion.

---

 dlls/winspool.drv/info.c |  105 ++++++++++++++++++++++------------------------
 1 files changed, 50 insertions(+), 55 deletions(-)

diff --git a/dlls/winspool.drv/info.c b/dlls/winspool.drv/info.c
index 1e5aabc..a2e3f8b 100644
--- a/dlls/winspool.drv/info.c
+++ b/dlls/winspool.drv/info.c
@@ -1022,10 +1022,56 @@ static DWORD WINSPOOL_GetOpenedPrinterRegKey(HANDLE hPrinter, HKEY *phkey)
     return open_printer_reg_key( name, phkey );
 }
 
+static void old_printer_check( BOOL delete_phase )
+{
+    PRINTER_INFO_5W* pi;
+    DWORD needed, type, num, delete, i, size;
+    const DWORD one = 1;
+    HKEY key;
+    HANDLE hprn;
+
+    EnumPrintersW( PRINTER_ENUM_LOCAL, NULL, 5, NULL, 0, &needed, &num );
+    if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) return;
+
+    pi = HeapAlloc( GetProcessHeap(), 0, needed );
+    EnumPrintersW( PRINTER_ENUM_LOCAL, NULL, 5, (LPBYTE)pi, needed, &needed, &num );
+    for (i = 0; i < num; i++)
+    {
+        if (strncmpW( pi[i].pPortName, CUPS_Port, strlenW(CUPS_Port) ) &&
+            strncmpW( pi[i].pPortName, LPR_Port, strlenW(LPR_Port) ))
+            continue;
+
+        if (open_printer_reg_key( pi[i].pPrinterName, &key )) continue;
+
+        if (!delete_phase)
+        {
+            RegSetValueExW( key, May_Delete_Value, 0, REG_DWORD, (LPBYTE)&one, sizeof(one) );
+            RegCloseKey( key );
+        }
+        else
+        {
+            delete = 0;
+            size = sizeof( delete );
+            RegQueryValueExW( key, May_Delete_Value, NULL, &type, (LPBYTE)&delete, &size );
+            RegCloseKey( key );
+            if (delete)
+            {
+                TRACE( "Deleting old printer %s\n", debugstr_w(pi[i].pPrinterName) );
+                if (OpenPrinterW( pi[i].pPrinterName, &hprn, NULL ))
+                {
+                    DeletePrinter( hprn );
+                    ClosePrinter( hprn );
+                }
+                DeletePrinterDriverExW( NULL, NULL, pi[i].pPrinterName, 0, 0 );
+            }
+        }
+    }
+    HeapFree(GetProcessHeap(), 0, pi);
+}
+
 void WINSPOOL_LoadSystemPrinters(void)
 {
     HKEY                hkey, hkeyPrinters;
-    HANDLE              hprn;
     DWORD               needed, num, i;
     WCHAR               PrinterName[256];
     BOOL                done = FALSE;
@@ -1034,7 +1080,7 @@ void WINSPOOL_LoadSystemPrinters(void)
        problems later if they don't.  If one is found to be missed we create one
        and set it equal to the name of the key */
     if(RegCreateKeyW(HKEY_LOCAL_MACHINE, PrintersW, &hkeyPrinters) == ERROR_SUCCESS) {
-        if(RegQueryInfoKeyA(hkeyPrinters, NULL, NULL, NULL, &num, NULL, NULL,
+        if(RegQueryInfoKeyW(hkeyPrinters, NULL, NULL, NULL, &num, NULL, NULL,
                             NULL, NULL, NULL, NULL, NULL) == ERROR_SUCCESS) {
             for(i = 0; i < num; i++) {
                 if(RegEnumKeyW(hkeyPrinters, i, PrinterName, sizeof(PrinterName)/sizeof(PrinterName[0])) == ERROR_SUCCESS) {
@@ -1050,31 +1096,7 @@ void WINSPOOL_LoadSystemPrinters(void)
         RegCloseKey(hkeyPrinters);
     }
 
-    /* We want to avoid calling AddPrinter on printers as much as
-       possible, because on cups printers this will (eventually) lead
-       to a call to cupsGetPPD which takes forever, even with non-cups
-       printers AddPrinter takes a while.  So we'll tag all printers that
-       were automatically added last time around, if they still exist
-       we'll leave them be otherwise we'll delete them. */
-    if (EnumPrintersA(PRINTER_ENUM_LOCAL, NULL, 5, NULL, 0, &needed, &num) && needed) {
-        PRINTER_INFO_5A* pi = HeapAlloc(GetProcessHeap(), 0, needed);
-        if(EnumPrintersA(PRINTER_ENUM_LOCAL, NULL, 5, (LPBYTE)pi, needed, &needed, &num)) {
-            for(i = 0; i < num; i++) {
-                if(pi[i].pPortName == NULL || !strncmp(pi[i].pPortName,"CUPS:", 5) || !strncmp(pi[i].pPortName, "LPR:", 4)) {
-                    if(OpenPrinterA(pi[i].pPrinterName, &hprn, NULL)) {
-                        if(WINSPOOL_GetOpenedPrinterRegKey(hprn, &hkey) == ERROR_SUCCESS) {
-                            DWORD dw = 1;
-                            RegSetValueExW(hkey, May_Delete_Value, 0, REG_DWORD, (LPBYTE)&dw, sizeof(dw));
-                            RegCloseKey(hkey);
-                        }
-                        ClosePrinter(hprn);
-                    }
-                }
-            }
-        }
-        HeapFree(GetProcessHeap(), 0, pi);
-    }
-
+    old_printer_check( FALSE );
 
 #ifdef SONAME_LIBCUPS
     done = CUPS_LoadPrinters();
@@ -1083,36 +1105,9 @@ void WINSPOOL_LoadSystemPrinters(void)
     if(!done) /* If we have any CUPS based printers, skip looking for printcap printers */
         PRINTCAP_LoadPrinters();
 
-    /* Now enumerate the list again and delete any printers that are still tagged */
-    EnumPrintersA(PRINTER_ENUM_LOCAL, NULL, 5, NULL, 0, &needed, &num);
-    if(needed) {
-        PRINTER_INFO_5A* pi = HeapAlloc(GetProcessHeap(), 0, needed);
-        if(EnumPrintersA(PRINTER_ENUM_LOCAL, NULL, 5, (LPBYTE)pi, needed, &needed, &num)) {
-            for(i = 0; i < num; i++) {
-                if(pi[i].pPortName == NULL || !strncmp(pi[i].pPortName,"CUPS:", 5) || !strncmp(pi[i].pPortName, "LPR:", 4)) {
-                    if(OpenPrinterA(pi[i].pPrinterName, &hprn, NULL)) {
-                        BOOL delete_driver = FALSE;
-                        if(WINSPOOL_GetOpenedPrinterRegKey(hprn, &hkey) == ERROR_SUCCESS) {
-                            DWORD dw, type, size = sizeof(dw);
-                            if(RegQueryValueExW(hkey, May_Delete_Value, NULL, &type, (LPBYTE)&dw, &size) == ERROR_SUCCESS) {
-                                TRACE("Deleting old printer %s\n", pi[i].pPrinterName);
-                                DeletePrinter(hprn);
-                                delete_driver = TRUE;
-                            }
-                            RegCloseKey(hkey);
-                        }
-                        ClosePrinter(hprn);
-                        if(delete_driver)
-                            DeletePrinterDriverExA(NULL, NULL, pi[i].pPrinterName, 0, 0);
-                    }
-                }
-            }
-        }
-        HeapFree(GetProcessHeap(), 0, pi);
-    }
+    old_printer_check( TRUE );
 
     return;
-
 }
 
 /******************************************************************




More information about the wine-cvs mailing list