Jacek Caban : winspool: Use DocumentPropertiesW for DocumentPropertiesA.

Alexandre Julliard julliard at winehq.org
Mon Sep 13 16:12:33 CDT 2021


Module: wine
Branch: master
Commit: 8eddb793a6f287cdaa3d9952d07e752b7755a3ca
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=8eddb793a6f287cdaa3d9952d07e752b7755a3ca

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Mon Sep 13 13:50:24 2021 +0200

winspool: Use DocumentPropertiesW for DocumentPropertiesA.

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/winspool.drv/info.c | 82 +++++++++++++++++++-----------------------------
 1 file changed, 33 insertions(+), 49 deletions(-)

diff --git a/dlls/winspool.drv/info.c b/dlls/winspool.drv/info.c
index 76c83345ebb..edfdab218c4 100644
--- a/dlls/winspool.drv/info.c
+++ b/dlls/winspool.drv/info.c
@@ -198,11 +198,6 @@ static opened_printer_t **printer_handles;
 static UINT nb_printer_handles;
 static LONG next_job_id = 1;
 
-static INT (WINAPI *GDI_CallExtDeviceMode16)( HWND hwnd, LPDEVMODEA lpdmOutput,
-                                              LPSTR lpszDevice, LPSTR lpszPort,
-                                              LPDEVMODEA lpdmInput, LPSTR lpszProfile,
-                                              DWORD fwMode );
-
 static const WCHAR DriversW[] = { 'S','y','s','t','e','m','\\',
                                   'C','u', 'r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\',
                                   'c','o','n','t','r','o','l','\\',
@@ -394,18 +389,6 @@ static LPWSTR strdupW(LPCWSTR p)
     return ret;
 }
 
-static LPSTR strdupWtoA( LPCWSTR str )
-{
-    LPSTR ret;
-    INT len;
-
-    if (!str) return NULL;
-    len = WideCharToMultiByte( CP_ACP, 0, str, -1, NULL, 0, NULL, NULL );
-    ret = HeapAlloc( GetProcessHeap(), 0, len );
-    if(ret) WideCharToMultiByte( CP_ACP, 0, str, -1, ret, len, NULL, NULL );
-    return ret;
-}
-
 static DEVMODEW *dup_devmode( const DEVMODEW *dm )
 {
     DEVMODEW *ret;
@@ -2513,46 +2496,47 @@ INT WINAPI DeviceCapabilitiesW(LPCWSTR pDevice, LPCWSTR pPort,
 
 /******************************************************************
  *              DocumentPropertiesA   [WINSPOOL.@]
- *
- * FIXME: implement DocumentPropertiesA via DocumentPropertiesW, not vice versa
  */
-LONG WINAPI DocumentPropertiesA(HWND hWnd,HANDLE hPrinter,
-                                LPSTR pDeviceName, LPDEVMODEA pDevModeOutput,
-				LPDEVMODEA pDevModeInput,DWORD fMode )
+LONG WINAPI DocumentPropertiesA(HWND hwnd, HANDLE printer, char *device_name, DEVMODEA *output,
+				DEVMODEA *input, DWORD mode)
 {
-    LPSTR lpName = pDeviceName, dupname = NULL;
-    static CHAR port[] = "LPT1:";
-    LONG ret;
+    DEVMODEW *outputW = NULL, *inputW = NULL;
+    WCHAR *device = NULL;
+    unsigned int len;
+    int ret;
 
-    TRACE("(%p,%p,%s,%p,%p,%d)\n",
-	hWnd,hPrinter,pDeviceName,pDevModeOutput,pDevModeInput,fMode
-    );
+    TRACE("(%p,%p,%s,%p,%p,%d)\n", hwnd, printer, debugstr_a(device_name), output, input, mode);
 
-    if(!pDeviceName || !*pDeviceName) {
-        LPCWSTR lpNameW = get_opened_printer_name(hPrinter);
-        if(!lpNameW) {
-		ERR("no name from hPrinter?\n");
-                SetLastError(ERROR_INVALID_HANDLE);
-		return -1;
-	}
-	lpName = dupname = strdupWtoA(lpNameW);
+    len = MultiByteToWideChar(CP_ACP, 0, device_name, -1, NULL, 0);
+    if (len) {
+        device = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
+        MultiByteToWideChar(CP_ACP, 0, device_name, -1, device, len);
     }
 
-    if (!GDI_CallExtDeviceMode16)
-    {
-        GDI_CallExtDeviceMode16 = (void*)GetProcAddress( GetModuleHandleA("gdi32"),
-                                                         (LPCSTR)102 );
-        if (!GDI_CallExtDeviceMode16) {
-		ERR("No CallExtDeviceMode16?\n");
-		ret = -1;
-		goto end;
-	}
+    if (output && (mode & (DM_COPY | DM_UPDATE))) {
+        ret = DocumentPropertiesW(hwnd, printer, device, NULL, NULL, 0);
+        if (ret <= 0) {
+            HeapFree(GetProcessHeap(), 0, device);
+            return -1;
+        }
+        outputW = HeapAlloc(GetProcessHeap(), 0, ret);
     }
-    ret = GDI_CallExtDeviceMode16(hWnd, pDevModeOutput, lpName, port,
-				  pDevModeInput, NULL, fMode);
 
-end:
-    HeapFree(GetProcessHeap(), 0, dupname);
+    if (input) inputW = GdiConvertToDevmodeW(input);
+
+    ret = DocumentPropertiesW(hwnd, printer, device, outputW, inputW, mode);
+
+    if (ret >= 0 && outputW && (mode & (DM_COPY | DM_UPDATE))) {
+        DEVMODEA *dmA = DEVMODEdupWtoA( outputW );
+        if (dmA) memcpy(output, dmA, dmA->dmSize + dmA->dmDriverExtra);
+        HeapFree(GetProcessHeap(), 0, dmA);
+    }
+
+    HeapFree(GetProcessHeap(), 0, device);
+    HeapFree(GetProcessHeap(), 0, inputW);
+    HeapFree(GetProcessHeap(), 0, outputW);
+
+    if (!mode && ret > 0) ret -= CCHDEVICENAME + CCHFORMNAME;
     return ret;
 }
 




More information about the wine-cvs mailing list