Get rid of W->A calls: GetPrinterDriverDirectory

Stefan Leichter Stefan.Leichter at camLine.com
Sun Dec 15 03:24:44 CST 2002


Hello,

after spending some days fixing the read-write errors on my DDYS-T18350 disk
here a new patch

Changelog
------------
        moved implementation of GetPrinterDriverDirectory from ascii to unicode

Index: dlls/winspool/info.c
===================================================================
RCS file: /home/wine/wine/dlls/winspool/info.c,v
retrieving revision 1.61
diff -u -r1.61 info.c
--- dlls/winspool/info.c	12 Nov 2002 02:22:24 -0000	1.61
+++ dlls/winspool/info.c	15 Dec 2002 08:40:09 -0000
@@ -41,6 +41,7 @@
 #include "winbase.h"
 #include "winerror.h"
 #include "winreg.h"
+#include "winternl.h"
 #include "wine/windef16.h"
 #include "wine/unicode.h"
 #include "wine/debug.h"
@@ -2390,23 +2391,23 @@
 }
 
 /*****************************************************************************
- *       GetPrinterDriverDirectoryA  [WINSPOOL.@]
+ *       GetPrinterDriverDirectoryW  [WINSPOOL.@]
  */
-BOOL WINAPI GetPrinterDriverDirectoryA(LPSTR pName, LPSTR pEnvironment,
+BOOL WINAPI GetPrinterDriverDirectoryW(LPWSTR pName, LPWSTR pEnvironment,
 				       DWORD Level, LPBYTE pDriverDirectory,
 				       DWORD cbBuf, LPDWORD pcbNeeded)
 {
     DWORD needed;
 
-    TRACE("(%s, %s, %ld, %p, %ld, %p)\n", pName, pEnvironment, Level,
-	  pDriverDirectory, cbBuf, pcbNeeded);
+    TRACE("(%s, %s, %ld, %p, %ld, %p)\n", debugstr_w(pName), 
+          debugstr_w(pEnvironment), Level, pDriverDirectory, cbBuf, pcbNeeded);
     if(pName != NULL) {
-        FIXME("pName = `%s' - unsupported\n", pName);
+        FIXME("pName = `%s' - unsupported\n", debugstr_w(pName));
 	SetLastError(ERROR_INVALID_PARAMETER);
 	return FALSE;
     }
     if(pEnvironment != NULL) {
-        FIXME("pEnvironment = `%s' - unsupported\n", pEnvironment);
+        FIXME("pEnvironment = `%s' - unsupported\n", debugstr_w(pEnvironment));
 	SetLastError(ERROR_INVALID_ENVIRONMENT);
 	return FALSE;
     }
@@ -2414,10 +2415,16 @@
         WARN("Level = %ld - assuming 1\n", Level);
 
     /* FIXME should read from registry */
-    needed = GetSystemDirectoryA(pDriverDirectory, cbBuf);
+    needed = GetSystemDirectoryW( (LPWSTR)pDriverDirectory, cbBuf/sizeof(WCHAR));
+    /* GetSystemDirectoryW returns number of TCHAR without '\0' 
+     * adjust this now
+     */
     needed++;
+    needed*=sizeof(WCHAR);
+
     if(pcbNeeded)
         *pcbNeeded = needed;
+    TRACE("required <%08lx>\n", *pcbNeeded);
     if(needed > cbBuf) {
         SetLastError(ERROR_INSUFFICIENT_BUFFER);
 	return FALSE;
@@ -2427,25 +2434,41 @@
 
 
 /*****************************************************************************
- *       GetPrinterDriverDirectoryW  [WINSPOOL.@]
+ *       GetPrinterDriverDirectoryA  [WINSPOOL.@]
  */
-BOOL WINAPI GetPrinterDriverDirectoryW(LPWSTR pName, LPWSTR pEnvironment,
+BOOL WINAPI GetPrinterDriverDirectoryA(LPSTR pName, LPSTR pEnvironment,
 				       DWORD Level, LPBYTE pDriverDirectory,
 				       DWORD cbBuf, LPDWORD pcbNeeded)
 {
-    LPSTR pNameA = NULL, pEnvironmentA = NULL;
+    UNICODE_STRING nameW, environmentW;
     BOOL ret;
-
-    if(pName)
-        pNameA = HEAP_strdupWtoA( GetProcessHeap(), 0, pName );
-    if(pEnvironment)
-        pEnvironmentA = HEAP_strdupWtoA( GetProcessHeap(), 0, pEnvironment );
-    ret = GetPrinterDriverDirectoryA( pNameA, pEnvironmentA, Level,
-				      pDriverDirectory, cbBuf, pcbNeeded );
-    if(pNameA)
-        HeapFree( GetProcessHeap(), 0, pNameA );
-    if(pEnvironmentA)
-        HeapFree( GetProcessHeap(), 0, pEnvironmentA );
+    DWORD pcbNeededW;
+    INT len = cbBuf * sizeof(WCHAR)/sizeof(CHAR);
+    WCHAR *driverDirectoryW = NULL;
+
+    if (len) driverDirectoryW = HeapAlloc( GetProcessHeap(), 0, len );
+
+    if(pName) RtlCreateUnicodeStringFromAsciiz(&nameW, pName);
+    else nameW.Buffer = NULL;
+    if(pEnvironment) RtlCreateUnicodeStringFromAsciiz(&environmentW, pEnvironment);
+    else environmentW.Buffer = NULL;
+
+    ret = GetPrinterDriverDirectoryW( nameW.Buffer, environmentW.Buffer, Level,
+				      (LPBYTE)driverDirectoryW, len, &pcbNeededW );
+    if (ret) {
+        ret = WideCharToMultiByte( CP_ACP, 0, driverDirectoryW, -1, 
+                                   pDriverDirectory, cbBuf, NULL, NULL);
+        *pcbNeeded = WideCharToMultiByte( CP_ACP, 0, driverDirectoryW, -1,
+                                   NULL, 0, NULL, NULL);
+    } else 
+        *pcbNeeded = pcbNeededW * sizeof(CHAR)/sizeof(WCHAR);
+
+    TRACE("provided<%ld> required <%ld>\n", cbBuf, *pcbNeeded);
+
+    if(driverDirectoryW)
+        HeapFree( GetProcessHeap(), 0, driverDirectoryW );
+    RtlFreeUnicodeString(&environmentW);
+    RtlFreeUnicodeString(&nameW);
 
     return ret;
 }



More information about the wine-patches mailing list