Fwd: Get rid of W->A calls: GetPrinterDriverDirectory (2nd)

Stefan Leichter Stefan.Leichter at camLine.com
Sat Dec 28 02:41:46 CST 2002


Hello Alexandre,

why is this patch still waiting to be applied? If something is wrong please 
tell it loud on the mailing list.

Stefan
----------  Weitergeleitete Nachricht  ----------

Subject: Fwd: Get rid of W->A calls: GetPrinterDriverDirectory
Date: Sat, 21 Dec 2002 09:52:30 +0100
From: Stefan Leichter <Stefan.Leichter at camLine.com>
To: wine-devel at winehq.com

Hello,

is there any reason why this patch did not made it into CVS & 20021219?

Stefan

----------  Weitergeleitete Nachricht  ----------

Subject: Get rid of W->A calls: GetPrinterDriverDirectory
Date: Sun, 15 Dec 2002 10:24:44 +0100
From: Stefan Leichter <Stefan.Leichter at camLine.com>
To: wine-patches at winehq.com

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-devel mailing list