diff --git a/win32ss/printing/base/winspool/printers.c b/win32ss/printing/base/winspool/printers.c index 5f130a3d15b..28bce502020 100644 --- a/win32ss/printing/base/winspool/printers.c +++ b/win32ss/printing/base/winspool/printers.c @@ -201,12 +201,91 @@ DocumentPropertiesA(HWND hWnd, HANDLE hPrinter, LPSTR pDeviceName, PDEVMODEA pDe return -1; } +static PRINTER_INFO_9W * get_devmodeW(HANDLE hprn) +{ + PRINTER_INFO_9W *pi9 = NULL; + DWORD needed = 0; + BOOL res; + + res = GetPrinterW(hprn, 9, NULL, 0, &needed); + if (!res && (GetLastError() == ERROR_INSUFFICIENT_BUFFER)) + { + pi9 = HeapAlloc(hProcessHeap, 0, needed); + res = GetPrinterW(hprn, 9, (LPBYTE)pi9, needed, &needed); + } + + if (res) + return pi9; + + ERR("GetPrinterW failed with %u\n", GetLastError()); + HeapFree(hProcessHeap, 0, pi9); + return NULL; +} + LONG WINAPI DocumentPropertiesW(HWND hWnd, HANDLE hPrinter, LPWSTR pDeviceName, PDEVMODEW pDevModeOutput, PDEVMODEW pDevModeInput, DWORD fMode) { + HANDLE hUseHandle = NULL; + PRINTER_INFO_9W *pi9 = NULL; + LONG Result = -1, Length; + TRACE("DocumentPropertiesW(%p, %p, %S, %p, %p, %lu)\n", hWnd, hPrinter, pDeviceName, pDevModeOutput, pDevModeInput, fMode); - UNIMPLEMENTED; - return -1; + if (hPrinter) + { + hUseHandle = hPrinter; + } + else if (!OpenPrinterW(pDeviceName, &hUseHandle, NULL)) + { + ERR("No handle, and no usable printer name passed in\n"); + return -1; + } + + pi9 = get_devmodeW(hUseHandle); + + if (pi9) + { + Length = pi9->pDevMode->dmSize + pi9->pDevMode->dmDriverExtra; + // See wineps.drv PSDRV_ExtDeviceMode + if (fMode) + { + Result = 1; /* IDOK */ + + if (fMode & DM_IN_BUFFER) + { + FIXME("Merge pDevModeInput with pi9, write back to driver!\n"); + // See wineps.drv PSDRV_MergeDevmodes + } + + if (fMode & DM_IN_PROMPT) + { + FIXME("Show property sheet!\n"); + Result = 2; /* IDCANCEL */ + } + + if (fMode & (DM_OUT_BUFFER | DM_OUT_DEFAULT)) + { + if (pDevModeOutput) + { + memcpy(pDevModeOutput, pi9->pDevMode, pi9->pDevMode->dmSize + pi9->pDevMode->dmDriverExtra); + } + else + { + ERR("No pDevModeOutput\n"); + Result = -1; + } + } + } + else + { + Result = Length; + } + + HeapFree(hProcessHeap, 0, pi9); + } + + if (hUseHandle && !hPrinter) + ClosePrinter(hUseHandle); + return Result; } BOOL WINAPI