Gal Topper : comdlg32: PrintDlgEx: Add support for RETURNDEFAULT.
Alexandre Julliard
julliard at winehq.org
Thu Jul 17 06:38:47 CDT 2008
Module: wine
Branch: master
Commit: a675c0168d4ea6e6b062034fe15018b9290cb19b
URL: http://source.winehq.org/git/wine.git/?a=commit;h=a675c0168d4ea6e6b062034fe15018b9290cb19b
Author: Gal Topper <galt280 at gmail.com>
Date: Thu Jul 10 20:19:27 2008 +0300
comdlg32: PrintDlgEx: Add support for RETURNDEFAULT.
---
dlls/comdlg32/printdlg.c | 78 ++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 76 insertions(+), 2 deletions(-)
diff --git a/dlls/comdlg32/printdlg.c b/dlls/comdlg32/printdlg.c
index 2e81627..52ac3c6 100644
--- a/dlls/comdlg32/printdlg.c
+++ b/dlls/comdlg32/printdlg.c
@@ -3749,13 +3749,16 @@ HRESULT WINAPI PrintDlgExA(LPPRINTDLGEXA lppd)
* driver-specific property pages.
*
* BUGS
- * Only a Stub
+ * Not fully implemented
*
*/
HRESULT WINAPI PrintDlgExW(LPPRINTDLGEXW lppd)
{
+ DWORD ret = E_FAIL;
+ LPVOID ptr;
+
+ FIXME("(%p) not fully implemented\n", lppd);
- FIXME("(%p) stub\n", lppd);
if ((lppd == NULL) || (lppd->lStructSize != sizeof(PRINTDLGEXW))) {
return E_INVALIDARG;
}
@@ -3764,5 +3767,76 @@ HRESULT WINAPI PrintDlgExW(LPPRINTDLGEXW lppd)
return E_HANDLE;
}
+ if (lppd->Flags & PD_RETURNDEFAULT) {
+ PRINTER_INFO_2W *pbuf;
+ DRIVER_INFO_2W *dbuf;
+ HANDLE hprn;
+ DWORD needed = 1024;
+ BOOL bRet;
+
+ if (lppd->hDevMode || lppd->hDevNames) {
+ WARN("hDevMode or hDevNames non-zero for PD_RETURNDEFAULT\n");
+ COMDLG32_SetCommDlgExtendedError(PDERR_RETDEFFAILURE);
+ return E_INVALIDARG;
+ }
+ if (!PRINTDLG_OpenDefaultPrinter(&hprn)) {
+ WARN("Can't find default printer\n");
+ COMDLG32_SetCommDlgExtendedError(PDERR_NODEFAULTPRN);
+ 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);
+ 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)) {
+ 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);
+ HeapFree(GetProcessHeap(), 0, pbuf);
+ COMDLG32_SetCommDlgExtendedError(PDERR_RETDEFFAILURE);
+ 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);
+
+ return ret;
+ }
+
return E_NOTIMPL;
}
More information about the wine-cvs
mailing list