Jacek Caban : wineps: Introduce DrvDocumentProperties entry point.
Alexandre Julliard
julliard at winehq.org
Mon Sep 13 16:12:33 CDT 2021
Module: wine
Branch: master
Commit: 0da3ffc4b941ec35e08b93ceb2981c1d42723a4f
URL: https://source.winehq.org/git/wine.git/?a=commit;h=0da3ffc4b941ec35e08b93ceb2981c1d42723a4f
Author: Jacek Caban <jacek at codeweavers.com>
Date: Mon Sep 13 13:49:44 2021 +0200
wineps: Introduce DrvDocumentProperties entry point.
This is not compatible with native. We should use
DrvDevicePropertySheets instead, but that requires support for CPSUI
support first.
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Huw Davies <huw at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/wineps.drv/driver.c | 116 +++++++++++++++++++++-------------------
dlls/wineps.drv/wineps.drv.spec | 1 +
2 files changed, 62 insertions(+), 55 deletions(-)
diff --git a/dlls/wineps.drv/driver.c b/dlls/wineps.drv/driver.c
index c4dcd405c26..18ede3d028d 100644
--- a/dlls/wineps.drv/driver.c
+++ b/dlls/wineps.drv/driver.c
@@ -435,19 +435,6 @@ static INT_PTR CALLBACK PSDRV_PaperDlgProc(HWND hwnd, UINT msg,
static HPROPSHEETPAGE (WINAPI *pCreatePropertySheetPage) (LPCPROPSHEETPAGEW);
static int (WINAPI *pPropertySheet) (LPCPROPSHEETHEADERW);
-static PRINTERINFO *PSDRV_FindPrinterInfoA(LPCSTR name)
-{
- int len = MultiByteToWideChar( CP_ACP, 0, name, -1, NULL, 0 );
- WCHAR *nameW = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) );
- PRINTERINFO *pi;
-
- MultiByteToWideChar( CP_ACP, 0, name, -1, nameW, len );
- pi = PSDRV_FindPrinterInfo( nameW );
- HeapFree( GetProcessHeap(), 0, nameW );
-
- return pi;
-}
-
/***********************************************************
* DEVMODEdupWtoA
*
@@ -489,27 +476,12 @@ static DEVMODEA *DEVMODEdupWtoA( const DEVMODEW *dmW )
return dmA;
}
- /******************************************************************
- * PSDRV_ExtDeviceMode
+/******************************************************************************
+ * DrvDocumentProperties (wineps.drv.@)
*
* Retrieves or modifies device-initialization information for the PostScript
* driver, or displays a driver-supplied dialog box for configuring the driver.
*
- * PARAMETERS
- * lpszDriver -- Driver name
- * hwnd -- Parent window for the dialog box
- * lpdmOutput -- Address of a DEVMODE structure for writing initialization information
- * lpszDevice -- Device name
- * lpszPort -- Port name
- * lpdmInput -- Address of a DEVMODE structure for reading initialization information
- * lpProfile -- Name of initialization file, defaults to WIN.INI if NULL
- * wMode -- Operation to perform. Can be a combination if > 0.
- * (0) -- Returns number of bytes required by DEVMODE structure
- * DM_UPDATE (1) -- Write current settings to environment and initialization file
- * DM_COPY (2) -- Write current settings to lpdmOutput
- * DM_PROMPT (4) -- Presents the driver's modal dialog box (USER.240)
- * DM_MODIFY (8) -- Changes current settings according to lpdmInput before any other operation
- *
* RETURNS
* Returns size of DEVMODE structure if wMode is 0. Otherwise, IDOK is returned for success
* for both dialog and non-dialog operations. IDCANCEL is returned if the dialog box was cancelled.
@@ -519,31 +491,29 @@ static DEVMODEA *DEVMODEdupWtoA( const DEVMODEW *dmW )
*
* Just returns default devmode at the moment. No use of initialization file.
*/
-INT CDECL PSDRV_ExtDeviceMode(LPSTR lpszDriver, HWND hwnd, LPDEVMODEA lpdmOutput,
- LPSTR lpszDevice, LPSTR lpszPort, LPDEVMODEA lpdmInput,
- LPSTR lpszProfile, DWORD dwMode)
+INT WINAPI DrvDocumentProperties(HWND hwnd, const WCHAR *device, DEVMODEW *output,
+ DEVMODEW *input, DWORD mode)
{
- PRINTERINFO *pi = PSDRV_FindPrinterInfoA(lpszDevice);
- if(!pi) return -1;
+ PRINTERINFO *pi;
+
+ TRACE("(hwnd=%p, Device='%s', devOut=%p, devIn=%p, Mode=%04x)\n",
+ hwnd, debugstr_w(device), output, input, mode);
- TRACE("(Driver=%s, hwnd=%p, devOut=%p, Device='%s', Port='%s', devIn=%p, Profile='%s', Mode=%04x)\n",
- lpszDriver, hwnd, lpdmOutput, lpszDevice, lpszPort, lpdmInput, debugstr_a(lpszProfile), dwMode);
+ if (!(pi = PSDRV_FindPrinterInfo(device))) return -1;
- /* If dwMode == 0, return size of DEVMODE structure */
- if(!dwMode)
- return pi->Devmode->dmPublic.dmSize + pi->Devmode->dmPublic.dmDriverExtra - CCHDEVICENAME - CCHFORMNAME;
+ /* If mode == 0, return size of DEVMODE structure */
+ if (!mode)
+ return pi->Devmode->dmPublic.dmSize + pi->Devmode->dmPublic.dmDriverExtra;
/* If DM_MODIFY is set, change settings in accordance with lpdmInput */
- if((dwMode & DM_MODIFY) && lpdmInput)
+ if ((mode & DM_MODIFY) && input)
{
- DEVMODEW *dmW = GdiConvertToDevmodeW( lpdmInput );
- TRACE("DM_MODIFY set. devIn->dmFields = %08x\n", lpdmInput->dmFields);
- if (dmW) PSDRV_MergeDevmodes(pi->Devmode, (PSDRV_DEVMODE *)dmW, pi);
- HeapFree( GetProcessHeap(), 0, dmW );
+ TRACE("DM_MODIFY set. devIn->dmFields = %08x\n", input->dmFields);
+ PSDRV_MergeDevmodes(pi->Devmode, (PSDRV_DEVMODE *)input, pi);
}
/* If DM_PROMPT is set, present modal dialog box */
- if(dwMode & DM_PROMPT) {
+ if (mode & DM_PROMPT) {
HINSTANCE hinstComctl32;
HPROPSHEETPAGE hpsp[1];
PROPSHEETPAGEW psp;
@@ -581,22 +551,58 @@ INT CDECL PSDRV_ExtDeviceMode(LPSTR lpszDriver, HWND hwnd, LPDEVMODEA lpdmOutput
}
/* If DM_UPDATE is set, should write settings to environment and initialization file */
- if(dwMode & DM_UPDATE)
+ if (mode & DM_UPDATE)
FIXME("Mode DM_UPDATE. Just do the same as DM_COPY\n");
/* If DM_COPY is set, should write settings to lpdmOutput */
- if((dwMode & DM_COPY) || (dwMode & DM_UPDATE)) {
- if (lpdmOutput)
- {
- DEVMODEA *dmA = DEVMODEdupWtoA( &pi->Devmode->dmPublic );
+ if (output && (mode & (DM_COPY | DM_UPDATE)))
+ memcpy( output, &pi->Devmode->dmPublic,
+ pi->Devmode->dmPublic.dmSize + pi->Devmode->dmPublic.dmDriverExtra );
+ return IDOK;
+}
+
+INT CDECL PSDRV_ExtDeviceMode(LPSTR lpszDriver, HWND hwnd, LPDEVMODEA lpdmOutput,
+ LPSTR lpszDevice, LPSTR lpszPort, LPDEVMODEA lpdmInput,
+ LPSTR lpszProfile, DWORD dwMode)
+{
+ DEVMODEW *outputW = NULL, *inputW = NULL;
+ WCHAR *device = NULL;
+ unsigned int len;
+ int ret;
+
+ len = MultiByteToWideChar(CP_ACP, 0, lpszDevice, -1, NULL, 0);
+ if (len) {
+ device = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
+ MultiByteToWideChar(CP_ACP, 0, lpszDevice, -1, device, len);
+ }
+
+ if (lpdmOutput && (dwMode & (DM_COPY | DM_UPDATE))) {
+ ret = DrvDocumentProperties(hwnd, device, NULL, NULL, 0);
+ if (ret <= 0) {
+ HeapFree(GetProcessHeap(), 0, device);
+ return -1;
+ }
+ outputW = HeapAlloc(GetProcessHeap(), 0, ret);
+ }
+
+ if (lpdmInput) inputW = GdiConvertToDevmodeW( lpdmInput );
+
+ ret = DrvDocumentProperties(hwnd, device, outputW, inputW, dwMode);
+
+ if (ret >= 0 && outputW && (dwMode & (DM_COPY | DM_UPDATE))) {
+ DEVMODEA *dmA = DEVMODEdupWtoA( outputW );
if (dmA) memcpy( lpdmOutput, dmA, dmA->dmSize + dmA->dmDriverExtra );
HeapFree( GetProcessHeap(), 0, dmA );
}
- else
- FIXME("lpdmOutput is NULL what should we do??\n");
- }
- return IDOK;
+
+ HeapFree(GetProcessHeap(), 0, device);
+ HeapFree(GetProcessHeap(), 0, inputW);
+ HeapFree(GetProcessHeap(), 0, outputW);
+
+ if (!dwMode && ret > 0) ret -= CCHDEVICENAME + CCHFORMNAME;
+ return ret;
}
+
/***********************************************************************
* PSDRV_DeviceCapabilities
*
diff --git a/dlls/wineps.drv/wineps.drv.spec b/dlls/wineps.drv/wineps.drv.spec
index 6cd7e680350..4dbdc0a2998 100644
--- a/dlls/wineps.drv/wineps.drv.spec
+++ b/dlls/wineps.drv/wineps.drv.spec
@@ -2,3 +2,4 @@
# Printer driver config exports
@ stdcall DrvDeviceCapabilities(ptr wstr long ptr ptr)
+@ stdcall DrvDocumentProperties(long ptr wstr ptr long)
More information about the wine-cvs
mailing list