Detlef Riekenberg : comdlg32: Use a helper to update the devmode handle.

Alexandre Julliard julliard at winehq.org
Tue Mar 27 12:48:05 CDT 2012


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

Author: Detlef Riekenberg <wine.dev at web.de>
Date:   Sun Mar 18 22:14:22 2012 +0100

comdlg32: Use a helper to update the devmode handle.

---

 dlls/comdlg32/printdlg.c |  170 ++++++++++++++++++++++++++++++----------------
 1 files changed, 112 insertions(+), 58 deletions(-)

diff --git a/dlls/comdlg32/printdlg.c b/dlls/comdlg32/printdlg.c
index ccb7b5f..0ac3650 100644
--- a/dlls/comdlg32/printdlg.c
+++ b/dlls/comdlg32/printdlg.c
@@ -254,6 +254,68 @@ static PRINTER_INFO_2A * get_printer_infoA(HANDLE hprn)
     return NULL;
 }
 
+
+/***********************************************************************
+ * update_devmode_handle [internal]
+ *
+ * update a devmode handle for the given DEVMODE, alloc the buffer, when needed
+ */
+static HGLOBAL update_devmode_handleW(HGLOBAL hdm, DEVMODEW *dm)
+{
+    SIZE_T size = GlobalSize(hdm);
+    LPVOID ptr;
+
+    /* Increase / alloc the global memory block, when needed */
+    if ((dm->dmSize + dm->dmDriverExtra) > size) {
+        if (hdm)
+            hdm = GlobalReAlloc(hdm, dm->dmSize + dm->dmDriverExtra, 0);
+        else
+            hdm = GlobalAlloc(GMEM_MOVEABLE, dm->dmSize + dm->dmDriverExtra);
+    }
+
+    if (hdm) {
+        ptr = GlobalLock(hdm);
+        if (ptr) {
+            memcpy(ptr, dm, dm->dmSize + dm->dmDriverExtra);
+            GlobalUnlock(hdm);
+        }
+        else
+        {
+            GlobalFree(hdm);
+            hdm = NULL;
+        }
+    }
+    return hdm;
+}
+
+static HGLOBAL update_devmode_handleA(HGLOBAL hdm, DEVMODEA *dm)
+{
+    SIZE_T size = GlobalSize(hdm);
+    LPVOID ptr;
+
+    /* Increase / alloc the global memory block, when needed */
+    if ((dm->dmSize + dm->dmDriverExtra) > size) {
+        if (hdm)
+            hdm = GlobalReAlloc(hdm, dm->dmSize + dm->dmDriverExtra, 0);
+        else
+            hdm = GlobalAlloc(GMEM_MOVEABLE, dm->dmSize + dm->dmDriverExtra);
+    }
+
+    if (hdm) {
+        ptr = GlobalLock(hdm);
+        if (ptr) {
+            memcpy(ptr, dm, dm->dmSize + dm->dmDriverExtra);
+            GlobalUnlock(hdm);
+        }
+        else
+        {
+            GlobalFree(hdm);
+            hdm = NULL;
+        }
+    }
+    return hdm;
+}
+
 /***********************************************************
  * convert_to_devmodeA
  *
@@ -3868,10 +3930,12 @@ BOOL WINAPI PageSetupDlgW(LPPAGESETUPDLGW setupdlg)
  */
 HRESULT WINAPI PrintDlgExA(LPPRINTDLGEXA lppd)
 {
-    DWORD     ret = E_FAIL;
-    LPVOID    ptr;
+    PRINTER_INFO_2A *pbuf;
+    DRIVER_INFO_3A *dbuf;
+    DEVMODEA *dm;
+    HRESULT hr = S_OK;
+    HANDLE hprn;
 
-    FIXME("(%p) not fully implemented\n", lppd);
     if ((lppd == NULL) || (lppd->lStructSize != sizeof(PRINTDLGEXA)))
         return E_INVALIDARG;
 
@@ -3894,10 +3958,6 @@ HRESULT WINAPI PrintDlgExA(LPPRINTDLGEXA lppd)
 
     if (lppd->Flags & PD_RETURNDEFAULT)
     {
-        PRINTER_INFO_2A *pbuf;
-        DRIVER_INFO_3A  *dbuf;
-        HANDLE hprn;
-
         if (lppd->hDevMode || lppd->hDevNames)
         {
             WARN("hDevMode or hDevNames non-zero for PD_RETURNDEFAULT\n");
@@ -3926,32 +3986,29 @@ HRESULT WINAPI PrintDlgExA(LPPRINTDLGEXA lppd)
             ClosePrinter(hprn);
             return E_FAIL;
         }
-        ClosePrinter(hprn);
-
-        PRINTDLG_CreateDevNames(&(lppd->hDevNames),
-                      dbuf->pDriverPath,
-                      pbuf->pPrinterName,
-                      pbuf->pPortName);
-        lppd->hDevMode = GlobalAlloc(GMEM_MOVEABLE, pbuf->pDevMode->dmSize +
-                                     pbuf->pDevMode->dmDriverExtra);
-        if (lppd->hDevMode)
-        {
-            ptr = GlobalLock(lppd->hDevMode);
-            if (ptr)
-            {
-                memcpy(ptr, pbuf->pDevMode, pbuf->pDevMode->dmSize +
-                       pbuf->pDevMode->dmDriverExtra);
-                GlobalUnlock(lppd->hDevMode);
-                ret = S_OK;
-            }
-        }
-        HeapFree(GetProcessHeap(), 0, pbuf);
-        HeapFree(GetProcessHeap(), 0, dbuf);
+        dm = pbuf->pDevMode;
+    }
+    else
+    {
+        FIXME("(%p) dialog not implemented\n", lppd);
+        return E_NOTIMPL;
 
-        return ret;
     }
 
-    return E_NOTIMPL;
+    ClosePrinter(hprn);
+
+    PRINTDLG_CreateDevNames(&(lppd->hDevNames), dbuf->pDriverPath, pbuf->pPrinterName, pbuf->pPortName);
+    if (!lppd->hDevNames)
+        hr = E_FAIL;
+
+    lppd->hDevMode = update_devmode_handleA(lppd->hDevMode, dm);
+    if (!lppd->hDevMode)
+        hr = E_FAIL;
+
+    HeapFree(GetProcessHeap(), 0, pbuf);
+    HeapFree(GetProcessHeap(), 0, dbuf);
+
+    return hr;
 }
 
 /***********************************************************************
@@ -3982,10 +4039,11 @@ HRESULT WINAPI PrintDlgExA(LPPRINTDLGEXA lppd)
  */
 HRESULT WINAPI PrintDlgExW(LPPRINTDLGEXW lppd)
 {
-    DWORD     ret = E_FAIL;
-    LPVOID    ptr;
-
-    FIXME("(%p) not fully implemented\n", lppd);
+    PRINTER_INFO_2W *pbuf;
+    DRIVER_INFO_3W *dbuf;
+    DEVMODEW *dm;
+    HRESULT hr = S_OK;
+    HANDLE hprn;
 
     if ((lppd == NULL) || (lppd->lStructSize != sizeof(PRINTDLGEXW))) {
         return E_INVALIDARG;
@@ -4010,9 +4068,6 @@ HRESULT WINAPI PrintDlgExW(LPPRINTDLGEXW lppd)
     }
 
     if (lppd->Flags & PD_RETURNDEFAULT) {
-        PRINTER_INFO_2W *pbuf;
-        DRIVER_INFO_3W  *dbuf;
-        HANDLE hprn;
 
         if (lppd->hDevMode || lppd->hDevNames) {
             WARN("hDevMode or hDevNames non-zero for PD_RETURNDEFAULT\n");
@@ -4040,28 +4095,27 @@ HRESULT WINAPI PrintDlgExW(LPPRINTDLGEXW lppd)
             ClosePrinter(hprn);
             return E_FAIL;
         }
-        ClosePrinter(hprn);
-
-        PRINTDLG_CreateDevNamesW(&(lppd->hDevNames),
-                      dbuf->pDriverPath,
-                      pbuf->pPrinterName,
-                      pbuf->pPortName);
-        lppd->hDevMode = GlobalAlloc(GMEM_MOVEABLE, pbuf->pDevMode->dmSize +
-                         pbuf->pDevMode->dmDriverExtra);
-        if (lppd->hDevMode) {
-            ptr = GlobalLock(lppd->hDevMode);
-            if (ptr) {
-                memcpy(ptr, pbuf->pDevMode, pbuf->pDevMode->dmSize +
-                    pbuf->pDevMode->dmDriverExtra);
-                GlobalUnlock(lppd->hDevMode);
-                ret = S_OK;
-            }
-        }
-        HeapFree(GetProcessHeap(), 0, pbuf);
-        HeapFree(GetProcessHeap(), 0, dbuf);
+        dm = pbuf->pDevMode;
+    }
+    else
+    {
+        FIXME("(%p) dialog not implemented\n", lppd);
+        return E_NOTIMPL;
 
-        return ret;
     }
 
-    return E_NOTIMPL;
+    ClosePrinter(hprn);
+
+    PRINTDLG_CreateDevNamesW(&(lppd->hDevNames), dbuf->pDriverPath, pbuf->pPrinterName, pbuf->pPortName);
+    if (!lppd->hDevNames)
+        hr = E_FAIL;
+
+    lppd->hDevMode = update_devmode_handleW(lppd->hDevMode, dm);
+    if (!lppd->hDevMode)
+        hr = E_FAIL;
+
+    HeapFree(GetProcessHeap(), 0, pbuf);
+    HeapFree(GetProcessHeap(), 0, dbuf);
+
+    return hr;
 }




More information about the wine-cvs mailing list