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