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(a)camLine.com>
To: wine-devel(a)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(a)camLine.com>
To: wine-patches(a)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;
}
-------------------------------------------------------
-------------------------------------------------------