Detlef Riekenberg : winspool: Do not fail in OpenPrinter on pDefault / local print server.

Alexandre Julliard julliard at wine.codeweavers.com
Wed May 17 04:47:08 CDT 2006


Module: wine
Branch: refs/heads/master
Commit: 351106f5ae3b787f246504203ddd8d31c0944cc2
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=351106f5ae3b787f246504203ddd8d31c0944cc2

Author: Detlef Riekenberg <wine.dev at web.de>
Date:   Fri May 12 16:14:59 2006 +0200

winspool: Do not fail in OpenPrinter on pDefault / local print server.

---

 dlls/winspool/info.c |  114 ++++++++++++++++++++++++++++++--------------------
 1 files changed, 68 insertions(+), 46 deletions(-)

diff --git a/dlls/winspool/info.c b/dlls/winspool/info.c
index 51f1fa1..b67613e 100644
--- a/dlls/winspool/info.c
+++ b/dlls/winspool/info.c
@@ -132,6 +132,12 @@ static const WCHAR MonitorsW[] =  { 'S',
                                   'P','r','i','n','t','\\',
                                   'M','o','n','i','t','o','r','s',0};
 
+static const WCHAR PrintersW[] = {'S','y','s','t','e','m','\\',
+                                  'C','u', 'r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\',
+                                  'C','o','n','t','r','o','l','\\',
+                                  'P','r','i','n','t','\\',
+                                  'P','r','i','n','t','e','r','s',0};
+
 static const WCHAR LocalPortW[] = {'L','o','c','a','l',' ','P','o','r','t',0};
 
 static const WCHAR user_default_reg_key[] = { 'S','o','f','t','w','a','r','e','\\',
@@ -776,12 +782,15 @@ static DWORD get_local_monitors(DWORD le
 /******************************************************************
  *  get_opened_printer_entry
  *  Get the first place empty in the opened printer table
+ *
+ * ToDo:
+ *  - pDefault is ignored
  */
-static HANDLE get_opened_printer_entry( LPCWSTR name )
+static HANDLE get_opened_printer_entry(LPCWSTR name, LPPRINTER_DEFAULTSW pDefault)
 {
     UINT_PTR handle = nb_printer_handles, i;
     jobqueue_t *queue = NULL;
-    opened_printer_t *printer;
+    opened_printer_t *printer = NULL;
 
     EnterCriticalSection(&printer_handles_cs);
 
@@ -792,8 +801,11 @@ static HANDLE get_opened_printer_entry( 
             if(handle == nb_printer_handles)
                 handle = i;
         }
-        else if(!queue && !strcmpW(name, printer_handles[i]->name))
-            queue = printer_handles[i]->queue;
+        else
+        {
+            if(!queue && (name) && !lstrcmpW(name, printer_handles[i]->name))
+                queue = printer_handles[i]->queue;
+        }
     }
 
     if (handle >= nb_printer_handles)
@@ -815,29 +827,45 @@ static HANDLE get_opened_printer_entry( 
         nb_printer_handles += 16;
     }
 
-    if (!(printer = HeapAlloc(GetProcessHeap(), 0, sizeof(*printer))))
+    if (!(printer = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*printer))))
     {
         handle = 0;
         goto end;
     }
 
-    printer->name = HeapAlloc(GetProcessHeap(), 0, (strlenW(name) + 1) * sizeof(WCHAR));
-    strcpyW(printer->name, name);
+    if(name) {
+        printer->name = HeapAlloc(GetProcessHeap(), 0, (strlenW(name) + 1) * sizeof(WCHAR));
+        if (!printer->name) {
+            handle = 0;
+            goto end;
+        }
+        strcpyW(printer->name, name);
+    }
+
     if(queue)
         printer->queue = queue;
     else
     {
         printer->queue = HeapAlloc(GetProcessHeap(), 0, sizeof(*queue));
+        if (!printer->queue) {
+            handle = 0;
+            goto end;
+        }
         list_init(&printer->queue->jobs);
         printer->queue->ref = 0;
     }
     InterlockedIncrement(&printer->queue->ref);
-    printer->doc = NULL;
 
     printer_handles[handle] = printer;
     handle++;
 end:
     LeaveCriticalSection(&printer_handles_cs);
+    if (!handle && printer) {
+        /* Something Failed: Free the Buffers */
+        HeapFree(GetProcessHeap(), 0, printer->name);
+        if (!queue) HeapFree(GetProcessHeap(), 0, printer->queue);
+        HeapFree(GetProcessHeap(), 0, printer);
+    }
 
     return (HANDLE)handle;
 }
@@ -1258,57 +1286,51 @@ BOOL WINAPI OpenPrinterA(LPSTR lpPrinter
  *|  XcvPort: "Servername,XcvPort PortName"
  *
  * BUGS
- *|  Printserver not supported
  *|  Printer-Object not supported
  *|  XcvMonitor not supported
  *|  XcvPort not supported
- *|  pDefaults not supported
+ *|  pDefaults is ignored
  *
  */
-BOOL WINAPI OpenPrinterW(LPWSTR lpPrinterName,HANDLE *phPrinter,
-			 LPPRINTER_DEFAULTSW pDefault)
+BOOL WINAPI OpenPrinterW(LPWSTR lpPrinterName,HANDLE *phPrinter, LPPRINTER_DEFAULTSW pDefault)
 {
-    HKEY hkeyPrinters, hkeyPrinter;
+    HKEY hkeyPrinters = NULL;
+    HKEY hkeyPrinter = NULL;
 
-    if (!lpPrinterName) {
-       FIXME("(printerName: NULL, pDefault %p Ret: False\n", pDefault);
-       SetLastError(ERROR_INVALID_PARAMETER);
-       return FALSE;
+    TRACE("(%s, %p, %p)\n", debugstr_w(lpPrinterName), phPrinter, pDefault);
+    if (pDefault) {
+        FIXME("PRINTER_DEFAULTS ignored => %s,%p,0x%08lx\n",
+        debugstr_w(pDefault->pDatatype), pDefault->pDevMode, pDefault->DesiredAccess);
     }
 
-    TRACE("(printerName: %s, pDefault %p)\n", debugstr_w(lpPrinterName),
-	  pDefault);
+    if(lpPrinterName != NULL)
+    {
+        /* Check any Printer exists */
+        if(RegCreateKeyW(HKEY_LOCAL_MACHINE, PrintersW, &hkeyPrinters) != ERROR_SUCCESS) {
+            ERR("Can't create Printers key\n");
+            SetLastError(ERROR_FILE_NOT_FOUND);
+            return FALSE;
+        }
+        if((lpPrinterName[0] == '\0') ||        /* explicitly exclude "" */
+           (RegOpenKeyW(hkeyPrinters, lpPrinterName, &hkeyPrinter) != ERROR_SUCCESS)) {
 
-    /* Check Printer exists */
-    if(RegCreateKeyA(HKEY_LOCAL_MACHINE, Printers, &hkeyPrinters) !=
-       ERROR_SUCCESS) {
-        ERR("Can't create Printers key\n");
-	SetLastError(ERROR_FILE_NOT_FOUND); /* ?? */
-	return FALSE;
+            WARN("Printer not found in Registry: '%s'\n", debugstr_w(lpPrinterName));
+            RegCloseKey(hkeyPrinters);
+            SetLastError(ERROR_INVALID_PRINTER_NAME);
+            return FALSE;
+        }
+        RegCloseKey(hkeyPrinter);
+        RegCloseKey(hkeyPrinters);
     }
-
-    if(lpPrinterName[0] == '\0' || /* explicitly exclude "" */
-       RegOpenKeyW(hkeyPrinters, lpPrinterName, &hkeyPrinter)
-       != ERROR_SUCCESS) {
-        TRACE("Can't find printer %s in registry\n",
-	      debugstr_w(lpPrinterName));
-	RegCloseKey(hkeyPrinters);
-        SetLastError(ERROR_INVALID_PRINTER_NAME);
-	return FALSE;
+    if(!phPrinter) {
+        /* NT: FALSE with ERROR_INVALID_PARAMETER, 9x: TRUE */
+        SetLastError(ERROR_INVALID_PARAMETER);
+        return FALSE;
     }
-    RegCloseKey(hkeyPrinter);
-    RegCloseKey(hkeyPrinters);
 
-    if(!phPrinter) /* This seems to be what win95 does anyway */
-        return TRUE;
-
-    /* Get the unique handle of the printer*/
-    *phPrinter = get_opened_printer_entry( lpPrinterName );
-
-    if (pDefault != NULL)
-        FIXME("Not handling pDefault\n");
-
-    return TRUE;
+    /* Get the unique handle of the printer or Printserver */
+    *phPrinter = get_opened_printer_entry(lpPrinterName, pDefault);
+    return (*phPrinter != 0);
 }
 
 /******************************************************************




More information about the wine-cvs mailing list