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