[PATCH 3/3] winspool: Use UNICODE for CUPS printer names [fixes bug 6437]
Detlef Riekenberg
wine.dev at web.de
Sun Oct 17 16:37:12 CDT 2010
Now CP_UNIXCP is used, when we get the printer names from CUPS
in CUPS_LoadPrinters and when we print to CUPS in schedule_cups
The casts are there to avoid warnings for discard "const",
or do we have to remove all related "const" from the strings?
--
By by ... Detlef
---
dlls/winspool.drv/info.c | 63 ++++++++++++++++++++++-----------------------
1 files changed, 31 insertions(+), 32 deletions(-)
diff --git a/dlls/winspool.drv/info.c b/dlls/winspool.drv/info.c
index 191f430..76046b8 100644
--- a/dlls/winspool.drv/info.c
+++ b/dlls/winspool.drv/info.c
@@ -425,8 +425,8 @@ static BOOL CUPS_LoadPrinters(void)
int i, nrofdests;
BOOL hadprinter = FALSE, haddefault = FALSE;
cups_dest_t *dests;
- PRINTER_INFO_2A pinfo2a;
- char *port;
+ PRINTER_INFO_2W pi2;
+ WCHAR *port;
HKEY hkeyPrinter, hkeyPrinters;
char loaderror[256];
WCHAR nameW[MAX_PATH];
@@ -457,57 +457,56 @@ 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));
+ MultiByteToWideChar(CP_UNIXCP, 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);
+ port = HeapAlloc(GetProcessHeap(), 0, sizeof(CUPS_Port) + lstrlenW(nameW) * sizeof(WCHAR));
+ lstrcpyW(port, CUPS_Port);
+ lstrcatW(port, nameW);
- TRACE("Printer %d: %s\n", i, dests[i].name);
- if(RegOpenKeyA(hkeyPrinters, dests[i].name, &hkeyPrinter) == ERROR_SUCCESS) {
+ TRACE("Printer %d: %s\n", i, debugstr_w(nameW));
+ if(RegOpenKeyW(hkeyPrinters, nameW, &hkeyPrinter) == ERROR_SUCCESS) {
/* Printer already in registry, delete the tag added in WINSPOOL_LoadSystemPrinters
and continue */
TRACE("Printer already exists\n");
- RegSetValueExA(hkeyPrinter, "Port", 0, REG_SZ, (LPBYTE)port, strlen(port) + 1); /* overwrite LPR:* port */
+ /* overwrite old LPR:* port */
+ RegSetValueExW(hkeyPrinter, PortW, 0, REG_SZ, (LPBYTE)port, (lstrlenW(port) + 1) * sizeof(WCHAR));
RegDeleteValueW(hkeyPrinter, May_Delete_Value);
RegCloseKey(hkeyPrinter);
} else {
- static CHAR data_type[] = "RAW",
- print_proc[] = "WinPrint",
- comment[] = "WINEPS Printer using CUPS",
- location[] = "<physical location of printer>",
- params[] = "<parameters?>",
- share_name[] = "<share name?>",
- sep_file[] = "<sep file?>";
+ static WCHAR comment_cups[] = {'W','I','N','E','P','S',' ','P','r','i','n','t','e','r',
+ ' ','u','s','i','n','g',' ','C','U','P','S',0};
add_printer_driver(nameW);
- memset(&pinfo2a,0,sizeof(pinfo2a));
- pinfo2a.pPrinterName = dests[i].name;
- pinfo2a.pDatatype = data_type;
- pinfo2a.pPrintProcessor = print_proc;
- pinfo2a.pDriverName = dests[i].name;
- pinfo2a.pComment = comment;
- pinfo2a.pLocation = location;
- pinfo2a.pPortName = port;
- pinfo2a.pParameters = params;
- pinfo2a.pShareName = share_name;
- pinfo2a.pSepFile = sep_file;
-
- if (!AddPrinterA(NULL,2,(LPBYTE)&pinfo2a)) {
+ memset(&pi2, 0, sizeof(PRINTER_INFO_2W));
+ pi2.pPrinterName = nameW;
+ pi2.pDatatype = (WCHAR *)rawW;
+ pi2.pPrintProcessor = (WCHAR *)WinPrintW;
+ pi2.pDriverName = nameW;
+ pi2.pComment = comment_cups;
+ pi2.pLocation = (WCHAR *)emptyStringW;
+ pi2.pPortName = port;
+ pi2.pParameters = (WCHAR *)emptyStringW;
+ pi2.pShareName = (WCHAR *)emptyStringW;
+ pi2.pSepFile = (WCHAR *)emptyStringW;
+
+ if (!AddPrinterW(NULL, 2, (LPBYTE)&pi2)) {
if (GetLastError() != ERROR_PRINTER_ALREADY_EXISTS)
- ERR("printer '%s' not added by AddPrinterA (error %d)\n",dests[i].name,GetLastError());
+ ERR("printer '%s' not added by AddPrinter (error %d)\n", debugstr_w(nameW), GetLastError());
}
}
HeapFree(GetProcessHeap(),0,port);
hadprinter = TRUE;
if (dests[i].is_default) {
- SetDefaultPrinterA(dests[i].name);
+ SetDefaultPrinterW(nameW);
haddefault = TRUE;
}
}
- if (hadprinter & !haddefault)
- SetDefaultPrinterA(dests[0].name);
+ if (hadprinter & !haddefault) {
+ MultiByteToWideChar(CP_UNIXCP, 0, dests[0].name, -1, nameW, sizeof(nameW) / sizeof(WCHAR));
+ SetDefaultPrinterW(nameW);
+ }
pcupsFreeDests(nrofdests, dests);
RegCloseKey(hkeyPrinters);
return hadprinter;
--
1.7.1
More information about the wine-patches
mailing list