Detlef Riekenberg : winspool: Use Unicode to add a driver entry for a unix printer.

Alexandre Julliard julliard at winehq.org
Mon Oct 18 13:36:55 CDT 2010


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

Author: Detlef Riekenberg <wine.dev at web.de>
Date:   Mon Oct 18 17:49:18 2010 +0200

winspool: Use Unicode to add a driver entry for a unix printer.

---

 dlls/winspool.drv/info.c |   66 +++++++++++++++++++++++----------------------
 1 files changed, 34 insertions(+), 32 deletions(-)

diff --git a/dlls/winspool.drv/info.c b/dlls/winspool.drv/info.c
index f757af6..0494584 100644
--- a/dlls/winspool.drv/info.c
+++ b/dlls/winspool.drv/info.c
@@ -167,9 +167,9 @@ static const WCHAR WinNT_CV_PrinterPortsW[] = { 'S','o','f','t','w','a','r','e',
                                                 'P','r','i','n','t','e','r','P','o','r','t','s',0};
 
 static const WCHAR DefaultEnvironmentW[] = {'W','i','n','e',0};
-static const WCHAR envname_win40W[] = {'W','i','n','d','o','w','s',' ','4','.','0',0};
+static       WCHAR envname_win40W[] = {'W','i','n','d','o','w','s',' ','4','.','0',0};
 static const WCHAR envname_x64W[] =   {'W','i','n','d','o','w','s',' ','x','6','4',0};
-static const WCHAR envname_x86W[] =   {'W','i','n','d','o','w','s',' ','N','T',' ','x','8','6',0};
+static       WCHAR envname_x86W[] =   {'W','i','n','d','o','w','s',' ','N','T',' ','x','8','6',0};
 static const WCHAR subdir_win40W[] = {'w','i','n','4','0',0};
 static const WCHAR subdir_x64W[] =   {'x','6','4',0};
 static const WCHAR subdir_x86W[] =   {'w','3','2','x','8','6',0};
@@ -212,7 +212,10 @@ static const WCHAR WinPrintW[] = {'W','i','n','P','r','i','n','t',0};
 static const WCHAR deviceW[]  = {'d','e','v','i','c','e',0};
 static const WCHAR devicesW[] = {'d','e','v','i','c','e','s',0};
 static const WCHAR windowsW[] = {'w','i','n','d','o','w','s',0};
-static const WCHAR driver_nt[] = {'w','i','n','e','p','s','.','d','r','v',0};
+static       WCHAR generic_ppdW[] = {'g','e','n','e','r','i','c','.','p','p','d',0};
+static       WCHAR rawW[] = {'R','A','W',0};
+static       WCHAR driver_9x[] = {'w','i','n','e','p','s','1','6','.','d','r','v',0};
+static       WCHAR driver_nt[] = {'w','i','n','e','p','s','.','d','r','v',0};
 static const WCHAR timeout_15_45[] = {',','1','5',',','4','5',0};
 static const WCHAR commaW[] = {',',0};
 static const WCHAR emptyStringW[] = {0};
@@ -380,41 +383,33 @@ WINSPOOL_SetDefaultPrinter(const char *devname, const char *name, BOOL force) {
     }
 }
 
-static BOOL add_printer_driver(const char *name)
+static BOOL add_printer_driver(WCHAR *name)
 {
-    DRIVER_INFO_3A di3a;
+    DRIVER_INFO_3W di3;
 
-    static char driver_9x[]         = "wineps16.drv",
-                driver_nt[]         = "wineps.drv",
-                env_9x[]            = "Windows 4.0",
-                env_nt[]            = "Windows NT x86",
-                data_file[]         = "generic.ppd",
-                default_data_type[] = "RAW";
+    ZeroMemory(&di3, sizeof(DRIVER_INFO_3W));
+    di3.cVersion         = 3;
+    di3.pName            = name;
+    di3.pEnvironment     = envname_x86W;
+    di3.pDriverPath      = driver_nt;
+    di3.pDataFile        = generic_ppdW;
+    di3.pConfigFile      = driver_nt;
+    di3.pDefaultDataType = rawW;
 
-    ZeroMemory(&di3a, sizeof(DRIVER_INFO_3A));
-    di3a.cVersion         = 3;
-    di3a.pName            = (char *)name;
-    di3a.pEnvironment     = env_nt;
-    di3a.pDriverPath      = driver_nt;
-    di3a.pDataFile        = data_file;
-    di3a.pConfigFile      = driver_nt;
-    di3a.pDefaultDataType = default_data_type;
-
-    if (AddPrinterDriverA(NULL, 3, (LPBYTE)&di3a) ||
+    if (AddPrinterDriverW(NULL, 3, (LPBYTE)&di3) ||
         (GetLastError() ==  ERROR_PRINTER_DRIVER_ALREADY_INSTALLED ))
     {
-        di3a.cVersion     = 0;
-        di3a.pEnvironment = env_9x;
-        di3a.pDriverPath  = driver_9x;
-        di3a.pConfigFile  = driver_9x;
-        if (AddPrinterDriverA(NULL, 3, (LPBYTE)&di3a) ||
+        di3.cVersion     = 0;
+        di3.pEnvironment = envname_win40W;
+        di3.pDriverPath  = driver_9x;
+        di3.pConfigFile  = driver_9x;
+        if (AddPrinterDriverW(NULL, 3, (LPBYTE)&di3) ||
             (GetLastError() ==  ERROR_PRINTER_DRIVER_ALREADY_INSTALLED ))
         {
             return TRUE;
         }
     }
-    ERR("Failed adding driver %s (%s): %u\n", debugstr_a(di3a.pDriverPath),
-        debugstr_a(di3a.pEnvironment), GetLastError());
+    ERR("failed with %u for %s (%s)\n", GetLastError(), debugstr_w(di3.pDriverPath), debugstr_w(di3.pEnvironment));
     return FALSE;
 }
 
@@ -434,6 +429,7 @@ static BOOL CUPS_LoadPrinters(void)
     char *port;
     HKEY hkeyPrinter, hkeyPrinters;
     char    loaderror[256];
+    WCHAR   nameW[MAX_PATH];
 
     cupshandle = wine_dlopen(SONAME_LIBCUPS, RTLD_NOW, loaderror, sizeof(loaderror));
     if (!cupshandle) {
@@ -461,6 +457,8 @@ static BOOL CUPS_LoadPrinters(void)
     nrofdests = pcupsGetDests(&dests);
     TRACE("Found %d CUPS %s:\n", nrofdests, (nrofdests == 1) ? "printer" : "printers");
     for (i=0;i<nrofdests;i++) {
+        MultiByteToWideChar(CP_ACP, 0, dests[i].name, -1, nameW, sizeof(nameW) / sizeof(WCHAR));
+
         port = HeapAlloc(GetProcessHeap(), 0, strlen("CUPS:") + strlen(dests[i].name)+1);
         sprintf(port,"CUPS:%s", dests[i].name);
 
@@ -481,7 +479,7 @@ static BOOL CUPS_LoadPrinters(void)
                     share_name[]    = "<share name?>",
                     sep_file[]      = "<sep file?>";
 
-            add_printer_driver(dests[i].name);
+            add_printer_driver(nameW);
 
             memset(&pinfo2a,0,sizeof(pinfo2a));
             pinfo2a.pPrinterName    = dests[i].name;
@@ -523,6 +521,7 @@ PRINTCAP_ParseEntry(const char *pent, BOOL isfirst) {
     BOOL		ret = FALSE, set_default = FALSE;
     char *port = NULL, *env_default;
     HKEY hkeyPrinter, hkeyPrinters;
+    WCHAR devnameW[MAX_PATH];
 
     while (isspace(*pent)) pent++;
     s = strchr(pent,':');
@@ -586,6 +585,9 @@ PRINTCAP_ParseEntry(const char *pent, BOOL isfirst) {
 	ret = FALSE;
         goto end;
     }
+
+    MultiByteToWideChar(CP_ACP, 0, devname, -1, devnameW, sizeof(devnameW) / sizeof(WCHAR));
+
     if(RegOpenKeyA(hkeyPrinters, devname, &hkeyPrinter) == ERROR_SUCCESS) {
         /* Printer already in registry, delete the tag added in WINSPOOL_LoadSystemPrinters
            and continue */
@@ -600,7 +602,7 @@ PRINTCAP_ParseEntry(const char *pent, BOOL isfirst) {
                     share_name[]  = "<share name?>",
                     sep_file[]    = "<sep file?>";
 
-        add_printer_driver(devname);
+        add_printer_driver(devnameW);
 
         memset(&pinfo2a,0,sizeof(pinfo2a));
         pinfo2a.pPrinterName    = devname;




More information about the wine-cvs mailing list