forked from Mirrors/wine-wine
winspool: Implement IsValidDevmodeW.
Signed-off-by: Dmitry Timoshkov <dmitry@baikal.ru> Signed-off-by: Huw Davies <huw@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>stable
parent
d1a879fb9d
commit
bd7ba264b6
|
@ -104,6 +104,9 @@
|
||||||
#undef UnionRect
|
#undef UnionRect
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define NONAMELESSSTRUCT
|
||||||
|
#define NONAMELESSUNION
|
||||||
|
|
||||||
#include "wine/library.h"
|
#include "wine/library.h"
|
||||||
#include "windef.h"
|
#include "windef.h"
|
||||||
#include "winbase.h"
|
#include "winbase.h"
|
||||||
|
@ -2449,7 +2452,7 @@ LONG WINAPI DocumentPropertiesW(HWND hWnd, HANDLE hPrinter,
|
||||||
* Validate a DEVMODE structure and fix errors if possible.
|
* Validate a DEVMODE structure and fix errors if possible.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
BOOL WINAPI IsValidDevmodeA(PDEVMODEA *pDevMode, SIZE_T size)
|
BOOL WINAPI IsValidDevmodeA(PDEVMODEA pDevMode, SIZE_T size)
|
||||||
{
|
{
|
||||||
FIXME("(%p,%ld): stub\n", pDevMode, size);
|
FIXME("(%p,%ld): stub\n", pDevMode, size);
|
||||||
|
|
||||||
|
@ -2465,12 +2468,55 @@ BOOL WINAPI IsValidDevmodeA(PDEVMODEA *pDevMode, SIZE_T size)
|
||||||
* Validate a DEVMODE structure and fix errors if possible.
|
* Validate a DEVMODE structure and fix errors if possible.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
BOOL WINAPI IsValidDevmodeW(PDEVMODEW *pDevMode, SIZE_T size)
|
BOOL WINAPI IsValidDevmodeW(PDEVMODEW dm, SIZE_T size)
|
||||||
{
|
{
|
||||||
FIXME("(%p,%ld): stub\n", pDevMode, size);
|
static const struct
|
||||||
|
{
|
||||||
|
DWORD flag;
|
||||||
|
SIZE_T size;
|
||||||
|
} map[] =
|
||||||
|
{
|
||||||
|
#define F_SIZE(field) FIELD_OFFSET(DEVMODEW, field) + sizeof(dm->field)
|
||||||
|
{ DM_ORIENTATION, F_SIZE(u1.s1.dmOrientation) },
|
||||||
|
{ DM_PAPERSIZE, F_SIZE(u1.s1.dmPaperSize) },
|
||||||
|
{ DM_PAPERLENGTH, F_SIZE(u1.s1.dmPaperLength) },
|
||||||
|
{ DM_PAPERWIDTH, F_SIZE(u1.s1.dmPaperWidth) },
|
||||||
|
{ DM_SCALE, F_SIZE(u1.s1.dmScale) },
|
||||||
|
{ DM_COPIES, F_SIZE(u1.s1.dmCopies) },
|
||||||
|
{ DM_DEFAULTSOURCE, F_SIZE(u1.s1.dmDefaultSource) },
|
||||||
|
{ DM_PRINTQUALITY, F_SIZE(u1.s1.dmPrintQuality) },
|
||||||
|
{ DM_POSITION, F_SIZE(u1.s2.dmPosition) },
|
||||||
|
{ DM_DISPLAYORIENTATION, F_SIZE(u1.s2.dmDisplayOrientation) },
|
||||||
|
{ DM_DISPLAYFIXEDOUTPUT, F_SIZE(u1.s2.dmDisplayFixedOutput) },
|
||||||
|
{ DM_COLOR, F_SIZE(dmColor) },
|
||||||
|
{ DM_DUPLEX, F_SIZE(dmDuplex) },
|
||||||
|
{ DM_YRESOLUTION, F_SIZE(dmYResolution) },
|
||||||
|
{ DM_TTOPTION, F_SIZE(dmTTOption) },
|
||||||
|
{ DM_COLLATE, F_SIZE(dmCollate) },
|
||||||
|
{ DM_FORMNAME, F_SIZE(dmFormName) },
|
||||||
|
{ DM_LOGPIXELS, F_SIZE(dmLogPixels) },
|
||||||
|
{ DM_BITSPERPEL, F_SIZE(dmBitsPerPel) },
|
||||||
|
{ DM_PELSWIDTH, F_SIZE(dmPelsWidth) },
|
||||||
|
{ DM_PELSHEIGHT, F_SIZE(dmPelsHeight) },
|
||||||
|
{ DM_DISPLAYFLAGS, F_SIZE(u2.dmDisplayFlags) },
|
||||||
|
{ DM_NUP, F_SIZE(u2.dmNup) },
|
||||||
|
{ DM_DISPLAYFREQUENCY, F_SIZE(dmDisplayFrequency) },
|
||||||
|
{ DM_ICMMETHOD, F_SIZE(dmICMMethod) },
|
||||||
|
{ DM_ICMINTENT, F_SIZE(dmICMIntent) },
|
||||||
|
{ DM_MEDIATYPE, F_SIZE(dmMediaType) },
|
||||||
|
{ DM_DITHERTYPE, F_SIZE(dmDitherType) },
|
||||||
|
{ DM_PANNINGWIDTH, F_SIZE(dmPanningWidth) },
|
||||||
|
{ DM_PANNINGHEIGHT, F_SIZE(dmPanningHeight) }
|
||||||
|
#undef F_SIZE
|
||||||
|
};
|
||||||
|
int i;
|
||||||
|
|
||||||
if(!pDevMode)
|
if (!dm) return FALSE;
|
||||||
return FALSE;
|
if (size < FIELD_OFFSET(DEVMODEW, dmFields) + sizeof(dm->dmFields)) return FALSE;
|
||||||
|
|
||||||
|
for (i = 0; i < ARRAY_SIZE(map); i++)
|
||||||
|
if ((dm->dmFields & map[i].flag) && size < map[i].size)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
|
@ -75,8 +75,6 @@ static BOOL (WINAPI * pGetPrinterDriverW)(HANDLE, LPWSTR, DWORD, LPBYTE, DWORD,
|
||||||
static BOOL (WINAPI * pGetPrinterW)(HANDLE, DWORD, LPBYTE, DWORD, LPDWORD);
|
static BOOL (WINAPI * pGetPrinterW)(HANDLE, DWORD, LPBYTE, DWORD, LPDWORD);
|
||||||
static BOOL (WINAPI * pSetDefaultPrinterA)(LPCSTR);
|
static BOOL (WINAPI * pSetDefaultPrinterA)(LPCSTR);
|
||||||
static DWORD (WINAPI * pXcvDataW)(HANDLE, LPCWSTR, PBYTE, DWORD, PBYTE, DWORD, PDWORD, PDWORD);
|
static DWORD (WINAPI * pXcvDataW)(HANDLE, LPCWSTR, PBYTE, DWORD, PBYTE, DWORD, PDWORD, PDWORD);
|
||||||
static BOOL (WINAPI * pIsValidDevmodeW)(PDEVMODEW, SIZE_T);
|
|
||||||
|
|
||||||
|
|
||||||
/* ################################ */
|
/* ################################ */
|
||||||
|
|
||||||
|
@ -2905,26 +2903,6 @@ static void test_DeviceCapabilities(void)
|
||||||
GlobalFree(prn_dlg.hDevNames);
|
GlobalFree(prn_dlg.hDevNames);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void test_IsValidDevmodeW(void)
|
|
||||||
{
|
|
||||||
BOOL br;
|
|
||||||
|
|
||||||
if (!pIsValidDevmodeW)
|
|
||||||
{
|
|
||||||
win_skip("IsValidDevmodeW not implemented.\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
br = pIsValidDevmodeW(NULL, 0);
|
|
||||||
ok(br == FALSE, "Got %d\n", br);
|
|
||||||
|
|
||||||
br = pIsValidDevmodeW(NULL, 1);
|
|
||||||
ok(br == FALSE, "Got %d\n", br);
|
|
||||||
|
|
||||||
br = pIsValidDevmodeW(NULL, sizeof(DEVMODEW));
|
|
||||||
ok(br == FALSE, "Got %d\n", br);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void test_OpenPrinter_defaults(void)
|
static void test_OpenPrinter_defaults(void)
|
||||||
{
|
{
|
||||||
HANDLE printer;
|
HANDLE printer;
|
||||||
|
@ -3044,6 +3022,53 @@ todo_wine
|
||||||
ClosePrinter( printer );
|
ClosePrinter( printer );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void test_IsValidDevmodeW(void)
|
||||||
|
{
|
||||||
|
static const struct
|
||||||
|
{
|
||||||
|
DWORD dmFields;
|
||||||
|
WORD dmSize;
|
||||||
|
BOOL ret;
|
||||||
|
} test[] =
|
||||||
|
{
|
||||||
|
{ 0, FIELD_OFFSET(DEVMODEW, dmFields) + 0, FALSE },
|
||||||
|
{ 0, FIELD_OFFSET(DEVMODEW, dmFields) + 1, FALSE },
|
||||||
|
{ 0, FIELD_OFFSET(DEVMODEW, dmFields) + 2, FALSE },
|
||||||
|
{ 0, FIELD_OFFSET(DEVMODEW, dmFields) + 3, FALSE },
|
||||||
|
{ 0, FIELD_OFFSET(DEVMODEW, dmFields) + 4, TRUE },
|
||||||
|
|
||||||
|
{ DM_ORIENTATION, FIELD_OFFSET(DEVMODEW, u1.s1.dmOrientation) + 0, FALSE },
|
||||||
|
{ DM_ORIENTATION, FIELD_OFFSET(DEVMODEW, u1.s1.dmOrientation) + 1, FALSE },
|
||||||
|
{ DM_ORIENTATION, FIELD_OFFSET(DEVMODEW, u1.s1.dmOrientation) + 2, TRUE },
|
||||||
|
|
||||||
|
{ DM_NUP, FIELD_OFFSET(DEVMODEW, u2.dmNup) + 0, FALSE },
|
||||||
|
{ DM_NUP, FIELD_OFFSET(DEVMODEW, u2.dmNup) + 1, FALSE },
|
||||||
|
{ DM_NUP, FIELD_OFFSET(DEVMODEW, u2.dmNup) + 2, FALSE },
|
||||||
|
{ DM_NUP, FIELD_OFFSET(DEVMODEW, u2.dmNup) + 3, FALSE },
|
||||||
|
{ DM_NUP, FIELD_OFFSET(DEVMODEW, u2.dmNup) + 4, TRUE },
|
||||||
|
|
||||||
|
};
|
||||||
|
DEVMODEW dm;
|
||||||
|
int i;
|
||||||
|
BOOL ret;
|
||||||
|
|
||||||
|
ret = IsValidDevmodeW(NULL, 0);
|
||||||
|
ok(!ret, "got %d\n", ret);
|
||||||
|
|
||||||
|
ret = IsValidDevmodeW(NULL, sizeof(DEVMODEW));
|
||||||
|
ok(!ret, "got %d\n", ret);
|
||||||
|
|
||||||
|
memset(&dm, 0, sizeof(dm));
|
||||||
|
|
||||||
|
for (i = 0; i < ARRAY_SIZE(test); i++)
|
||||||
|
{
|
||||||
|
dm.dmSize = test[i].dmSize;
|
||||||
|
dm.dmFields = test[i].dmFields;
|
||||||
|
ret = IsValidDevmodeW(&dm, dm.dmSize);
|
||||||
|
ok(ret == test[i].ret, "%d: got %d\n", i, ret);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
START_TEST(info)
|
START_TEST(info)
|
||||||
{
|
{
|
||||||
hwinspool = LoadLibraryA("winspool.drv");
|
hwinspool = LoadLibraryA("winspool.drv");
|
||||||
|
@ -3055,7 +3080,6 @@ START_TEST(info)
|
||||||
pGetPrinterW = (void *) GetProcAddress(hwinspool, "GetPrinterW");
|
pGetPrinterW = (void *) GetProcAddress(hwinspool, "GetPrinterW");
|
||||||
pSetDefaultPrinterA = (void *) GetProcAddress(hwinspool, "SetDefaultPrinterA");
|
pSetDefaultPrinterA = (void *) GetProcAddress(hwinspool, "SetDefaultPrinterA");
|
||||||
pXcvDataW = (void *) GetProcAddress(hwinspool, "XcvDataW");
|
pXcvDataW = (void *) GetProcAddress(hwinspool, "XcvDataW");
|
||||||
pIsValidDevmodeW = (void *) GetProcAddress(hwinspool, "IsValidDevmodeW");
|
|
||||||
|
|
||||||
on_win9x = check_win9x();
|
on_win9x = check_win9x();
|
||||||
if (on_win9x)
|
if (on_win9x)
|
||||||
|
|
|
@ -1761,6 +1761,9 @@ BOOL WINAPI XcvDataW(HANDLE hXcv, LPCWSTR pszDataName, PBYTE pInputData,
|
||||||
DWORD cbInputData, PBYTE pOutputData, DWORD cbOutputData,
|
DWORD cbInputData, PBYTE pOutputData, DWORD cbOutputData,
|
||||||
PDWORD pcbOutputNeeded, PDWORD pdwStatus);
|
PDWORD pcbOutputNeeded, PDWORD pdwStatus);
|
||||||
|
|
||||||
|
BOOL WINAPI IsValidDevmodeA(PDEVMODEA pDevMode, SIZE_T size);
|
||||||
|
BOOL WINAPI IsValidDevmodeW(PDEVMODEW pDevMode, SIZE_T size);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
} /* extern "C" */
|
} /* extern "C" */
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue