[PATCH 1/3] winspool: Set devices and printerports in AddPrinterW [resend]
Detlef Riekenberg
wine.dev at web.de
Mon Oct 18 10:49:17 CDT 2010
This patchset fixes BUG 6437
--
By by -... Detlef
---
dlls/winspool.drv/info.c | 88 +++++++++++++++++++++++++--------------------
1 files changed, 49 insertions(+), 39 deletions(-)
diff --git a/dlls/winspool.drv/info.c b/dlls/winspool.drv/info.c
index 135f8a3..f757af6 100644
--- a/dlls/winspool.drv/info.c
+++ b/dlls/winspool.drv/info.c
@@ -212,6 +212,9 @@ 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 const WCHAR timeout_15_45[] = {',','1','5',',','4','5',0};
+static const WCHAR commaW[] = {',',0};
static const WCHAR emptyStringW[] = {0};
static const WCHAR May_Delete_Value[] = {'W','i','n','e','M','a','y','D','e','l','e','t','e','M','e',0};
@@ -428,8 +431,8 @@ static BOOL CUPS_LoadPrinters(void)
BOOL hadprinter = FALSE, haddefault = FALSE;
cups_dest_t *dests;
PRINTER_INFO_2A pinfo2a;
- char *port,*devline;
- HKEY hkeyPrinter, hkeyPrinters, hkey;
+ char *port;
+ HKEY hkeyPrinter, hkeyPrinters;
char loaderror[256];
cupshandle = wine_dlopen(SONAME_LIBCUPS, RTLD_NOW, loaderror, sizeof(loaderror));
@@ -460,23 +463,6 @@ static BOOL CUPS_LoadPrinters(void)
for (i=0;i<nrofdests;i++) {
port = HeapAlloc(GetProcessHeap(), 0, strlen("CUPS:") + strlen(dests[i].name)+1);
sprintf(port,"CUPS:%s", dests[i].name);
- /* FIXME: remove extension. Fix gdi32/drivers and comdlg32/printdlg first */
- devline = HeapAlloc(GetProcessHeap(), 0, sizeof("WINEPS.DRV,,15,45") + strlen(port));
- sprintf(devline, "WINEPS.DRV,%s", port);
- WriteProfileStringA("devices", dests[i].name, devline);
- if(RegCreateKeyW(HKEY_CURRENT_USER, user_printers_reg_key, &hkey) == ERROR_SUCCESS) {
- RegSetValueExA(hkey, dests[i].name, 0, REG_SZ, (LPBYTE)devline, strlen(devline) + 1);
- RegCloseKey(hkey);
- }
-
- lstrcatA(devline, ",15,45");
- WriteProfileStringA("PrinterPorts", dests[i].name, devline);
- if(RegCreateKeyW(HKEY_CURRENT_USER, WinNT_CV_PrinterPortsW, &hkey) == ERROR_SUCCESS) {
- RegSetValueExA(hkey, dests[i].name, 0, REG_SZ, (LPBYTE)devline, strlen(devline) + 1);
- RegCloseKey(hkey);
- }
-
- HeapFree(GetProcessHeap(), 0, devline);
TRACE("Printer %d: %s\n", i, dests[i].name);
if(RegOpenKeyA(hkeyPrinters, dests[i].name, &hkeyPrinter) == ERROR_SUCCESS) {
@@ -535,8 +521,8 @@ PRINTCAP_ParseEntry(const char *pent, BOOL isfirst) {
PRINTER_INFO_2A pinfo2a;
char *e,*s,*name,*prettyname,*devname;
BOOL ret = FALSE, set_default = FALSE;
- char *port = NULL, *devline,*env_default;
- HKEY hkeyPrinter, hkeyPrinters, hkey;
+ char *port = NULL, *env_default;
+ HKEY hkeyPrinter, hkeyPrinters;
while (isspace(*pent)) pent++;
s = strchr(pent,':');
@@ -594,24 +580,6 @@ PRINTCAP_ParseEntry(const char *pent, BOOL isfirst) {
port = HeapAlloc(GetProcessHeap(),0,strlen("LPR:")+strlen(name)+1);
sprintf(port,"LPR:%s",name);
- /* FIXME: remove extension. Fix gdi32/drivers and comdlg32/printdlg first */
- devline = HeapAlloc(GetProcessHeap(), 0, sizeof("WINEPS.DRV,,15,45") + strlen(port));
- sprintf(devline, "WINEPS.DRV,%s", port);
- WriteProfileStringA("devices", devname, devline);
- if(RegCreateKeyW(HKEY_CURRENT_USER, user_printers_reg_key, &hkey) == ERROR_SUCCESS) {
- RegSetValueExA(hkey, devname, 0, REG_SZ, (LPBYTE)devline, strlen(devline) + 1);
- RegCloseKey(hkey);
- }
-
- lstrcatA(devline, ",15,45");
- WriteProfileStringA("PrinterPorts", devname, devline);
- if(RegCreateKeyW(HKEY_CURRENT_USER, WinNT_CV_PrinterPortsW, &hkey) == ERROR_SUCCESS) {
- RegSetValueExA(hkey, devname, 0, REG_SZ, (LPBYTE)devline, strlen(devline) + 1);
- RegCloseKey(hkey);
- }
-
- HeapFree(GetProcessHeap(),0,devline);
-
if(RegCreateKeyW(HKEY_LOCAL_MACHINE, PrintersW, &hkeyPrinters) !=
ERROR_SUCCESS) {
ERR("Can't create Printers key\n");
@@ -2438,6 +2406,46 @@ static HKEY WINSPOOL_OpenDriverReg( LPCVOID pEnvironment)
}
/*****************************************************************************
+ * set_devices_and_printerports [internal]
+ *
+ * set the [Devices] and [PrinterPorts] entries for a printer.
+ *
+ */
+static void set_devices_and_printerports(PRINTER_INFO_2W *pi)
+{
+ DWORD portlen = lstrlenW(pi->pPortName) * sizeof(WCHAR);
+ WCHAR *devline;
+ HKEY hkey;
+
+ TRACE("(%p) %s\n", pi, debugstr_w(pi->pPrinterName));
+
+ /* FIXME: the driver must change to "winspool" */
+ devline = HeapAlloc(GetProcessHeap(), 0, sizeof(driver_nt) + portlen + sizeof(timeout_15_45));
+ if (devline) {
+ lstrcpyW(devline, driver_nt);
+ lstrcatW(devline, commaW);
+ lstrcatW(devline, pi->pPortName);
+
+ TRACE("using %s\n", debugstr_w(devline));
+ WriteProfileStringW(devicesW, pi->pPrinterName, devline);
+ if (!RegCreateKeyW(HKEY_CURRENT_USER, user_printers_reg_key, &hkey)) {
+ RegSetValueExW(hkey, pi->pPrinterName, 0, REG_SZ, (LPBYTE)devline,
+ (lstrlenW(devline) + 1) * sizeof(WCHAR));
+ RegCloseKey(hkey);
+ }
+
+ lstrcatW(devline, timeout_15_45);
+ WriteProfileStringW(PrinterPortsW, pi->pPrinterName, devline);
+ if (!RegCreateKeyW(HKEY_CURRENT_USER, WinNT_CV_PrinterPortsW, &hkey)) {
+ RegSetValueExW(hkey, pi->pPrinterName, 0, REG_SZ, (LPBYTE)devline,
+ (lstrlenW(devline) + 1) * sizeof(WCHAR));
+ RegCloseKey(hkey);
+ }
+ HeapFree(GetProcessHeap(), 0, devline);
+ }
+}
+
+/*****************************************************************************
* AddPrinterW [WINSPOOL.@]
*/
HANDLE WINAPI AddPrinterW(LPWSTR pName, DWORD Level, LPBYTE pPrinter)
@@ -2516,6 +2524,8 @@ HANDLE WINAPI AddPrinterW(LPWSTR pName, DWORD Level, LPBYTE pPrinter)
RegCloseKey(hkeyPrinters);
return 0;
}
+
+ set_devices_and_printerports(pi);
RegSetValueExW(hkeyPrinter, attributesW, 0, REG_DWORD,
(LPBYTE)&pi->Attributes, sizeof(DWORD));
set_reg_szW(hkeyPrinter, DatatypeW, pi->pDatatype);
--
1.7.1
More information about the wine-patches
mailing list