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

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


The helper will be reused in the other GetPrinterDriver - locations

--
By by ... Detlef
---
 dlls/comdlg32/printdlg.c |   85 ++++++++++++++++++++++++++++++----------------
 1 files changed, 56 insertions(+), 29 deletions(-)

diff --git a/dlls/comdlg32/printdlg.c b/dlls/comdlg32/printdlg.c
index 7acb4ab..d78cf3c 100644
--- a/dlls/comdlg32/printdlg.c
+++ b/dlls/comdlg32/printdlg.c
@@ -162,6 +162,55 @@ static LPWSTR strdupW(LPCWSTR p)
 }
 
 /***********************************************************************
+ * get_driver_info [internal]
+ *
+ * get DRIVER_INFO_3W for the current printer handle,
+ * alloc the buffer, when needed
+ */
+static DRIVER_INFO_3W * get_driver_infoW(HANDLE hprn)
+{
+    DRIVER_INFO_3W *di3 = NULL;
+    DWORD needed = 0;
+    BOOL res;
+
+    res = GetPrinterDriverW(hprn, NULL, 3, NULL, 0, &needed);
+    if (!res && (GetLastError() == ERROR_INSUFFICIENT_BUFFER)) {
+        HeapFree(GetProcessHeap(), 0, di3);
+        di3 = HeapAlloc(GetProcessHeap(), 0, needed);
+        res = GetPrinterDriverW(hprn, NULL, 3, (LPBYTE)di3, needed, &needed);
+    }
+
+    if (res)
+        return di3;
+
+    TRACE("GetPrinterDriverW failed with %u\n", GetLastError());
+    HeapFree(GetProcessHeap(), 0, di3);
+    return NULL;
+}
+
+static DRIVER_INFO_3A * get_driver_infoA(HANDLE hprn)
+{
+    DRIVER_INFO_3A *di3 = NULL;
+    DWORD needed = 0;
+    BOOL res;
+
+    res = GetPrinterDriverA(hprn, NULL, 3, NULL, 0, &needed);
+    if (!res && (GetLastError() == ERROR_INSUFFICIENT_BUFFER)) {
+        HeapFree(GetProcessHeap(), 0, di3);
+        di3 = HeapAlloc(GetProcessHeap(), 0, needed);
+        res = GetPrinterDriverA(hprn, NULL, 3, (LPBYTE)di3, needed, &needed);
+    }
+
+    if (res)
+        return di3;
+
+    TRACE("GetPrinterDriverA failed with %u\n", GetLastError());
+    HeapFree(GetProcessHeap(), 0, di3);
+    return NULL;
+}
+
+
+/***********************************************************************
  * get_printer_info [internal]
  *
  * get PRINTER_INFO_2W for the current printer handle,
@@ -3846,10 +3895,8 @@ HRESULT WINAPI PrintDlgExA(LPPRINTDLGEXA lppd)
     if (lppd->Flags & PD_RETURNDEFAULT)
     {
         PRINTER_INFO_2A *pbuf;
-        DRIVER_INFO_2A  *dbuf;
+        DRIVER_INFO_3A  *dbuf;
         HANDLE hprn;
-        DWORD needed = 1024;
-        BOOL bRet;
 
         if (lppd->hDevMode || lppd->hDevNames)
         {
@@ -3871,19 +3918,9 @@ HRESULT WINAPI PrintDlgExA(LPPRINTDLGEXA lppd)
             return E_FAIL;
         }
 
-        dbuf = HeapAlloc(GetProcessHeap(), 0, needed);
-        bRet = GetPrinterDriverA(hprn, NULL, 3, (LPBYTE)dbuf, needed, &needed);
-        if (!bRet && (GetLastError() == ERROR_INSUFFICIENT_BUFFER))
+        dbuf = get_driver_infoA(hprn);
+        if (!dbuf)
         {
-            HeapFree(GetProcessHeap(), 0, dbuf);
-            dbuf = HeapAlloc(GetProcessHeap(), 0, needed);
-            bRet = GetPrinterDriverA(hprn, NULL, 3, (LPBYTE)dbuf, needed, &needed);
-        }
-        if (!bRet)
-        {
-            ERR("GetPrinterDriverА failed, last error %d, fix your config for printer %s!\n",
-                GetLastError(), pbuf->pPrinterName);
-            HeapFree(GetProcessHeap(), 0, dbuf);
             HeapFree(GetProcessHeap(), 0, pbuf);
             COMDLG32_SetCommDlgExtendedError(PDERR_RETDEFFAILURE);
             ClosePrinter(hprn);
@@ -3974,10 +4011,8 @@ HRESULT WINAPI PrintDlgExW(LPPRINTDLGEXW lppd)
 
     if (lppd->Flags & PD_RETURNDEFAULT) {
         PRINTER_INFO_2W *pbuf;
-        DRIVER_INFO_2W  *dbuf;
+        DRIVER_INFO_3W  *dbuf;
         HANDLE hprn;
-        DWORD needed = 1024;
-        BOOL bRet;
 
         if (lppd->hDevMode || lppd->hDevNames) {
             WARN("hDevMode or hDevNames non-zero for PD_RETURNDEFAULT\n");
@@ -3997,17 +4032,9 @@ HRESULT WINAPI PrintDlgExW(LPPRINTDLGEXW lppd)
             return E_FAIL;
         }
 
-        dbuf = HeapAlloc(GetProcessHeap(), 0, needed);
-        bRet = GetPrinterDriverW(hprn, NULL, 3, (LPBYTE)dbuf, needed, &needed);
-        if (!bRet && (GetLastError() == ERROR_INSUFFICIENT_BUFFER)) {
-            HeapFree(GetProcessHeap(), 0, dbuf);
-            dbuf = HeapAlloc(GetProcessHeap(), 0, needed);
-            bRet = GetPrinterDriverW(hprn, NULL, 3, (LPBYTE)dbuf, needed, &needed);
-        }
-        if (!bRet) {
-            ERR("GetPrinterDriverW failed, last error %d, fix your config for printer %s!\n",
-                GetLastError(), debugstr_w(pbuf->pPrinterName));
-            HeapFree(GetProcessHeap(), 0, dbuf);
+        dbuf = get_driver_infoW(hprn);
+        if (!dbuf)
+        {
             HeapFree(GetProcessHeap(), 0, pbuf);
             COMDLG32_SetCommDlgExtendedError(PDERR_RETDEFFAILURE);
             ClosePrinter(hprn);
-- 
1.7.5.4




More information about the wine-patches mailing list