Jeremy White : winspool: Implement GetPrinterA via GetPrinterW, largely to support the eccentricity that GetPrinterA allocates buffers as large as those required by GetPrinterW .

Alexandre Julliard julliard at winehq.org
Tue Dec 1 09:19:42 CST 2009


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

Author: Jeremy White <jwhite at winehq.org>
Date:   Mon Nov 30 17:04:35 2009 -0600

winspool: Implement GetPrinterA via GetPrinterW, largely to support the eccentricity that GetPrinterA allocates buffers as large as those required by GetPrinterW.

---

 dlls/winspool.drv/info.c       |   89 +++++++++++++++++++++++++++++-----------
 dlls/winspool.drv/tests/info.c |    1 -
 2 files changed, 65 insertions(+), 25 deletions(-)

diff --git a/dlls/winspool.drv/info.c b/dlls/winspool.drv/info.c
index 37a2bf7..cbd8f27 100644
--- a/dlls/winspool.drv/info.c
+++ b/dlls/winspool.drv/info.c
@@ -1356,6 +1356,51 @@ static void convert_printerinfo_W_to_A(LPBYTE out, LPBYTE pPrintersW,
                     break;
                 }
 
+            case 6:  /* 6A and 6W are the same structure */
+                break;
+
+            case 7:
+                {
+                    PRINTER_INFO_7W * piW = (PRINTER_INFO_7W *) pPrintersW;
+                    PRINTER_INFO_7A * piA = (PRINTER_INFO_7A *) out;
+
+                    TRACE("(%u) #%u\n", level, id);
+                    if (piW->pszObjectGUID) {
+                        piA->pszObjectGUID = ptr;
+                        len = WideCharToMultiByte(CP_ACP, 0, piW->pszObjectGUID, -1,
+                                                  ptr, outlen, NULL, NULL);
+                        ptr += len;
+                        outlen -= len;
+                    }
+                    break;
+                }
+
+            case 9:
+                {
+                    PRINTER_INFO_9W * piW = (PRINTER_INFO_9W *) pPrintersW;
+                    PRINTER_INFO_9A * piA = (PRINTER_INFO_9A *) out;
+                    LPDEVMODEA dmA;
+
+                    TRACE("(%u) #%u\n", level, id);
+                    dmA = DEVMODEdupWtoA(piW->pDevMode);
+                    if (dmA) {
+                        /* align DEVMODEA to a DWORD boundary */
+                        len = (4 - ( (DWORD_PTR) ptr & 3)) & 3;
+                        ptr += len;
+                        outlen -= len;
+
+                        piA->pDevMode = (LPDEVMODEA) ptr;
+                        len = dmA->dmSize + dmA->dmDriverExtra;
+                        memcpy(ptr, dmA, len);
+                        HeapFree(GetProcessHeap(), 0, dmA);
+
+                        ptr += len;
+                        outlen -= len;
+                    }
+
+                    break;
+                }
+
             default:
                 FIXME("for level %u\n", level);
         }
@@ -3528,14 +3573,10 @@ static BOOL WINSPOOL_GetPrinter_9(HKEY hkeyPrinter, PRINTER_INFO_9W *pi9, LPBYTE
 }
 
 /*****************************************************************************
- *          WINSPOOL_GetPrinter
- *
- *    Implementation of GetPrinterA|W.  Relies on PRINTER_INFO_*W being
- *    essentially the same as PRINTER_INFO_*A. i.e. the structure itself is
- *    just a collection of pointers to strings.
+ *          GetPrinterW  [WINSPOOL.@]
  */
-static BOOL WINSPOOL_GetPrinter(HANDLE hPrinter, DWORD Level, LPBYTE pPrinter,
-				DWORD cbBuf, LPDWORD pcbNeeded, BOOL unicode)
+BOOL WINAPI GetPrinterW(HANDLE hPrinter, DWORD Level, LPBYTE pPrinter,
+			DWORD cbBuf, LPDWORD pcbNeeded)
 {
     LPCWSTR name;
     DWORD size, needed = 0;
@@ -3578,7 +3619,7 @@ static BOOL WINSPOOL_GetPrinter(HANDLE hPrinter, DWORD Level, LPBYTE pPrinter,
 	    cbBuf = 0;
 	}
 	ret = WINSPOOL_GetPrinter_2(hkeyPrinter, pi2, ptr, cbBuf, &needed,
-				    unicode);
+				    TRUE);
 	needed += size;
 	break;
       }
@@ -3597,7 +3638,7 @@ static BOOL WINSPOOL_GetPrinter(HANDLE hPrinter, DWORD Level, LPBYTE pPrinter,
 	    cbBuf = 0;
 	}
 	ret = WINSPOOL_GetPrinter_4(hkeyPrinter, pi4, ptr, cbBuf, &needed,
-				    unicode);
+				    TRUE);
 	needed += size;
 	break;
       }
@@ -3618,7 +3659,7 @@ static BOOL WINSPOOL_GetPrinter(HANDLE hPrinter, DWORD Level, LPBYTE pPrinter,
 	}
 
 	ret = WINSPOOL_GetPrinter_5(hkeyPrinter, pi5, ptr, cbBuf, &needed,
-				    unicode);
+				    TRUE);
 	needed += size;
 	break;
       }
@@ -3655,7 +3696,7 @@ static BOOL WINSPOOL_GetPrinter(HANDLE hPrinter, DWORD Level, LPBYTE pPrinter,
             cbBuf = 0;
         }
 
-        ret = WINSPOOL_GetPrinter_7(hkeyPrinter, pi7, ptr, cbBuf, &needed, unicode);
+        ret = WINSPOOL_GetPrinter_7(hkeyPrinter, pi7, ptr, cbBuf, &needed, TRUE);
         needed += size;
         break;
       }
@@ -3675,7 +3716,7 @@ static BOOL WINSPOOL_GetPrinter(HANDLE hPrinter, DWORD Level, LPBYTE pPrinter,
             cbBuf = 0;
         }
 
-        ret = WINSPOOL_GetPrinter_9(hkeyPrinter, pi9, ptr, cbBuf, &needed, unicode);
+        ret = WINSPOOL_GetPrinter_9(hkeyPrinter, pi9, ptr, cbBuf, &needed, TRUE);
         needed += size;
         break;
       }
@@ -3700,23 +3741,23 @@ static BOOL WINSPOOL_GetPrinter(HANDLE hPrinter, DWORD Level, LPBYTE pPrinter,
 }
 
 /*****************************************************************************
- *          GetPrinterW  [WINSPOOL.@]
- */
-BOOL WINAPI GetPrinterW(HANDLE hPrinter, DWORD Level, LPBYTE pPrinter,
-			DWORD cbBuf, LPDWORD pcbNeeded)
-{
-    return WINSPOOL_GetPrinter(hPrinter, Level, pPrinter, cbBuf, pcbNeeded,
-			       TRUE);
-}
-
-/*****************************************************************************
  *          GetPrinterA  [WINSPOOL.@]
  */
 BOOL WINAPI GetPrinterA(HANDLE hPrinter, DWORD Level, LPBYTE pPrinter,
                     DWORD cbBuf, LPDWORD pcbNeeded)
 {
-    return WINSPOOL_GetPrinter(hPrinter, Level, pPrinter, cbBuf, pcbNeeded,
-			       FALSE);
+    BOOL ret;
+    LPBYTE buf = NULL;
+
+    if (cbBuf)
+        buf = HeapAlloc(GetProcessHeap(), 0, cbBuf);
+
+    ret = GetPrinterW(hPrinter, Level, buf, cbBuf, pcbNeeded);
+    if (ret)
+        convert_printerinfo_W_to_A(pPrinter, buf, Level, cbBuf, 1);
+    HeapFree(GetProcessHeap(), 0, buf);
+
+    return ret;
 }
 
 /*****************************************************************************
diff --git a/dlls/winspool.drv/tests/info.c b/dlls/winspool.drv/tests/info.c
index bbf4642..42a0fa7 100644
--- a/dlls/winspool.drv/tests/info.c
+++ b/dlls/winspool.drv/tests/info.c
@@ -2252,7 +2252,6 @@ static void test_GetPrinter(void)
         {
             DWORD double_needed;
             ret = pGetPrinterW(hprn, level, NULL, 0, &double_needed);
-            todo_wine
             ok(double_needed == needed, "level %d: GetPrinterA returned different size %d than GetPrinterW (%d)\n", level, needed, double_needed);
         }
 




More information about the wine-cvs mailing list