Jacek Caban : winspool: Use DeviceCapabilitiesW for DeviceCapabilitiesA.

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


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

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

winspool: Use DeviceCapabilitiesW for DeviceCapabilitiesA.

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 | 67 +++++++++++++++++++++++++++++++-----------------
 1 file changed, 43 insertions(+), 24 deletions(-)

diff --git a/dlls/winspool.drv/info.c b/dlls/winspool.drv/info.c
index f14ab103ded..d7f2b7fb7d1 100644
--- a/dlls/winspool.drv/info.c
+++ b/dlls/winspool.drv/info.c
@@ -197,9 +197,6 @@ static opened_printer_t **printer_handles;
 static UINT nb_printer_handles;
 static LONG next_job_id = 1;
 
-static DWORD (WINAPI *GDI_CallDeviceCapabilities16)( LPCSTR lpszDevice, LPCSTR lpszPort,
-                                                     WORD fwCapability, LPSTR lpszOutput,
-                                                     LPDEVMODEA lpdm );
 static INT (WINAPI *GDI_CallExtDeviceMode16)( HWND hwnd, LPDEVMODEA lpdmOutput,
                                               LPSTR lpszDevice, LPSTR lpszPort,
                                               LPDEVMODEA lpdmInput, LPSTR lpszProfile,
@@ -2464,34 +2461,56 @@ static void free_printer_info( void *data, DWORD level )
  *              DeviceCapabilitiesA    [WINSPOOL.@]
  *
  */
-INT WINAPI DeviceCapabilitiesA(LPCSTR pDevice,LPCSTR pPort, WORD cap,
-			       LPSTR pOutput, LPDEVMODEA lpdm)
+INT WINAPI DeviceCapabilitiesA(const char *device, const char *portA, WORD cap,
+                               char *output, DEVMODEA *devmodeA)
 {
-    INT ret;
+    WCHAR *device_name = NULL, *port = NULL;
+    DEVMODEW *devmode = NULL;
+    DWORD ret, len;
 
-    TRACE("%s,%s,%u,%p,%p\n", debugstr_a(pDevice), debugstr_a(pPort), cap, pOutput, lpdm);
+    len = MultiByteToWideChar(CP_ACP, 0, device, -1, NULL, 0);
+    if (len) {
+        device_name = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
+        MultiByteToWideChar(CP_ACP, 0, device, -1, device_name, len);
+    }
 
-    if (!GDI_CallDeviceCapabilities16)
-    {
-        GDI_CallDeviceCapabilities16 = (void*)GetProcAddress( GetModuleHandleA("gdi32"),
-                                                              (LPCSTR)104 );
-        if (!GDI_CallDeviceCapabilities16) return -1;
+    len = MultiByteToWideChar(CP_ACP, 0, portA, -1, NULL, 0);
+    if (len) {
+        port = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
+        MultiByteToWideChar(CP_ACP, 0, portA, -1, port, len);
     }
-    ret = GDI_CallDeviceCapabilities16(pDevice, pPort, cap, pOutput, lpdm);
 
-    /* If DC_PAPERSIZE map POINT16s to POINTs */
-    if(ret != -1 && cap == DC_PAPERSIZE && pOutput) {
-        POINT16 *tmp = HeapAlloc( GetProcessHeap(), 0, ret * sizeof(POINT16) );
-        POINT *pt = (POINT *)pOutput;
-	INT i;
-	memcpy(tmp, pOutput, ret * sizeof(POINT16));
-	for(i = 0; i < ret; i++, pt++)
-        {
-            pt->x = tmp[i].x;
-            pt->y = tmp[i].y;
+    if (devmodeA) devmode = GdiConvertToDevmodeW( devmodeA );
+
+    if (output && (cap == DC_BINNAMES || cap == DC_FILEDEPENDENCIES || cap == DC_PAPERNAMES)) {
+        /* These need A -> W translation */
+        unsigned int size = 0, i;
+        WCHAR *outputW;
+
+        ret = DeviceCapabilitiesW(device_name, port, cap, NULL, devmode);
+        if (ret == -1) return ret;
+
+        switch (cap) {
+        case DC_BINNAMES:
+            size = 24;
+            break;
+        case DC_PAPERNAMES:
+        case DC_FILEDEPENDENCIES:
+            size = 64;
+            break;
         }
-	HeapFree( GetProcessHeap(), 0, tmp );
+        outputW = HeapAlloc(GetProcessHeap(), 0, size * ret * sizeof(WCHAR));
+        ret = DeviceCapabilitiesW(device_name, port, cap, outputW, devmode);
+        for (i = 0; i < ret; i++)
+            WideCharToMultiByte(CP_ACP, 0, outputW + (i * size), -1,
+                                output + (i * size), size, NULL, NULL);
+        HeapFree(GetProcessHeap(), 0, outputW);
+    } else {
+        ret = DeviceCapabilitiesW(device_name, port, cap, (WCHAR *)output, devmode);
     }
+    HeapFree(GetProcessHeap(), 0, device_name);
+    HeapFree(GetProcessHeap(), 0, devmode);
+    HeapFree(GetProcessHeap(), 0, port);
     return ret;
 }
 




More information about the wine-cvs mailing list