[PATCH 4/8] comdlg32: Use a helper to get the printer info

Detlef Riekenberg wine.dev at web.de
Mon Feb 20 06:55:36 CST 2012


The helper will be reused in the other GetPrinter - locations

--
By by ... Detlef
---
 dlls/comdlg32/printdlg.c |   74 +++++++++++++++++++++++++++++++++-------------
 1 files changed, 53 insertions(+), 21 deletions(-)

diff --git a/dlls/comdlg32/printdlg.c b/dlls/comdlg32/printdlg.c
index 2647ea3..7acb4ab 100644
--- a/dlls/comdlg32/printdlg.c
+++ b/dlls/comdlg32/printdlg.c
@@ -161,6 +161,54 @@ static LPWSTR strdupW(LPCWSTR p)
     return ret;
 }
 
+/***********************************************************************
+ * get_printer_info [internal]
+ *
+ * get PRINTER_INFO_2W for the current printer handle,
+ * alloc the buffer, when needed
+ */
+static PRINTER_INFO_2W * get_printer_infoW(HANDLE hprn)
+{
+    PRINTER_INFO_2W *pi2 = NULL;
+    DWORD needed = 0;
+    BOOL res;
+
+    res = GetPrinterW(hprn, 2, NULL, 0, &needed);
+    if (!res && (GetLastError() == ERROR_INSUFFICIENT_BUFFER)) {
+        HeapFree(GetProcessHeap(), 0, pi2);
+        pi2 = HeapAlloc(GetProcessHeap(), 0, needed);
+        res = GetPrinterW(hprn, 2, (LPBYTE)pi2, needed, &needed);
+    }
+
+    if (res)
+        return pi2;
+
+    TRACE("GetPrinterW failed with %u\n", GetLastError());
+    HeapFree(GetProcessHeap(), 0, pi2);
+    return NULL;
+}
+
+static PRINTER_INFO_2A * get_printer_infoA(HANDLE hprn)
+{
+    PRINTER_INFO_2A *pi2 = NULL;
+    DWORD needed = 0;
+    BOOL res;
+
+    res = GetPrinterA(hprn, 2, NULL, 0, &needed);
+    if (!res && (GetLastError() == ERROR_INSUFFICIENT_BUFFER)) {
+        HeapFree(GetProcessHeap(), 0, pi2);
+        pi2 = HeapAlloc(GetProcessHeap(), 0, needed);
+        res = GetPrinterA(hprn, 2, (LPBYTE)pi2, needed, &needed);
+    }
+
+    if (res)
+        return pi2;
+
+    TRACE("GetPrinterA failed with %u\n", GetLastError());
+    HeapFree(GetProcessHeap(), 0, pi2);
+    return NULL;
+}
+
 /***********************************************************
  * convert_to_devmodeA
  *
@@ -3816,22 +3864,13 @@ HRESULT WINAPI PrintDlgExA(LPPRINTDLGEXA lppd)
             return E_FAIL;
         }
 
-        pbuf = HeapAlloc(GetProcessHeap(), 0, needed);
-        bRet = GetPrinterA(hprn, 2, (LPBYTE)pbuf, needed, &needed);
-        if (!bRet && (GetLastError() == ERROR_INSUFFICIENT_BUFFER))
-        {
-            HeapFree(GetProcessHeap(), 0, pbuf);
-            pbuf = HeapAlloc(GetProcessHeap(), 0, needed);
-            bRet = GetPrinterA(hprn, 2, (LPBYTE)pbuf, needed, &needed);
-        }
-        if (!bRet)
+        pbuf = get_printer_infoA(hprn);
+        if (!pbuf)
         {
-            HeapFree(GetProcessHeap(), 0, pbuf);
             ClosePrinter(hprn);
             return E_FAIL;
         }
 
-        needed = 1024;
         dbuf = HeapAlloc(GetProcessHeap(), 0, needed);
         bRet = GetPrinterDriverA(hprn, NULL, 3, (LPBYTE)dbuf, needed, &needed);
         if (!bRet && (GetLastError() == ERROR_INSUFFICIENT_BUFFER))
@@ -3951,20 +3990,13 @@ HRESULT WINAPI PrintDlgExW(LPPRINTDLGEXW lppd)
             return E_FAIL;
         }
 
-        pbuf = HeapAlloc(GetProcessHeap(), 0, needed);
-        bRet = GetPrinterW(hprn, 2, (LPBYTE)pbuf, needed, &needed);
-        if (!bRet && (GetLastError() == ERROR_INSUFFICIENT_BUFFER)) {
-            HeapFree(GetProcessHeap(), 0, pbuf);
-            pbuf = HeapAlloc(GetProcessHeap(), 0, needed);
-            bRet = GetPrinterW(hprn, 2, (LPBYTE)pbuf, needed, &needed);
-        }
-        if (!bRet) {
-            HeapFree(GetProcessHeap(), 0, pbuf);
+        pbuf = get_printer_infoW(hprn);
+        if (!pbuf)
+        {
             ClosePrinter(hprn);
             return E_FAIL;
         }
 
-        needed = 1024;
         dbuf = HeapAlloc(GetProcessHeap(), 0, needed);
         bRet = GetPrinterDriverW(hprn, NULL, 3, (LPBYTE)dbuf, needed, &needed);
         if (!bRet && (GetLastError() == ERROR_INSUFFICIENT_BUFFER)) {
-- 
1.7.5.4




More information about the wine-patches mailing list