Huw Davies : winspool.drv: Associate a printer driver with each printer, rather than share a common one between all printers.

Alexandre Julliard julliard at wine.codeweavers.com
Wed Nov 8 06:42:44 CST 2006


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

Author: Huw Davies <huw at codeweavers.com>
Date:   Tue Nov  7 17:19:06 2006 +0000

winspool.drv: Associate a printer driver with each printer, rather than share a common one between all printers.

---

 dlls/winspool.drv/info.c |   70 +++++++++++++++++++++++++++-------------------
 1 files changed, 41 insertions(+), 29 deletions(-)

diff --git a/dlls/winspool.drv/info.c b/dlls/winspool.drv/info.c
index 8235fd7..cb2a818 100644
--- a/dlls/winspool.drv/info.c
+++ b/dlls/winspool.drv/info.c
@@ -365,6 +365,37 @@ WINSPOOL_SetDefaultPrinter(const char *d
     }
 }
 
+BOOL add_printer_driver(const char *name)
+{
+    DRIVER_INFO_3A di3a;
+
+    static char driver_path[]       = "wineps16",
+                data_file[]         = "<datafile?>",
+                config_file[]       = "wineps16",
+                help_file[]         = "<helpfile?>",
+                dep_file[]          = "<dependent files?>\0",
+                monitor_name[]      = "<monitor name?>",
+                default_data_type[] = "RAW";
+
+    di3a.cVersion = (GetVersion() & 0x80000000) ? 0 : 3; /* FIXME: add 1, 2 */
+    di3a.pName            = (char *)name;
+    di3a.pEnvironment     = NULL;      /* NULL means auto */
+    di3a.pDriverPath      = driver_path;
+    di3a.pDataFile        = data_file;
+    di3a.pConfigFile      = config_file;
+    di3a.pHelpFile        = help_file;
+    di3a.pDependentFiles  = dep_file;
+    di3a.pMonitorName     = monitor_name;
+    di3a.pDefaultDataType = default_data_type;
+
+    if (!AddPrinterDriverA(NULL, 3, (LPBYTE)&di3a))
+    {
+        ERR("Failed adding driver (%d)\n", GetLastError());
+        return FALSE;
+    }
+    return TRUE;
+}
+
 #ifdef HAVE_CUPS_CUPS_H
 static typeof(cupsGetDests)  *pcupsGetDests;
 static typeof(cupsGetPPD)    *pcupsGetPPD;
@@ -424,18 +455,19 @@ #undef DYNCUPS
         } else {
             static CHAR data_type[] = "RAW",
                     print_proc[]    = "WinPrint",
-                    driver_name[]   = "PS Driver",
                     comment[]       = "WINEPS Printer using CUPS",
                     location[]      = "<physical location of printer>",
                     params[]        = "<parameters?>",
                     share_name[]    = "<share name?>",
                     sep_file[]      = "<sep file?>";
 
+            add_printer_driver(dests[i].name);
+
             memset(&pinfo2a,0,sizeof(pinfo2a));
             pinfo2a.pPrinterName    = dests[i].name;
             pinfo2a.pDatatype       = data_type;
             pinfo2a.pPrintProcessor = print_proc;
-            pinfo2a.pDriverName     = driver_name;
+            pinfo2a.pDriverName     = dests[i].name;
             pinfo2a.pComment        = comment;
             pinfo2a.pLocation       = location;
             pinfo2a.pPortName       = port;
@@ -547,17 +579,18 @@ PRINTCAP_ParseEntry(const char *pent, BO
     } else {
         static CHAR data_type[]   = "RAW",
                     print_proc[]  = "WinPrint",
-                    driver_name[] = "PS Driver",
                     comment[]     = "WINEPS Printer using LPR",
                     params[]      = "<parameters?>",
                     share_name[]  = "<share name?>",
                     sep_file[]    = "<sep file?>";
 
+        add_printer_driver(devname);
+
         memset(&pinfo2a,0,sizeof(pinfo2a));
         pinfo2a.pPrinterName    = devname;
         pinfo2a.pDatatype       = data_type;
         pinfo2a.pPrintProcessor = print_proc;
-        pinfo2a.pDriverName     = driver_name;
+        pinfo2a.pDriverName     = devname;
         pinfo2a.pComment        = comment;
         pinfo2a.pLocation       = prettyname;
         pinfo2a.pPortName       = port;
@@ -645,35 +678,10 @@ static inline DWORD set_reg_szW(HKEY hke
 void WINSPOOL_LoadSystemPrinters(void)
 {
     HKEY                hkey, hkeyPrinters;
-    DRIVER_INFO_3A      di3a;
     HANDLE              hprn;
     DWORD               needed, num, i;
     WCHAR               PrinterName[256];
     BOOL                done = FALSE;
-    static CHAR         name[]              = "PS Driver",
-                        driver_path[]       = "wineps16",
-                        data_file[]         = "<datafile?>",
-                        config_file[]       = "wineps16",
-                        help_file[]         = "<helpfile?>",
-                        dep_file[]          = "<dependent files?>\0",
-                        monitor_name[]      = "<monitor name?>",
-                        default_data_type[] = "RAW";
-
-    di3a.cVersion = (GetVersion() & 0x80000000) ? 0 : 3; /* FIXME: add 1, 2 */
-    di3a.pName            = name;
-    di3a.pEnvironment     = NULL;      /* NULL means auto */
-    di3a.pDriverPath      = driver_path;
-    di3a.pDataFile        = data_file;
-    di3a.pConfigFile      = config_file;
-    di3a.pHelpFile        = help_file;
-    di3a.pDependentFiles  = dep_file;
-    di3a.pMonitorName     = monitor_name;
-    di3a.pDefaultDataType = default_data_type;
-
-    if (!AddPrinterDriverA(NULL,3,(LPBYTE)&di3a)) {
-	ERR("Failed adding PS Driver (%d)\n",GetLastError());
-        return;
-    }
 
     /* This ensures that all printer entries have a valid Name value.  If causes
        problems later if they don't.  If one is found to be missed we create one
@@ -744,15 +752,19 @@ #endif
             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);
                     }
                 }
             }




More information about the wine-cvs mailing list