Add a test for GetPrinterDriver, make it pass under Wine
Dmitry Timoshkov
dmitry at codeweavers.com
Fri Apr 14 08:34:57 CDT 2006
Hello,
Changelog:
Add a test for GetPrinterDriver, make it pass under Wine.
diff -up cvs/hq/wine/dlls/winspool/info.c wine/dlls/winspool/info.c
--- cvs/hq/wine/dlls/winspool/info.c 2006-04-13 15:55:56.000000000 +0900
+++ wine/dlls/winspool/info.c 2006-04-14 22:27:33.000000000 +0900
@@ -575,7 +575,7 @@ void WINSPOOL_LoadSystemPrinters(void)
WCHAR PrinterName[256];
BOOL done = FALSE;
- di3a.cVersion = 0x400;
+ di3a.cVersion = (GetVersion() & 0x80000000) ? 0 : 3; /* FIXME: add 1, 2 */
di3a.pName = "PS Driver";
di3a.pEnvironment = NULL; /* NULL means auto */
di3a.pDriverPath = "wineps16";
@@ -2589,7 +2589,13 @@ static BOOL WINSPOOL_GetStringFromReg(HK
*needed = 0;
return FALSE;
}
+ /* add space for terminating '\0' */
+ sz += unicode ? sizeof(WCHAR) : 1;
*needed = sz;
+
+ if (ptr)
+ TRACE("%s: %s\n", debugstr_w(ValueName), unicode ? debugstr_w((LPCWSTR)ptr) : debugstr_a((LPCSTR)ptr));
+
return TRUE;
}
@@ -3326,7 +3332,8 @@ static BOOL WINSPOOL_GetDriverInfoFromRe
DWORD cbBuf, /* size of string buffer */
LPDWORD pcbNeeded, /* space needed for str. */
BOOL unicode) /* type of strings */
-{ DWORD dw, size, tmp, type;
+{
+ DWORD size, tmp;
HKEY hkeyDriver;
LPBYTE strPtr = pDriverStrings;
@@ -3351,7 +3358,7 @@ static BOOL WINSPOOL_GetDriverInfoFromRe
return TRUE;
} else {
if(ptr)
- ((PDRIVER_INFO_3W) ptr)->pName = (LPWSTR) strPtr;
+ ((PDRIVER_INFO_2W) ptr)->pName = (LPWSTR) strPtr;
strPtr = (pDriverStrings) ? (pDriverStrings + (*pcbNeeded)) : NULL;
}
@@ -3361,12 +3368,8 @@ static BOOL WINSPOOL_GetDriverInfoFromRe
return FALSE;
}
- size = sizeof(dw);
- if(RegQueryValueExA(hkeyDriver, "Version", 0, &type, (PBYTE)&dw, &size) !=
- ERROR_SUCCESS)
- WARN("Can't get Version\n");
- else if(ptr)
- ((PDRIVER_INFO_3A) ptr)->cVersion = dw;
+ if(ptr)
+ ((PDRIVER_INFO_2A) ptr)->cVersion = (GetVersion() & 0x80000000) ? 0 : 3; /* FIXME: add 1, 2 */
if(!pEnvironment)
pEnvironment = (LPWSTR)DefaultEnvironmentW;
@@ -3383,7 +3386,7 @@ static BOOL WINSPOOL_GetDriverInfoFromRe
WideCharToMultiByte(CP_ACP, 0, pEnvironment, -1,
(LPSTR)strPtr, size, NULL, NULL);
if(ptr)
- ((PDRIVER_INFO_3W) ptr)->pEnvironment = (LPWSTR)strPtr;
+ ((PDRIVER_INFO_2W) ptr)->pEnvironment = (LPWSTR)strPtr;
strPtr = (pDriverStrings) ? (pDriverStrings + (*pcbNeeded)) : NULL;
}
@@ -3394,7 +3397,7 @@ static BOOL WINSPOOL_GetDriverInfoFromRe
WINSPOOL_GetStringFromReg(hkeyDriver, DriverW, strPtr, size, &tmp,
unicode);
if(ptr)
- ((PDRIVER_INFO_3W) ptr)->pDriverPath = (LPWSTR)strPtr;
+ ((PDRIVER_INFO_2W) ptr)->pDriverPath = (LPWSTR)strPtr;
strPtr = (pDriverStrings) ? (pDriverStrings + (*pcbNeeded)) : NULL;
}
@@ -3405,7 +3408,7 @@ static BOOL WINSPOOL_GetDriverInfoFromRe
WINSPOOL_GetStringFromReg(hkeyDriver, Data_FileW, strPtr, size,
&tmp, unicode);
if(ptr)
- ((PDRIVER_INFO_3W) ptr)->pDataFile = (LPWSTR)strPtr;
+ ((PDRIVER_INFO_2W) ptr)->pDataFile = (LPWSTR)strPtr;
strPtr = (pDriverStrings) ? pDriverStrings + (*pcbNeeded) : NULL;
}
@@ -3416,7 +3419,7 @@ static BOOL WINSPOOL_GetDriverInfoFromRe
WINSPOOL_GetStringFromReg(hkeyDriver, Configuration_FileW, strPtr,
size, &tmp, unicode);
if(ptr)
- ((PDRIVER_INFO_3W) ptr)->pConfigFile = (LPWSTR)strPtr;
+ ((PDRIVER_INFO_2W) ptr)->pConfigFile = (LPWSTR)strPtr;
strPtr = (pDriverStrings) ? pDriverStrings + (*pcbNeeded) : NULL;
}
@@ -3426,7 +3429,7 @@ static BOOL WINSPOOL_GetDriverInfoFromRe
return TRUE;
}
- if(WINSPOOL_GetStringFromReg(hkeyDriver, Help_FileW, strPtr, 0, &size,
+ if (Level != 5 && WINSPOOL_GetStringFromReg(hkeyDriver, Help_FileW, strPtr, 0, &size,
unicode)) {
*pcbNeeded += size;
if(*pcbNeeded <= cbBuf)
@@ -3437,7 +3440,7 @@ static BOOL WINSPOOL_GetDriverInfoFromRe
strPtr = (pDriverStrings) ? pDriverStrings + (*pcbNeeded) : NULL;
}
- if(WINSPOOL_GetStringFromReg(hkeyDriver, Dependent_FilesW, strPtr, 0,
+ if (Level != 5 && WINSPOOL_GetStringFromReg(hkeyDriver, Dependent_FilesW, strPtr, 0,
&size, unicode)) {
*pcbNeeded += size;
if(*pcbNeeded <= cbBuf)
@@ -3448,7 +3451,7 @@ static BOOL WINSPOOL_GetDriverInfoFromRe
strPtr = (pDriverStrings) ? pDriverStrings + (*pcbNeeded) : NULL;
}
- if(WINSPOOL_GetStringFromReg(hkeyDriver, MonitorW, strPtr, 0, &size,
+ if (Level != 5 && WINSPOOL_GetStringFromReg(hkeyDriver, MonitorW, strPtr, 0, &size,
unicode)) {
*pcbNeeded += size;
if(*pcbNeeded <= cbBuf)
@@ -3459,7 +3462,7 @@ static BOOL WINSPOOL_GetDriverInfoFromRe
strPtr = (pDriverStrings) ? pDriverStrings + (*pcbNeeded) : NULL;
}
- if(WINSPOOL_GetStringFromReg(hkeyDriver, DatatypeW, strPtr, 0, &size,
+ if (Level != 5 && WINSPOOL_GetStringFromReg(hkeyDriver, DatatypeW, strPtr, 0, &size,
unicode)) {
*pcbNeeded += size;
if(*pcbNeeded <= cbBuf)
@@ -3498,7 +3501,7 @@ static BOOL WINSPOOL_GetPrinterDriver(HA
SetLastError(ERROR_INVALID_HANDLE);
return FALSE;
}
- if(Level < 1 || Level > 3) {
+ if(Level < 1 || Level > 6) {
SetLastError(ERROR_INVALID_LEVEL);
return FALSE;
}
@@ -3541,6 +3544,15 @@ static BOOL WINSPOOL_GetPrinterDriver(HA
case 3:
size = sizeof(DRIVER_INFO_3W);
break;
+ case 4:
+ size = sizeof(DRIVER_INFO_4W);
+ break;
+ case 5:
+ size = sizeof(DRIVER_INFO_5W);
+ break;
+ case 6:
+ size = sizeof(DRIVER_INFO_6W);
+ break;
default:
ERR("Invalid level\n");
return FALSE;
diff -up cvs/hq/wine/dlls/winspool/tests/info.c wine/dlls/winspool/tests/info.c
--- cvs/hq/wine/dlls/winspool/tests/info.c 2006-04-13 15:55:56.000000000 +0900
+++ wine/dlls/winspool/tests/info.c 2006-04-14 21:48:06.000000000 +0900
@@ -1,6 +1,7 @@
/*
* Copyright (C) 2003, 2004 Stefan Leichter
* Copyright (C) 2005, 2006 Detlef Riekenberg
+ * Copyright (C) 2006 Dmitry Timoshkov
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -911,6 +912,92 @@ static void test_SetDefaultPrinter(void)
}
+static void test_GetPrinterDriver(void)
+{
+ LPSTR default_printer;
+ HANDLE hprn;
+ BOOL ret;
+ BYTE *buf;
+ INT level;
+ DWORD needed, filled;
+
+ default_printer = find_default_printer();
+ if (!default_printer)
+ {
+ trace("There is no default printer installed, skiping the test\n");
+ return;
+ }
+
+ hprn = 0;
+ ret = OpenPrinter(default_printer, &hprn, NULL);
+ if (!ret)
+ {
+ trace("There is no printers installed, skiping the test\n");
+ return;
+ }
+ ok(hprn != 0, "wrong hprn %p\n", hprn);
+
+ for (level = -1; level <= 7; level++)
+ {
+ SetLastError(0xdeadbeef);
+ needed = (DWORD)-1;
+ ret = GetPrinterDriver(hprn, NULL, level, NULL, 0, &needed);
+ ok(!ret, "level %d: GetPrinterDriver should fail\n", level);
+ if (level >= 1 && level <= 6)
+ {
+ ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "wrong error %ld\n", GetLastError());
+ ok(needed > 0,"not expected needed buffer size %ld\n", needed);
+ }
+ else
+ {
+ ok(GetLastError() == ERROR_INVALID_LEVEL, "wrong error %ld\n", GetLastError());
+ ok(needed == (DWORD)-1,"not expected needed buffer size %ld\n", needed);
+ continue;
+ }
+
+ buf = HeapAlloc(GetProcessHeap(), 0, needed);
+
+ SetLastError(0xdeadbeef);
+ filled = -1;
+ ret = GetPrinterDriver(hprn, NULL, level, buf, needed, &filled);
+ ok(ret, "level %d: GetPrinterDriver error %ld\n", level, GetLastError());
+ ok(needed == filled, "needed %ld != filled %ld\n", needed, filled);
+
+ if (level == 2)
+ {
+ DRIVER_INFO_2 *di_2 = (DRIVER_INFO_2 *)buf;
+ DWORD calculated = sizeof(*di_2);
+
+ ok(di_2->cVersion >= 0 && di_2->cVersion <= 3, "di_2->cVersion = %ld\n", di_2->cVersion);
+ ok(di_2->pName != NULL, "not expected NULL ptr\n");
+ ok(di_2->pEnvironment != NULL, "not expected NULL ptr\n");
+ ok(di_2->pDriverPath != NULL, "not expected NULL ptr\n");
+ ok(di_2->pDataFile != NULL, "not expected NULL ptr\n");
+ ok(di_2->pConfigFile != NULL, "not expected NULL ptr\n");
+
+ trace("cVersion %ld\n", di_2->cVersion);
+ trace("pName %s\n", di_2->pName);
+ calculated += strlen(di_2->pName) + 1;
+ trace("pEnvironment %s\n", di_2->pEnvironment);
+ calculated += strlen(di_2->pEnvironment) + 1;
+ trace("pDriverPath %s\n", di_2->pDriverPath);
+ calculated += strlen(di_2->pDriverPath) + 1;
+ trace("pDataFile %s\n", di_2->pDataFile);
+ calculated += strlen(di_2->pDataFile) + 1;
+ trace("pConfigFile %s\n", di_2->pConfigFile);
+ calculated += strlen(di_2->pConfigFile) + 1;
+
+ /* XP allocates memory for both ANSI and unicode names */
+ ok(filled >= calculated,"calculated %ld != filled %ld\n", calculated, filled);
+ }
+
+ HeapFree(GetProcessHeap(), 0, buf);
+ }
+
+ SetLastError(0xdeadbeef);
+ ret = ClosePrinter(hprn);
+ ok(ret, "ClosePrinter error %ld\n", GetLastError());
+}
START_TEST(info)
{
@@ -925,5 +1012,6 @@ START_TEST(info)
test_GetDefaultPrinter();
test_GetPrinterDriverDirectory();
test_OpenPrinter();
+ test_GetPrinterDriver();
test_SetDefaultPrinter();
}
More information about the wine-patches
mailing list