1
0
mirror of https://github.com/samba-team/samba.git synced 2025-02-12 21:58:10 +03:00

devmode parsing merge from SAMBA_2_2

(This used to be commit 59e49a79b485f5ba26dedff8a7d7fe1c8c77f16a)
This commit is contained in:
Gerald Carter 2002-05-10 16:19:05 +00:00
parent 4f4f56d147
commit 9992378e55

View File

@ -546,8 +546,29 @@ static BOOL spool_io_user_level(char *desc, SPOOL_USER_CTR *q_u, prs_struct *ps,
* on reading allocate memory for the private member
********************************************************************/
#define DM_NUM_OPTIONAL_FIELDS 8
BOOL spoolss_io_devmode(char *desc, prs_struct *ps, int depth, DEVICEMODE *devmode)
{
uint32 available_space; /* size of the device mode left to parse */
/* only important on unmarshalling */
int i = 0;
struct optional_fields {
fstring name;
uint32* field;
} opt_fields[DM_NUM_OPTIONAL_FIELDS] = {
{ "icmmethod", &devmode->icmmethod },
{ "icmintent", &devmode->icmintent },
{ "mediatype", &devmode->mediatype },
{ "dithertype", &devmode->dithertype },
{ "reserved1", &devmode->reserved1 },
{ "reserved2", &devmode->reserved2 },
{ "panningwidth", &devmode->panningwidth },
{ "panningheight", &devmode->panningheight }
};
prs_debug(ps, depth, desc, "spoolss_io_devmode");
depth++;
@ -559,8 +580,27 @@ BOOL spoolss_io_devmode(char *desc, prs_struct *ps, int depth, DEVICEMODE *devmo
if (!prs_uint16uni(True,"devicename", ps, depth, devmode->devicename.buffer, 32))
return False;
if (!prs_uint16("specversion", ps, depth, &devmode->specversion))
return False;
/* Sanity Check - look for unknown specversions, but don't fail if we see one.
Let the size determine that */
switch (devmode->specversion) {
case 0x0320:
case 0x0400:
case 0x0401:
break;
default:
DEBUG(0,("spoolss_io_devmode: Unknown specversion in devicemode [0x%x]\n",
devmode->specversion));
DEBUG(0,("spoolss_io_devmode: please report to samba-technical@samba.org!\n"));
break;
}
if (!prs_uint16("driverversion", ps, depth, &devmode->driverversion))
return False;
if (!prs_uint16("size", ps, depth, &devmode->size))
@ -616,45 +656,50 @@ BOOL spoolss_io_devmode(char *desc, prs_struct *ps, int depth, DEVICEMODE *devmo
return False;
if (!prs_uint32("displayfrequency", ps, depth, &devmode->displayfrequency))
return False;
/*
* every device mode I've ever seen on the wire at least has up
* to the displayfrequency field. --jerry (05-09-2002)
*/
/* add uint32's + uint16's + two UNICODE strings */
available_space = devmode->size - (sizeof(uint32)*6 + sizeof(uint16)*18 + sizeof(uint16)*64);
/* Sanity check - we only have uint32's left tp parse */
if ( available_space && ((available_space % 4) != 0) ) {
DEBUG(0,("spoolss_io_devmode: available_space [%d] no in multiple of 4 bytes (size = %d)!\n",
available_space, devmode->size));
DEBUG(0,("spoolss_io_devmode: please report to samba-technical@samba.org!\n"));
return False;
}
/*
* Conditional parsing. Assume that the DeviceMode has been
* zero'd by the caller.
*/
switch(devmode->specversion) {
/* Used by spooler when issuing OpenPrinter() calls. NT 3.5x? */
case 0x0320:
break;
while (available_space && (i<DM_NUM_OPTIONAL_FIELDS))
{
if (!prs_uint32(opt_fields[i].name, ps, depth, opt_fields[i].field))
return False;
available_space -= sizeof(uint32);
i++;
}
/* Sanity Check - we should no available space at this point unless
MS changes the device mode structure */
/* See the comments on the DEVMODE in the msdn GDI documentation */
case 0x0400:
case 0x0401:
if (!prs_uint32("icmmethod", ps, depth, &devmode->icmmethod))
if (available_space) {
DEBUG(0,("spoolss_io_devmode: I've parsed all I know and there is still stuff left|\n"));
DEBUG(0,("spoolss_io_devmode: available_space = [%d], devmode_size = [%d]!\n",
available_space, devmode->size));
DEBUG(0,("spoolss_io_devmode: please report to samba-technical@samba.org!\n"));
return False;
if (!prs_uint32("icmintent", ps, depth, &devmode->icmintent))
return False;
if (!prs_uint32("mediatype", ps, depth, &devmode->mediatype))
return False;
if (!prs_uint32("dithertype", ps, depth, &devmode->dithertype))
return False;
if (!prs_uint32("reserved1", ps, depth, &devmode->reserved1))
return False;
if (!prs_uint32("reserved2", ps, depth, &devmode->reserved2))
return False;
if (!prs_uint32("panningwidth", ps, depth, &devmode->panningwidth))
return False;
if (!prs_uint32("panningheight", ps, depth, &devmode->panningheight))
return False;
break;
/* log an error if we see something else */
default:
DEBUG(0,("spoolss_io_devmode: Unknown specversion [0x%x]!\n", devmode->specversion));
DEBUG(0,("spoolss_io_devmode: Please report to samba-technical@samba.org\n"));
break;
}
parse_driverextra:
if (devmode->driverextra!=0) {
if (UNMARSHALLING(ps)) {
devmode->private=(uint8 *)prs_alloc_mem(ps, devmode->driverextra*sizeof(uint8));