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