Dmitry Timoshkov : winspool: Add a test for DeviceCapabilities, fix some bugs found.

Alexandre Julliard julliard at wine.codeweavers.com
Thu Apr 5 06:42:53 CDT 2007


Module: wine
Branch: master
Commit: dddf3487160b63d5788d18bb648ea9b071e28d79
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=dddf3487160b63d5788d18bb648ea9b071e28d79

Author: Dmitry Timoshkov <dmitry at codeweavers.com>
Date:   Sat Apr  7 17:28:10 2007 +0900

winspool: Add a test for DeviceCapabilities, fix some bugs found.

---

 dlls/wineps.drv/driver.c       |   19 +++----
 dlls/winspool.drv/tests/info.c |  122 +++++++++++++++++++++++++++++++++++++++-
 2 files changed, 128 insertions(+), 13 deletions(-)

diff --git a/dlls/wineps.drv/driver.c b/dlls/wineps.drv/driver.c
index 9c3136b..0bc1537 100644
--- a/dlls/wineps.drv/driver.c
+++ b/dlls/wineps.drv/driver.c
@@ -447,15 +447,15 @@ DWORD PSDRV_DeviceCapabilities(LPSTR lpszDriver, LPCSTR lpszDevice, LPCSTR lpszP
   DWORD ret;
   pi = PSDRV_FindPrinterInfo(lpszDevice);
 
-  TRACE("Cap=%d. Got PrinterInfo = %p\n", fwCapability, pi);
-
+  TRACE("%s %s %s, %u, %p, %p\n", debugstr_a(lpszDriver), debugstr_a(lpszDevice),
+        debugstr_a(lpszPort), fwCapability, lpszOutput, lpDevMode);
 
   if (!pi) {
-	  ERR("no printerinfo for %s, return 0!\n",lpszDevice);
-	  return 0;
+      ERR("no printer info for %s %s, return 0!\n",
+          debugstr_a(lpszDriver), debugstr_a(lpszDevice));
+      return 0;
   }
 
-
   lpdm = lpDevMode ? lpDevMode : (DEVMODEA *)pi->Devmode;
 
   switch(fwCapability) {
@@ -468,6 +468,7 @@ DWORD PSDRV_DeviceCapabilities(LPSTR lpszDriver, LPCSTR lpszDevice, LPCSTR lpszP
 
       LIST_FOR_EACH_ENTRY(ps, &pi->ppd->PageSizes, PAGESIZE, entry)
       {
+        TRACE("DC_PAPERS: %u\n", ps->WinPage);
         i++;
 	if(lpszOutput != NULL)
 	  *wp++ = ps->WinPage;
@@ -483,6 +484,7 @@ DWORD PSDRV_DeviceCapabilities(LPSTR lpszDriver, LPCSTR lpszDevice, LPCSTR lpszP
 
       LIST_FOR_EACH_ENTRY(ps, &pi->ppd->PageSizes, PAGESIZE, entry)
       {
+        TRACE("DC_PAPERSIZE: %f x %f\n", ps->PaperDimension->x, ps->PaperDimension->y);
         i++;
 	if(lpszOutput != NULL) {
 	  pt->x = ps->PaperDimension->x * 254.0 / 72.0;
@@ -501,6 +503,7 @@ DWORD PSDRV_DeviceCapabilities(LPSTR lpszDriver, LPCSTR lpszDevice, LPCSTR lpszP
 
       LIST_FOR_EACH_ENTRY(ps, &pi->ppd->PageSizes, PAGESIZE, entry)
       {
+        TRACE("DC_PAPERNAMES: %s\n", debugstr_a(ps->FullName));
         i++;
 	if(lpszOutput != NULL) {
 	  lstrcpynA(cp, ps->FullName, 64);
@@ -593,9 +596,6 @@ DWORD PSDRV_DeviceCapabilities(LPSTR lpszDriver, LPCSTR lpszDevice, LPCSTR lpszP
       POINT ptMax;
       ptMax.x = ptMax.y = 0;
 
-      if(lpszOutput == NULL)
-	return -1;
-
       LIST_FOR_EACH_ENTRY(ps, &pi->ppd->PageSizes, PAGESIZE, entry)
       {
 	if(ps->PaperDimension->x > ptMax.x)
@@ -612,9 +612,6 @@ DWORD PSDRV_DeviceCapabilities(LPSTR lpszDriver, LPCSTR lpszDevice, LPCSTR lpszP
       POINT ptMin;
       ptMin.x = ptMin.y = -1;
 
-      if(lpszOutput == NULL)
-	return -1;
-
       LIST_FOR_EACH_ENTRY(ps, &pi->ppd->PageSizes, PAGESIZE, entry)
       {
 	if(ptMin.x == -1 || ps->PaperDimension->x < ptMin.x)
diff --git a/dlls/winspool.drv/tests/info.c b/dlls/winspool.drv/tests/info.c
index ebfed4b..2862031 100644
--- a/dlls/winspool.drv/tests/info.c
+++ b/dlls/winspool.drv/tests/info.c
@@ -19,16 +19,21 @@
  */
 
 #include <stdarg.h>
+#include <assert.h>
+
+#define NONAMELESSSTRUCT
+#define NONAMELESSUNION
 
-#include "wine/test.h"
 #include "windef.h"
 #include "winbase.h"
 #include "winerror.h"
 #include "wingdi.h"
-#include <winnls.h>
+#include "winnls.h"
 #include "winuser.h"
 #include "winreg.h"
 #include "winspool.h"
+#include "commdlg.h"
+#include "wine/test.h"
 
 #define MAGIC_DEAD  0xdeadbeef
 #define DEFAULT_PRINTER_SIZE 1000
@@ -1990,6 +1995,118 @@ static void test_EnumPrinters(void)
     ok(neededA == neededW, "neededA %d neededW %d\n", neededA, neededW);
 }
 
+static void test_DeviceCapabilities(void)
+{
+    HANDLE hComdlg32;
+    BOOL (WINAPI *pPrintDlgA)(PRINTDLGA *);
+    PRINTDLGA prn_dlg;
+    DEVMODE *dm;
+    DEVNAMES *dn;
+    const char *driver, *device, *port;
+    WORD *papers;
+    POINT *paper_size;
+    POINTS ext;
+    struct
+    {
+        char name[64];
+    } *paper_name;
+    INT n_papers, n_paper_size, n_paper_names, n_copies, ret;
+    DWORD fields;
+
+    hComdlg32 = LoadLibrary("comdlg32.dll");
+    assert(hComdlg32);
+    pPrintDlgA = GetProcAddress(hComdlg32, "PrintDlgA");
+    assert(pPrintDlgA);
+
+    memset(&prn_dlg, 0, sizeof(prn_dlg));
+    prn_dlg.lStructSize = sizeof(prn_dlg);
+    prn_dlg.Flags = PD_RETURNDEFAULT;
+    ret = pPrintDlgA(&prn_dlg);
+    FreeLibrary(hComdlg32);
+    if (!ret)
+    {
+        skip("PrintDlg returned no default printer\n");
+        return;
+    }
+    ok(prn_dlg.hDevMode != 0, "PrintDlg returned hDevMode == NULL\n");
+    ok(prn_dlg.hDevNames != 0, "PrintDlg returned hDevNames == NULL\n");
+
+    dm = GlobalLock(prn_dlg.hDevMode);
+    ok(dm != NULL, "GlobalLock(prn_dlg.hDevMode) failed\n");
+    trace("dmDeviceName \"%s\"\n", dm->dmDeviceName);
+
+    dn = GlobalLock(prn_dlg.hDevNames);
+    ok(dn != NULL, "GlobalLock(prn_dlg.hDevNames) failed\n");
+    ok(dn->wDriverOffset, "expected not 0 wDriverOffset\n");
+    ok(dn->wDeviceOffset, "expected not 0 wDeviceOffset\n");
+    ok(dn->wOutputOffset, "expected not 0 wOutputOffset\n");
+    ok(dn->wDefault == DN_DEFAULTPRN, "expected DN_DEFAULTPRN got %x\n", dn->wDefault);
+    driver = (const char *)dn + dn->wDriverOffset;
+    device = (const char *)dn + dn->wDeviceOffset;
+    port = (const char *)dn + dn->wOutputOffset;
+    trace("driver \"%s\" device \"%s\" port \"%s\"\n", driver, device, port);
+
+    test_DEVMODE(dm, dm->dmSize + dm->dmDriverExtra, device);
+
+    n_papers = DeviceCapabilities(device, port, DC_PAPERS, NULL, NULL);
+    ok(n_papers > 0, "DeviceCapabilities DC_PAPERS failed\n");
+    papers = HeapAlloc(GetProcessHeap(), 0, sizeof(*papers) * n_papers);
+    ret = DeviceCapabilities(device, port, DC_PAPERS, (LPSTR)papers, NULL);
+    ok(ret == n_papers, "expected %d, got %d\n", n_papers, ret);
+#if VERBOSE
+    for (ret = 0; ret < n_papers; ret++)
+        trace("papers[%d] = %d\n", ret, papers[ret]);
+#endif
+    HeapFree(GetProcessHeap(), 0, papers);
+
+    n_paper_size = DeviceCapabilities(device, port, DC_PAPERSIZE, NULL, NULL);
+    ok(n_paper_size > 0, "DeviceCapabilities DC_PAPERSIZE failed\n");
+    ok(n_paper_size == n_papers, "n_paper_size %d != n_papers %d\n", n_paper_size, n_papers);
+    paper_size = HeapAlloc(GetProcessHeap(), 0, sizeof(*paper_size) * n_paper_size);
+    ret = DeviceCapabilities(device, port, DC_PAPERSIZE, (LPSTR)paper_size, NULL);
+    ok(ret == n_paper_size, "expected %d, got %d\n", n_paper_size, ret);
+#if VERBOSE
+    for (ret = 0; ret < n_paper_size; ret++)
+        trace("paper_size[%d] = %d x %d\n", ret, paper_size[ret].x, paper_size[ret].y);
+#endif
+    HeapFree(GetProcessHeap(), 0, paper_size);
+
+    n_paper_names = DeviceCapabilities(device, port, DC_PAPERNAMES, NULL, NULL);
+    ok(n_paper_names > 0, "DeviceCapabilities DC_PAPERNAMES failed\n");
+    ok(n_paper_names == n_papers, "n_paper_names %d != n_papers %d\n", n_paper_names, n_papers);
+    paper_name = HeapAlloc(GetProcessHeap(), 0, sizeof(*paper_name) * n_paper_names);
+    ret = DeviceCapabilities(device, port, DC_PAPERNAMES, (LPSTR)paper_name, NULL);
+    ok(ret == n_paper_names, "expected %d, got %d\n", n_paper_names, ret);
+#if VERBOSE
+    for (ret = 0; ret < n_paper_names; ret++)
+        trace("paper_name[%u] = %s\n", ret, paper_name[ret].name);
+#endif
+    HeapFree(GetProcessHeap(), 0, paper_name);
+
+    n_copies = DeviceCapabilities(device, port, DC_COPIES, NULL, dm);
+    ok(n_copies > 0, "DeviceCapabilities DC_COPIES failed\n");
+    trace("n_copies = %d\n", n_copies);
+
+    ret = DeviceCapabilities(device, port, DC_MAXEXTENT, NULL, NULL);
+    ok(ret != -1, "DeviceCapabilities DC_MAXEXTENT failed\n");
+    ext = MAKEPOINTS(ret);
+    trace("max ext = %d x %d\n", ext.x, ext.y);
+
+    ret = DeviceCapabilities(device, port, DC_MINEXTENT, NULL, NULL);
+    ok(ret != -1, "DeviceCapabilities DC_MINEXTENT failed\n");
+    ext = MAKEPOINTS(ret);
+    trace("min ext = %d x %d\n", ext.x, ext.y);
+
+    fields = DeviceCapabilities(device, port, DC_FIELDS, NULL, NULL);
+    ok(fields != (DWORD)-1, "DeviceCapabilities DC_FIELDS failed\n");
+    ok(fields == dm->dmFields, "fields %x != dm->dmFields %x\n", fields, dm->dmFields);
+
+    GlobalUnlock(prn_dlg.hDevMode);
+    GlobalFree(prn_dlg.hDevMode);
+    GlobalUnlock(prn_dlg.hDevNames);
+    GlobalFree(prn_dlg.hDevNames);
+}
+
 START_TEST(info)
 {
     hwinspool = GetModuleHandleA("winspool.drv");
@@ -2006,6 +2123,7 @@ START_TEST(info)
     test_ConfigurePort();
     test_DeleteMonitor();
     test_DeletePort();
+    test_DeviceCapabilities();
     test_DocumentProperties();
     test_EnumForms(NULL);
     if (default_printer) test_EnumForms(default_printer);




More information about the wine-cvs mailing list