2 * Unix SMB/CIFS implementation.
3 * RPC Pipe client / server routines
4 * Copyright (C) Andrew Tridgell 1992-2000,
5 * Copyright (C) Luke Kenneth Casson Leighton 1996-2000,
6 * Copyright (C) Jean François Micouleau 1998-2000,
7 * Copyright (C) Gerald Carter 2000-2002,
8 * Copyright (C) Tim Potter 2001-2002.
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
28 #define DBGC_CLASS DBGC_RPC_PARSE
31 /*******************************************************************
32 This should be moved in a more generic lib.
33 ********************************************************************/
35 BOOL spoolss_io_system_time(const char *desc, prs_struct *ps, int depth, SYSTEMTIME *systime)
37 if(!prs_uint16("year", ps, depth, &systime->year))
39 if(!prs_uint16("month", ps, depth, &systime->month))
41 if(!prs_uint16("dayofweek", ps, depth, &systime->dayofweek))
43 if(!prs_uint16("day", ps, depth, &systime->day))
45 if(!prs_uint16("hour", ps, depth, &systime->hour))
47 if(!prs_uint16("minute", ps, depth, &systime->minute))
49 if(!prs_uint16("second", ps, depth, &systime->second))
51 if(!prs_uint16("milliseconds", ps, depth, &systime->milliseconds))
57 /*******************************************************************
58 ********************************************************************/
60 BOOL make_systemtime(SYSTEMTIME *systime, struct tm *unixtime)
62 systime->year=unixtime->tm_year+1900;
63 systime->month=unixtime->tm_mon+1;
64 systime->dayofweek=unixtime->tm_wday;
65 systime->day=unixtime->tm_mday;
66 systime->hour=unixtime->tm_hour;
67 systime->minute=unixtime->tm_min;
68 systime->second=unixtime->tm_sec;
69 systime->milliseconds=0;
74 /*******************************************************************
75 reads or writes an DOC_INFO structure.
76 ********************************************************************/
78 static BOOL smb_io_doc_info_1(const char *desc, DOC_INFO_1 *info_1, prs_struct *ps, int depth)
80 if (info_1 == NULL) return False;
82 prs_debug(ps, depth, desc, "smb_io_doc_info_1");
88 if(!prs_uint32("p_docname", ps, depth, &info_1->p_docname))
90 if(!prs_uint32("p_outputfile", ps, depth, &info_1->p_outputfile))
92 if(!prs_uint32("p_datatype", ps, depth, &info_1->p_datatype))
95 if(!smb_io_unistr2("", &info_1->docname, info_1->p_docname, ps, depth))
97 if(!smb_io_unistr2("", &info_1->outputfile, info_1->p_outputfile, ps, depth))
99 if(!smb_io_unistr2("", &info_1->datatype, info_1->p_datatype, ps, depth))
105 /*******************************************************************
106 reads or writes an DOC_INFO structure.
107 ********************************************************************/
109 static BOOL smb_io_doc_info(const char *desc, DOC_INFO *info, prs_struct *ps, int depth)
111 uint32 useless_ptr=0;
113 if (info == NULL) return False;
115 prs_debug(ps, depth, desc, "smb_io_doc_info");
121 if(!prs_uint32("switch_value", ps, depth, &info->switch_value))
124 if(!prs_uint32("doc_info_X ptr", ps, depth, &useless_ptr))
127 switch (info->switch_value)
130 if(!smb_io_doc_info_1("",&info->doc_info_1, ps, depth))
135 this is just a placeholder
137 MSDN July 1998 says doc_info_2 is only on
138 Windows 95, and as Win95 doesn't do RPC to print
139 this case is nearly impossible
141 Maybe one day with Windows for dishwasher 2037 ...
144 /* smb_io_doc_info_2("",&info->doc_info_2, ps, depth); */
147 DEBUG(0,("Something is obviously wrong somewhere !\n"));
154 /*******************************************************************
155 reads or writes an DOC_INFO_CONTAINER structure.
156 ********************************************************************/
158 static BOOL smb_io_doc_info_container(const char *desc, DOC_INFO_CONTAINER *cont, prs_struct *ps, int depth)
160 if (cont == NULL) return False;
162 prs_debug(ps, depth, desc, "smb_io_doc_info_container");
168 if(!prs_uint32("level", ps, depth, &cont->level))
171 if(!smb_io_doc_info("",&cont->docinfo, ps, depth))
177 /*******************************************************************
178 reads or writes an NOTIFY OPTION TYPE structure.
179 ********************************************************************/
181 /* NOTIFY_OPTION_TYPE and NOTIFY_OPTION_TYPE_DATA are really one
182 structure. The _TYPE structure is really the deferred referrants (i.e
183 the notify fields array) of the _TYPE structure. -tpot */
185 static BOOL smb_io_notify_option_type(const char *desc, SPOOL_NOTIFY_OPTION_TYPE *type, prs_struct *ps, int depth)
187 prs_debug(ps, depth, desc, "smb_io_notify_option_type");
193 if(!prs_uint16("type", ps, depth, &type->type))
195 if(!prs_uint16("reserved0", ps, depth, &type->reserved0))
197 if(!prs_uint32("reserved1", ps, depth, &type->reserved1))
199 if(!prs_uint32("reserved2", ps, depth, &type->reserved2))
201 if(!prs_uint32("count", ps, depth, &type->count))
203 if(!prs_uint32("fields_ptr", ps, depth, &type->fields_ptr))
209 /*******************************************************************
210 reads or writes an NOTIFY OPTION TYPE DATA.
211 ********************************************************************/
213 static BOOL smb_io_notify_option_type_data(const char *desc, SPOOL_NOTIFY_OPTION_TYPE *type, prs_struct *ps, int depth)
217 prs_debug(ps, depth, desc, "smb_io_notify_option_type_data");
220 /* if there are no fields just return */
221 if (type->fields_ptr==0)
227 if(!prs_uint32("count2", ps, depth, &type->count2))
230 if (type->count2 != type->count)
231 DEBUG(4,("What a mess, count was %x now is %x !\n", type->count, type->count2));
233 /* parse the option type data */
234 for(i=0;i<type->count2;i++)
235 if(!prs_uint16("fields",ps,depth,&type->fields[i]))
240 /*******************************************************************
241 reads or writes an NOTIFY OPTION structure.
242 ********************************************************************/
244 static BOOL smb_io_notify_option_type_ctr(const char *desc, SPOOL_NOTIFY_OPTION_TYPE_CTR *ctr , prs_struct *ps, int depth)
248 prs_debug(ps, depth, desc, "smb_io_notify_option_type_ctr");
251 if(!prs_uint32("count", ps, depth, &ctr->count))
255 if (UNMARSHALLING(ps))
256 if((ctr->type=PRS_ALLOC_MEM(ps,SPOOL_NOTIFY_OPTION_TYPE,ctr->count)) == NULL)
259 /* the option type struct */
260 for(i=0;i<ctr->count;i++)
261 if(!smb_io_notify_option_type("", &ctr->type[i] , ps, depth))
264 /* the type associated with the option type struct */
265 for(i=0;i<ctr->count;i++)
266 if(!smb_io_notify_option_type_data("", &ctr->type[i] , ps, depth))
272 /*******************************************************************
273 reads or writes an NOTIFY OPTION structure.
274 ********************************************************************/
276 static BOOL smb_io_notify_option(const char *desc, SPOOL_NOTIFY_OPTION *option, prs_struct *ps, int depth)
278 prs_debug(ps, depth, desc, "smb_io_notify_option");
281 if(!prs_uint32("version", ps, depth, &option->version))
283 if(!prs_uint32("flags", ps, depth, &option->flags))
285 if(!prs_uint32("count", ps, depth, &option->count))
287 if(!prs_uint32("option_type_ptr", ps, depth, &option->option_type_ptr))
290 /* marshalling or unmarshalling, that would work */
291 if (option->option_type_ptr!=0) {
292 if(!smb_io_notify_option_type_ctr("", &option->ctr ,ps, depth))
296 option->ctr.type=NULL;
303 /*******************************************************************
304 reads or writes an NOTIFY INFO DATA structure.
305 ********************************************************************/
307 static BOOL smb_io_notify_info_data(const char *desc,SPOOL_NOTIFY_INFO_DATA *data, prs_struct *ps, int depth)
309 uint32 useless_ptr=0x0FF0ADDE;
311 prs_debug(ps, depth, desc, "smb_io_notify_info_data");
316 if(!prs_uint16("type", ps, depth, &data->type))
318 if(!prs_uint16("field", ps, depth, &data->field))
321 if(!prs_uint32("how many words", ps, depth, &data->size))
323 if(!prs_uint32("id", ps, depth, &data->id))
325 if(!prs_uint32("how many words", ps, depth, &data->size))
328 switch (data->enc_type) {
330 /* One and two value data has two uint32 values */
332 case NOTIFY_ONE_VALUE:
333 case NOTIFY_TWO_VALUE:
335 if(!prs_uint32("value[0]", ps, depth, &data->notify_data.value[0]))
337 if(!prs_uint32("value[1]", ps, depth, &data->notify_data.value[1]))
341 /* Pointers and strings have a string length and a
342 pointer. For a string the length is expressed as
343 the number of uint16 characters plus a trailing
348 if(!prs_uint32("string length", ps, depth, &data->notify_data.data.length ))
350 if(!prs_uint32("pointer", ps, depth, &useless_ptr))
357 if(!prs_uint32("string length", ps, depth, &data->notify_data.data.length))
360 if(!prs_uint32("pointer", ps, depth, &useless_ptr))
366 if( !prs_uint32( "sd size", ps, depth, &data->notify_data.sd.size ) )
368 if( !prs_uint32( "pointer", ps, depth, &useless_ptr ) )
374 DEBUG(3, ("invalid enc_type %d for smb_io_notify_info_data\n",
382 /*******************************************************************
383 reads or writes an NOTIFY INFO DATA structure.
384 ********************************************************************/
386 BOOL smb_io_notify_info_data_strings(const char *desc,SPOOL_NOTIFY_INFO_DATA *data,
387 prs_struct *ps, int depth)
389 prs_debug(ps, depth, desc, "smb_io_notify_info_data_strings");
395 switch(data->enc_type) {
397 /* No data for values */
399 case NOTIFY_ONE_VALUE:
400 case NOTIFY_TWO_VALUE:
404 /* Strings start with a length in uint16s */
409 data->notify_data.data.length /= 2;
411 if(!prs_uint32("string length", ps, depth, &data->notify_data.data.length))
414 if (UNMARSHALLING(ps)) {
415 data->notify_data.data.string = PRS_ALLOC_MEM(ps, uint16,
416 data->notify_data.data.length);
418 if (!data->notify_data.data.string)
422 if (!prs_uint16uni(True, "string", ps, depth, data->notify_data.data.string,
423 data->notify_data.data.length))
427 data->notify_data.data.length *= 2;
433 if (UNMARSHALLING(ps)) {
434 data->notify_data.data.string = PRS_ALLOC_MEM(ps, uint16,
435 data->notify_data.data.length);
437 if (!data->notify_data.data.string)
441 if(!prs_uint8s(True,"buffer",ps,depth,(uint8*)data->notify_data.data.string,data->notify_data.data.length))
447 if( !prs_uint32("secdesc size ", ps, depth, &data->notify_data.sd.size ) )
449 if ( !sec_io_desc( "sec_desc", &data->notify_data.sd.desc, ps, depth ) )
454 DEBUG(3, ("invalid enc_type %d for smb_io_notify_info_data_strings\n",
460 if (isvalue==False) {
462 /* length of string in unicode include \0 */
463 x=data->notify_data.data.length+1;
465 if (data->field != 16)
466 if(!prs_uint32("string length", ps, depth, &x ))
469 if (MARSHALLING(ps)) {
470 /* These are already in little endian format. Don't byte swap. */
473 /* No memory allocated for this string
474 therefore following the data.string
475 pointer is a bad idea. Use a pointer to
476 the uint32 length union member to
477 provide a source for a unicode NULL */
479 if(!prs_uint8s(True,"string",ps,depth, (uint8 *)&data->notify_data.data.length,x*2))
483 if (data->field == 16)
486 if(!prs_uint16uni(True,"string",ps,depth,data->notify_data.data.string,x))
491 /* Tallocate memory for string */
493 data->notify_data.data.string = PRS_ALLOC_MEM(ps, uint16, x * 2);
494 if (!data->notify_data.data.string)
497 if(!prs_uint16uni(True,"string",ps,depth,data->notify_data.data.string,x))
505 /* Win2k does not seem to put this parse align here */
513 /*******************************************************************
514 reads or writes an NOTIFY INFO structure.
515 ********************************************************************/
517 static BOOL smb_io_notify_info(const char *desc, SPOOL_NOTIFY_INFO *info, prs_struct *ps, int depth)
521 prs_debug(ps, depth, desc, "smb_io_notify_info");
527 if(!prs_uint32("count", ps, depth, &info->count))
529 if(!prs_uint32("version", ps, depth, &info->version))
531 if(!prs_uint32("flags", ps, depth, &info->flags))
533 if(!prs_uint32("count", ps, depth, &info->count))
536 for (i=0;i<info->count;i++) {
537 if(!smb_io_notify_info_data(desc, &info->data[i], ps, depth))
541 /* now do the strings at the end of the stream */
542 for (i=0;i<info->count;i++) {
543 if(!smb_io_notify_info_data_strings(desc, &info->data[i], ps, depth))
550 /*******************************************************************
551 ********************************************************************/
553 BOOL spool_io_user_level_1( const char *desc, prs_struct *ps, int depth, SPOOL_USER_1 *q_u )
555 prs_debug(ps, depth, desc, "");
561 if (!prs_uint32("size", ps, depth, &q_u->size))
564 if (!prs_io_unistr2_p("", ps, depth, &q_u->client_name))
566 if (!prs_io_unistr2_p("", ps, depth, &q_u->user_name))
569 if (!prs_uint32("build", ps, depth, &q_u->build))
571 if (!prs_uint32("major", ps, depth, &q_u->major))
573 if (!prs_uint32("minor", ps, depth, &q_u->minor))
575 if (!prs_uint32("processor", ps, depth, &q_u->processor))
578 if (!prs_io_unistr2("", ps, depth, q_u->client_name))
583 if (!prs_io_unistr2("", ps, depth, q_u->user_name))
589 /*******************************************************************
590 ********************************************************************/
592 static BOOL spool_io_user_level(const char *desc, SPOOL_USER_CTR *q_u, prs_struct *ps, int depth)
597 prs_debug(ps, depth, desc, "spool_io_user_level");
603 if (!prs_uint32("level", ps, depth, &q_u->level))
606 switch ( q_u->level )
609 if ( !prs_pointer( "" , ps, depth, (void**)&q_u->user.user1,
610 sizeof(SPOOL_USER_1), (PRS_POINTER_CAST)spool_io_user_level_1 ))
622 /*******************************************************************
623 * read or write a DEVICEMODE struct.
624 * on reading allocate memory for the private member
625 ********************************************************************/
627 #define DM_NUM_OPTIONAL_FIELDS 8
629 BOOL spoolss_io_devmode(const char *desc, prs_struct *ps, int depth, DEVICEMODE *devmode)
631 int available_space; /* size of the device mode left to parse */
632 /* only important on unmarshalling */
635 struct optional_fields {
638 } opt_fields[DM_NUM_OPTIONAL_FIELDS] = {
639 { "icmmethod", NULL },
640 { "icmintent", NULL },
641 { "mediatype", NULL },
642 { "dithertype", NULL },
643 { "reserved1", NULL },
644 { "reserved2", NULL },
645 { "panningwidth", NULL },
646 { "panningheight", NULL }
649 /* assign at run time to keep non-gcc compilers happy */
651 opt_fields[0].field = &devmode->icmmethod;
652 opt_fields[1].field = &devmode->icmintent;
653 opt_fields[2].field = &devmode->mediatype;
654 opt_fields[3].field = &devmode->dithertype;
655 opt_fields[4].field = &devmode->reserved1;
656 opt_fields[5].field = &devmode->reserved2;
657 opt_fields[6].field = &devmode->panningwidth;
658 opt_fields[7].field = &devmode->panningheight;
661 prs_debug(ps, depth, desc, "spoolss_io_devmode");
664 if (UNMARSHALLING(ps)) {
665 devmode->devicename.buffer = PRS_ALLOC_MEM(ps, uint16, 32);
666 if (devmode->devicename.buffer == NULL)
670 if (!prs_uint16uni(True,"devicename", ps, depth, devmode->devicename.buffer, MAXDEVICENAME))
673 if (!prs_uint16("specversion", ps, depth, &devmode->specversion))
676 if (!prs_uint16("driverversion", ps, depth, &devmode->driverversion))
678 if (!prs_uint16("size", ps, depth, &devmode->size))
680 if (!prs_uint16("driverextra", ps, depth, &devmode->driverextra))
682 if (!prs_uint32("fields", ps, depth, &devmode->fields))
684 if (!prs_uint16("orientation", ps, depth, &devmode->orientation))
686 if (!prs_uint16("papersize", ps, depth, &devmode->papersize))
688 if (!prs_uint16("paperlength", ps, depth, &devmode->paperlength))
690 if (!prs_uint16("paperwidth", ps, depth, &devmode->paperwidth))
692 if (!prs_uint16("scale", ps, depth, &devmode->scale))
694 if (!prs_uint16("copies", ps, depth, &devmode->copies))
696 if (!prs_uint16("defaultsource", ps, depth, &devmode->defaultsource))
698 if (!prs_uint16("printquality", ps, depth, &devmode->printquality))
700 if (!prs_uint16("color", ps, depth, &devmode->color))
702 if (!prs_uint16("duplex", ps, depth, &devmode->duplex))
704 if (!prs_uint16("yresolution", ps, depth, &devmode->yresolution))
706 if (!prs_uint16("ttoption", ps, depth, &devmode->ttoption))
708 if (!prs_uint16("collate", ps, depth, &devmode->collate))
711 if (UNMARSHALLING(ps)) {
712 devmode->formname.buffer = PRS_ALLOC_MEM(ps, uint16, 32);
713 if (devmode->formname.buffer == NULL)
717 if (!prs_uint16uni(True, "formname", ps, depth, devmode->formname.buffer, 32))
719 if (!prs_uint16("logpixels", ps, depth, &devmode->logpixels))
721 if (!prs_uint32("bitsperpel", ps, depth, &devmode->bitsperpel))
723 if (!prs_uint32("pelswidth", ps, depth, &devmode->pelswidth))
725 if (!prs_uint32("pelsheight", ps, depth, &devmode->pelsheight))
727 if (!prs_uint32("displayflags", ps, depth, &devmode->displayflags))
729 if (!prs_uint32("displayfrequency", ps, depth, &devmode->displayfrequency))
732 * every device mode I've ever seen on the wire at least has up
733 * to the displayfrequency field. --jerry (05-09-2002)
736 /* add uint32's + uint16's + two UNICODE strings */
738 available_space = devmode->size - (sizeof(uint32)*6 + sizeof(uint16)*18 + sizeof(uint16)*64);
740 /* Sanity check - we only have uint32's left tp parse */
742 if ( available_space && ((available_space % sizeof(uint32)) != 0) ) {
743 DEBUG(0,("spoolss_io_devmode: available_space [%d] no in multiple of 4 bytes (size = %d)!\n",
744 available_space, devmode->size));
745 DEBUG(0,("spoolss_io_devmode: please report to samba-technical@samba.org!\n"));
750 * Conditional parsing. Assume that the DeviceMode has been
751 * zero'd by the caller.
754 while ((available_space > 0) && (i < DM_NUM_OPTIONAL_FIELDS))
756 DEBUG(11, ("spoolss_io_devmode: [%d] bytes left to parse in devmode\n", available_space));
757 if (!prs_uint32(opt_fields[i].name, ps, depth, opt_fields[i].field))
759 available_space -= sizeof(uint32);
763 /* Sanity Check - we should no available space at this point unless
764 MS changes the device mode structure */
766 if (available_space) {
767 DEBUG(0,("spoolss_io_devmode: I've parsed all I know and there is still stuff left|\n"));
768 DEBUG(0,("spoolss_io_devmode: available_space = [%d], devmode_size = [%d]!\n",
769 available_space, devmode->size));
770 DEBUG(0,("spoolss_io_devmode: please report to samba-technical@samba.org!\n"));
775 if (devmode->driverextra!=0) {
776 if (UNMARSHALLING(ps)) {
777 devmode->private=PRS_ALLOC_MEM(ps, uint8, devmode->driverextra);
778 if(devmode->private == NULL)
780 DEBUG(7,("spoolss_io_devmode: allocated memory [%d] for private\n",devmode->driverextra));
783 DEBUG(7,("spoolss_io_devmode: parsing [%d] bytes of private\n",devmode->driverextra));
784 if (!prs_uint8s(False, "private", ps, depth,
785 devmode->private, devmode->driverextra))
792 /*******************************************************************
793 Read or write a DEVICEMODE container
794 ********************************************************************/
796 static BOOL spoolss_io_devmode_cont(const char *desc, DEVMODE_CTR *dm_c, prs_struct *ps, int depth)
801 prs_debug(ps, depth, desc, "spoolss_io_devmode_cont");
807 if (!prs_uint32("size", ps, depth, &dm_c->size))
810 if (!prs_uint32("devmode_ptr", ps, depth, &dm_c->devmode_ptr))
813 if (dm_c->size==0 || dm_c->devmode_ptr==0) {
814 if (UNMARSHALLING(ps))
815 /* if while reading there is no DEVMODE ... */
820 /* so we have a DEVICEMODE to follow */
821 if (UNMARSHALLING(ps)) {
822 DEBUG(9,("Allocating memory for spoolss_io_devmode\n"));
823 dm_c->devmode=PRS_ALLOC_MEM(ps,DEVICEMODE,1);
824 if(dm_c->devmode == NULL)
828 /* this is bad code, shouldn't be there */
829 if (!prs_uint32("size", ps, depth, &dm_c->size))
832 if (!spoolss_io_devmode(desc, ps, depth, dm_c->devmode))
838 /*******************************************************************
839 ********************************************************************/
841 static BOOL spoolss_io_printer_default(const char *desc, PRINTER_DEFAULT *pd, prs_struct *ps, int depth)
846 prs_debug(ps, depth, desc, "spoolss_io_printer_default");
849 if (!prs_uint32("datatype_ptr", ps, depth, &pd->datatype_ptr))
852 if (!smb_io_unistr2("datatype", &pd->datatype, pd->datatype_ptr, ps,depth))
858 if (!spoolss_io_devmode_cont("", &pd->devmode_cont, ps, depth))
864 if (!prs_uint32("access_required", ps, depth, &pd->access_required))
870 /*******************************************************************
872 ********************************************************************/
874 BOOL make_spoolss_q_open_printer_ex(SPOOL_Q_OPEN_PRINTER_EX *q_u,
875 const fstring printername,
876 const fstring datatype,
877 uint32 access_required,
878 const fstring clientname,
879 const fstring user_name)
881 DEBUG(5,("make_spoolss_q_open_printer_ex\n"));
883 q_u->printername = TALLOC_P( get_talloc_ctx(), UNISTR2 );
884 init_unistr2(q_u->printername, printername, UNI_STR_TERMINATE);
886 q_u->printer_default.datatype_ptr = 0;
888 q_u->printer_default.devmode_cont.size=0;
889 q_u->printer_default.devmode_cont.devmode_ptr=0;
890 q_u->printer_default.devmode_cont.devmode=NULL;
891 q_u->printer_default.access_required=access_required;
893 q_u->user_switch = 1;
895 q_u->user_ctr.level = 1;
896 q_u->user_ctr.user.user1 = TALLOC_P( get_talloc_ctx(), SPOOL_USER_1 );
897 q_u->user_ctr.user.user1->size = strlen(clientname) + strlen(user_name) + 10;
898 q_u->user_ctr.user.user1->build = 1381;
899 q_u->user_ctr.user.user1->major = 2;
900 q_u->user_ctr.user.user1->minor = 0;
901 q_u->user_ctr.user.user1->processor = 0;
903 q_u->user_ctr.user.user1->client_name = TALLOC_P( get_talloc_ctx(), UNISTR2 );
904 q_u->user_ctr.user.user1->user_name = TALLOC_P( get_talloc_ctx(), UNISTR2 );
906 init_unistr2(q_u->user_ctr.user.user1->client_name, clientname, UNI_STR_TERMINATE);
907 init_unistr2(q_u->user_ctr.user.user1->user_name, user_name, UNI_STR_TERMINATE);
912 /*******************************************************************
914 ********************************************************************/
916 BOOL make_spoolss_q_addprinterex( TALLOC_CTX *mem_ctx, SPOOL_Q_ADDPRINTEREX *q_u,
917 const char *srv_name, const char* clientname, const char* user_name,
918 uint32 level, PRINTER_INFO_CTR *ctr)
920 DEBUG(5,("make_spoolss_q_addprinterex\n"));
927 q_u->server_name = TALLOC_P( mem_ctx, UNISTR2 );
928 init_unistr2(q_u->server_name, srv_name, UNI_FLAGS_NONE);
932 q_u->info.level = level;
933 q_u->info.info_ptr = (ctr->printers_2!=NULL)?1:0;
936 /* init q_u->info.info2 from *info */
937 if (!make_spoolss_printer_info_2(mem_ctx, &q_u->info.info_2, ctr->printers_2)) {
938 DEBUG(0,("make_spoolss_q_addprinterex: Unable to fill SPOOL_Q_ADDPRINTEREX struct!\n"));
948 q_u->user_ctr.level = 1;
949 q_u->user_ctr.user.user1->build = 1381;
950 q_u->user_ctr.user.user1->major = 2;
951 q_u->user_ctr.user.user1->minor = 0;
952 q_u->user_ctr.user.user1->processor = 0;
954 q_u->user_ctr.user.user1->client_name = TALLOC_P( mem_ctx, UNISTR2 );
955 q_u->user_ctr.user.user1->user_name = TALLOC_P( mem_ctx, UNISTR2 );
957 init_unistr2(q_u->user_ctr.user.user1->client_name, clientname, UNI_STR_TERMINATE);
958 init_unistr2(q_u->user_ctr.user.user1->user_name, user_name, UNI_STR_TERMINATE);
960 q_u->user_ctr.user.user1->size = q_u->user_ctr.user.user1->user_name->uni_str_len +
961 q_u->user_ctr.user.user1->client_name->uni_str_len + 2;
966 /*******************************************************************
967 create a SPOOL_PRINTER_INFO_2 stuct from a PRINTER_INFO_2 struct
968 *******************************************************************/
970 BOOL make_spoolss_printer_info_2(TALLOC_CTX *mem_ctx, SPOOL_PRINTER_INFO_LEVEL_2 **spool_info2,
971 PRINTER_INFO_2 *info)
974 SPOOL_PRINTER_INFO_LEVEL_2 *inf;
976 /* allocate the necessary memory */
977 if (!(inf=TALLOC_P(mem_ctx, SPOOL_PRINTER_INFO_LEVEL_2))) {
978 DEBUG(0,("make_spoolss_printer_info_2: Unable to allocate SPOOL_PRINTER_INFO_LEVEL_2 sruct!\n"));
982 inf->servername_ptr = (info->servername.buffer!=NULL)?1:0;
983 inf->printername_ptr = (info->printername.buffer!=NULL)?1:0;
984 inf->sharename_ptr = (info->sharename.buffer!=NULL)?1:0;
985 inf->portname_ptr = (info->portname.buffer!=NULL)?1:0;
986 inf->drivername_ptr = (info->drivername.buffer!=NULL)?1:0;
987 inf->comment_ptr = (info->comment.buffer!=NULL)?1:0;
988 inf->location_ptr = (info->location.buffer!=NULL)?1:0;
989 inf->devmode_ptr = (info->devmode!=NULL)?1:0;
990 inf->sepfile_ptr = (info->sepfile.buffer!=NULL)?1:0;
991 inf->printprocessor_ptr = (info->printprocessor.buffer!=NULL)?1:0;
992 inf->datatype_ptr = (info->datatype.buffer!=NULL)?1:0;
993 inf->parameters_ptr = (info->parameters.buffer!=NULL)?1:0;
994 inf->secdesc_ptr = (info->secdesc!=NULL)?1:0;
995 inf->attributes = info->attributes;
996 inf->priority = info->priority;
997 inf->default_priority = info->defaultpriority;
998 inf->starttime = info->starttime;
999 inf->untiltime = info->untiltime;
1000 inf->cjobs = info->cjobs;
1001 inf->averageppm = info->averageppm;
1002 init_unistr2_from_unistr(&inf->servername, &info->servername);
1003 init_unistr2_from_unistr(&inf->printername, &info->printername);
1004 init_unistr2_from_unistr(&inf->sharename, &info->sharename);
1005 init_unistr2_from_unistr(&inf->portname, &info->portname);
1006 init_unistr2_from_unistr(&inf->drivername, &info->drivername);
1007 init_unistr2_from_unistr(&inf->comment, &info->comment);
1008 init_unistr2_from_unistr(&inf->location, &info->location);
1009 init_unistr2_from_unistr(&inf->sepfile, &info->sepfile);
1010 init_unistr2_from_unistr(&inf->printprocessor, &info->printprocessor);
1011 init_unistr2_from_unistr(&inf->datatype, &info->datatype);
1012 init_unistr2_from_unistr(&inf->parameters, &info->parameters);
1013 init_unistr2_from_unistr(&inf->datatype, &info->datatype);
1020 /*******************************************************************
1021 create a SPOOL_PRINTER_INFO_3 struct from a PRINTER_INFO_3 struct
1022 *******************************************************************/
1024 BOOL make_spoolss_printer_info_3(TALLOC_CTX *mem_ctx, SPOOL_PRINTER_INFO_LEVEL_3 **spool_info3,
1025 PRINTER_INFO_3 *info)
1028 SPOOL_PRINTER_INFO_LEVEL_3 *inf;
1030 /* allocate the necessary memory */
1031 if (!(inf=TALLOC_P(mem_ctx, SPOOL_PRINTER_INFO_LEVEL_3))) {
1032 DEBUG(0,("make_spoolss_printer_info_3: Unable to allocate SPOOL_PRINTER_INFO_LEVEL_3 sruct!\n"));
1036 inf->secdesc_ptr = (info->secdesc!=NULL)?1:0;
1043 /*******************************************************************
1044 create a SPOOL_PRINTER_INFO_7 struct from a PRINTER_INFO_7 struct
1045 *******************************************************************/
1047 BOOL make_spoolss_printer_info_7(TALLOC_CTX *mem_ctx, SPOOL_PRINTER_INFO_LEVEL_7 **spool_info7,
1048 PRINTER_INFO_7 *info)
1051 SPOOL_PRINTER_INFO_LEVEL_7 *inf;
1053 /* allocate the necessary memory */
1054 if (!(inf=TALLOC_P(mem_ctx, SPOOL_PRINTER_INFO_LEVEL_7))) {
1055 DEBUG(0,("make_spoolss_printer_info_7: Unable to allocate SPOOL_PRINTER_INFO_LEVEL_7 struct!\n"));
1059 inf->guid_ptr = (info->guid.buffer!=NULL)?1:0;
1060 inf->action = info->action;
1061 init_unistr2_from_unistr(&inf->guid, &info->guid);
1069 /*******************************************************************
1071 * called from spoolss_q_open_printer_ex (srv_spoolss.c)
1072 ********************************************************************/
1074 BOOL spoolss_io_q_open_printer(const char *desc, SPOOL_Q_OPEN_PRINTER *q_u, prs_struct *ps, int depth)
1079 prs_debug(ps, depth, desc, "spoolss_io_q_open_printer");
1085 if (!prs_io_unistr2_p("ptr", ps, depth, &q_u->printername))
1087 if (!prs_io_unistr2("printername", ps, depth, q_u->printername))
1093 if (!spoolss_io_printer_default("", &q_u->printer_default, ps, depth))
1099 /*******************************************************************
1100 * write a structure.
1101 * called from static spoolss_r_open_printer_ex (srv_spoolss.c)
1102 * called from spoolss_open_printer_ex (cli_spoolss.c)
1103 ********************************************************************/
1105 BOOL spoolss_io_r_open_printer(const char *desc, SPOOL_R_OPEN_PRINTER *r_u, prs_struct *ps, int depth)
1107 if (r_u == NULL) return False;
1109 prs_debug(ps, depth, desc, "spoolss_io_r_open_printer");
1115 if (!smb_io_pol_hnd("printer handle",&(r_u->handle),ps,depth))
1118 if (!prs_werror("status code", ps, depth, &(r_u->status)))
1125 /*******************************************************************
1127 * called from spoolss_q_open_printer_ex (srv_spoolss.c)
1128 ********************************************************************/
1130 BOOL spoolss_io_q_open_printer_ex(const char *desc, SPOOL_Q_OPEN_PRINTER_EX *q_u, prs_struct *ps, int depth)
1135 prs_debug(ps, depth, desc, "spoolss_io_q_open_printer_ex");
1141 if (!prs_io_unistr2_p("ptr", ps, depth, &q_u->printername))
1143 if (!prs_io_unistr2("printername", ps, depth, q_u->printername))
1149 if (!spoolss_io_printer_default("", &q_u->printer_default, ps, depth))
1152 if (!prs_uint32("user_switch", ps, depth, &q_u->user_switch))
1154 if (!spool_io_user_level("", &q_u->user_ctr, ps, depth))
1160 /*******************************************************************
1161 * write a structure.
1162 * called from static spoolss_r_open_printer_ex (srv_spoolss.c)
1163 * called from spoolss_open_printer_ex (cli_spoolss.c)
1164 ********************************************************************/
1166 BOOL spoolss_io_r_open_printer_ex(const char *desc, SPOOL_R_OPEN_PRINTER_EX *r_u, prs_struct *ps, int depth)
1168 if (r_u == NULL) return False;
1170 prs_debug(ps, depth, desc, "spoolss_io_r_open_printer_ex");
1176 if (!smb_io_pol_hnd("printer handle",&(r_u->handle),ps,depth))
1179 if (!prs_werror("status code", ps, depth, &(r_u->status)))
1185 /*******************************************************************
1187 ********************************************************************/
1188 BOOL make_spoolss_q_deleteprinterdriverex( TALLOC_CTX *mem_ctx,
1189 SPOOL_Q_DELETEPRINTERDRIVEREX *q_u,
1195 DEBUG(5,("make_spoolss_q_deleteprinterdriverex\n"));
1197 q_u->server_ptr = (server!=NULL)?1:0;
1198 q_u->delete_flags = DPD_DELETE_UNUSED_FILES;
1200 /* these must be NULL terminated or else NT4 will
1201 complain about invalid parameters --jerry */
1202 init_unistr2(&q_u->server, server, UNI_STR_TERMINATE);
1203 init_unistr2(&q_u->arch, arch, UNI_STR_TERMINATE);
1204 init_unistr2(&q_u->driver, driver, UNI_STR_TERMINATE);
1207 q_u->delete_flags |= DPD_DELETE_SPECIFIC_VERSION;
1208 q_u->version = version;
1215 /*******************************************************************
1217 ********************************************************************/
1218 BOOL make_spoolss_q_deleteprinterdriver(
1219 TALLOC_CTX *mem_ctx,
1220 SPOOL_Q_DELETEPRINTERDRIVER *q_u,
1226 DEBUG(5,("make_spoolss_q_deleteprinterdriver\n"));
1228 q_u->server_ptr = (server!=NULL)?1:0;
1230 /* these must be NULL terminated or else NT4 will
1231 complain about invalid parameters --jerry */
1232 init_unistr2(&q_u->server, server, UNI_STR_TERMINATE);
1233 init_unistr2(&q_u->arch, arch, UNI_STR_TERMINATE);
1234 init_unistr2(&q_u->driver, driver, UNI_STR_TERMINATE);
1239 /*******************************************************************
1241 ********************************************************************/
1243 BOOL make_spoolss_q_getprinterdata(SPOOL_Q_GETPRINTERDATA *q_u,
1244 const POLICY_HND *handle,
1245 const char *valuename, uint32 size)
1247 if (q_u == NULL) return False;
1249 DEBUG(5,("make_spoolss_q_getprinterdata\n"));
1251 q_u->handle = *handle;
1252 init_unistr2(&q_u->valuename, valuename, UNI_STR_TERMINATE);
1258 /*******************************************************************
1260 ********************************************************************/
1262 BOOL make_spoolss_q_getprinterdataex(SPOOL_Q_GETPRINTERDATAEX *q_u,
1263 const POLICY_HND *handle,
1264 const char *keyname,
1265 const char *valuename, uint32 size)
1267 if (q_u == NULL) return False;
1269 DEBUG(5,("make_spoolss_q_getprinterdataex\n"));
1271 q_u->handle = *handle;
1272 init_unistr2(&q_u->valuename, valuename, UNI_STR_TERMINATE);
1273 init_unistr2(&q_u->keyname, keyname, UNI_STR_TERMINATE);
1279 /*******************************************************************
1281 * called from spoolss_q_getprinterdata (srv_spoolss.c)
1282 ********************************************************************/
1284 BOOL spoolss_io_q_getprinterdata(const char *desc, SPOOL_Q_GETPRINTERDATA *q_u, prs_struct *ps, int depth)
1289 prs_debug(ps, depth, desc, "spoolss_io_q_getprinterdata");
1294 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1298 if (!smb_io_unistr2("valuename", &q_u->valuename,True,ps,depth))
1302 if (!prs_uint32("size", ps, depth, &q_u->size))
1308 /*******************************************************************
1310 * called from spoolss_q_deleteprinterdata (srv_spoolss.c)
1311 ********************************************************************/
1313 BOOL spoolss_io_q_deleteprinterdata(const char *desc, SPOOL_Q_DELETEPRINTERDATA *q_u, prs_struct *ps, int depth)
1318 prs_debug(ps, depth, desc, "spoolss_io_q_deleteprinterdata");
1323 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1327 if (!smb_io_unistr2("valuename", &q_u->valuename,True,ps,depth))
1333 /*******************************************************************
1334 * write a structure.
1335 * called from spoolss_r_deleteprinterdata (srv_spoolss.c)
1336 ********************************************************************/
1338 BOOL spoolss_io_r_deleteprinterdata(const char *desc, SPOOL_R_DELETEPRINTERDATA *r_u, prs_struct *ps, int depth)
1340 prs_debug(ps, depth, desc, "spoolss_io_r_deleteprinterdata");
1342 if(!prs_werror("status", ps, depth, &r_u->status))
1348 /*******************************************************************
1350 * called from spoolss_q_deleteprinterdataex (srv_spoolss.c)
1351 ********************************************************************/
1353 BOOL spoolss_io_q_deleteprinterdataex(const char *desc, SPOOL_Q_DELETEPRINTERDATAEX *q_u, prs_struct *ps, int depth)
1358 prs_debug(ps, depth, desc, "spoolss_io_q_deleteprinterdataex");
1363 if (!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
1366 if (!smb_io_unistr2("keyname ", &q_u->keyname, True, ps, depth))
1368 if (!smb_io_unistr2("valuename", &q_u->valuename, True, ps, depth))
1374 /*******************************************************************
1375 * write a structure.
1376 * called from spoolss_r_deleteprinterdataex (srv_spoolss.c)
1377 ********************************************************************/
1379 BOOL spoolss_io_r_deleteprinterdataex(const char *desc, SPOOL_R_DELETEPRINTERDATAEX *r_u, prs_struct *ps, int depth)
1381 prs_debug(ps, depth, desc, "spoolss_io_r_deleteprinterdataex");
1384 if(!prs_werror("status", ps, depth, &r_u->status))
1390 /*******************************************************************
1391 * write a structure.
1392 * called from spoolss_r_getprinterdata (srv_spoolss.c)
1393 ********************************************************************/
1395 BOOL spoolss_io_r_getprinterdata(const char *desc, SPOOL_R_GETPRINTERDATA *r_u, prs_struct *ps, int depth)
1400 prs_debug(ps, depth, desc, "spoolss_io_r_getprinterdata");
1405 if (!prs_uint32("type", ps, depth, &r_u->type))
1407 if (!prs_uint32("size", ps, depth, &r_u->size))
1410 if (UNMARSHALLING(ps) && r_u->size) {
1411 r_u->data = PRS_ALLOC_MEM(ps, unsigned char, r_u->size);
1416 if (!prs_uint8s( False, "data", ps, depth, r_u->data, r_u->size ))
1422 if (!prs_uint32("needed", ps, depth, &r_u->needed))
1424 if (!prs_werror("status", ps, depth, &r_u->status))
1430 /*******************************************************************
1432 ********************************************************************/
1434 BOOL make_spoolss_q_closeprinter(SPOOL_Q_CLOSEPRINTER *q_u, POLICY_HND *hnd)
1436 if (q_u == NULL) return False;
1438 DEBUG(5,("make_spoolss_q_closeprinter\n"));
1440 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
1445 /*******************************************************************
1447 * called from static spoolss_q_abortprinter (srv_spoolss.c)
1448 * called from spoolss_abortprinter (cli_spoolss.c)
1449 ********************************************************************/
1451 BOOL spoolss_io_q_abortprinter(const char *desc, SPOOL_Q_ABORTPRINTER *q_u, prs_struct *ps, int depth)
1453 if (q_u == NULL) return False;
1455 prs_debug(ps, depth, desc, "spoolss_io_q_abortprinter");
1461 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1467 /*******************************************************************
1468 * write a structure.
1469 * called from spoolss_r_abortprinter (srv_spoolss.c)
1470 ********************************************************************/
1472 BOOL spoolss_io_r_abortprinter(const char *desc, SPOOL_R_ABORTPRINTER *r_u, prs_struct *ps, int depth)
1474 prs_debug(ps, depth, desc, "spoolss_io_r_abortprinter");
1476 if(!prs_werror("status", ps, depth, &r_u->status))
1482 /*******************************************************************
1484 * called from static spoolss_q_deleteprinter (srv_spoolss.c)
1485 * called from spoolss_deleteprinter (cli_spoolss.c)
1486 ********************************************************************/
1488 BOOL spoolss_io_q_deleteprinter(const char *desc, SPOOL_Q_DELETEPRINTER *q_u, prs_struct *ps, int depth)
1490 if (q_u == NULL) return False;
1492 prs_debug(ps, depth, desc, "spoolss_io_q_deleteprinter");
1498 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1504 /*******************************************************************
1505 * write a structure.
1506 * called from static spoolss_r_deleteprinter (srv_spoolss.c)
1507 * called from spoolss_deleteprinter (cli_spoolss.c)
1508 ********************************************************************/
1510 BOOL spoolss_io_r_deleteprinter(const char *desc, SPOOL_R_DELETEPRINTER *r_u, prs_struct *ps, int depth)
1512 prs_debug(ps, depth, desc, "spoolss_io_r_deleteprinter");
1518 if (!smb_io_pol_hnd("printer handle",&r_u->handle,ps,depth))
1520 if (!prs_werror("status", ps, depth, &r_u->status))
1527 /*******************************************************************
1529 * called from api_spoolss_deleteprinterdriver (srv_spoolss.c)
1530 * called from spoolss_deleteprinterdriver (cli_spoolss.c)
1531 ********************************************************************/
1533 BOOL spoolss_io_q_deleteprinterdriver(const char *desc, SPOOL_Q_DELETEPRINTERDRIVER *q_u, prs_struct *ps, int depth)
1535 if (q_u == NULL) return False;
1537 prs_debug(ps, depth, desc, "spoolss_io_q_deleteprinterdriver");
1543 if(!prs_uint32("server_ptr", ps, depth, &q_u->server_ptr))
1545 if(!smb_io_unistr2("server", &q_u->server, q_u->server_ptr, ps, depth))
1547 if(!smb_io_unistr2("arch", &q_u->arch, True, ps, depth))
1549 if(!smb_io_unistr2("driver", &q_u->driver, True, ps, depth))
1557 /*******************************************************************
1558 * write a structure.
1559 ********************************************************************/
1560 BOOL spoolss_io_r_deleteprinterdriver(const char *desc, SPOOL_R_DELETEPRINTERDRIVER *r_u, prs_struct *ps, int depth)
1562 if (r_u == NULL) return False;
1564 prs_debug(ps, depth, desc, "spoolss_io_r_deleteprinterdriver");
1570 if (!prs_werror("status", ps, depth, &r_u->status))
1577 /*******************************************************************
1579 * called from api_spoolss_deleteprinterdriver (srv_spoolss.c)
1580 * called from spoolss_deleteprinterdriver (cli_spoolss.c)
1581 ********************************************************************/
1583 BOOL spoolss_io_q_deleteprinterdriverex(const char *desc, SPOOL_Q_DELETEPRINTERDRIVEREX *q_u, prs_struct *ps, int depth)
1585 if (q_u == NULL) return False;
1587 prs_debug(ps, depth, desc, "spoolss_io_q_deleteprinterdriverex");
1593 if(!prs_uint32("server_ptr", ps, depth, &q_u->server_ptr))
1595 if(!smb_io_unistr2("server", &q_u->server, q_u->server_ptr, ps, depth))
1597 if(!smb_io_unistr2("arch", &q_u->arch, True, ps, depth))
1599 if(!smb_io_unistr2("driver", &q_u->driver, True, ps, depth))
1605 if(!prs_uint32("delete_flags ", ps, depth, &q_u->delete_flags))
1607 if(!prs_uint32("version ", ps, depth, &q_u->version))
1615 /*******************************************************************
1616 * write a structure.
1617 ********************************************************************/
1618 BOOL spoolss_io_r_deleteprinterdriverex(const char *desc, SPOOL_R_DELETEPRINTERDRIVEREX *r_u, prs_struct *ps, int depth)
1620 if (r_u == NULL) return False;
1622 prs_debug(ps, depth, desc, "spoolss_io_r_deleteprinterdriverex");
1628 if (!prs_werror("status", ps, depth, &r_u->status))
1636 /*******************************************************************
1638 * called from static spoolss_q_closeprinter (srv_spoolss.c)
1639 * called from spoolss_closeprinter (cli_spoolss.c)
1640 ********************************************************************/
1642 BOOL spoolss_io_q_closeprinter(const char *desc, SPOOL_Q_CLOSEPRINTER *q_u, prs_struct *ps, int depth)
1644 if (q_u == NULL) return False;
1646 prs_debug(ps, depth, desc, "spoolss_io_q_closeprinter");
1652 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1658 /*******************************************************************
1659 * write a structure.
1660 * called from static spoolss_r_closeprinter (srv_spoolss.c)
1661 * called from spoolss_closeprinter (cli_spoolss.c)
1662 ********************************************************************/
1664 BOOL spoolss_io_r_closeprinter(const char *desc, SPOOL_R_CLOSEPRINTER *r_u, prs_struct *ps, int depth)
1666 prs_debug(ps, depth, desc, "spoolss_io_r_closeprinter");
1672 if (!smb_io_pol_hnd("printer handle",&r_u->handle,ps,depth))
1674 if (!prs_werror("status", ps, depth, &r_u->status))
1680 /*******************************************************************
1682 * called from spoolss_q_startdocprinter (srv_spoolss.c)
1683 ********************************************************************/
1685 BOOL spoolss_io_q_startdocprinter(const char *desc, SPOOL_Q_STARTDOCPRINTER *q_u, prs_struct *ps, int depth)
1687 if (q_u == NULL) return False;
1689 prs_debug(ps, depth, desc, "spoolss_io_q_startdocprinter");
1695 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1698 if(!smb_io_doc_info_container("",&q_u->doc_info_container, ps, depth))
1704 /*******************************************************************
1705 * write a structure.
1706 * called from spoolss_r_startdocprinter (srv_spoolss.c)
1707 ********************************************************************/
1709 BOOL spoolss_io_r_startdocprinter(const char *desc, SPOOL_R_STARTDOCPRINTER *r_u, prs_struct *ps, int depth)
1711 prs_debug(ps, depth, desc, "spoolss_io_r_startdocprinter");
1713 if(!prs_uint32("jobid", ps, depth, &r_u->jobid))
1715 if(!prs_werror("status", ps, depth, &r_u->status))
1721 /*******************************************************************
1723 * called from spoolss_q_enddocprinter (srv_spoolss.c)
1724 ********************************************************************/
1726 BOOL spoolss_io_q_enddocprinter(const char *desc, SPOOL_Q_ENDDOCPRINTER *q_u, prs_struct *ps, int depth)
1728 if (q_u == NULL) return False;
1730 prs_debug(ps, depth, desc, "spoolss_io_q_enddocprinter");
1736 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1742 /*******************************************************************
1743 * write a structure.
1744 * called from spoolss_r_enddocprinter (srv_spoolss.c)
1745 ********************************************************************/
1747 BOOL spoolss_io_r_enddocprinter(const char *desc, SPOOL_R_ENDDOCPRINTER *r_u, prs_struct *ps, int depth)
1749 prs_debug(ps, depth, desc, "spoolss_io_r_enddocprinter");
1751 if(!prs_werror("status", ps, depth, &r_u->status))
1757 /*******************************************************************
1759 * called from spoolss_q_startpageprinter (srv_spoolss.c)
1760 ********************************************************************/
1762 BOOL spoolss_io_q_startpageprinter(const char *desc, SPOOL_Q_STARTPAGEPRINTER *q_u, prs_struct *ps, int depth)
1764 if (q_u == NULL) return False;
1766 prs_debug(ps, depth, desc, "spoolss_io_q_startpageprinter");
1772 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1778 /*******************************************************************
1779 * write a structure.
1780 * called from spoolss_r_startpageprinter (srv_spoolss.c)
1781 ********************************************************************/
1783 BOOL spoolss_io_r_startpageprinter(const char *desc, SPOOL_R_STARTPAGEPRINTER *r_u, prs_struct *ps, int depth)
1785 prs_debug(ps, depth, desc, "spoolss_io_r_startpageprinter");
1787 if(!prs_werror("status", ps, depth, &r_u->status))
1793 /*******************************************************************
1795 * called from spoolss_q_endpageprinter (srv_spoolss.c)
1796 ********************************************************************/
1798 BOOL spoolss_io_q_endpageprinter(const char *desc, SPOOL_Q_ENDPAGEPRINTER *q_u, prs_struct *ps, int depth)
1800 if (q_u == NULL) return False;
1802 prs_debug(ps, depth, desc, "spoolss_io_q_endpageprinter");
1808 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1814 /*******************************************************************
1815 * write a structure.
1816 * called from spoolss_r_endpageprinter (srv_spoolss.c)
1817 ********************************************************************/
1819 BOOL spoolss_io_r_endpageprinter(const char *desc, SPOOL_R_ENDPAGEPRINTER *r_u, prs_struct *ps, int depth)
1821 prs_debug(ps, depth, desc, "spoolss_io_r_endpageprinter");
1823 if(!prs_werror("status", ps, depth, &r_u->status))
1829 /*******************************************************************
1831 * called from spoolss_q_writeprinter (srv_spoolss.c)
1832 ********************************************************************/
1834 BOOL spoolss_io_q_writeprinter(const char *desc, SPOOL_Q_WRITEPRINTER *q_u, prs_struct *ps, int depth)
1836 if (q_u == NULL) return False;
1838 prs_debug(ps, depth, desc, "spoolss_io_q_writeprinter");
1844 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1846 if(!prs_uint32("buffer_size", ps, depth, &q_u->buffer_size))
1849 if (q_u->buffer_size!=0)
1851 if (UNMARSHALLING(ps))
1852 q_u->buffer=PRS_ALLOC_MEM(ps, uint8, q_u->buffer_size);
1853 if(q_u->buffer == NULL)
1855 if(!prs_uint8s(True, "buffer", ps, depth, q_u->buffer, q_u->buffer_size))
1860 if(!prs_uint32("buffer_size2", ps, depth, &q_u->buffer_size2))
1866 /*******************************************************************
1867 * write a structure.
1868 * called from spoolss_r_writeprinter (srv_spoolss.c)
1869 ********************************************************************/
1871 BOOL spoolss_io_r_writeprinter(const char *desc, SPOOL_R_WRITEPRINTER *r_u, prs_struct *ps, int depth)
1873 prs_debug(ps, depth, desc, "spoolss_io_r_writeprinter");
1875 if(!prs_uint32("buffer_written", ps, depth, &r_u->buffer_written))
1877 if(!prs_werror("status", ps, depth, &r_u->status))
1883 /*******************************************************************
1885 * called from spoolss_q_rffpcnex (srv_spoolss.c)
1886 ********************************************************************/
1888 BOOL spoolss_io_q_rffpcnex(const char *desc, SPOOL_Q_RFFPCNEX *q_u, prs_struct *ps, int depth)
1890 prs_debug(ps, depth, desc, "spoolss_io_q_rffpcnex");
1896 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
1898 if(!prs_uint32("flags", ps, depth, &q_u->flags))
1900 if(!prs_uint32("options", ps, depth, &q_u->options))
1902 if(!prs_uint32("localmachine_ptr", ps, depth, &q_u->localmachine_ptr))
1904 if(!smb_io_unistr2("localmachine", &q_u->localmachine, q_u->localmachine_ptr, ps, depth))
1910 if(!prs_uint32("printerlocal", ps, depth, &q_u->printerlocal))
1913 if(!prs_uint32("option_ptr", ps, depth, &q_u->option_ptr))
1916 if (q_u->option_ptr!=0) {
1918 if (UNMARSHALLING(ps))
1919 if((q_u->option=PRS_ALLOC_MEM(ps,SPOOL_NOTIFY_OPTION,1)) == NULL)
1922 if(!smb_io_notify_option("notify option", q_u->option, ps, depth))
1929 /*******************************************************************
1930 * write a structure.
1931 * called from spoolss_r_rffpcnex (srv_spoolss.c)
1932 ********************************************************************/
1934 BOOL spoolss_io_r_rffpcnex(const char *desc, SPOOL_R_RFFPCNEX *r_u, prs_struct *ps, int depth)
1936 prs_debug(ps, depth, desc, "spoolss_io_r_rffpcnex");
1939 if(!prs_werror("status", ps, depth, &r_u->status))
1945 /*******************************************************************
1947 * called from spoolss_q_rfnpcnex (srv_spoolss.c)
1948 ********************************************************************/
1950 BOOL spoolss_io_q_rfnpcnex(const char *desc, SPOOL_Q_RFNPCNEX *q_u, prs_struct *ps, int depth)
1952 prs_debug(ps, depth, desc, "spoolss_io_q_rfnpcnex");
1958 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1961 if(!prs_uint32("change", ps, depth, &q_u->change))
1964 if(!prs_uint32("option_ptr", ps, depth, &q_u->option_ptr))
1967 if (q_u->option_ptr!=0) {
1969 if (UNMARSHALLING(ps))
1970 if((q_u->option=PRS_ALLOC_MEM(ps,SPOOL_NOTIFY_OPTION,1)) == NULL)
1973 if(!smb_io_notify_option("notify option", q_u->option, ps, depth))
1980 /*******************************************************************
1981 * write a structure.
1982 * called from spoolss_r_rfnpcnex (srv_spoolss.c)
1983 ********************************************************************/
1985 BOOL spoolss_io_r_rfnpcnex(const char *desc, SPOOL_R_RFNPCNEX *r_u, prs_struct *ps, int depth)
1987 prs_debug(ps, depth, desc, "spoolss_io_r_rfnpcnex");
1993 if (!prs_uint32("info_ptr", ps, depth, &r_u->info_ptr))
1996 if(!smb_io_notify_info("notify info", &r_u->info ,ps,depth))
2001 if(!prs_werror("status", ps, depth, &r_u->status))
2007 /*******************************************************************
2008 * return the length of a uint16 (obvious, but the code is clean)
2009 ********************************************************************/
2011 static uint32 size_of_uint16(uint16 *value)
2013 return (sizeof(*value));
2016 /*******************************************************************
2017 * return the length of a uint32 (obvious, but the code is clean)
2018 ********************************************************************/
2020 static uint32 size_of_uint32(uint32 *value)
2022 return (sizeof(*value));
2025 /*******************************************************************
2026 * return the length of a NTTIME (obvious, but the code is clean)
2027 ********************************************************************/
2029 static uint32 size_of_nttime(NTTIME *value)
2031 return (sizeof(*value));
2034 /*******************************************************************
2035 * return the length of a uint32 (obvious, but the code is clean)
2036 ********************************************************************/
2038 static uint32 size_of_device_mode(DEVICEMODE *devmode)
2043 return (4+devmode->size+devmode->driverextra);
2046 /*******************************************************************
2047 * return the length of a uint32 (obvious, but the code is clean)
2048 ********************************************************************/
2050 static uint32 size_of_systemtime(SYSTEMTIME *systime)
2055 return (sizeof(SYSTEMTIME) +4);
2058 /*******************************************************************
2059 Parse a DEVMODE structure and its relative pointer.
2060 ********************************************************************/
2062 static BOOL smb_io_reldevmode(const char *desc, RPC_BUFFER *buffer, int depth, DEVICEMODE **devmode)
2064 prs_struct *ps=&buffer->prs;
2066 prs_debug(ps, depth, desc, "smb_io_reldevmode");
2069 if (MARSHALLING(ps)) {
2070 uint32 struct_offset = prs_offset(ps);
2071 uint32 relative_offset;
2073 if (*devmode == NULL) {
2075 if (!prs_uint32("offset", ps, depth, &relative_offset))
2077 DEBUG(8, ("boing, the devmode was NULL\n"));
2082 buffer->string_at_end -= ((*devmode)->size + (*devmode)->driverextra);
2084 if(!prs_set_offset(ps, buffer->string_at_end))
2087 /* write the DEVMODE */
2088 if (!spoolss_io_devmode(desc, ps, depth, *devmode))
2091 if(!prs_set_offset(ps, struct_offset))
2094 relative_offset=buffer->string_at_end - buffer->struct_start;
2095 /* write its offset */
2096 if (!prs_uint32("offset", ps, depth, &relative_offset))
2102 /* read the offset */
2103 if (!prs_uint32("offset", ps, depth, &buffer->string_at_end))
2105 if (buffer->string_at_end == 0) {
2110 old_offset = prs_offset(ps);
2111 if(!prs_set_offset(ps, buffer->string_at_end + buffer->struct_start))
2114 /* read the string */
2115 if((*devmode=PRS_ALLOC_MEM(ps,DEVICEMODE,1)) == NULL)
2117 if (!spoolss_io_devmode(desc, ps, depth, *devmode))
2120 if(!prs_set_offset(ps, old_offset))
2126 /*******************************************************************
2127 Parse a PRINTER_INFO_0 structure.
2128 ********************************************************************/
2130 BOOL smb_io_printer_info_0(const char *desc, RPC_BUFFER *buffer, PRINTER_INFO_0 *info, int depth)
2132 prs_struct *ps=&buffer->prs;
2134 prs_debug(ps, depth, desc, "smb_io_printer_info_0");
2137 buffer->struct_start=prs_offset(ps);
2139 if (!smb_io_relstr("printername", buffer, depth, &info->printername))
2141 if (!smb_io_relstr("servername", buffer, depth, &info->servername))
2144 if(!prs_uint32("cjobs", ps, depth, &info->cjobs))
2146 if(!prs_uint32("total_jobs", ps, depth, &info->total_jobs))
2148 if(!prs_uint32("total_bytes", ps, depth, &info->total_bytes))
2151 if(!prs_uint16("year", ps, depth, &info->year))
2153 if(!prs_uint16("month", ps, depth, &info->month))
2155 if(!prs_uint16("dayofweek", ps, depth, &info->dayofweek))
2157 if(!prs_uint16("day", ps, depth, &info->day))
2159 if(!prs_uint16("hour", ps, depth, &info->hour))
2161 if(!prs_uint16("minute", ps, depth, &info->minute))
2163 if(!prs_uint16("second", ps, depth, &info->second))
2165 if(!prs_uint16("milliseconds", ps, depth, &info->milliseconds))
2168 if(!prs_uint32("global_counter", ps, depth, &info->global_counter))
2170 if(!prs_uint32("total_pages", ps, depth, &info->total_pages))
2173 if(!prs_uint16("major_version", ps, depth, &info->major_version))
2175 if(!prs_uint16("build_version", ps, depth, &info->build_version))
2177 if(!prs_uint32("unknown7", ps, depth, &info->unknown7))
2179 if(!prs_uint32("unknown8", ps, depth, &info->unknown8))
2181 if(!prs_uint32("unknown9", ps, depth, &info->unknown9))
2183 if(!prs_uint32("session_counter", ps, depth, &info->session_counter))
2185 if(!prs_uint32("unknown11", ps, depth, &info->unknown11))
2187 if(!prs_uint32("printer_errors", ps, depth, &info->printer_errors))
2189 if(!prs_uint32("unknown13", ps, depth, &info->unknown13))
2191 if(!prs_uint32("unknown14", ps, depth, &info->unknown14))
2193 if(!prs_uint32("unknown15", ps, depth, &info->unknown15))
2195 if(!prs_uint32("unknown16", ps, depth, &info->unknown16))
2197 if(!prs_uint32("change_id", ps, depth, &info->change_id))
2199 if(!prs_uint32("unknown18", ps, depth, &info->unknown18))
2201 if(!prs_uint32("status" , ps, depth, &info->status))
2203 if(!prs_uint32("unknown20", ps, depth, &info->unknown20))
2205 if(!prs_uint32("c_setprinter", ps, depth, &info->c_setprinter))
2207 if(!prs_uint16("unknown22", ps, depth, &info->unknown22))
2209 if(!prs_uint16("unknown23", ps, depth, &info->unknown23))
2211 if(!prs_uint16("unknown24", ps, depth, &info->unknown24))
2213 if(!prs_uint16("unknown25", ps, depth, &info->unknown25))
2215 if(!prs_uint16("unknown26", ps, depth, &info->unknown26))
2217 if(!prs_uint16("unknown27", ps, depth, &info->unknown27))
2219 if(!prs_uint16("unknown28", ps, depth, &info->unknown28))
2221 if(!prs_uint16("unknown29", ps, depth, &info->unknown29))
2227 /*******************************************************************
2228 Parse a PRINTER_INFO_1 structure.
2229 ********************************************************************/
2231 BOOL smb_io_printer_info_1(const char *desc, RPC_BUFFER *buffer, PRINTER_INFO_1 *info, int depth)
2233 prs_struct *ps=&buffer->prs;
2235 prs_debug(ps, depth, desc, "smb_io_printer_info_1");
2238 buffer->struct_start=prs_offset(ps);
2240 if (!prs_uint32("flags", ps, depth, &info->flags))
2242 if (!smb_io_relstr("description", buffer, depth, &info->description))
2244 if (!smb_io_relstr("name", buffer, depth, &info->name))
2246 if (!smb_io_relstr("comment", buffer, depth, &info->comment))
2252 /*******************************************************************
2253 Parse a PRINTER_INFO_2 structure.
2254 ********************************************************************/
2256 BOOL smb_io_printer_info_2(const char *desc, RPC_BUFFER *buffer, PRINTER_INFO_2 *info, int depth)
2258 prs_struct *ps=&buffer->prs;
2259 uint32 dm_offset, sd_offset, current_offset;
2260 uint32 dummy_value = 0, has_secdesc = 0;
2262 prs_debug(ps, depth, desc, "smb_io_printer_info_2");
2265 buffer->struct_start=prs_offset(ps);
2267 if (!smb_io_relstr("servername", buffer, depth, &info->servername))
2269 if (!smb_io_relstr("printername", buffer, depth, &info->printername))
2271 if (!smb_io_relstr("sharename", buffer, depth, &info->sharename))
2273 if (!smb_io_relstr("portname", buffer, depth, &info->portname))
2275 if (!smb_io_relstr("drivername", buffer, depth, &info->drivername))
2277 if (!smb_io_relstr("comment", buffer, depth, &info->comment))
2279 if (!smb_io_relstr("location", buffer, depth, &info->location))
2282 /* save current offset and wind forwared by a uint32 */
2283 dm_offset = prs_offset(ps);
2284 if (!prs_uint32("devmode", ps, depth, &dummy_value))
2287 if (!smb_io_relstr("sepfile", buffer, depth, &info->sepfile))
2289 if (!smb_io_relstr("printprocessor", buffer, depth, &info->printprocessor))
2291 if (!smb_io_relstr("datatype", buffer, depth, &info->datatype))
2293 if (!smb_io_relstr("parameters", buffer, depth, &info->parameters))
2296 /* save current offset for the sec_desc */
2297 sd_offset = prs_offset(ps);
2298 if (!prs_uint32("sec_desc", ps, depth, &has_secdesc))
2302 /* save current location so we can pick back up here */
2303 current_offset = prs_offset(ps);
2305 /* parse the devmode */
2306 if (!prs_set_offset(ps, dm_offset))
2308 if (!smb_io_reldevmode("devmode", buffer, depth, &info->devmode))
2311 /* parse the sec_desc */
2312 if (info->secdesc) {
2313 if (!prs_set_offset(ps, sd_offset))
2315 if (!smb_io_relsecdesc("secdesc", buffer, depth, &info->secdesc))
2319 /* pick up where we left off */
2320 if (!prs_set_offset(ps, current_offset))
2323 if (!prs_uint32("attributes", ps, depth, &info->attributes))
2325 if (!prs_uint32("priority", ps, depth, &info->priority))
2327 if (!prs_uint32("defpriority", ps, depth, &info->defaultpriority))
2329 if (!prs_uint32("starttime", ps, depth, &info->starttime))
2331 if (!prs_uint32("untiltime", ps, depth, &info->untiltime))
2333 if (!prs_uint32("status", ps, depth, &info->status))
2335 if (!prs_uint32("jobs", ps, depth, &info->cjobs))
2337 if (!prs_uint32("averageppm", ps, depth, &info->averageppm))
2343 /*******************************************************************
2344 Parse a PRINTER_INFO_3 structure.
2345 ********************************************************************/
2347 BOOL smb_io_printer_info_3(const char *desc, RPC_BUFFER *buffer, PRINTER_INFO_3 *info, int depth)
2349 prs_struct *ps=&buffer->prs;
2351 prs_debug(ps, depth, desc, "smb_io_printer_info_3");
2354 buffer->struct_start=prs_offset(ps);
2356 if (!prs_uint32("flags", ps, depth, &info->flags))
2358 if (!sec_io_desc("sec_desc", &info->secdesc, ps, depth))
2364 /*******************************************************************
2365 Parse a PRINTER_INFO_4 structure.
2366 ********************************************************************/
2368 BOOL smb_io_printer_info_4(const char *desc, RPC_BUFFER *buffer, PRINTER_INFO_4 *info, int depth)
2370 prs_struct *ps=&buffer->prs;
2372 prs_debug(ps, depth, desc, "smb_io_printer_info_4");
2375 buffer->struct_start=prs_offset(ps);
2377 if (!smb_io_relstr("printername", buffer, depth, &info->printername))
2379 if (!smb_io_relstr("servername", buffer, depth, &info->servername))
2381 if (!prs_uint32("attributes", ps, depth, &info->attributes))
2386 /*******************************************************************
2387 Parse a PRINTER_INFO_5 structure.
2388 ********************************************************************/
2390 BOOL smb_io_printer_info_5(const char *desc, RPC_BUFFER *buffer, PRINTER_INFO_5 *info, int depth)
2392 prs_struct *ps=&buffer->prs;
2394 prs_debug(ps, depth, desc, "smb_io_printer_info_5");
2397 buffer->struct_start=prs_offset(ps);
2399 if (!smb_io_relstr("printername", buffer, depth, &info->printername))
2401 if (!smb_io_relstr("portname", buffer, depth, &info->portname))
2403 if (!prs_uint32("attributes", ps, depth, &info->attributes))
2405 if (!prs_uint32("device_not_selected_timeout", ps, depth, &info->device_not_selected_timeout))
2407 if (!prs_uint32("transmission_retry_timeout", ps, depth, &info->transmission_retry_timeout))
2412 /*******************************************************************
2413 Parse a PRINTER_INFO_7 structure.
2414 ********************************************************************/
2416 BOOL smb_io_printer_info_7(const char *desc, RPC_BUFFER *buffer, PRINTER_INFO_7 *info, int depth)
2418 prs_struct *ps=&buffer->prs;
2420 prs_debug(ps, depth, desc, "smb_io_printer_info_7");
2423 buffer->struct_start=prs_offset(ps);
2425 if (!smb_io_relstr("guid", buffer, depth, &info->guid))
2427 if (!prs_uint32("action", ps, depth, &info->action))
2432 /*******************************************************************
2433 Parse a PORT_INFO_1 structure.
2434 ********************************************************************/
2436 BOOL smb_io_port_info_1(const char *desc, RPC_BUFFER *buffer, PORT_INFO_1 *info, int depth)
2438 prs_struct *ps=&buffer->prs;
2440 prs_debug(ps, depth, desc, "smb_io_port_info_1");
2443 buffer->struct_start=prs_offset(ps);
2445 if (!smb_io_relstr("port_name", buffer, depth, &info->port_name))
2451 /*******************************************************************
2452 Parse a PORT_INFO_2 structure.
2453 ********************************************************************/
2455 BOOL smb_io_port_info_2(const char *desc, RPC_BUFFER *buffer, PORT_INFO_2 *info, int depth)
2457 prs_struct *ps=&buffer->prs;
2459 prs_debug(ps, depth, desc, "smb_io_port_info_2");
2462 buffer->struct_start=prs_offset(ps);
2464 if (!smb_io_relstr("port_name", buffer, depth, &info->port_name))
2466 if (!smb_io_relstr("monitor_name", buffer, depth, &info->monitor_name))
2468 if (!smb_io_relstr("description", buffer, depth, &info->description))
2470 if (!prs_uint32("port_type", ps, depth, &info->port_type))
2472 if (!prs_uint32("reserved", ps, depth, &info->reserved))
2478 /*******************************************************************
2479 Parse a DRIVER_INFO_1 structure.
2480 ********************************************************************/
2482 BOOL smb_io_printer_driver_info_1(const char *desc, RPC_BUFFER *buffer, DRIVER_INFO_1 *info, int depth)
2484 prs_struct *ps=&buffer->prs;
2486 prs_debug(ps, depth, desc, "smb_io_printer_driver_info_1");
2489 buffer->struct_start=prs_offset(ps);
2491 if (!smb_io_relstr("name", buffer, depth, &info->name))
2497 /*******************************************************************
2498 Parse a DRIVER_INFO_2 structure.
2499 ********************************************************************/
2501 BOOL smb_io_printer_driver_info_2(const char *desc, RPC_BUFFER *buffer, DRIVER_INFO_2 *info, int depth)
2503 prs_struct *ps=&buffer->prs;
2505 prs_debug(ps, depth, desc, "smb_io_printer_driver_info_2");
2508 buffer->struct_start=prs_offset(ps);
2510 if (!prs_uint32("version", ps, depth, &info->version))
2512 if (!smb_io_relstr("name", buffer, depth, &info->name))
2514 if (!smb_io_relstr("architecture", buffer, depth, &info->architecture))
2516 if (!smb_io_relstr("driverpath", buffer, depth, &info->driverpath))
2518 if (!smb_io_relstr("datafile", buffer, depth, &info->datafile))
2520 if (!smb_io_relstr("configfile", buffer, depth, &info->configfile))
2526 /*******************************************************************
2527 Parse a DRIVER_INFO_3 structure.
2528 ********************************************************************/
2530 BOOL smb_io_printer_driver_info_3(const char *desc, RPC_BUFFER *buffer, DRIVER_INFO_3 *info, int depth)
2532 prs_struct *ps=&buffer->prs;
2534 prs_debug(ps, depth, desc, "smb_io_printer_driver_info_3");
2537 buffer->struct_start=prs_offset(ps);
2539 if (!prs_uint32("version", ps, depth, &info->version))
2541 if (!smb_io_relstr("name", buffer, depth, &info->name))
2543 if (!smb_io_relstr("architecture", buffer, depth, &info->architecture))
2545 if (!smb_io_relstr("driverpath", buffer, depth, &info->driverpath))
2547 if (!smb_io_relstr("datafile", buffer, depth, &info->datafile))
2549 if (!smb_io_relstr("configfile", buffer, depth, &info->configfile))
2551 if (!smb_io_relstr("helpfile", buffer, depth, &info->helpfile))
2554 if (!smb_io_relarraystr("dependentfiles", buffer, depth, &info->dependentfiles))
2557 if (!smb_io_relstr("monitorname", buffer, depth, &info->monitorname))
2559 if (!smb_io_relstr("defaultdatatype", buffer, depth, &info->defaultdatatype))
2565 /*******************************************************************
2566 Parse a DRIVER_INFO_6 structure.
2567 ********************************************************************/
2569 BOOL smb_io_printer_driver_info_6(const char *desc, RPC_BUFFER *buffer, DRIVER_INFO_6 *info, int depth)
2571 prs_struct *ps=&buffer->prs;
2573 prs_debug(ps, depth, desc, "smb_io_printer_driver_info_6");
2576 buffer->struct_start=prs_offset(ps);
2578 if (!prs_uint32("version", ps, depth, &info->version))
2580 if (!smb_io_relstr("name", buffer, depth, &info->name))
2582 if (!smb_io_relstr("architecture", buffer, depth, &info->architecture))
2584 if (!smb_io_relstr("driverpath", buffer, depth, &info->driverpath))
2586 if (!smb_io_relstr("datafile", buffer, depth, &info->datafile))
2588 if (!smb_io_relstr("configfile", buffer, depth, &info->configfile))
2590 if (!smb_io_relstr("helpfile", buffer, depth, &info->helpfile))
2593 if (!smb_io_relarraystr("dependentfiles", buffer, depth, &info->dependentfiles))
2596 if (!smb_io_relstr("monitorname", buffer, depth, &info->monitorname))
2598 if (!smb_io_relstr("defaultdatatype", buffer, depth, &info->defaultdatatype))
2601 if (!smb_io_relarraystr("previousdrivernames", buffer, depth, &info->previousdrivernames))
2604 if (!prs_uint32("date.low", ps, depth, &info->driver_date.low))
2606 if (!prs_uint32("date.high", ps, depth, &info->driver_date.high))
2609 if (!prs_uint32("padding", ps, depth, &info->padding))
2612 if (!prs_uint32("driver_version_low", ps, depth, &info->driver_version_low))
2615 if (!prs_uint32("driver_version_high", ps, depth, &info->driver_version_high))
2618 if (!smb_io_relstr("mfgname", buffer, depth, &info->mfgname))
2620 if (!smb_io_relstr("oem_url", buffer, depth, &info->oem_url))
2622 if (!smb_io_relstr("hardware_id", buffer, depth, &info->hardware_id))
2624 if (!smb_io_relstr("provider", buffer, depth, &info->provider))
2630 /*******************************************************************
2631 Parse a JOB_INFO_1 structure.
2632 ********************************************************************/
2634 BOOL smb_io_job_info_1(const char *desc, RPC_BUFFER *buffer, JOB_INFO_1 *info, int depth)
2636 prs_struct *ps=&buffer->prs;
2638 prs_debug(ps, depth, desc, "smb_io_job_info_1");
2641 buffer->struct_start=prs_offset(ps);
2643 if (!prs_uint32("jobid", ps, depth, &info->jobid))
2645 if (!smb_io_relstr("printername", buffer, depth, &info->printername))
2647 if (!smb_io_relstr("machinename", buffer, depth, &info->machinename))
2649 if (!smb_io_relstr("username", buffer, depth, &info->username))
2651 if (!smb_io_relstr("document", buffer, depth, &info->document))
2653 if (!smb_io_relstr("datatype", buffer, depth, &info->datatype))
2655 if (!smb_io_relstr("text_status", buffer, depth, &info->text_status))
2657 if (!prs_uint32("status", ps, depth, &info->status))
2659 if (!prs_uint32("priority", ps, depth, &info->priority))
2661 if (!prs_uint32("position", ps, depth, &info->position))
2663 if (!prs_uint32("totalpages", ps, depth, &info->totalpages))
2665 if (!prs_uint32("pagesprinted", ps, depth, &info->pagesprinted))
2667 if (!spoolss_io_system_time("submitted", ps, depth, &info->submitted))
2673 /*******************************************************************
2674 Parse a JOB_INFO_2 structure.
2675 ********************************************************************/
2677 BOOL smb_io_job_info_2(const char *desc, RPC_BUFFER *buffer, JOB_INFO_2 *info, int depth)
2680 prs_struct *ps=&buffer->prs;
2682 prs_debug(ps, depth, desc, "smb_io_job_info_2");
2685 buffer->struct_start=prs_offset(ps);
2687 if (!prs_uint32("jobid",ps, depth, &info->jobid))
2689 if (!smb_io_relstr("printername", buffer, depth, &info->printername))
2691 if (!smb_io_relstr("machinename", buffer, depth, &info->machinename))
2693 if (!smb_io_relstr("username", buffer, depth, &info->username))
2695 if (!smb_io_relstr("document", buffer, depth, &info->document))
2697 if (!smb_io_relstr("notifyname", buffer, depth, &info->notifyname))
2699 if (!smb_io_relstr("datatype", buffer, depth, &info->datatype))
2702 if (!smb_io_relstr("printprocessor", buffer, depth, &info->printprocessor))
2704 if (!smb_io_relstr("parameters", buffer, depth, &info->parameters))
2706 if (!smb_io_relstr("drivername", buffer, depth, &info->drivername))
2708 if (!smb_io_reldevmode("devmode", buffer, depth, &info->devmode))
2710 if (!smb_io_relstr("text_status", buffer, depth, &info->text_status))
2713 /* SEC_DESC sec_desc;*/
2714 if (!prs_uint32("Hack! sec desc", ps, depth, &pipo))
2717 if (!prs_uint32("status",ps, depth, &info->status))
2719 if (!prs_uint32("priority",ps, depth, &info->priority))
2721 if (!prs_uint32("position",ps, depth, &info->position))
2723 if (!prs_uint32("starttime",ps, depth, &info->starttime))
2725 if (!prs_uint32("untiltime",ps, depth, &info->untiltime))
2727 if (!prs_uint32("totalpages",ps, depth, &info->totalpages))
2729 if (!prs_uint32("size",ps, depth, &info->size))
2731 if (!spoolss_io_system_time("submitted", ps, depth, &info->submitted) )
2733 if (!prs_uint32("timeelapsed",ps, depth, &info->timeelapsed))
2735 if (!prs_uint32("pagesprinted",ps, depth, &info->pagesprinted))
2741 /*******************************************************************
2742 ********************************************************************/
2744 BOOL smb_io_form_1(const char *desc, RPC_BUFFER *buffer, FORM_1 *info, int depth)
2746 prs_struct *ps=&buffer->prs;
2748 prs_debug(ps, depth, desc, "smb_io_form_1");
2751 buffer->struct_start=prs_offset(ps);
2753 if (!prs_uint32("flag", ps, depth, &info->flag))
2756 if (!smb_io_relstr("name", buffer, depth, &info->name))
2759 if (!prs_uint32("width", ps, depth, &info->width))
2761 if (!prs_uint32("length", ps, depth, &info->length))
2763 if (!prs_uint32("left", ps, depth, &info->left))
2765 if (!prs_uint32("top", ps, depth, &info->top))
2767 if (!prs_uint32("right", ps, depth, &info->right))
2769 if (!prs_uint32("bottom", ps, depth, &info->bottom))
2777 /*******************************************************************
2778 Parse a DRIVER_DIRECTORY_1 structure.
2779 ********************************************************************/
2781 BOOL smb_io_driverdir_1(const char *desc, RPC_BUFFER *buffer, DRIVER_DIRECTORY_1 *info, int depth)
2783 prs_struct *ps=&buffer->prs;
2785 prs_debug(ps, depth, desc, "smb_io_driverdir_1");
2788 buffer->struct_start=prs_offset(ps);
2790 if (!smb_io_unistr(desc, &info->name, ps, depth))
2796 /*******************************************************************
2797 Parse a PORT_INFO_1 structure.
2798 ********************************************************************/
2800 BOOL smb_io_port_1(const char *desc, RPC_BUFFER *buffer, PORT_INFO_1 *info, int depth)
2802 prs_struct *ps=&buffer->prs;
2804 prs_debug(ps, depth, desc, "smb_io_port_1");
2807 buffer->struct_start=prs_offset(ps);
2809 if(!smb_io_relstr("port_name", buffer, depth, &info->port_name))
2815 /*******************************************************************
2816 Parse a PORT_INFO_2 structure.
2817 ********************************************************************/
2819 BOOL smb_io_port_2(const char *desc, RPC_BUFFER *buffer, PORT_INFO_2 *info, int depth)
2821 prs_struct *ps=&buffer->prs;
2823 prs_debug(ps, depth, desc, "smb_io_port_2");
2826 buffer->struct_start=prs_offset(ps);
2828 if(!smb_io_relstr("port_name", buffer, depth, &info->port_name))
2830 if(!smb_io_relstr("monitor_name", buffer, depth, &info->monitor_name))
2832 if(!smb_io_relstr("description", buffer, depth, &info->description))
2834 if(!prs_uint32("port_type", ps, depth, &info->port_type))
2836 if(!prs_uint32("reserved", ps, depth, &info->reserved))
2842 /*******************************************************************
2843 ********************************************************************/
2845 BOOL smb_io_printprocessor_info_1(const char *desc, RPC_BUFFER *buffer, PRINTPROCESSOR_1 *info, int depth)
2847 prs_struct *ps=&buffer->prs;
2849 prs_debug(ps, depth, desc, "smb_io_printprocessor_info_1");
2852 buffer->struct_start=prs_offset(ps);
2854 if (smb_io_relstr("name", buffer, depth, &info->name))
2860 /*******************************************************************
2861 ********************************************************************/
2863 BOOL smb_io_printprocdatatype_info_1(const char *desc, RPC_BUFFER *buffer, PRINTPROCDATATYPE_1 *info, int depth)
2865 prs_struct *ps=&buffer->prs;
2867 prs_debug(ps, depth, desc, "smb_io_printprocdatatype_info_1");
2870 buffer->struct_start=prs_offset(ps);
2872 if (smb_io_relstr("name", buffer, depth, &info->name))
2878 /*******************************************************************
2879 ********************************************************************/
2881 BOOL smb_io_printmonitor_info_1(const char *desc, RPC_BUFFER *buffer, PRINTMONITOR_1 *info, int depth)
2883 prs_struct *ps=&buffer->prs;
2885 prs_debug(ps, depth, desc, "smb_io_printmonitor_info_1");
2888 buffer->struct_start=prs_offset(ps);
2890 if (!smb_io_relstr("name", buffer, depth, &info->name))
2896 /*******************************************************************
2897 ********************************************************************/
2899 BOOL smb_io_printmonitor_info_2(const char *desc, RPC_BUFFER *buffer, PRINTMONITOR_2 *info, int depth)
2901 prs_struct *ps=&buffer->prs;
2903 prs_debug(ps, depth, desc, "smb_io_printmonitor_info_2");
2906 buffer->struct_start=prs_offset(ps);
2908 if (!smb_io_relstr("name", buffer, depth, &info->name))
2910 if (!smb_io_relstr("environment", buffer, depth, &info->environment))
2912 if (!smb_io_relstr("dll_name", buffer, depth, &info->dll_name))
2918 /*******************************************************************
2919 return the size required by a struct in the stream
2920 ********************************************************************/
2922 uint32 spoolss_size_printer_info_0(PRINTER_INFO_0 *info)
2926 size+=size_of_relative_string( &info->printername );
2927 size+=size_of_relative_string( &info->servername );
2929 size+=size_of_uint32( &info->cjobs);
2930 size+=size_of_uint32( &info->total_jobs);
2931 size+=size_of_uint32( &info->total_bytes);
2933 size+=size_of_uint16( &info->year);
2934 size+=size_of_uint16( &info->month);
2935 size+=size_of_uint16( &info->dayofweek);
2936 size+=size_of_uint16( &info->day);
2937 size+=size_of_uint16( &info->hour);
2938 size+=size_of_uint16( &info->minute);
2939 size+=size_of_uint16( &info->second);
2940 size+=size_of_uint16( &info->milliseconds);
2942 size+=size_of_uint32( &info->global_counter);
2943 size+=size_of_uint32( &info->total_pages);
2945 size+=size_of_uint16( &info->major_version);
2946 size+=size_of_uint16( &info->build_version);
2948 size+=size_of_uint32( &info->unknown7);
2949 size+=size_of_uint32( &info->unknown8);
2950 size+=size_of_uint32( &info->unknown9);
2951 size+=size_of_uint32( &info->session_counter);
2952 size+=size_of_uint32( &info->unknown11);
2953 size+=size_of_uint32( &info->printer_errors);
2954 size+=size_of_uint32( &info->unknown13);
2955 size+=size_of_uint32( &info->unknown14);
2956 size+=size_of_uint32( &info->unknown15);
2957 size+=size_of_uint32( &info->unknown16);
2958 size+=size_of_uint32( &info->change_id);
2959 size+=size_of_uint32( &info->unknown18);
2960 size+=size_of_uint32( &info->status);
2961 size+=size_of_uint32( &info->unknown20);
2962 size+=size_of_uint32( &info->c_setprinter);
2964 size+=size_of_uint16( &info->unknown22);
2965 size+=size_of_uint16( &info->unknown23);
2966 size+=size_of_uint16( &info->unknown24);
2967 size+=size_of_uint16( &info->unknown25);
2968 size+=size_of_uint16( &info->unknown26);
2969 size+=size_of_uint16( &info->unknown27);
2970 size+=size_of_uint16( &info->unknown28);
2971 size+=size_of_uint16( &info->unknown29);
2976 /*******************************************************************
2977 return the size required by a struct in the stream
2978 ********************************************************************/
2980 uint32 spoolss_size_printer_info_1(PRINTER_INFO_1 *info)
2984 size+=size_of_uint32( &info->flags );
2985 size+=size_of_relative_string( &info->description );
2986 size+=size_of_relative_string( &info->name );
2987 size+=size_of_relative_string( &info->comment );
2992 /*******************************************************************
2993 return the size required by a struct in the stream
2994 ********************************************************************/
2996 uint32 spoolss_size_printer_info_2(PRINTER_INFO_2 *info)
3002 size += sec_desc_size( info->secdesc );
3004 size+=size_of_device_mode( info->devmode );
3006 size+=size_of_relative_string( &info->servername );
3007 size+=size_of_relative_string( &info->printername );
3008 size+=size_of_relative_string( &info->sharename );
3009 size+=size_of_relative_string( &info->portname );
3010 size+=size_of_relative_string( &info->drivername );
3011 size+=size_of_relative_string( &info->comment );
3012 size+=size_of_relative_string( &info->location );
3014 size+=size_of_relative_string( &info->sepfile );
3015 size+=size_of_relative_string( &info->printprocessor );
3016 size+=size_of_relative_string( &info->datatype );
3017 size+=size_of_relative_string( &info->parameters );
3019 size+=size_of_uint32( &info->attributes );
3020 size+=size_of_uint32( &info->priority );
3021 size+=size_of_uint32( &info->defaultpriority );
3022 size+=size_of_uint32( &info->starttime );
3023 size+=size_of_uint32( &info->untiltime );
3024 size+=size_of_uint32( &info->status );
3025 size+=size_of_uint32( &info->cjobs );
3026 size+=size_of_uint32( &info->averageppm );
3029 * add any adjustments for alignment. This is
3030 * not optimal since we could be calling this
3031 * function from a loop (e.g. enumprinters), but
3032 * it is easier to maintain the calculation here and
3033 * not place the burden on the caller to remember. --jerry
3035 if ((size % 4) != 0)
3036 size += 4 - (size % 4);
3041 /*******************************************************************
3042 return the size required by a struct in the stream
3043 ********************************************************************/
3045 uint32 spoolss_size_printer_info_4(PRINTER_INFO_4 *info)
3049 size+=size_of_relative_string( &info->printername );
3050 size+=size_of_relative_string( &info->servername );
3052 size+=size_of_uint32( &info->attributes );
3056 /*******************************************************************
3057 return the size required by a struct in the stream
3058 ********************************************************************/
3060 uint32 spoolss_size_printer_info_5(PRINTER_INFO_5 *info)
3064 size+=size_of_relative_string( &info->printername );
3065 size+=size_of_relative_string( &info->portname );
3067 size+=size_of_uint32( &info->attributes );
3068 size+=size_of_uint32( &info->device_not_selected_timeout );
3069 size+=size_of_uint32( &info->transmission_retry_timeout );
3074 /*******************************************************************
3075 return the size required by a struct in the stream
3076 ********************************************************************/
3078 uint32 spoolss_size_printer_info_3(PRINTER_INFO_3 *info)
3080 /* The 4 is for the self relative pointer.. */
3081 /* JRA !!!! TESTME - WHAT ABOUT prs_align.... !!! */
3082 return 4 + (uint32)sec_desc_size( info->secdesc );
3085 /*******************************************************************
3086 return the size required by a struct in the stream
3087 ********************************************************************/
3089 uint32 spoolss_size_printer_info_7(PRINTER_INFO_7 *info)
3093 size+=size_of_relative_string( &info->guid );
3094 size+=size_of_uint32( &info->action );
3098 /*******************************************************************
3099 return the size required by a struct in the stream
3100 ********************************************************************/
3102 uint32 spoolss_size_printer_driver_info_1(DRIVER_INFO_1 *info)
3105 size+=size_of_relative_string( &info->name );
3110 /*******************************************************************
3111 return the size required by a struct in the stream
3112 ********************************************************************/
3114 uint32 spoolss_size_printer_driver_info_2(DRIVER_INFO_2 *info)
3117 size+=size_of_uint32( &info->version );
3118 size+=size_of_relative_string( &info->name );
3119 size+=size_of_relative_string( &info->architecture );
3120 size+=size_of_relative_string( &info->driverpath );
3121 size+=size_of_relative_string( &info->datafile );
3122 size+=size_of_relative_string( &info->configfile );
3127 /*******************************************************************
3128 return the size required by a string array.
3129 ********************************************************************/
3131 uint32 spoolss_size_string_array(uint16 *string)
3136 for (i=0; (string[i]!=0x0000) || (string[i+1]!=0x0000); i++);
3138 i=i+2; /* to count all chars including the leading zero */
3139 i=2*i; /* because we need the value in bytes */
3140 i=i+4; /* the offset pointer size */
3145 /*******************************************************************
3146 return the size required by a struct in the stream
3147 ********************************************************************/
3149 uint32 spoolss_size_printer_driver_info_3(DRIVER_INFO_3 *info)
3153 size+=size_of_uint32( &info->version );
3154 size+=size_of_relative_string( &info->name );
3155 size+=size_of_relative_string( &info->architecture );
3156 size+=size_of_relative_string( &info->driverpath );
3157 size+=size_of_relative_string( &info->datafile );
3158 size+=size_of_relative_string( &info->configfile );
3159 size+=size_of_relative_string( &info->helpfile );
3160 size+=size_of_relative_string( &info->monitorname );
3161 size+=size_of_relative_string( &info->defaultdatatype );
3163 size+=spoolss_size_string_array(info->dependentfiles);
3168 /*******************************************************************
3169 return the size required by a struct in the stream
3170 ********************************************************************/
3172 uint32 spoolss_size_printer_driver_info_6(DRIVER_INFO_6 *info)
3176 size+=size_of_uint32( &info->version );
3177 size+=size_of_relative_string( &info->name );
3178 size+=size_of_relative_string( &info->architecture );
3179 size+=size_of_relative_string( &info->driverpath );
3180 size+=size_of_relative_string( &info->datafile );
3181 size+=size_of_relative_string( &info->configfile );
3182 size+=size_of_relative_string( &info->helpfile );
3184 size+=spoolss_size_string_array(info->dependentfiles);
3186 size+=size_of_relative_string( &info->monitorname );
3187 size+=size_of_relative_string( &info->defaultdatatype );
3189 size+=spoolss_size_string_array(info->previousdrivernames);
3191 size+=size_of_nttime(&info->driver_date);
3192 size+=size_of_uint32( &info->padding );
3193 size+=size_of_uint32( &info->driver_version_low );
3194 size+=size_of_uint32( &info->driver_version_high );
3195 size+=size_of_relative_string( &info->mfgname );
3196 size+=size_of_relative_string( &info->oem_url );
3197 size+=size_of_relative_string( &info->hardware_id );
3198 size+=size_of_relative_string( &info->provider );
3203 /*******************************************************************
3204 return the size required by a struct in the stream
3205 ********************************************************************/
3207 uint32 spoolss_size_job_info_1(JOB_INFO_1 *info)
3210 size+=size_of_uint32( &info->jobid );
3211 size+=size_of_relative_string( &info->printername );
3212 size+=size_of_relative_string( &info->machinename );
3213 size+=size_of_relative_string( &info->username );
3214 size+=size_of_relative_string( &info->document );
3215 size+=size_of_relative_string( &info->datatype );
3216 size+=size_of_relative_string( &info->text_status );
3217 size+=size_of_uint32( &info->status );
3218 size+=size_of_uint32( &info->priority );
3219 size+=size_of_uint32( &info->position );
3220 size+=size_of_uint32( &info->totalpages );
3221 size+=size_of_uint32( &info->pagesprinted );
3222 size+=size_of_systemtime( &info->submitted );
3227 /*******************************************************************
3228 return the size required by a struct in the stream
3229 ********************************************************************/
3231 uint32 spoolss_size_job_info_2(JOB_INFO_2 *info)
3235 size+=4; /* size of sec desc ptr */
3237 size+=size_of_uint32( &info->jobid );
3238 size+=size_of_relative_string( &info->printername );
3239 size+=size_of_relative_string( &info->machinename );
3240 size+=size_of_relative_string( &info->username );
3241 size+=size_of_relative_string( &info->document );
3242 size+=size_of_relative_string( &info->notifyname );
3243 size+=size_of_relative_string( &info->datatype );
3244 size+=size_of_relative_string( &info->printprocessor );
3245 size+=size_of_relative_string( &info->parameters );
3246 size+=size_of_relative_string( &info->drivername );
3247 size+=size_of_device_mode( info->devmode );
3248 size+=size_of_relative_string( &info->text_status );
3249 /* SEC_DESC sec_desc;*/
3250 size+=size_of_uint32( &info->status );
3251 size+=size_of_uint32( &info->priority );
3252 size+=size_of_uint32( &info->position );
3253 size+=size_of_uint32( &info->starttime );
3254 size+=size_of_uint32( &info->untiltime );
3255 size+=size_of_uint32( &info->totalpages );
3256 size+=size_of_uint32( &info->size );
3257 size+=size_of_systemtime( &info->submitted );
3258 size+=size_of_uint32( &info->timeelapsed );
3259 size+=size_of_uint32( &info->pagesprinted );
3264 /*******************************************************************
3265 return the size required by a struct in the stream
3266 ********************************************************************/
3268 uint32 spoolss_size_form_1(FORM_1 *info)
3272 size+=size_of_uint32( &info->flag );
3273 size+=size_of_relative_string( &info->name );
3274 size+=size_of_uint32( &info->width );
3275 size+=size_of_uint32( &info->length );
3276 size+=size_of_uint32( &info->left );
3277 size+=size_of_uint32( &info->top );
3278 size+=size_of_uint32( &info->right );
3279 size+=size_of_uint32( &info->bottom );
3284 /*******************************************************************
3285 return the size required by a struct in the stream
3286 ********************************************************************/
3288 uint32 spoolss_size_port_info_1(PORT_INFO_1 *info)
3292 size+=size_of_relative_string( &info->port_name );
3297 /*******************************************************************
3298 return the size required by a struct in the stream
3299 ********************************************************************/
3301 uint32 spoolss_size_driverdir_info_1(DRIVER_DIRECTORY_1 *info)
3305 size=str_len_uni(&info->name); /* the string length */
3306 size=size+1; /* add the leading zero */
3307 size=size*2; /* convert in char */
3312 /*******************************************************************
3313 return the size required by a struct in the stream
3314 ********************************************************************/
3316 uint32 spoolss_size_printprocessordirectory_info_1(PRINTPROCESSOR_DIRECTORY_1 *info)
3320 size=str_len_uni(&info->name); /* the string length */
3321 size=size+1; /* add the leading zero */
3322 size=size*2; /* convert in char */
3327 /*******************************************************************
3328 return the size required by a struct in the stream
3329 ********************************************************************/
3331 uint32 spoolss_size_port_info_2(PORT_INFO_2 *info)
3335 size+=size_of_relative_string( &info->port_name );
3336 size+=size_of_relative_string( &info->monitor_name );
3337 size+=size_of_relative_string( &info->description );
3339 size+=size_of_uint32( &info->port_type );
3340 size+=size_of_uint32( &info->reserved );
3345 /*******************************************************************
3346 return the size required by a struct in the stream
3347 ********************************************************************/
3349 uint32 spoolss_size_printprocessor_info_1(PRINTPROCESSOR_1 *info)
3352 size+=size_of_relative_string( &info->name );
3357 /*******************************************************************
3358 return the size required by a struct in the stream
3359 ********************************************************************/
3361 uint32 spoolss_size_printprocdatatype_info_1(PRINTPROCDATATYPE_1 *info)
3364 size+=size_of_relative_string( &info->name );
3369 /*******************************************************************
3370 return the size required by a struct in the stream
3371 ********************************************************************/
3372 uint32 spoolss_size_printer_enum_values(PRINTER_ENUM_VALUES *p)
3379 /* uint32(offset) + uint32(length) + length) */
3380 size += (size_of_uint32(&p->value_len)*2) + p->value_len;
3381 size += (size_of_uint32(&p->data_len)*2) + p->data_len + (p->data_len%2) ;
3383 size += size_of_uint32(&p->type);
3388 /*******************************************************************
3389 return the size required by a struct in the stream
3390 ********************************************************************/
3392 uint32 spoolss_size_printmonitor_info_1(PRINTMONITOR_1 *info)
3395 size+=size_of_relative_string( &info->name );
3400 /*******************************************************************
3401 return the size required by a struct in the stream
3402 ********************************************************************/
3404 uint32 spoolss_size_printmonitor_info_2(PRINTMONITOR_2 *info)
3407 size+=size_of_relative_string( &info->name);
3408 size+=size_of_relative_string( &info->environment);
3409 size+=size_of_relative_string( &info->dll_name);
3414 /*******************************************************************
3416 ********************************************************************/
3418 BOOL make_spoolss_q_getprinterdriver2(SPOOL_Q_GETPRINTERDRIVER2 *q_u,
3419 const POLICY_HND *hnd,
3420 const fstring architecture,
3421 uint32 level, uint32 clientmajor, uint32 clientminor,
3422 RPC_BUFFER *buffer, uint32 offered)
3427 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
3429 init_buf_unistr2(&q_u->architecture, &q_u->architecture_ptr, architecture);
3432 q_u->clientmajorversion=clientmajor;
3433 q_u->clientminorversion=clientminor;
3436 q_u->offered=offered;
3441 /*******************************************************************
3443 * called from spoolss_getprinterdriver2 (srv_spoolss.c)
3444 ********************************************************************/
3446 BOOL spoolss_io_q_getprinterdriver2(const char *desc, SPOOL_Q_GETPRINTERDRIVER2 *q_u, prs_struct *ps, int depth)
3448 prs_debug(ps, depth, desc, "spoolss_io_q_getprinterdriver2");
3454 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
3456 if(!prs_uint32("architecture_ptr", ps, depth, &q_u->architecture_ptr))
3458 if(!smb_io_unistr2("architecture", &q_u->architecture, q_u->architecture_ptr, ps, depth))
3463 if(!prs_uint32("level", ps, depth, &q_u->level))
3466 if(!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
3472 if(!prs_uint32("offered", ps, depth, &q_u->offered))
3475 if(!prs_uint32("clientmajorversion", ps, depth, &q_u->clientmajorversion))
3477 if(!prs_uint32("clientminorversion", ps, depth, &q_u->clientminorversion))
3483 /*******************************************************************
3485 * called from spoolss_getprinterdriver2 (srv_spoolss.c)
3486 ********************************************************************/
3488 BOOL spoolss_io_r_getprinterdriver2(const char *desc, SPOOL_R_GETPRINTERDRIVER2 *r_u, prs_struct *ps, int depth)
3490 prs_debug(ps, depth, desc, "spoolss_io_r_getprinterdriver2");
3496 if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
3501 if (!prs_uint32("needed", ps, depth, &r_u->needed))
3503 if (!prs_uint32("servermajorversion", ps, depth, &r_u->servermajorversion))
3505 if (!prs_uint32("serverminorversion", ps, depth, &r_u->serverminorversion))
3507 if (!prs_werror("status", ps, depth, &r_u->status))
3513 /*******************************************************************
3515 ********************************************************************/
3517 BOOL make_spoolss_q_enumprinters(
3518 SPOOL_Q_ENUMPRINTERS *q_u,
3528 q_u->servername_ptr = (servername != NULL) ? 1 : 0;
3529 init_buf_unistr2(&q_u->servername, &q_u->servername_ptr, servername);
3533 q_u->offered=offered;
3538 /*******************************************************************
3540 ********************************************************************/
3542 BOOL make_spoolss_q_enumports(SPOOL_Q_ENUMPORTS *q_u,
3543 fstring servername, uint32 level,
3544 RPC_BUFFER *buffer, uint32 offered)
3546 q_u->name_ptr = (servername != NULL) ? 1 : 0;
3547 init_buf_unistr2(&q_u->name, &q_u->name_ptr, servername);
3551 q_u->offered=offered;
3556 /*******************************************************************
3558 * called from spoolss_enumprinters (srv_spoolss.c)
3559 ********************************************************************/
3561 BOOL spoolss_io_q_enumprinters(const char *desc, SPOOL_Q_ENUMPRINTERS *q_u, prs_struct *ps, int depth)
3563 prs_debug(ps, depth, desc, "spoolss_io_q_enumprinters");
3569 if (!prs_uint32("flags", ps, depth, &q_u->flags))
3571 if (!prs_uint32("servername_ptr", ps, depth, &q_u->servername_ptr))
3574 if (!smb_io_unistr2("", &q_u->servername, q_u->servername_ptr, ps, depth))
3579 if (!prs_uint32("level", ps, depth, &q_u->level))
3582 if (!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
3587 if (!prs_uint32("offered", ps, depth, &q_u->offered))
3593 /*******************************************************************
3594 Parse a SPOOL_R_ENUMPRINTERS structure.
3595 ********************************************************************/
3597 BOOL spoolss_io_r_enumprinters(const char *desc, SPOOL_R_ENUMPRINTERS *r_u, prs_struct *ps, int depth)
3599 prs_debug(ps, depth, desc, "spoolss_io_r_enumprinters");
3605 if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
3611 if (!prs_uint32("needed", ps, depth, &r_u->needed))
3614 if (!prs_uint32("returned", ps, depth, &r_u->returned))
3617 if (!prs_werror("status", ps, depth, &r_u->status))
3623 /*******************************************************************
3624 * write a structure.
3625 * called from spoolss_r_enum_printers (srv_spoolss.c)
3627 ********************************************************************/
3629 BOOL spoolss_io_r_getprinter(const char *desc, SPOOL_R_GETPRINTER *r_u, prs_struct *ps, int depth)
3631 prs_debug(ps, depth, desc, "spoolss_io_r_getprinter");
3637 if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
3643 if (!prs_uint32("needed", ps, depth, &r_u->needed))
3646 if (!prs_werror("status", ps, depth, &r_u->status))
3652 /*******************************************************************
3654 * called from spoolss_getprinter (srv_spoolss.c)
3655 ********************************************************************/
3657 BOOL spoolss_io_q_getprinter(const char *desc, SPOOL_Q_GETPRINTER *q_u, prs_struct *ps, int depth)
3659 prs_debug(ps, depth, desc, "spoolss_io_q_getprinter");
3665 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
3667 if (!prs_uint32("level", ps, depth, &q_u->level))
3670 if (!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
3675 if (!prs_uint32("offered", ps, depth, &q_u->offered))
3681 /*******************************************************************
3683 ********************************************************************/
3685 BOOL make_spoolss_q_getprinter(
3686 TALLOC_CTX *mem_ctx,
3687 SPOOL_Q_GETPRINTER *q_u,
3688 const POLICY_HND *hnd,
3698 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
3702 q_u->offered=offered;
3707 /*******************************************************************
3709 ********************************************************************/
3710 BOOL make_spoolss_q_setprinter(TALLOC_CTX *mem_ctx, SPOOL_Q_SETPRINTER *q_u,
3711 const POLICY_HND *hnd, uint32 level, PRINTER_INFO_CTR *info,
3715 DEVICEMODE *devmode;
3720 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
3723 q_u->info.level = level;
3724 q_u->info.info_ptr = (info != NULL) ? 1 : 0;
3727 /* There's no such thing as a setprinter level 1 */
3730 secdesc = info->printers_2->secdesc;
3731 devmode = info->printers_2->devmode;
3733 make_spoolss_printer_info_2 (mem_ctx, &q_u->info.info_2, info->printers_2);
3734 #if 1 /* JERRY TEST */
3735 q_u->secdesc_ctr = SMB_MALLOC_P(SEC_DESC_BUF);
3736 if (!q_u->secdesc_ctr)
3738 q_u->secdesc_ctr->ptr = (secdesc != NULL) ? 1: 0;
3739 q_u->secdesc_ctr->max_len = (secdesc) ? sizeof(SEC_DESC) + (2*sizeof(uint32)) : 0;
3740 q_u->secdesc_ctr->len = (secdesc) ? sizeof(SEC_DESC) + (2*sizeof(uint32)) : 0;
3741 q_u->secdesc_ctr->sec = secdesc;
3743 q_u->devmode_ctr.devmode_ptr = (devmode != NULL) ? 1 : 0;
3744 q_u->devmode_ctr.size = (devmode != NULL) ? sizeof(DEVICEMODE) + (3*sizeof(uint32)) : 0;
3745 q_u->devmode_ctr.devmode = devmode;
3747 q_u->secdesc_ctr = NULL;
3749 q_u->devmode_ctr.devmode_ptr = 0;
3750 q_u->devmode_ctr.size = 0;
3751 q_u->devmode_ctr.devmode = NULL;
3755 secdesc = info->printers_3->secdesc;
3757 make_spoolss_printer_info_3 (mem_ctx, &q_u->info.info_3, info->printers_3);
3759 q_u->secdesc_ctr = SMB_MALLOC_P(SEC_DESC_BUF);
3760 if (!q_u->secdesc_ctr)
3762 q_u->secdesc_ctr->ptr = (secdesc != NULL) ? 1: 0;
3763 q_u->secdesc_ctr->max_len = (secdesc) ? sizeof(SEC_DESC) + (2*sizeof(uint32)) : 0;
3764 q_u->secdesc_ctr->len = (secdesc) ? sizeof(SEC_DESC) + (2*sizeof(uint32)) : 0;
3765 q_u->secdesc_ctr->sec = secdesc;
3769 make_spoolss_printer_info_7 (mem_ctx, &q_u->info.info_7, info->printers_7);
3773 DEBUG(0,("make_spoolss_q_setprinter: Unknown info level [%d]\n", level));
3778 q_u->command = command;
3784 /*******************************************************************
3785 ********************************************************************/
3787 BOOL spoolss_io_r_setprinter(const char *desc, SPOOL_R_SETPRINTER *r_u, prs_struct *ps, int depth)
3789 prs_debug(ps, depth, desc, "spoolss_io_r_setprinter");
3795 if(!prs_werror("status", ps, depth, &r_u->status))
3801 /*******************************************************************
3802 Marshall/unmarshall a SPOOL_Q_SETPRINTER struct.
3803 ********************************************************************/
3805 BOOL spoolss_io_q_setprinter(const char *desc, SPOOL_Q_SETPRINTER *q_u, prs_struct *ps, int depth)
3807 uint32 ptr_sec_desc = 0;
3809 prs_debug(ps, depth, desc, "spoolss_io_q_setprinter");
3815 if(!smb_io_pol_hnd("printer handle", &q_u->handle ,ps, depth))
3817 if(!prs_uint32("level", ps, depth, &q_u->level))
3820 if(!spool_io_printer_info_level("", &q_u->info, ps, depth))
3823 if (!spoolss_io_devmode_cont(desc, &q_u->devmode_ctr, ps, depth))
3833 ptr_sec_desc = q_u->info.info_2->secdesc_ptr;
3838 ptr_sec_desc = q_u->info.info_3->secdesc_ptr;
3844 if (!sec_io_desc_buf(desc, &q_u->secdesc_ctr, ps, depth))
3849 /* Parse a NULL security descriptor. This should really
3850 happen inside the sec_io_desc_buf() function. */
3852 prs_debug(ps, depth, "", "sec_io_desc_buf");
3853 if (!prs_uint32("size", ps, depth + 1, &dummy))
3855 if (!prs_uint32("ptr", ps, depth + 1, &dummy)) return
3859 if(!prs_uint32("command", ps, depth, &q_u->command))
3865 /*******************************************************************
3866 ********************************************************************/
3868 BOOL spoolss_io_r_fcpn(const char *desc, SPOOL_R_FCPN *r_u, prs_struct *ps, int depth)
3870 prs_debug(ps, depth, desc, "spoolss_io_r_fcpn");
3876 if(!prs_werror("status", ps, depth, &r_u->status))
3882 /*******************************************************************
3883 ********************************************************************/
3885 BOOL spoolss_io_q_fcpn(const char *desc, SPOOL_Q_FCPN *q_u, prs_struct *ps, int depth)
3888 prs_debug(ps, depth, desc, "spoolss_io_q_fcpn");
3894 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
3901 /*******************************************************************
3902 ********************************************************************/
3904 BOOL spoolss_io_r_addjob(const char *desc, SPOOL_R_ADDJOB *r_u, prs_struct *ps, int depth)
3906 prs_debug(ps, depth, desc, "");
3912 if(!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
3918 if(!prs_uint32("needed", ps, depth, &r_u->needed))
3921 if(!prs_werror("status", ps, depth, &r_u->status))
3927 /*******************************************************************
3928 ********************************************************************/
3930 BOOL spoolss_io_q_addjob(const char *desc, SPOOL_Q_ADDJOB *q_u, prs_struct *ps, int depth)
3932 prs_debug(ps, depth, desc, "");
3938 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
3940 if(!prs_uint32("level", ps, depth, &q_u->level))
3943 if(!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
3949 if(!prs_uint32("offered", ps, depth, &q_u->offered))
3955 /*******************************************************************
3956 ********************************************************************/
3958 BOOL spoolss_io_r_enumjobs(const char *desc, SPOOL_R_ENUMJOBS *r_u, prs_struct *ps, int depth)
3960 prs_debug(ps, depth, desc, "spoolss_io_r_enumjobs");
3966 if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
3972 if (!prs_uint32("needed", ps, depth, &r_u->needed))
3975 if (!prs_uint32("returned", ps, depth, &r_u->returned))
3978 if (!prs_werror("status", ps, depth, &r_u->status))
3984 /*******************************************************************
3985 ********************************************************************/
3987 BOOL make_spoolss_q_enumjobs(SPOOL_Q_ENUMJOBS *q_u, const POLICY_HND *hnd,
3998 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
3999 q_u->firstjob = firstjob;
4000 q_u->numofjobs = numofjobs;
4002 q_u->buffer= buffer;
4003 q_u->offered = offered;
4007 /*******************************************************************
4008 ********************************************************************/
4010 BOOL spoolss_io_q_enumjobs(const char *desc, SPOOL_Q_ENUMJOBS *q_u, prs_struct *ps, int depth)
4012 prs_debug(ps, depth, desc, "spoolss_io_q_enumjobs");
4018 if (!smb_io_pol_hnd("printer handle",&q_u->handle, ps, depth))
4021 if (!prs_uint32("firstjob", ps, depth, &q_u->firstjob))
4023 if (!prs_uint32("numofjobs", ps, depth, &q_u->numofjobs))
4025 if (!prs_uint32("level", ps, depth, &q_u->level))
4028 if (!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
4034 if (!prs_uint32("offered", ps, depth, &q_u->offered))
4040 /*******************************************************************
4041 ********************************************************************/
4043 BOOL spoolss_io_r_schedulejob(const char *desc, SPOOL_R_SCHEDULEJOB *r_u, prs_struct *ps, int depth)
4045 prs_debug(ps, depth, desc, "spoolss_io_r_schedulejob");
4051 if(!prs_werror("status", ps, depth, &r_u->status))
4057 /*******************************************************************
4058 ********************************************************************/
4060 BOOL spoolss_io_q_schedulejob(const char *desc, SPOOL_Q_SCHEDULEJOB *q_u, prs_struct *ps, int depth)
4062 prs_debug(ps, depth, desc, "spoolss_io_q_schedulejob");
4068 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
4070 if(!prs_uint32("jobid", ps, depth, &q_u->jobid))
4076 /*******************************************************************
4077 ********************************************************************/
4079 BOOL spoolss_io_r_setjob(const char *desc, SPOOL_R_SETJOB *r_u, prs_struct *ps, int depth)
4081 prs_debug(ps, depth, desc, "spoolss_io_r_setjob");
4087 if(!prs_werror("status", ps, depth, &r_u->status))
4093 /*******************************************************************
4094 ********************************************************************/
4096 BOOL spoolss_io_q_setjob(const char *desc, SPOOL_Q_SETJOB *q_u, prs_struct *ps, int depth)
4098 prs_debug(ps, depth, desc, "spoolss_io_q_setjob");
4104 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
4106 if(!prs_uint32("jobid", ps, depth, &q_u->jobid))
4109 * level is usually 0. If (level!=0) then I'm in trouble !
4110 * I will try to generate setjob command with level!=0, one day.
4112 if(!prs_uint32("level", ps, depth, &q_u->level))
4114 if(!prs_uint32("command", ps, depth, &q_u->command))
4120 /*******************************************************************
4121 Parse a SPOOL_R_ENUMPRINTERDRIVERS structure.
4122 ********************************************************************/
4124 BOOL spoolss_io_r_enumprinterdrivers(const char *desc, SPOOL_R_ENUMPRINTERDRIVERS *r_u, prs_struct *ps, int depth)
4126 prs_debug(ps, depth, desc, "spoolss_io_r_enumprinterdrivers");
4132 if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
4138 if (!prs_uint32("needed", ps, depth, &r_u->needed))
4141 if (!prs_uint32("returned", ps, depth, &r_u->returned))
4144 if (!prs_werror("status", ps, depth, &r_u->status))
4150 /*******************************************************************
4152 ********************************************************************/
4154 BOOL make_spoolss_q_enumprinterdrivers(SPOOL_Q_ENUMPRINTERDRIVERS *q_u,
4156 const char *environment,
4158 RPC_BUFFER *buffer, uint32 offered)
4160 init_buf_unistr2(&q_u->name, &q_u->name_ptr, name);
4161 init_buf_unistr2(&q_u->environment, &q_u->environment_ptr, environment);
4165 q_u->offered=offered;
4170 /*******************************************************************
4171 Parse a SPOOL_Q_ENUMPRINTERDRIVERS structure.
4172 ********************************************************************/
4174 BOOL spoolss_io_q_enumprinterdrivers(const char *desc, SPOOL_Q_ENUMPRINTERDRIVERS *q_u, prs_struct *ps, int depth)
4177 prs_debug(ps, depth, desc, "spoolss_io_q_enumprinterdrivers");
4183 if (!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
4185 if (!smb_io_unistr2("", &q_u->name, q_u->name_ptr,ps, depth))
4190 if (!prs_uint32("environment_ptr", ps, depth, &q_u->environment_ptr))
4192 if (!smb_io_unistr2("", &q_u->environment, q_u->environment_ptr, ps, depth))
4197 if (!prs_uint32("level", ps, depth, &q_u->level))
4200 if (!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
4206 if (!prs_uint32("offered", ps, depth, &q_u->offered))
4212 /*******************************************************************
4213 ********************************************************************/
4215 BOOL spoolss_io_q_enumforms(const char *desc, SPOOL_Q_ENUMFORMS *q_u, prs_struct *ps, int depth)
4218 prs_debug(ps, depth, desc, "spoolss_io_q_enumforms");
4223 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
4225 if (!prs_uint32("level", ps, depth, &q_u->level))
4228 if (!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
4233 if (!prs_uint32("offered", ps, depth, &q_u->offered))
4239 /*******************************************************************
4240 ********************************************************************/
4242 BOOL spoolss_io_r_enumforms(const char *desc, SPOOL_R_ENUMFORMS *r_u, prs_struct *ps, int depth)
4244 prs_debug(ps, depth, desc, "spoolss_io_r_enumforms");
4250 if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
4256 if (!prs_uint32("size of buffer needed", ps, depth, &r_u->needed))
4259 if (!prs_uint32("numofforms", ps, depth, &r_u->numofforms))
4262 if (!prs_werror("status", ps, depth, &r_u->status))
4268 /*******************************************************************
4269 ********************************************************************/
4271 BOOL spoolss_io_q_getform(const char *desc, SPOOL_Q_GETFORM *q_u, prs_struct *ps, int depth)
4274 prs_debug(ps, depth, desc, "spoolss_io_q_getform");
4279 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
4281 if (!smb_io_unistr2("", &q_u->formname,True,ps,depth))
4287 if (!prs_uint32("level", ps, depth, &q_u->level))
4290 if (!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
4295 if (!prs_uint32("offered", ps, depth, &q_u->offered))
4301 /*******************************************************************
4302 ********************************************************************/
4304 BOOL spoolss_io_r_getform(const char *desc, SPOOL_R_GETFORM *r_u, prs_struct *ps, int depth)
4306 prs_debug(ps, depth, desc, "spoolss_io_r_getform");
4312 if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
4318 if (!prs_uint32("size of buffer needed", ps, depth, &r_u->needed))
4321 if (!prs_werror("status", ps, depth, &r_u->status))
4327 /*******************************************************************
4328 Parse a SPOOL_R_ENUMPORTS structure.
4329 ********************************************************************/
4331 BOOL spoolss_io_r_enumports(const char *desc, SPOOL_R_ENUMPORTS *r_u, prs_struct *ps, int depth)
4333 prs_debug(ps, depth, desc, "spoolss_io_r_enumports");
4339 if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
4345 if (!prs_uint32("needed", ps, depth, &r_u->needed))
4348 if (!prs_uint32("returned", ps, depth, &r_u->returned))
4351 if (!prs_werror("status", ps, depth, &r_u->status))
4357 /*******************************************************************
4358 ********************************************************************/
4360 BOOL spoolss_io_q_enumports(const char *desc, SPOOL_Q_ENUMPORTS *q_u, prs_struct *ps, int depth)
4362 prs_debug(ps, depth, desc, "");
4368 if (!prs_uint32("", ps, depth, &q_u->name_ptr))
4370 if (!smb_io_unistr2("", &q_u->name,True,ps,depth))
4375 if (!prs_uint32("level", ps, depth, &q_u->level))
4378 if (!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
4383 if (!prs_uint32("offered", ps, depth, &q_u->offered))
4389 /*******************************************************************
4390 Parse a SPOOL_PRINTER_INFO_LEVEL_1 structure.
4391 ********************************************************************/
4393 BOOL spool_io_printer_info_level_1(const char *desc, SPOOL_PRINTER_INFO_LEVEL_1 *il, prs_struct *ps, int depth)
4395 prs_debug(ps, depth, desc, "spool_io_printer_info_level_1");
4401 if(!prs_uint32("flags", ps, depth, &il->flags))
4403 if(!prs_uint32("description_ptr", ps, depth, &il->description_ptr))
4405 if(!prs_uint32("name_ptr", ps, depth, &il->name_ptr))
4407 if(!prs_uint32("comment_ptr", ps, depth, &il->comment_ptr))
4410 if(!smb_io_unistr2("description", &il->description, il->description_ptr, ps, depth))
4412 if(!smb_io_unistr2("name", &il->name, il->name_ptr, ps, depth))
4414 if(!smb_io_unistr2("comment", &il->comment, il->comment_ptr, ps, depth))
4420 /*******************************************************************
4421 Parse a SPOOL_PRINTER_INFO_LEVEL_3 structure.
4422 ********************************************************************/
4424 BOOL spool_io_printer_info_level_3(const char *desc, SPOOL_PRINTER_INFO_LEVEL_3 *il, prs_struct *ps, int depth)
4426 prs_debug(ps, depth, desc, "spool_io_printer_info_level_3");
4432 if(!prs_uint32("secdesc_ptr", ps, depth, &il->secdesc_ptr))
4438 /*******************************************************************
4439 Parse a SPOOL_PRINTER_INFO_LEVEL_2 structure.
4440 ********************************************************************/
4442 BOOL spool_io_printer_info_level_2(const char *desc, SPOOL_PRINTER_INFO_LEVEL_2 *il, prs_struct *ps, int depth)
4444 prs_debug(ps, depth, desc, "spool_io_printer_info_level_2");
4450 if(!prs_uint32("servername_ptr", ps, depth, &il->servername_ptr))
4452 if(!prs_uint32("printername_ptr", ps, depth, &il->printername_ptr))
4454 if(!prs_uint32("sharename_ptr", ps, depth, &il->sharename_ptr))
4456 if(!prs_uint32("portname_ptr", ps, depth, &il->portname_ptr))
4459 if(!prs_uint32("drivername_ptr", ps, depth, &il->drivername_ptr))
4461 if(!prs_uint32("comment_ptr", ps, depth, &il->comment_ptr))
4463 if(!prs_uint32("location_ptr", ps, depth, &il->location_ptr))
4465 if(!prs_uint32("devmode_ptr", ps, depth, &il->devmode_ptr))
4467 if(!prs_uint32("sepfile_ptr", ps, depth, &il->sepfile_ptr))
4469 if(!prs_uint32("printprocessor_ptr", ps, depth, &il->printprocessor_ptr))
4471 if(!prs_uint32("datatype_ptr", ps, depth, &il->datatype_ptr))
4473 if(!prs_uint32("parameters_ptr", ps, depth, &il->parameters_ptr))
4475 if(!prs_uint32("secdesc_ptr", ps, depth, &il->secdesc_ptr))
4478 if(!prs_uint32("attributes", ps, depth, &il->attributes))
4480 if(!prs_uint32("priority", ps, depth, &il->priority))
4482 if(!prs_uint32("default_priority", ps, depth, &il->default_priority))
4484 if(!prs_uint32("starttime", ps, depth, &il->starttime))
4486 if(!prs_uint32("untiltime", ps, depth, &il->untiltime))
4488 if(!prs_uint32("status", ps, depth, &il->status))
4490 if(!prs_uint32("cjobs", ps, depth, &il->cjobs))
4492 if(!prs_uint32("averageppm", ps, depth, &il->averageppm))
4495 if(!smb_io_unistr2("servername", &il->servername, il->servername_ptr, ps, depth))
4497 if(!smb_io_unistr2("printername", &il->printername, il->printername_ptr, ps, depth))
4499 if(!smb_io_unistr2("sharename", &il->sharename, il->sharename_ptr, ps, depth))
4501 if(!smb_io_unistr2("portname", &il->portname, il->portname_ptr, ps, depth))
4503 if(!smb_io_unistr2("drivername", &il->drivername, il->drivername_ptr, ps, depth))
4505 if(!smb_io_unistr2("comment", &il->comment, il->comment_ptr, ps, depth))
4507 if(!smb_io_unistr2("location", &il->location, il->location_ptr, ps, depth))
4509 if(!smb_io_unistr2("sepfile", &il->sepfile, il->sepfile_ptr, ps, depth))
4511 if(!smb_io_unistr2("printprocessor", &il->printprocessor, il->printprocessor_ptr, ps, depth))
4513 if(!smb_io_unistr2("datatype", &il->datatype, il->datatype_ptr, ps, depth))
4515 if(!smb_io_unistr2("parameters", &il->parameters, il->parameters_ptr, ps, depth))
4521 BOOL spool_io_printer_info_level_7(const char *desc, SPOOL_PRINTER_INFO_LEVEL_7 *il, prs_struct *ps, int depth)
4523 prs_debug(ps, depth, desc, "spool_io_printer_info_level_7");
4529 if(!prs_uint32("guid_ptr", ps, depth, &il->guid_ptr))
4531 if(!prs_uint32("action", ps, depth, &il->action))
4534 if(!smb_io_unistr2("servername", &il->guid, il->guid_ptr, ps, depth))
4539 /*******************************************************************
4540 ********************************************************************/
4542 BOOL spool_io_printer_info_level(const char *desc, SPOOL_PRINTER_INFO_LEVEL *il, prs_struct *ps, int depth)
4544 prs_debug(ps, depth, desc, "spool_io_printer_info_level");
4549 if(!prs_uint32("level", ps, depth, &il->level))
4551 if(!prs_uint32("info_ptr", ps, depth, &il->info_ptr))
4554 /* if no struct inside just return */
4555 if (il->info_ptr==0) {
4556 if (UNMARSHALLING(ps)) {
4563 switch (il->level) {
4565 * level 0 is used by setprinter when managing the queue
4566 * (hold, stop, start a queue)
4570 /* DOCUMENT ME!!! What is level 1 used for? */
4573 if (UNMARSHALLING(ps)) {
4574 if ((il->info_1=PRS_ALLOC_MEM(ps,SPOOL_PRINTER_INFO_LEVEL_1,1)) == NULL)
4577 if (!spool_io_printer_info_level_1("", il->info_1, ps, depth))
4582 * level 2 is used by addprinter
4583 * and by setprinter when updating printer's info
4586 if (UNMARSHALLING(ps)) {
4587 if ((il->info_2=PRS_ALLOC_MEM(ps,SPOOL_PRINTER_INFO_LEVEL_2,1)) == NULL)
4590 if (!spool_io_printer_info_level_2("", il->info_2, ps, depth))
4593 /* DOCUMENT ME!!! What is level 3 used for? */
4596 if (UNMARSHALLING(ps)) {
4597 if ((il->info_3=PRS_ALLOC_MEM(ps,SPOOL_PRINTER_INFO_LEVEL_3,1)) == NULL)
4600 if (!spool_io_printer_info_level_3("", il->info_3, ps, depth))
4605 if (UNMARSHALLING(ps))
4606 if ((il->info_7=PRS_ALLOC_MEM(ps,SPOOL_PRINTER_INFO_LEVEL_7,1)) == NULL)
4608 if (!spool_io_printer_info_level_7("", il->info_7, ps, depth))
4616 /*******************************************************************
4617 ********************************************************************/
4619 BOOL spoolss_io_q_addprinterex(const char *desc, SPOOL_Q_ADDPRINTEREX *q_u, prs_struct *ps, int depth)
4621 uint32 ptr_sec_desc = 0;
4623 prs_debug(ps, depth, desc, "spoolss_io_q_addprinterex");
4629 if (!prs_io_unistr2_p("ptr", ps, depth, &q_u->server_name))
4631 if (!prs_io_unistr2("servername", ps, depth, q_u->server_name))
4637 if(!prs_uint32("info_level", ps, depth, &q_u->level))
4640 if(!spool_io_printer_info_level("", &q_u->info, ps, depth))
4643 if (!spoolss_io_devmode_cont(desc, &q_u->devmode_ctr, ps, depth))
4649 switch (q_u->level) {
4651 ptr_sec_desc = q_u->info.info_2->secdesc_ptr;
4654 ptr_sec_desc = q_u->info.info_3->secdesc_ptr;
4658 if (!sec_io_desc_buf(desc, &q_u->secdesc_ctr, ps, depth))
4663 /* Parse a NULL security descriptor. This should really
4664 happen inside the sec_io_desc_buf() function. */
4666 prs_debug(ps, depth, "", "sec_io_desc_buf");
4667 if (!prs_uint32("size", ps, depth + 1, &dummy))
4669 if (!prs_uint32("ptr", ps, depth + 1, &dummy))
4673 if(!prs_uint32("user_switch", ps, depth, &q_u->user_switch))
4675 if(!spool_io_user_level("", &q_u->user_ctr, ps, depth))
4681 /*******************************************************************
4682 ********************************************************************/
4684 BOOL spoolss_io_r_addprinterex(const char *desc, SPOOL_R_ADDPRINTEREX *r_u,
4685 prs_struct *ps, int depth)
4687 prs_debug(ps, depth, desc, "spoolss_io_r_addprinterex");
4690 if(!smb_io_pol_hnd("printer handle",&r_u->handle,ps,depth))
4693 if(!prs_werror("status", ps, depth, &r_u->status))
4699 /*******************************************************************
4700 ********************************************************************/
4702 BOOL spool_io_printer_driver_info_level_3(const char *desc, SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 **q_u,
4703 prs_struct *ps, int depth)
4705 SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 *il;
4707 prs_debug(ps, depth, desc, "spool_io_printer_driver_info_level_3");
4711 if (UNMARSHALLING(ps)) {
4712 il=PRS_ALLOC_MEM(ps,SPOOL_PRINTER_DRIVER_INFO_LEVEL_3,1);
4724 if(!prs_uint32("cversion", ps, depth, &il->cversion))
4726 if(!prs_uint32("name", ps, depth, &il->name_ptr))
4728 if(!prs_uint32("environment", ps, depth, &il->environment_ptr))
4730 if(!prs_uint32("driverpath", ps, depth, &il->driverpath_ptr))
4732 if(!prs_uint32("datafile", ps, depth, &il->datafile_ptr))
4734 if(!prs_uint32("configfile", ps, depth, &il->configfile_ptr))
4736 if(!prs_uint32("helpfile", ps, depth, &il->helpfile_ptr))
4738 if(!prs_uint32("monitorname", ps, depth, &il->monitorname_ptr))
4740 if(!prs_uint32("defaultdatatype", ps, depth, &il->defaultdatatype_ptr))
4742 if(!prs_uint32("dependentfilessize", ps, depth, &il->dependentfilessize))
4744 if(!prs_uint32("dependentfiles", ps, depth, &il->dependentfiles_ptr))
4750 if(!smb_io_unistr2("name", &il->name, il->name_ptr, ps, depth))
4752 if(!smb_io_unistr2("environment", &il->environment, il->environment_ptr, ps, depth))
4754 if(!smb_io_unistr2("driverpath", &il->driverpath, il->driverpath_ptr, ps, depth))
4756 if(!smb_io_unistr2("datafile", &il->datafile, il->datafile_ptr, ps, depth))
4758 if(!smb_io_unistr2("configfile", &il->configfile, il->configfile_ptr, ps, depth))
4760 if(!smb_io_unistr2("helpfile", &il->helpfile, il->helpfile_ptr, ps, depth))
4762 if(!smb_io_unistr2("monitorname", &il->monitorname, il->monitorname_ptr, ps, depth))
4764 if(!smb_io_unistr2("defaultdatatype", &il->defaultdatatype, il->defaultdatatype_ptr, ps, depth))
4770 if (il->dependentfiles_ptr)
4771 smb_io_buffer5("", &il->dependentfiles, ps, depth);
4776 /*******************************************************************
4777 parse a SPOOL_PRINTER_DRIVER_INFO_LEVEL_6 structure
4778 ********************************************************************/
4780 BOOL spool_io_printer_driver_info_level_6(const char *desc, SPOOL_PRINTER_DRIVER_INFO_LEVEL_6 **q_u,
4781 prs_struct *ps, int depth)
4783 SPOOL_PRINTER_DRIVER_INFO_LEVEL_6 *il;
4785 prs_debug(ps, depth, desc, "spool_io_printer_driver_info_level_6");
4789 if (UNMARSHALLING(ps)) {
4790 il=PRS_ALLOC_MEM(ps,SPOOL_PRINTER_DRIVER_INFO_LEVEL_6,1);
4803 * I know this seems weird, but I have no other explanation.
4804 * This is observed behavior on both NT4 and 2K servers.
4808 if (!prs_align_uint64(ps))
4811 /* parse the main elements the packet */
4813 if(!prs_uint32("cversion ", ps, depth, &il->version))
4815 if(!prs_uint32("name ", ps, depth, &il->name_ptr))
4817 if(!prs_uint32("environment ", ps, depth, &il->environment_ptr))
4819 if(!prs_uint32("driverpath ", ps, depth, &il->driverpath_ptr))
4821 if(!prs_uint32("datafile ", ps, depth, &il->datafile_ptr))
4823 if(!prs_uint32("configfile ", ps, depth, &il->configfile_ptr))
4825 if(!prs_uint32("helpfile ", ps, depth, &il->helpfile_ptr))
4827 if(!prs_uint32("monitorname ", ps, depth, &il->monitorname_ptr))
4829 if(!prs_uint32("defaultdatatype", ps, depth, &il->defaultdatatype_ptr))
4831 if(!prs_uint32("dependentfiles ", ps, depth, &il->dependentfiles_len))
4833 if(!prs_uint32("dependentfiles ", ps, depth, &il->dependentfiles_ptr))
4835 if(!prs_uint32("previousnames ", ps, depth, &il->previousnames_len))
4837 if(!prs_uint32("previousnames ", ps, depth, &il->previousnames_ptr))
4839 if(!smb_io_time("driverdate ", &il->driverdate, ps, depth))
4841 if(!prs_uint32("dummy4 ", ps, depth, &il->dummy4))
4843 if(!prs_uint64("driverversion ", ps, depth, &il->driverversion))
4845 if(!prs_uint32("mfgname ", ps, depth, &il->mfgname_ptr))
4847 if(!prs_uint32("oemurl ", ps, depth, &il->oemurl_ptr))
4849 if(!prs_uint32("hardwareid ", ps, depth, &il->hardwareid_ptr))
4851 if(!prs_uint32("provider ", ps, depth, &il->provider_ptr))
4854 /* parse the structures in the packet */
4856 if(!smb_io_unistr2("name", &il->name, il->name_ptr, ps, depth))
4861 if(!smb_io_unistr2("environment", &il->environment, il->environment_ptr, ps, depth))
4866 if(!smb_io_unistr2("driverpath", &il->driverpath, il->driverpath_ptr, ps, depth))
4871 if(!smb_io_unistr2("datafile", &il->datafile, il->datafile_ptr, ps, depth))
4876 if(!smb_io_unistr2("configfile", &il->configfile, il->configfile_ptr, ps, depth))
4881 if(!smb_io_unistr2("helpfile", &il->helpfile, il->helpfile_ptr, ps, depth))
4886 if(!smb_io_unistr2("monitorname", &il->monitorname, il->monitorname_ptr, ps, depth))
4891 if(!smb_io_unistr2("defaultdatatype", &il->defaultdatatype, il->defaultdatatype_ptr, ps, depth))
4895 if (il->dependentfiles_ptr) {
4896 if(!smb_io_buffer5("dependentfiles", &il->dependentfiles, ps, depth))
4901 if (il->previousnames_ptr) {
4902 if(!smb_io_buffer5("previousnames", &il->previousnames, ps, depth))
4907 if(!smb_io_unistr2("mfgname", &il->mfgname, il->mfgname_ptr, ps, depth))
4911 if(!smb_io_unistr2("oemurl", &il->oemurl, il->oemurl_ptr, ps, depth))
4915 if(!smb_io_unistr2("hardwareid", &il->hardwareid, il->hardwareid_ptr, ps, depth))
4919 if(!smb_io_unistr2("provider", &il->provider, il->provider_ptr, ps, depth))
4925 /*******************************************************************
4926 convert a buffer of UNICODE strings null terminated
4927 the buffer is terminated by a NULL
4929 convert to an dos codepage array (null terminated)
4931 dynamically allocate memory
4933 ********************************************************************/
4934 static BOOL uniarray_2_dosarray(BUFFER5 *buf5, fstring **ar)
4943 src = (char *)buf5->buffer;
4946 while (src < ((char *)buf5->buffer) + buf5->buf_len*2) {
4947 rpcstr_pull(f, src, sizeof(f)-1, -1, STR_TERMINATE);
4948 src = skip_unibuf(src, 2*buf5->buf_len - PTR_DIFF(src,buf5->buffer));
4949 tar = SMB_REALLOC_ARRAY(*ar, fstring, n+2);
4954 fstrcpy((*ar)[n], f);
4957 fstrcpy((*ar)[n], "");
4965 /*******************************************************************
4966 read a UNICODE array with null terminated strings
4967 and null terminated array
4968 and size of array at beginning
4969 ********************************************************************/
4971 BOOL smb_io_unibuffer(const char *desc, UNISTR2 *buffer, prs_struct *ps, int depth)
4973 if (buffer==NULL) return False;
4976 buffer->uni_str_len=buffer->uni_max_len;
4978 if(!prs_uint32("buffer_size", ps, depth, &buffer->uni_max_len))
4981 if(!prs_unistr2(True, "buffer ", ps, depth, buffer))
4987 /*******************************************************************
4988 ********************************************************************/
4990 BOOL spool_io_printer_driver_info_level(const char *desc, SPOOL_PRINTER_DRIVER_INFO_LEVEL *il, prs_struct *ps, int depth)
4992 prs_debug(ps, depth, desc, "spool_io_printer_driver_info_level");
4997 if(!prs_uint32("level", ps, depth, &il->level))
4999 if(!prs_uint32("ptr", ps, depth, &il->ptr))
5005 switch (il->level) {
5007 if(!spool_io_printer_driver_info_level_3("", &il->info_3, ps, depth))
5011 if(!spool_io_printer_driver_info_level_6("", &il->info_6, ps, depth))
5021 /*******************************************************************
5022 init a SPOOL_Q_ADDPRINTERDRIVER struct
5023 ******************************************************************/
5025 BOOL make_spoolss_q_addprinterdriver(TALLOC_CTX *mem_ctx,
5026 SPOOL_Q_ADDPRINTERDRIVER *q_u, const char* srv_name,
5027 uint32 level, PRINTER_DRIVER_CTR *info)
5029 DEBUG(5,("make_spoolss_q_addprinterdriver\n"));
5031 q_u->server_name_ptr = (srv_name!=NULL)?1:0;
5032 init_unistr2(&q_u->server_name, srv_name, UNI_STR_TERMINATE);
5036 q_u->info.level = level;
5037 q_u->info.ptr = (info!=NULL)?1:0;
5040 /* info level 3 is supported by Windows 95/98, WinNT and Win2k */
5042 make_spoolss_driver_info_3(mem_ctx, &q_u->info.info_3, info->info3);
5046 DEBUG(0,("make_spoolss_q_addprinterdriver: Unknown info level [%d]\n", level));
5053 BOOL make_spoolss_driver_info_3(TALLOC_CTX *mem_ctx,
5054 SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 **spool_drv_info,
5055 DRIVER_INFO_3 *info3)
5058 uint16 *ptr = info3->dependentfiles;
5060 BOOL null_char = False;
5061 SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 *inf;
5063 if (!(inf=TALLOC_ZERO_P(mem_ctx, SPOOL_PRINTER_DRIVER_INFO_LEVEL_3)))
5066 inf->cversion = info3->version;
5067 inf->name_ptr = (info3->name.buffer!=NULL)?1:0;
5068 inf->environment_ptr = (info3->architecture.buffer!=NULL)?1:0;
5069 inf->driverpath_ptr = (info3->driverpath.buffer!=NULL)?1:0;
5070 inf->datafile_ptr = (info3->datafile.buffer!=NULL)?1:0;
5071 inf->configfile_ptr = (info3->configfile.buffer!=NULL)?1:0;
5072 inf->helpfile_ptr = (info3->helpfile.buffer!=NULL)?1:0;
5073 inf->monitorname_ptr = (info3->monitorname.buffer!=NULL)?1:0;
5074 inf->defaultdatatype_ptr = (info3->defaultdatatype.buffer!=NULL)?1:0;
5076 init_unistr2_from_unistr(&inf->name, &info3->name);
5077 init_unistr2_from_unistr(&inf->environment, &info3->architecture);
5078 init_unistr2_from_unistr(&inf->driverpath, &info3->driverpath);
5079 init_unistr2_from_unistr(&inf->datafile, &info3->datafile);
5080 init_unistr2_from_unistr(&inf->configfile, &info3->configfile);
5081 init_unistr2_from_unistr(&inf->helpfile, &info3->helpfile);
5082 init_unistr2_from_unistr(&inf->monitorname, &info3->monitorname);
5083 init_unistr2_from_unistr(&inf->defaultdatatype, &info3->defaultdatatype);
5090 /* the null_char BOOL is used to help locate
5091 two '\0's back to back */
5106 inf->dependentfiles_ptr = (info3->dependentfiles != NULL) ? 1 : 0;
5107 inf->dependentfilessize = len;
5108 if(!make_spoolss_buffer5(mem_ctx, &inf->dependentfiles, len, info3->dependentfiles))
5114 *spool_drv_info = inf;
5119 /*******************************************************************
5120 make a BUFFER5 struct from a uint16*
5121 ******************************************************************/
5122 BOOL make_spoolss_buffer5(TALLOC_CTX *mem_ctx, BUFFER5 *buf5, uint32 len, uint16 *src)
5125 buf5->buf_len = len;
5126 if((buf5->buffer=(uint16*)TALLOC_MEMDUP(mem_ctx, src, sizeof(uint16)*len)) == NULL) {
5127 DEBUG(0,("make_spoolss_buffer5: Unable to malloc memory for buffer!\n"));
5134 /*******************************************************************
5135 fill in the prs_struct for a ADDPRINTERDRIVER request PDU
5136 ********************************************************************/
5138 BOOL spoolss_io_q_addprinterdriver(const char *desc, SPOOL_Q_ADDPRINTERDRIVER *q_u, prs_struct *ps, int depth)
5140 prs_debug(ps, depth, desc, "spoolss_io_q_addprinterdriver");
5146 if(!prs_uint32("server_name_ptr", ps, depth, &q_u->server_name_ptr))
5148 if(!smb_io_unistr2("server_name", &q_u->server_name, q_u->server_name_ptr, ps, depth))
5153 if(!prs_uint32("info_level", ps, depth, &q_u->level))
5156 if(!spool_io_printer_driver_info_level("", &q_u->info, ps, depth))
5162 /*******************************************************************
5163 ********************************************************************/
5165 BOOL spoolss_io_r_addprinterdriver(const char *desc, SPOOL_R_ADDPRINTERDRIVER *q_u, prs_struct *ps, int depth)
5167 prs_debug(ps, depth, desc, "spoolss_io_r_addprinterdriver");
5170 if(!prs_werror("status", ps, depth, &q_u->status))
5176 /*******************************************************************
5177 fill in the prs_struct for a ADDPRINTERDRIVER request PDU
5178 ********************************************************************/
5180 BOOL spoolss_io_q_addprinterdriverex(const char *desc, SPOOL_Q_ADDPRINTERDRIVEREX *q_u, prs_struct *ps, int depth)
5182 prs_debug(ps, depth, desc, "spoolss_io_q_addprinterdriverex");
5188 if(!prs_uint32("server_name_ptr", ps, depth, &q_u->server_name_ptr))
5190 if(!smb_io_unistr2("server_name", &q_u->server_name, q_u->server_name_ptr, ps, depth))
5195 if(!prs_uint32("info_level", ps, depth, &q_u->level))
5198 if(!spool_io_printer_driver_info_level("", &q_u->info, ps, depth))
5203 if(!prs_uint32("copy flags", ps, depth, &q_u->copy_flags))
5209 /*******************************************************************
5210 ********************************************************************/
5212 BOOL spoolss_io_r_addprinterdriverex(const char *desc, SPOOL_R_ADDPRINTERDRIVEREX *q_u, prs_struct *ps, int depth)
5214 prs_debug(ps, depth, desc, "spoolss_io_r_addprinterdriverex");
5217 if(!prs_werror("status", ps, depth, &q_u->status))
5223 /*******************************************************************
5224 ********************************************************************/
5226 BOOL uni_2_asc_printer_driver_3(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 *uni,
5227 NT_PRINTER_DRIVER_INFO_LEVEL_3 **asc)
5229 NT_PRINTER_DRIVER_INFO_LEVEL_3 *d;
5231 DEBUG(7,("uni_2_asc_printer_driver_3: Converting from UNICODE to ASCII\n"));
5235 *asc=SMB_MALLOC_P(NT_PRINTER_DRIVER_INFO_LEVEL_3);
5243 d->cversion=uni->cversion;
5245 unistr2_to_ascii(d->name, &uni->name, sizeof(d->name)-1);
5246 unistr2_to_ascii(d->environment, &uni->environment, sizeof(d->environment)-1);
5247 unistr2_to_ascii(d->driverpath, &uni->driverpath, sizeof(d->driverpath)-1);
5248 unistr2_to_ascii(d->datafile, &uni->datafile, sizeof(d->datafile)-1);
5249 unistr2_to_ascii(d->configfile, &uni->configfile, sizeof(d->configfile)-1);
5250 unistr2_to_ascii(d->helpfile, &uni->helpfile, sizeof(d->helpfile)-1);
5251 unistr2_to_ascii(d->monitorname, &uni->monitorname, sizeof(d->monitorname)-1);
5252 unistr2_to_ascii(d->defaultdatatype, &uni->defaultdatatype, sizeof(d->defaultdatatype)-1);
5254 DEBUGADD(8,( "version: %d\n", d->cversion));
5255 DEBUGADD(8,( "name: %s\n", d->name));
5256 DEBUGADD(8,( "environment: %s\n", d->environment));
5257 DEBUGADD(8,( "driverpath: %s\n", d->driverpath));
5258 DEBUGADD(8,( "datafile: %s\n", d->datafile));
5259 DEBUGADD(8,( "configfile: %s\n", d->configfile));
5260 DEBUGADD(8,( "helpfile: %s\n", d->helpfile));
5261 DEBUGADD(8,( "monitorname: %s\n", d->monitorname));
5262 DEBUGADD(8,( "defaultdatatype: %s\n", d->defaultdatatype));
5264 if (uniarray_2_dosarray(&uni->dependentfiles, &d->dependentfiles ))
5271 /*******************************************************************
5272 ********************************************************************/
5273 BOOL uni_2_asc_printer_driver_6(SPOOL_PRINTER_DRIVER_INFO_LEVEL_6 *uni,
5274 NT_PRINTER_DRIVER_INFO_LEVEL_6 **asc)
5276 NT_PRINTER_DRIVER_INFO_LEVEL_6 *d;
5278 DEBUG(7,("uni_2_asc_printer_driver_6: Converting from UNICODE to ASCII\n"));
5282 *asc=SMB_MALLOC_P(NT_PRINTER_DRIVER_INFO_LEVEL_6);
5290 d->version=uni->version;
5292 unistr2_to_ascii(d->name, &uni->name, sizeof(d->name)-1);
5293 unistr2_to_ascii(d->environment, &uni->environment, sizeof(d->environment)-1);
5294 unistr2_to_ascii(d->driverpath, &uni->driverpath, sizeof(d->driverpath)-1);
5295 unistr2_to_ascii(d->datafile, &uni->datafile, sizeof(d->datafile)-1);
5296 unistr2_to_ascii(d->configfile, &uni->configfile, sizeof(d->configfile)-1);
5297 unistr2_to_ascii(d->helpfile, &uni->helpfile, sizeof(d->helpfile)-1);
5298 unistr2_to_ascii(d->monitorname, &uni->monitorname, sizeof(d->monitorname)-1);
5299 unistr2_to_ascii(d->defaultdatatype, &uni->defaultdatatype, sizeof(d->defaultdatatype)-1);
5301 DEBUGADD(8,( "version: %d\n", d->version));
5302 DEBUGADD(8,( "name: %s\n", d->name));
5303 DEBUGADD(8,( "environment: %s\n", d->environment));
5304 DEBUGADD(8,( "driverpath: %s\n", d->driverpath));
5305 DEBUGADD(8,( "datafile: %s\n", d->datafile));
5306 DEBUGADD(8,( "configfile: %s\n", d->configfile));
5307 DEBUGADD(8,( "helpfile: %s\n", d->helpfile));
5308 DEBUGADD(8,( "monitorname: %s\n", d->monitorname));
5309 DEBUGADD(8,( "defaultdatatype: %s\n", d->defaultdatatype));
5311 if (!uniarray_2_dosarray(&uni->dependentfiles, &d->dependentfiles ))
5313 if (!uniarray_2_dosarray(&uni->previousnames, &d->previousnames ))
5323 BOOL uni_2_asc_printer_info_2(const SPOOL_PRINTER_INFO_LEVEL_2 *uni,
5324 NT_PRINTER_INFO_LEVEL_2 **asc)
5326 NT_PRINTER_INFO_LEVEL_2 *d;
5329 DEBUG(7,("Converting from UNICODE to ASCII\n"));
5330 time_unix=time(NULL);
5333 DEBUGADD(8,("allocating memory\n"));
5335 *asc=SMB_MALLOC_P(NT_PRINTER_INFO_LEVEL_2);
5340 /* we allocate memory iff called from
5341 * addprinter(ex) so we can do one time stuff here.
5343 (*asc)->setuptime=time_unix;
5346 DEBUGADD(8,("start converting\n"));
5350 d->attributes=uni->attributes;
5351 d->priority=uni->priority;
5352 d->default_priority=uni->default_priority;
5353 d->starttime=uni->starttime;
5354 d->untiltime=uni->untiltime;
5355 d->status=uni->status;
5356 d->cjobs=uni->cjobs;
5358 unistr2_to_ascii(d->servername, &uni->servername, sizeof(d->servername)-1);
5359 unistr2_to_ascii(d->printername, &uni->printername, sizeof(d->printername)-1);
5360 unistr2_to_ascii(d->sharename, &uni->sharename, sizeof(d->sharename)-1);
5361 unistr2_to_ascii(d->portname, &uni->portname, sizeof(d->portname)-1);
5362 unistr2_to_ascii(d->drivername, &uni->drivername, sizeof(d->drivername)-1);
5363 unistr2_to_ascii(d->comment, &uni->comment, sizeof(d->comment)-1);
5364 unistr2_to_ascii(d->location, &uni->location, sizeof(d->location)-1);
5365 unistr2_to_ascii(d->sepfile, &uni->sepfile, sizeof(d->sepfile)-1);
5366 unistr2_to_ascii(d->printprocessor, &uni->printprocessor, sizeof(d->printprocessor)-1);
5367 unistr2_to_ascii(d->datatype, &uni->datatype, sizeof(d->datatype)-1);
5368 unistr2_to_ascii(d->parameters, &uni->parameters, sizeof(d->parameters)-1);
5373 /*******************************************************************
5375 ********************************************************************/
5377 BOOL make_spoolss_q_getprinterdriverdir(SPOOL_Q_GETPRINTERDRIVERDIR *q_u,
5378 fstring servername, fstring env_name, uint32 level,
5379 RPC_BUFFER *buffer, uint32 offered)
5381 init_buf_unistr2(&q_u->name, &q_u->name_ptr, servername);
5382 init_buf_unistr2(&q_u->environment, &q_u->environment_ptr, env_name);
5386 q_u->offered=offered;
5391 /*******************************************************************
5392 Parse a SPOOL_Q_GETPRINTERDRIVERDIR structure.
5393 ********************************************************************/
5395 BOOL spoolss_io_q_getprinterdriverdir(const char *desc, SPOOL_Q_GETPRINTERDRIVERDIR *q_u, prs_struct *ps, int depth)
5397 prs_debug(ps, depth, desc, "spoolss_io_q_getprinterdriverdir");
5402 if(!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
5404 if(!smb_io_unistr2("", &q_u->name, q_u->name_ptr, ps, depth))
5410 if(!prs_uint32("", ps, depth, &q_u->environment_ptr))
5412 if(!smb_io_unistr2("", &q_u->environment, q_u->environment_ptr, ps, depth))
5418 if(!prs_uint32("level", ps, depth, &q_u->level))
5421 if(!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
5427 if(!prs_uint32("offered", ps, depth, &q_u->offered))
5433 /*******************************************************************
5434 Parse a SPOOL_R_GETPRINTERDRIVERDIR structure.
5435 ********************************************************************/
5437 BOOL spoolss_io_r_getprinterdriverdir(const char *desc, SPOOL_R_GETPRINTERDRIVERDIR *r_u, prs_struct *ps, int depth)
5439 prs_debug(ps, depth, desc, "spoolss_io_r_getprinterdriverdir");
5445 if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
5451 if (!prs_uint32("needed", ps, depth, &r_u->needed))
5454 if (!prs_werror("status", ps, depth, &r_u->status))
5460 /*******************************************************************
5461 ********************************************************************/
5463 BOOL spoolss_io_r_enumprintprocessors(const char *desc, SPOOL_R_ENUMPRINTPROCESSORS *r_u, prs_struct *ps, int depth)
5465 prs_debug(ps, depth, desc, "spoolss_io_r_enumprintprocessors");
5471 if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
5477 if (!prs_uint32("needed", ps, depth, &r_u->needed))
5480 if (!prs_uint32("returned", ps, depth, &r_u->returned))
5483 if (!prs_werror("status", ps, depth, &r_u->status))
5489 /*******************************************************************
5490 ********************************************************************/
5492 BOOL spoolss_io_q_enumprintprocessors(const char *desc, SPOOL_Q_ENUMPRINTPROCESSORS *q_u, prs_struct *ps, int depth)
5494 prs_debug(ps, depth, desc, "spoolss_io_q_enumprintprocessors");
5500 if (!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
5502 if (!smb_io_unistr2("name", &q_u->name, True, ps, depth))
5508 if (!prs_uint32("", ps, depth, &q_u->environment_ptr))
5510 if (!smb_io_unistr2("", &q_u->environment, q_u->environment_ptr, ps, depth))
5516 if (!prs_uint32("level", ps, depth, &q_u->level))
5519 if(!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
5525 if (!prs_uint32("offered", ps, depth, &q_u->offered))
5531 /*******************************************************************
5532 ********************************************************************/
5534 BOOL spoolss_io_q_addprintprocessor(const char *desc, SPOOL_Q_ADDPRINTPROCESSOR *q_u, prs_struct *ps, int depth)
5536 prs_debug(ps, depth, desc, "spoolss_io_q_addprintprocessor");
5542 if (!prs_uint32("server_ptr", ps, depth, &q_u->server_ptr))
5544 if (!smb_io_unistr2("server", &q_u->server, q_u->server_ptr, ps, depth))
5549 if (!smb_io_unistr2("environment", &q_u->environment, True, ps, depth))
5554 if (!smb_io_unistr2("path", &q_u->path, True, ps, depth))
5559 if (!smb_io_unistr2("name", &q_u->name, True, ps, depth))
5565 /*******************************************************************
5566 ********************************************************************/
5568 BOOL spoolss_io_r_addprintprocessor(const char *desc, SPOOL_R_ADDPRINTPROCESSOR *r_u, prs_struct *ps, int depth)
5570 prs_debug(ps, depth, desc, "spoolss_io_r_addprintproicessor");
5576 if (!prs_werror("status", ps, depth, &r_u->status))
5582 /*******************************************************************
5583 ********************************************************************/
5585 BOOL spoolss_io_r_enumprintprocdatatypes(const char *desc, SPOOL_R_ENUMPRINTPROCDATATYPES *r_u, prs_struct *ps, int depth)
5587 prs_debug(ps, depth, desc, "spoolss_io_r_enumprintprocdatatypes");
5593 if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
5599 if (!prs_uint32("needed", ps, depth, &r_u->needed))
5602 if (!prs_uint32("returned", ps, depth, &r_u->returned))
5605 if (!prs_werror("status", ps, depth, &r_u->status))
5611 /*******************************************************************
5612 ********************************************************************/
5614 BOOL spoolss_io_q_enumprintprocdatatypes(const char *desc, SPOOL_Q_ENUMPRINTPROCDATATYPES *q_u, prs_struct *ps, int depth)
5616 prs_debug(ps, depth, desc, "spoolss_io_q_enumprintprocdatatypes");
5622 if (!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
5624 if (!smb_io_unistr2("name", &q_u->name, True, ps, depth))
5630 if (!prs_uint32("processor_ptr", ps, depth, &q_u->processor_ptr))
5632 if (!smb_io_unistr2("processor", &q_u->processor, q_u->processor_ptr, ps, depth))
5638 if (!prs_uint32("level", ps, depth, &q_u->level))
5641 if(!prs_rpcbuffer_p("buffer", ps, depth, &q_u->buffer))
5647 if (!prs_uint32("offered", ps, depth, &q_u->offered))
5653 /*******************************************************************
5654 Parse a SPOOL_Q_ENUMPRINTMONITORS structure.
5655 ********************************************************************/
5657 BOOL spoolss_io_q_enumprintmonitors(const char *desc, SPOOL_Q_ENUMPRINTMONITORS *q_u, prs_struct *ps, int depth)
5659 prs_debug(ps, depth, desc, "spoolss_io_q_enumprintmonitors");
5665 if (!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
5667 if (!smb_io_unistr2("name", &q_u->name, True, ps, depth))
5673 if (!prs_uint32("level", ps, depth, &q_u->level))
5676 if(!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
5682 if (!prs_uint32("offered", ps, depth, &q_u->offered))
5688 /*******************************************************************
5689 ********************************************************************/
5691 BOOL spoolss_io_r_enumprintmonitors(const char *desc, SPOOL_R_ENUMPRINTMONITORS *r_u, prs_struct *ps, int depth)
5693 prs_debug(ps, depth, desc, "spoolss_io_r_enumprintmonitors");
5699 if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
5705 if (!prs_uint32("needed", ps, depth, &r_u->needed))
5708 if (!prs_uint32("returned", ps, depth, &r_u->returned))
5711 if (!prs_werror("status", ps, depth, &r_u->status))
5717 /*******************************************************************
5718 ********************************************************************/
5720 BOOL spoolss_io_r_enumprinterdata(const char *desc, SPOOL_R_ENUMPRINTERDATA *r_u, prs_struct *ps, int depth)
5722 prs_debug(ps, depth, desc, "spoolss_io_r_enumprinterdata");
5727 if(!prs_uint32("valuesize", ps, depth, &r_u->valuesize))
5730 if (UNMARSHALLING(ps) && r_u->valuesize) {
5731 r_u->value = PRS_ALLOC_MEM(ps, uint16, r_u->valuesize);
5733 DEBUG(0, ("spoolss_io_r_enumprinterdata: out of memory for printerdata value\n"));
5738 if(!prs_uint16uni(False, "value", ps, depth, r_u->value, r_u->valuesize ))
5744 if(!prs_uint32("realvaluesize", ps, depth, &r_u->realvaluesize))
5747 if(!prs_uint32("type", ps, depth, &r_u->type))
5750 if(!prs_uint32("datasize", ps, depth, &r_u->datasize))
5753 if (UNMARSHALLING(ps) && r_u->datasize) {
5754 r_u->data = PRS_ALLOC_MEM(ps, uint8, r_u->datasize);
5756 DEBUG(0, ("spoolss_io_r_enumprinterdata: out of memory for printerdata data\n"));
5761 if(!prs_uint8s(False, "data", ps, depth, r_u->data, r_u->datasize))
5766 if(!prs_uint32("realdatasize", ps, depth, &r_u->realdatasize))
5768 if(!prs_werror("status", ps, depth, &r_u->status))
5774 /*******************************************************************
5775 ********************************************************************/
5777 BOOL spoolss_io_q_enumprinterdata(const char *desc, SPOOL_Q_ENUMPRINTERDATA *q_u, prs_struct *ps, int depth)
5779 prs_debug(ps, depth, desc, "spoolss_io_q_enumprinterdata");
5784 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
5786 if(!prs_uint32("index", ps, depth, &q_u->index))
5788 if(!prs_uint32("valuesize", ps, depth, &q_u->valuesize))
5790 if(!prs_uint32("datasize", ps, depth, &q_u->datasize))
5796 /*******************************************************************
5797 ********************************************************************/
5799 BOOL make_spoolss_q_enumprinterdata(SPOOL_Q_ENUMPRINTERDATA *q_u,
5800 const POLICY_HND *hnd,
5801 uint32 idx, uint32 valuelen, uint32 datalen)
5803 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
5805 q_u->valuesize=valuelen;
5806 q_u->datasize=datalen;
5811 /*******************************************************************
5812 ********************************************************************/
5814 BOOL make_spoolss_q_enumprinterdataex(SPOOL_Q_ENUMPRINTERDATAEX *q_u,
5815 const POLICY_HND *hnd, const char *key,
5818 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
5819 init_unistr2(&q_u->key, key, UNI_STR_TERMINATE);
5825 /*******************************************************************
5826 ********************************************************************/
5827 BOOL make_spoolss_q_setprinterdata(SPOOL_Q_SETPRINTERDATA *q_u, const POLICY_HND *hnd,
5828 char* value, uint32 data_type, char* data, uint32 data_size)
5830 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
5831 q_u->type = data_type;
5832 init_unistr2(&q_u->value, value, UNI_STR_TERMINATE);
5834 q_u->max_len = q_u->real_len = data_size;
5835 q_u->data = (unsigned char *)data;
5840 /*******************************************************************
5841 ********************************************************************/
5842 BOOL make_spoolss_q_setprinterdataex(SPOOL_Q_SETPRINTERDATAEX *q_u, const POLICY_HND *hnd,
5843 char *key, char* value, uint32 data_type, char* data,
5846 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
5847 q_u->type = data_type;
5848 init_unistr2(&q_u->value, value, UNI_STR_TERMINATE);
5849 init_unistr2(&q_u->key, key, UNI_STR_TERMINATE);
5851 q_u->max_len = q_u->real_len = data_size;
5852 q_u->data = (unsigned char *)data;
5857 /*******************************************************************
5858 ********************************************************************/
5860 BOOL spoolss_io_q_setprinterdata(const char *desc, SPOOL_Q_SETPRINTERDATA *q_u, prs_struct *ps, int depth)
5862 prs_debug(ps, depth, desc, "spoolss_io_q_setprinterdata");
5867 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
5869 if(!smb_io_unistr2("", &q_u->value, True, ps, depth))
5875 if(!prs_uint32("type", ps, depth, &q_u->type))
5878 if(!prs_uint32("max_len", ps, depth, &q_u->max_len))
5888 if (UNMARSHALLING(ps))
5889 q_u->data=PRS_ALLOC_MEM(ps, uint8, q_u->max_len);
5890 if(q_u->data == NULL)
5892 if(!prs_uint8s(False,"data", ps, depth, q_u->data, q_u->max_len))
5900 if(!prs_uint32("real_len", ps, depth, &q_u->real_len))
5906 /*******************************************************************
5907 ********************************************************************/
5909 BOOL spoolss_io_r_setprinterdata(const char *desc, SPOOL_R_SETPRINTERDATA *r_u, prs_struct *ps, int depth)
5911 prs_debug(ps, depth, desc, "spoolss_io_r_setprinterdata");
5916 if(!prs_werror("status", ps, depth, &r_u->status))
5922 /*******************************************************************
5923 ********************************************************************/
5924 BOOL spoolss_io_q_resetprinter(const char *desc, SPOOL_Q_RESETPRINTER *q_u, prs_struct *ps, int depth)
5926 prs_debug(ps, depth, desc, "spoolss_io_q_resetprinter");
5931 if (!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
5934 if (!prs_uint32("datatype_ptr", ps, depth, &q_u->datatype_ptr))
5937 if (q_u->datatype_ptr) {
5938 if (!smb_io_unistr2("datatype", &q_u->datatype, q_u->datatype_ptr?True:False, ps, depth))
5942 if (!spoolss_io_devmode_cont(desc, &q_u->devmode_ctr, ps, depth))
5949 /*******************************************************************
5950 ********************************************************************/
5951 BOOL spoolss_io_r_resetprinter(const char *desc, SPOOL_R_RESETPRINTER *r_u, prs_struct *ps, int depth)
5953 prs_debug(ps, depth, desc, "spoolss_io_r_resetprinter");
5958 if(!prs_werror("status", ps, depth, &r_u->status))
5964 /*******************************************************************
5965 ********************************************************************/
5967 static BOOL spoolss_io_addform(const char *desc, FORM *f, uint32 ptr, prs_struct *ps, int depth)
5969 prs_debug(ps, depth, desc, "spoolss_io_addform");
5976 if(!prs_uint32("flags", ps, depth, &f->flags))
5978 if(!prs_uint32("name_ptr", ps, depth, &f->name_ptr))
5980 if(!prs_uint32("size_x", ps, depth, &f->size_x))
5982 if(!prs_uint32("size_y", ps, depth, &f->size_y))
5984 if(!prs_uint32("left", ps, depth, &f->left))
5986 if(!prs_uint32("top", ps, depth, &f->top))
5988 if(!prs_uint32("right", ps, depth, &f->right))
5990 if(!prs_uint32("bottom", ps, depth, &f->bottom))
5993 if(!smb_io_unistr2("", &f->name, f->name_ptr, ps, depth))
6000 /*******************************************************************
6001 ********************************************************************/
6003 BOOL spoolss_io_q_deleteform(const char *desc, SPOOL_Q_DELETEFORM *q_u, prs_struct *ps, int depth)
6005 prs_debug(ps, depth, desc, "spoolss_io_q_deleteform");
6010 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
6012 if(!smb_io_unistr2("form name", &q_u->name, True, ps, depth))
6018 /*******************************************************************
6019 ********************************************************************/
6021 BOOL spoolss_io_r_deleteform(const char *desc, SPOOL_R_DELETEFORM *r_u, prs_struct *ps, int depth)
6023 prs_debug(ps, depth, desc, "spoolss_io_r_deleteform");
6028 if(!prs_werror("status", ps, depth, &r_u->status))
6034 /*******************************************************************
6035 ********************************************************************/
6037 BOOL spoolss_io_q_addform(const char *desc, SPOOL_Q_ADDFORM *q_u, prs_struct *ps, int depth)
6039 uint32 useless_ptr=1;
6040 prs_debug(ps, depth, desc, "spoolss_io_q_addform");
6045 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
6047 if(!prs_uint32("level", ps, depth, &q_u->level))
6049 if(!prs_uint32("level2", ps, depth, &q_u->level2))
6054 if(!prs_uint32("useless_ptr", ps, depth, &useless_ptr))
6056 if(!spoolss_io_addform("", &q_u->form, useless_ptr, ps, depth))
6063 /*******************************************************************
6064 ********************************************************************/
6066 BOOL spoolss_io_r_addform(const char *desc, SPOOL_R_ADDFORM *r_u, prs_struct *ps, int depth)
6068 prs_debug(ps, depth, desc, "spoolss_io_r_addform");
6073 if(!prs_werror("status", ps, depth, &r_u->status))
6079 /*******************************************************************
6080 ********************************************************************/
6082 BOOL spoolss_io_q_setform(const char *desc, SPOOL_Q_SETFORM *q_u, prs_struct *ps, int depth)
6084 uint32 useless_ptr=1;
6085 prs_debug(ps, depth, desc, "spoolss_io_q_setform");
6090 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
6092 if(!smb_io_unistr2("", &q_u->name, True, ps, depth))
6098 if(!prs_uint32("level", ps, depth, &q_u->level))
6100 if(!prs_uint32("level2", ps, depth, &q_u->level2))
6105 if(!prs_uint32("useless_ptr", ps, depth, &useless_ptr))
6107 if(!spoolss_io_addform("", &q_u->form, useless_ptr, ps, depth))
6114 /*******************************************************************
6115 ********************************************************************/
6117 BOOL spoolss_io_r_setform(const char *desc, SPOOL_R_SETFORM *r_u, prs_struct *ps, int depth)
6119 prs_debug(ps, depth, desc, "spoolss_io_r_setform");
6124 if(!prs_werror("status", ps, depth, &r_u->status))
6130 /*******************************************************************
6131 Parse a SPOOL_R_GETJOB structure.
6132 ********************************************************************/
6134 BOOL spoolss_io_r_getjob(const char *desc, SPOOL_R_GETJOB *r_u, prs_struct *ps, int depth)
6136 prs_debug(ps, depth, desc, "spoolss_io_r_getjob");
6142 if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
6148 if (!prs_uint32("needed", ps, depth, &r_u->needed))
6151 if (!prs_werror("status", ps, depth, &r_u->status))
6157 /*******************************************************************
6158 Parse a SPOOL_Q_GETJOB structure.
6159 ********************************************************************/
6161 BOOL spoolss_io_q_getjob(const char *desc, SPOOL_Q_GETJOB *q_u, prs_struct *ps, int depth)
6163 prs_debug(ps, depth, desc, "");
6169 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
6171 if(!prs_uint32("jobid", ps, depth, &q_u->jobid))
6173 if(!prs_uint32("level", ps, depth, &q_u->level))
6176 if(!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
6182 if(!prs_uint32("offered", ps, depth, &q_u->offered))
6188 void free_devmode(DEVICEMODE *devmode)
6190 if (devmode!=NULL) {
6191 SAFE_FREE(devmode->private);
6196 void free_printer_info_1(PRINTER_INFO_1 *printer)
6201 void free_printer_info_2(PRINTER_INFO_2 *printer)
6203 if (printer!=NULL) {
6204 free_devmode(printer->devmode);
6205 printer->devmode = NULL;
6210 void free_printer_info_3(PRINTER_INFO_3 *printer)
6215 void free_printer_info_4(PRINTER_INFO_4 *printer)
6220 void free_printer_info_5(PRINTER_INFO_5 *printer)
6225 void free_printer_info_7(PRINTER_INFO_7 *printer)
6230 void free_job_info_2(JOB_INFO_2 *job)
6233 free_devmode(job->devmode);
6236 /*******************************************************************
6238 ********************************************************************/
6240 BOOL make_spoolss_q_replyopenprinter(SPOOL_Q_REPLYOPENPRINTER *q_u,
6241 const fstring string, uint32 printer, uint32 type)
6246 init_unistr2(&q_u->string, string, UNI_STR_TERMINATE);
6248 q_u->printer=printer;
6257 /*******************************************************************
6258 Parse a SPOOL_Q_REPLYOPENPRINTER structure.
6259 ********************************************************************/
6261 BOOL spoolss_io_q_replyopenprinter(const char *desc, SPOOL_Q_REPLYOPENPRINTER *q_u, prs_struct *ps, int depth)
6263 prs_debug(ps, depth, desc, "spoolss_io_q_replyopenprinter");
6269 if(!smb_io_unistr2("", &q_u->string, True, ps, depth))
6275 if(!prs_uint32("printer", ps, depth, &q_u->printer))
6277 if(!prs_uint32("type", ps, depth, &q_u->type))
6280 if(!prs_uint32("unknown0", ps, depth, &q_u->unknown0))
6282 if(!prs_uint32("unknown1", ps, depth, &q_u->unknown1))
6288 /*******************************************************************
6289 Parse a SPOOL_R_REPLYOPENPRINTER structure.
6290 ********************************************************************/
6292 BOOL spoolss_io_r_replyopenprinter(const char *desc, SPOOL_R_REPLYOPENPRINTER *r_u, prs_struct *ps, int depth)
6294 prs_debug(ps, depth, desc, "spoolss_io_r_replyopenprinter");
6300 if(!smb_io_pol_hnd("printer handle",&r_u->handle,ps,depth))
6303 if (!prs_werror("status", ps, depth, &r_u->status))
6309 /*******************************************************************
6311 ********************************************************************/
6312 BOOL make_spoolss_q_routerreplyprinter(SPOOL_Q_ROUTERREPLYPRINTER *q_u, POLICY_HND *hnd,
6313 uint32 condition, uint32 change_id)
6316 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
6318 q_u->condition = condition;
6319 q_u->change_id = change_id;
6322 q_u->unknown1 = 0x1;
6323 memset(q_u->unknown2, 0x0, 5);
6324 q_u->unknown2[0] = 0x1;
6329 /*******************************************************************
6330 Parse a SPOOL_Q_ROUTERREPLYPRINTER structure.
6331 ********************************************************************/
6332 BOOL spoolss_io_q_routerreplyprinter (const char *desc, SPOOL_Q_ROUTERREPLYPRINTER *q_u, prs_struct *ps, int depth)
6335 prs_debug(ps, depth, desc, "spoolss_io_q_routerreplyprinter");
6341 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
6344 if (!prs_uint32("condition", ps, depth, &q_u->condition))
6347 if (!prs_uint32("unknown1", ps, depth, &q_u->unknown1))
6350 if (!prs_uint32("change_id", ps, depth, &q_u->change_id))
6353 if (!prs_uint8s(False, "private", ps, depth, q_u->unknown2, 5))
6359 /*******************************************************************
6360 Parse a SPOOL_R_ROUTERREPLYPRINTER structure.
6361 ********************************************************************/
6362 BOOL spoolss_io_r_routerreplyprinter (const char *desc, SPOOL_R_ROUTERREPLYPRINTER *r_u, prs_struct *ps, int depth)
6364 prs_debug(ps, depth, desc, "spoolss_io_r_routerreplyprinter");
6370 if (!prs_werror("status", ps, depth, &r_u->status))
6376 /*******************************************************************
6378 ********************************************************************/
6380 BOOL make_spoolss_q_reply_closeprinter(SPOOL_Q_REPLYCLOSEPRINTER *q_u, POLICY_HND *hnd)
6385 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
6390 /*******************************************************************
6391 Parse a SPOOL_Q_REPLYCLOSEPRINTER structure.
6392 ********************************************************************/
6394 BOOL spoolss_io_q_replycloseprinter(const char *desc, SPOOL_Q_REPLYCLOSEPRINTER *q_u, prs_struct *ps, int depth)
6396 prs_debug(ps, depth, desc, "spoolss_io_q_replycloseprinter");
6402 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
6408 /*******************************************************************
6409 Parse a SPOOL_R_REPLYCLOSEPRINTER structure.
6410 ********************************************************************/
6412 BOOL spoolss_io_r_replycloseprinter(const char *desc, SPOOL_R_REPLYCLOSEPRINTER *r_u, prs_struct *ps, int depth)
6414 prs_debug(ps, depth, desc, "spoolss_io_r_replycloseprinter");
6420 if(!smb_io_pol_hnd("printer handle",&r_u->handle,ps,depth))
6423 if (!prs_werror("status", ps, depth, &r_u->status))
6429 #if 0 /* JERRY - not currently used but could be :-) */
6431 /*******************************************************************
6432 Deep copy a SPOOL_NOTIFY_INFO_DATA structure
6433 ******************************************************************/
6434 static BOOL copy_spool_notify_info_data(SPOOL_NOTIFY_INFO_DATA *dst,
6435 SPOOL_NOTIFY_INFO_DATA *src, int n)
6439 memcpy(dst, src, sizeof(SPOOL_NOTIFY_INFO_DATA)*n);
6441 for (i=0; i<n; i++) {
6445 if (src->size != POINTER)
6447 len = src->notify_data.data.length;
6448 s = SMB_MALLOC_ARRAY(uint16, len);
6450 DEBUG(0,("copy_spool_notify_info_data: malloc() failed!\n"));
6454 memcpy(s, src->notify_data.data.string, len*2);
6455 dst->notify_data.data.string = s;
6461 /*******************************************************************
6462 Deep copy a SPOOL_NOTIFY_INFO structure
6463 ******************************************************************/
6464 static BOOL copy_spool_notify_info(SPOOL_NOTIFY_INFO *dst, SPOOL_NOTIFY_INFO *src)
6467 DEBUG(0,("copy_spool_notify_info: NULL destination pointer!\n"));
6471 dst->version = src->version;
6472 dst->flags = src->flags;
6473 dst->count = src->count;
6477 dst->data = SMB_MALLOC_ARRAY(SPOOL_NOTIFY_INFO_DATA, dst->count);
6479 DEBUG(10,("copy_spool_notify_info: allocating space for [%d] PRINTER_NOTIFY_INFO_DATA entries\n",
6482 if (dst->data == NULL) {
6483 DEBUG(0,("copy_spool_notify_info: malloc() failed for [%d] entries!\n",
6488 return (copy_spool_notify_info_data(dst->data, src->data, src->count));
6495 /*******************************************************************
6497 ********************************************************************/
6499 BOOL make_spoolss_q_reply_rrpcn(SPOOL_Q_REPLY_RRPCN *q_u, POLICY_HND *hnd,
6500 uint32 change_low, uint32 change_high,
6501 SPOOL_NOTIFY_INFO *info)
6506 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
6508 q_u->change_low=change_low;
6509 q_u->change_high=change_high;
6514 q_u->info_ptr=0x0FF0ADDE;
6516 q_u->info.version=2;
6519 DEBUG(10,("make_spoolss_q_reply_rrpcn: [%d] PRINTER_NOTIFY_INFO_DATA\n",
6521 q_u->info.version = info->version;
6522 q_u->info.flags = info->flags;
6523 q_u->info.count = info->count;
6524 /* pointer field - be careful! */
6525 q_u->info.data = info->data;
6528 q_u->info.flags=PRINTER_NOTIFY_INFO_DISCARDED;
6535 /*******************************************************************
6536 Parse a SPOOL_Q_REPLY_RRPCN structure.
6537 ********************************************************************/
6539 BOOL spoolss_io_q_reply_rrpcn(const char *desc, SPOOL_Q_REPLY_RRPCN *q_u, prs_struct *ps, int depth)
6541 prs_debug(ps, depth, desc, "spoolss_io_q_reply_rrpcn");
6547 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
6550 if (!prs_uint32("change_low", ps, depth, &q_u->change_low))
6553 if (!prs_uint32("change_high", ps, depth, &q_u->change_high))
6556 if (!prs_uint32("unknown0", ps, depth, &q_u->unknown0))
6559 if (!prs_uint32("unknown1", ps, depth, &q_u->unknown1))
6562 if (!prs_uint32("info_ptr", ps, depth, &q_u->info_ptr))
6565 if(q_u->info_ptr!=0)
6566 if(!smb_io_notify_info(desc, &q_u->info, ps, depth))
6572 /*******************************************************************
6573 Parse a SPOOL_R_REPLY_RRPCN structure.
6574 ********************************************************************/
6576 BOOL spoolss_io_r_reply_rrpcn(const char *desc, SPOOL_R_REPLY_RRPCN *r_u, prs_struct *ps, int depth)
6578 prs_debug(ps, depth, desc, "spoolss_io_r_reply_rrpcn");
6584 if (!prs_uint32("unknown0", ps, depth, &r_u->unknown0))
6587 if (!prs_werror("status", ps, depth, &r_u->status))
6593 /*******************************************************************
6595 * called from spoolss_q_getprinterdataex (srv_spoolss.c)
6596 ********************************************************************/
6598 BOOL spoolss_io_q_getprinterdataex(const char *desc, SPOOL_Q_GETPRINTERDATAEX *q_u, prs_struct *ps, int depth)
6603 prs_debug(ps, depth, desc, "spoolss_io_q_getprinterdataex");
6608 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
6612 if (!smb_io_unistr2("keyname", &q_u->keyname,True,ps,depth))
6616 if (!smb_io_unistr2("valuename", &q_u->valuename,True,ps,depth))
6620 if (!prs_uint32("size", ps, depth, &q_u->size))
6626 /*******************************************************************
6627 * write a structure.
6628 * called from spoolss_r_getprinterdataex (srv_spoolss.c)
6629 ********************************************************************/
6631 BOOL spoolss_io_r_getprinterdataex(const char *desc, SPOOL_R_GETPRINTERDATAEX *r_u, prs_struct *ps, int depth)
6636 prs_debug(ps, depth, desc, "spoolss_io_r_getprinterdataex");
6641 if (!prs_uint32("type", ps, depth, &r_u->type))
6643 if (!prs_uint32("size", ps, depth, &r_u->size))
6646 if (UNMARSHALLING(ps) && r_u->size) {
6647 r_u->data = PRS_ALLOC_MEM(ps, unsigned char, r_u->size);
6652 if (!prs_uint8s(False,"data", ps, depth, r_u->data, r_u->size))
6658 if (!prs_uint32("needed", ps, depth, &r_u->needed))
6660 if (!prs_werror("status", ps, depth, &r_u->status))
6666 /*******************************************************************
6668 ********************************************************************/
6670 BOOL spoolss_io_q_setprinterdataex(const char *desc, SPOOL_Q_SETPRINTERDATAEX *q_u, prs_struct *ps, int depth)
6672 prs_debug(ps, depth, desc, "spoolss_io_q_setprinterdataex");
6677 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
6679 if(!smb_io_unistr2("", &q_u->key, True, ps, depth))
6685 if(!smb_io_unistr2("", &q_u->value, True, ps, depth))
6691 if(!prs_uint32("type", ps, depth, &q_u->type))
6694 if(!prs_uint32("max_len", ps, depth, &q_u->max_len))
6704 if (UNMARSHALLING(ps))
6705 q_u->data=PRS_ALLOC_MEM(ps, uint8, q_u->max_len);
6706 if(q_u->data == NULL)
6708 if(!prs_uint8s(False,"data", ps, depth, q_u->data, q_u->max_len))
6716 if(!prs_uint32("real_len", ps, depth, &q_u->real_len))
6722 /*******************************************************************
6723 * write a structure.
6724 ********************************************************************/
6726 BOOL spoolss_io_r_setprinterdataex(const char *desc, SPOOL_R_SETPRINTERDATAEX *r_u, prs_struct *ps, int depth)
6728 prs_debug(ps, depth, desc, "spoolss_io_r_setprinterdataex");
6733 if(!prs_werror("status", ps, depth, &r_u->status))
6739 /*******************************************************************
6741 ********************************************************************/
6742 BOOL make_spoolss_q_enumprinterkey(SPOOL_Q_ENUMPRINTERKEY *q_u,
6743 POLICY_HND *hnd, const char *key,
6746 DEBUG(5,("make_spoolss_q_enumprinterkey\n"));
6748 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
6749 init_unistr2(&q_u->key, key, UNI_STR_TERMINATE);
6755 /*******************************************************************
6757 ********************************************************************/
6759 BOOL spoolss_io_q_enumprinterkey(const char *desc, SPOOL_Q_ENUMPRINTERKEY *q_u, prs_struct *ps, int depth)
6761 prs_debug(ps, depth, desc, "spoolss_io_q_enumprinterkey");
6766 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
6769 if(!smb_io_unistr2("", &q_u->key, True, ps, depth))
6775 if(!prs_uint32("size", ps, depth, &q_u->size))
6781 /*******************************************************************
6782 * write a structure.
6783 ********************************************************************/
6785 BOOL spoolss_io_r_enumprinterkey(const char *desc, SPOOL_R_ENUMPRINTERKEY *r_u, prs_struct *ps, int depth)
6787 prs_debug(ps, depth, desc, "spoolss_io_r_enumprinterkey");
6793 if (!smb_io_buffer5("", &r_u->keys, ps, depth))
6799 if(!prs_uint32("needed", ps, depth, &r_u->needed))
6802 if(!prs_werror("status", ps, depth, &r_u->status))
6808 /*******************************************************************
6810 ********************************************************************/
6812 BOOL make_spoolss_q_deleteprinterkey(SPOOL_Q_DELETEPRINTERKEY *q_u,
6813 POLICY_HND *hnd, char *keyname)
6815 DEBUG(5,("make_spoolss_q_deleteprinterkey\n"));
6817 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
6818 init_unistr2(&q_u->keyname, keyname, UNI_STR_TERMINATE);
6823 /*******************************************************************
6825 ********************************************************************/
6827 BOOL spoolss_io_q_deleteprinterkey(const char *desc, SPOOL_Q_DELETEPRINTERKEY *q_u, prs_struct *ps, int depth)
6829 prs_debug(ps, depth, desc, "spoolss_io_q_deleteprinterkey");
6834 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
6837 if(!smb_io_unistr2("", &q_u->keyname, True, ps, depth))
6843 /*******************************************************************
6844 * write a structure.
6845 ********************************************************************/
6847 BOOL spoolss_io_r_deleteprinterkey(const char *desc, SPOOL_R_DELETEPRINTERKEY *r_u, prs_struct *ps, int depth)
6849 prs_debug(ps, depth, desc, "spoolss_io_r_deleteprinterkey");
6855 if(!prs_werror("status", ps, depth, &r_u->status))
6862 /*******************************************************************
6864 ********************************************************************/
6866 BOOL spoolss_io_q_enumprinterdataex(const char *desc, SPOOL_Q_ENUMPRINTERDATAEX *q_u, prs_struct *ps, int depth)
6868 prs_debug(ps, depth, desc, "spoolss_io_q_enumprinterdataex");
6873 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
6876 if(!smb_io_unistr2("", &q_u->key, True, ps, depth))
6882 if(!prs_uint32("size", ps, depth, &q_u->size))
6888 /*******************************************************************
6889 ********************************************************************/
6891 static BOOL spoolss_io_printer_enum_values_ctr(const char *desc, prs_struct *ps,
6892 PRINTER_ENUM_VALUES_CTR *ctr, int depth)
6895 uint32 valuename_offset,
6898 const uint32 basic_unit = 20; /* size of static portion of enum_values */
6900 prs_debug(ps, depth, desc, "spoolss_io_printer_enum_values_ctr");
6904 * offset data begins at 20 bytes per structure * size_of_array.
6905 * Don't forget the uint32 at the beginning
6908 current_offset = basic_unit * ctr->size_of_array;
6910 /* first loop to write basic enum_value information */
6912 if (UNMARSHALLING(ps)) {
6913 ctr->values = PRS_ALLOC_MEM(ps, PRINTER_ENUM_VALUES, ctr->size_of_array);
6918 for (i=0; i<ctr->size_of_array; i++) {
6919 valuename_offset = current_offset;
6920 if (!prs_uint32("valuename_offset", ps, depth, &valuename_offset))
6923 if (!prs_uint32("value_len", ps, depth, &ctr->values[i].value_len))
6926 if (!prs_uint32("type", ps, depth, &ctr->values[i].type))
6929 data_offset = ctr->values[i].value_len + valuename_offset;
6931 if (!prs_uint32("data_offset", ps, depth, &data_offset))
6934 if (!prs_uint32("data_len", ps, depth, &ctr->values[i].data_len))
6937 current_offset = data_offset + ctr->values[i].data_len - basic_unit;
6938 /* account for 2 byte alignment */
6939 current_offset += (current_offset % 2);
6943 * loop #2 for writing the dynamically size objects; pay
6944 * attention to 2-byte alignment here....
6947 for (i=0; i<ctr->size_of_array; i++) {
6949 if (!prs_unistr("valuename", ps, depth, &ctr->values[i].valuename))
6952 if ( ctr->values[i].data_len ) {
6953 if ( UNMARSHALLING(ps) ) {
6954 ctr->values[i].data = PRS_ALLOC_MEM(ps, uint8, ctr->values[i].data_len);
6955 if (!ctr->values[i].data)
6958 if (!prs_uint8s(False, "data", ps, depth, ctr->values[i].data, ctr->values[i].data_len))
6962 if ( !prs_align_uint16(ps) )
6969 /*******************************************************************
6970 * write a structure.
6971 ********************************************************************/
6973 BOOL spoolss_io_r_enumprinterdataex(const char *desc, SPOOL_R_ENUMPRINTERDATAEX *r_u, prs_struct *ps, int depth)
6975 uint32 data_offset, end_offset;
6976 prs_debug(ps, depth, desc, "spoolss_io_r_enumprinterdataex");
6982 if (!prs_uint32("size", ps, depth, &r_u->ctr.size))
6985 data_offset = prs_offset(ps);
6987 if (!prs_set_offset(ps, data_offset + r_u->ctr.size))
6993 if(!prs_uint32("needed", ps, depth, &r_u->needed))
6996 if(!prs_uint32("returned", ps, depth, &r_u->returned))
6999 if(!prs_werror("status", ps, depth, &r_u->status))
7002 r_u->ctr.size_of_array = r_u->returned;
7004 end_offset = prs_offset(ps);
7006 if (!prs_set_offset(ps, data_offset))
7010 if (!spoolss_io_printer_enum_values_ctr("", ps, &r_u->ctr, depth ))
7013 if (!prs_set_offset(ps, end_offset))
7018 /*******************************************************************
7019 * write a structure.
7020 ********************************************************************/
7023 uint32 GetPrintProcessorDirectory(
7025 [in] unistr2 *environment,
7027 [in,out] RPC_BUFFER buffer,
7028 [in] uint32 offered,
7029 [out] uint32 needed,
7030 [out] uint32 returned
7035 BOOL make_spoolss_q_getprintprocessordirectory(SPOOL_Q_GETPRINTPROCESSORDIRECTORY *q_u, const char *name, char *environment, int level, RPC_BUFFER *buffer, uint32 offered)
7037 DEBUG(5,("make_spoolss_q_getprintprocessordirectory\n"));
7039 init_unistr2(&q_u->name, name, UNI_STR_TERMINATE);
7040 init_unistr2(&q_u->environment, environment, UNI_STR_TERMINATE);
7044 q_u->buffer = buffer;
7045 q_u->offered = offered;
7050 BOOL spoolss_io_q_getprintprocessordirectory(const char *desc, SPOOL_Q_GETPRINTPROCESSORDIRECTORY *q_u, prs_struct *ps, int depth)
7054 prs_debug(ps, depth, desc, "spoolss_io_q_getprintprocessordirectory");
7060 if (!prs_uint32("ptr", ps, depth, &ptr))
7064 if(!smb_io_unistr2("name", &q_u->name, True, ps, depth))
7071 if (!prs_uint32("ptr", ps, depth, &ptr))
7075 if(!smb_io_unistr2("environment", &q_u->environment, True,
7083 if(!prs_uint32("level", ps, depth, &q_u->level))
7086 if(!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
7092 if(!prs_uint32("offered", ps, depth, &q_u->offered))
7098 /*******************************************************************
7099 * write a structure.
7100 ********************************************************************/
7102 BOOL spoolss_io_r_getprintprocessordirectory(const char *desc, SPOOL_R_GETPRINTPROCESSORDIRECTORY *r_u, prs_struct *ps, int depth)
7104 prs_debug(ps, depth, desc, "spoolss_io_r_getprintprocessordirectory");
7110 if(!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
7116 if(!prs_uint32("needed", ps, depth, &r_u->needed))
7119 if(!prs_werror("status", ps, depth, &r_u->status))
7125 BOOL smb_io_printprocessordirectory_1(const char *desc, RPC_BUFFER *buffer, PRINTPROCESSOR_DIRECTORY_1 *info, int depth)
7127 prs_struct *ps=&buffer->prs;
7129 prs_debug(ps, depth, desc, "smb_io_printprocessordirectory_1");
7132 buffer->struct_start=prs_offset(ps);
7134 if (!smb_io_unistr(desc, &info->name, ps, depth))
7140 /*******************************************************************
7142 ********************************************************************/
7144 BOOL make_spoolss_q_addform(SPOOL_Q_ADDFORM *q_u, POLICY_HND *handle,
7145 int level, FORM *form)
7147 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7149 q_u->level2 = level;
7150 memcpy(&q_u->form, form, sizeof(FORM));
7155 /*******************************************************************
7157 ********************************************************************/
7159 BOOL make_spoolss_q_setform(SPOOL_Q_SETFORM *q_u, POLICY_HND *handle,
7160 int level, const char *form_name, FORM *form)
7162 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7164 q_u->level2 = level;
7165 memcpy(&q_u->form, form, sizeof(FORM));
7166 init_unistr2(&q_u->name, form_name, UNI_STR_TERMINATE);
7171 /*******************************************************************
7173 ********************************************************************/
7175 BOOL make_spoolss_q_deleteform(SPOOL_Q_DELETEFORM *q_u, POLICY_HND *handle,
7178 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7179 init_unistr2(&q_u->name, form, UNI_STR_TERMINATE);
7183 /*******************************************************************
7185 ********************************************************************/
7187 BOOL make_spoolss_q_getform(SPOOL_Q_GETFORM *q_u, POLICY_HND *handle,
7188 const char *formname, uint32 level,
7189 RPC_BUFFER *buffer, uint32 offered)
7191 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7193 init_unistr2(&q_u->formname, formname, UNI_STR_TERMINATE);
7195 q_u->offered=offered;
7200 /*******************************************************************
7202 ********************************************************************/
7204 BOOL make_spoolss_q_enumforms(SPOOL_Q_ENUMFORMS *q_u, POLICY_HND *handle,
7205 uint32 level, RPC_BUFFER *buffer,
7208 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7211 q_u->offered=offered;
7216 /*******************************************************************
7218 ********************************************************************/
7220 BOOL make_spoolss_q_setjob(SPOOL_Q_SETJOB *q_u, POLICY_HND *handle,
7221 uint32 jobid, uint32 level, uint32 command)
7223 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7227 /* Hmm - the SPOOL_Q_SETJOB structure has a JOB_INFO ctr in it but
7228 the server side code has it marked as unused. */
7230 q_u->command = command;
7235 /*******************************************************************
7237 ********************************************************************/
7239 BOOL make_spoolss_q_getjob(SPOOL_Q_GETJOB *q_u, POLICY_HND *handle,
7240 uint32 jobid, uint32 level, RPC_BUFFER *buffer,
7243 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7246 q_u->buffer = buffer;
7247 q_u->offered = offered;
7252 /*******************************************************************
7254 ********************************************************************/
7256 BOOL make_spoolss_q_startpageprinter(SPOOL_Q_STARTPAGEPRINTER *q_u,
7259 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7264 /*******************************************************************
7266 ********************************************************************/
7268 BOOL make_spoolss_q_endpageprinter(SPOOL_Q_ENDPAGEPRINTER *q_u,
7271 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7276 /*******************************************************************
7278 ********************************************************************/
7280 BOOL make_spoolss_q_startdocprinter(SPOOL_Q_STARTDOCPRINTER *q_u,
7281 POLICY_HND *handle, uint32 level,
7282 char *docname, char *outputfile,
7285 DOC_INFO_CONTAINER *ctr = &q_u->doc_info_container;
7287 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7293 ctr->docinfo.switch_value = level;
7295 ctr->docinfo.doc_info_1.p_docname = docname ? 1 : 0;
7296 ctr->docinfo.doc_info_1.p_outputfile = outputfile ? 1 : 0;
7297 ctr->docinfo.doc_info_1.p_datatype = datatype ? 1 : 0;
7299 init_unistr2(&ctr->docinfo.doc_info_1.docname, docname, UNI_STR_TERMINATE);
7300 init_unistr2(&ctr->docinfo.doc_info_1.outputfile, outputfile, UNI_STR_TERMINATE);
7301 init_unistr2(&ctr->docinfo.doc_info_1.datatype, datatype, UNI_STR_TERMINATE);
7305 /* DOC_INFO_2 is only used by Windows 9x and since it
7306 doesn't do printing over RPC we don't have to worry
7309 DEBUG(3, ("unsupported info level %d\n", level));
7316 /*******************************************************************
7318 ********************************************************************/
7320 BOOL make_spoolss_q_enddocprinter(SPOOL_Q_ENDDOCPRINTER *q_u,
7323 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7328 /*******************************************************************
7330 ********************************************************************/
7332 BOOL make_spoolss_q_writeprinter(SPOOL_Q_WRITEPRINTER *q_u,
7333 POLICY_HND *handle, uint32 data_size,
7336 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7337 q_u->buffer_size = q_u->buffer_size2 = data_size;
7338 q_u->buffer = (unsigned char *)data;
7342 /*******************************************************************
7344 ********************************************************************/
7346 BOOL make_spoolss_q_deleteprinterdata(SPOOL_Q_DELETEPRINTERDATA *q_u,
7347 POLICY_HND *handle, char *valuename)
7349 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7350 init_unistr2(&q_u->valuename, valuename, UNI_STR_TERMINATE);
7355 /*******************************************************************
7357 ********************************************************************/
7359 BOOL make_spoolss_q_deleteprinterdataex(SPOOL_Q_DELETEPRINTERDATAEX *q_u,
7360 POLICY_HND *handle, char *key,
7363 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7364 init_unistr2(&q_u->valuename, value, UNI_STR_TERMINATE);
7365 init_unistr2(&q_u->keyname, key, UNI_STR_TERMINATE);
7370 /*******************************************************************
7372 ********************************************************************/
7374 BOOL make_spoolss_q_rffpcnex(SPOOL_Q_RFFPCNEX *q_u, POLICY_HND *handle,
7375 uint32 flags, uint32 options, const char *localmachine,
7376 uint32 printerlocal, SPOOL_NOTIFY_OPTION *option)
7378 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7381 q_u->options = options;
7383 q_u->localmachine_ptr = 1;
7385 init_unistr2(&q_u->localmachine, localmachine, UNI_STR_TERMINATE);
7387 q_u->printerlocal = printerlocal;
7390 q_u->option_ptr = 1;
7392 q_u->option = option;