ntprinting: add ntprinting.idl.
authorGünther Deschner <gd@samba.org>
Tue, 11 May 2010 22:26:24 +0000 (00:26 +0200)
committerGünther Deschner <gd@samba.org>
Fri, 14 May 2010 12:12:57 +0000 (14:12 +0200)
This generates convenient unmarshalling routines for pulling out spoolss related
information out of ntprinters.tdb, ntforms.tdb and ntdrivers.tdb.

Guenther

librpc/idl/ntprinting.idl [new file with mode: 0644]
librpc/ndr/ndr_ntprinting.c [new file with mode: 0644]
librpc/ndr/ndr_ntprinting.h [new file with mode: 0644]

diff --git a/librpc/idl/ntprinting.idl b/librpc/idl/ntprinting.idl
new file mode 100644 (file)
index 0000000..9098291
--- /dev/null
@@ -0,0 +1,152 @@
+#include "idl_types.h"
+
+/*
+  old s3 spoolss tdb on-disc interface definitions
+*/
+
+[
+       pointer_default(unique),
+       helpstring("s3 printing tdb formats"),
+       uuid("a025d3cb-c605-40d6-86e1-4cff18e7dd94"),
+       helper("../librpc/ndr/ndr_ntprinting.h")
+]
+interface ntprinting
+{
+       /* Samba 3 tdb storage format: forms
+        * "dddddddd" */
+
+       typedef [flag(NDR_NOALIGN),public] struct {
+               uint32 position;
+               uint32 flag;
+               uint32 width;
+               uint32 length;
+               uint32 left;
+               uint32 top;
+               uint32 right;
+               uint32 bottom;
+       } ntprinting_form;
+
+       void decode_ntprinting_form(
+               [in] ntprinting_form form
+               );
+
+       /* Samba 3 tdb storage format: drivers
+        * "dffffffff" followed by a remaining buffer of "f" array */
+
+       typedef [flag(NDR_NOALIGN),public] struct {
+               uint32 version;
+               utf8string name;
+               utf8string environment;
+               utf8string driverpath;
+               utf8string datafile;
+               utf8string configfile;
+               utf8string helpfile;
+               utf8string monitorname;
+               utf8string defaultdatatype;
+               [flag(STR_UTF8|STR_NOTERM|NDR_REMAINING)] string_array dependent_files;
+       } ntprinting_driver;
+
+       void decode_ntprinting_driver(
+               [in] ntprinting_driver driver
+               );
+
+       /* Samba 3 tdb storage format: devicemode
+        * "p" ptr to devicemode
+        * "ffwwwwwwwwwwwwwwwwwwdddddddddddddd"
+        * "p" ptr to devicemode private data
+        * "B" private data blob */
+
+       typedef [flag(NDR_NOALIGN),public] struct {
+               /* uint32 devicemode_ptr; */
+               utf8string devicename;
+               utf8string formname;
+               uint16 specversion;
+               uint16 driverversion;
+               uint16 size;
+               uint16 driverextra;
+               uint16 orientation;
+               uint16 papersize;
+               uint16 paperlength;
+               uint16 paperwidth;
+               uint16 scale;
+               uint16 copies;
+               uint16 defaultsource;
+               uint16 printquality;
+               uint16 color;
+               uint16 duplex;
+               uint16 yresolution;
+               uint16 ttoption;
+               uint16 collate;
+               uint16 logpixels;
+               uint32 fields;
+               uint32 bitsperpel;
+               uint32 pelswidth;
+               uint32 pelsheight;
+               uint32 displayflags;
+               uint32 displayfrequency;
+               uint32 icmmethod;
+               uint32 icmintent;
+               uint32 mediatype;
+               uint32 dithertype;
+               uint32 reserved1;
+               uint32 reserved2;
+               uint32 panningwidth;
+               uint32 panningheight;
+               DATA_BLOB *nt_dev_private;
+       } ntprinting_devicemode;
+
+       /* Samba 3 tdb storage format: printer_data
+        * "p" ptr to printer_data
+        * "fdB" */
+
+       typedef [flag(NDR_NOALIGN),public] struct {
+               uint32 ptr;
+               utf8string name;
+               uint32 type;
+               DATA_BLOB data;
+       } ntprinting_printer_data;
+
+       /* Samba 3 tdb storage format: printer_info
+        * "dddddddddddfffffPfffff" */
+
+       typedef [flag(NDR_NOALIGN),public] struct {
+               uint32 attributes;
+               uint32 priority;
+               uint32 default_priority;
+               uint32 starttime;
+               uint32 untiltime;
+               uint32 status;
+               uint32 cjobs;
+               uint32 averageppm;
+               uint32 changeid;
+               uint32 c_setprinter;
+               uint32 setuptime;
+               utf8string servername;
+               utf8string printername;
+               utf8string sharename;
+               utf8string portname;
+               utf8string drivername;
+               utf8string comment;
+               utf8string location;
+               utf8string sepfile;
+               utf8string printprocessor;
+               utf8string datatype;
+               utf8string parameters;
+       } ntprinting_printer_info;
+
+       /* Abstract Samba 3 printer
+        * printer_info
+        * followed by ntprinting_devicemode
+        * followed by remaining buffer of ntprinting_printer_data array */
+
+       typedef [flag(NDR_NOALIGN),public,nopull] struct {
+               ntprinting_printer_info info;
+               ntprinting_devicemode *devmode;
+               uint32 count;
+               ntprinting_printer_data printer_data[count];
+       } ntprinting_printer;
+
+       void decode_ntprinting_printer(
+               [in] ntprinting_printer printer
+               );
+}
diff --git a/librpc/ndr/ndr_ntprinting.c b/librpc/ndr/ndr_ntprinting.c
new file mode 100644 (file)
index 0000000..87b743d
--- /dev/null
@@ -0,0 +1,69 @@
+/*
+   Unix SMB/CIFS implementation.
+
+   routines for marshalling/unmarshalling special ntprinting structures
+
+   Copyright (C) Guenther Deschner 2010
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "includes.h"
+#include "../librpc/gen_ndr/ndr_ntprinting.h"
+
+_PUBLIC_ enum ndr_err_code ndr_pull_ntprinting_printer(struct ndr_pull *ndr, int ndr_flags, struct ntprinting_printer *r)
+{
+       uint32_t _ptr_devmode;
+       TALLOC_CTX *_mem_save_devmode_0;
+       {
+               uint32_t _flags_save_STRUCT = ndr->flags;
+               ndr_set_flags(&ndr->flags, LIBNDR_FLAG_NOALIGN);
+               if (ndr_flags & NDR_SCALARS) {
+                       NDR_CHECK(ndr_pull_align(ndr, 5));
+                       NDR_CHECK(ndr_pull_ntprinting_printer_info(ndr, NDR_SCALARS, &r->info));
+                       NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_devmode));
+                       if (_ptr_devmode) {
+                               NDR_PULL_ALLOC(ndr, r->devmode);
+                       } else {
+                               r->devmode = NULL;
+                       }
+               }
+               if (ndr_flags & NDR_BUFFERS) {
+                       if (r->devmode) {
+                               _mem_save_devmode_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                               NDR_PULL_SET_MEM_CTX(ndr, r->devmode, 0);
+                               NDR_CHECK(ndr_pull_ntprinting_devicemode(ndr, NDR_SCALARS|NDR_BUFFERS, r->devmode));
+                               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_devmode_0, 0);
+                       }
+               }
+               if (ndr_flags & NDR_SCALARS) {
+                       r->count = 0;
+                       NDR_PULL_ALLOC_N(ndr, r->printer_data, r->count);
+                       while (ndr->offset + 4 <= ndr->data_size) {
+                               uint32_t ptr = 0;
+                               ptr = IVAL(ndr->data, ndr->offset);
+                               if (ptr == 0) {
+                                       break;
+                               }
+                               r->printer_data = talloc_realloc(ndr, r->printer_data, struct ntprinting_printer_data, r->count + 1);
+                               NDR_ERR_HAVE_NO_MEMORY(r->printer_data);
+                               NDR_CHECK(ndr_pull_ntprinting_printer_data(ndr, NDR_SCALARS, &r->printer_data[r->count]));
+                               r->count++;
+                       }
+                       NDR_CHECK(ndr_pull_trailer_align(ndr, 5));
+               }
+               ndr->flags = _flags_save_STRUCT;
+       }
+       return NDR_ERR_SUCCESS;
+}
diff --git a/librpc/ndr/ndr_ntprinting.h b/librpc/ndr/ndr_ntprinting.h
new file mode 100644 (file)
index 0000000..8bda430
--- /dev/null
@@ -0,0 +1,25 @@
+/*
+   Unix SMB/CIFS implementation.
+
+   routines for marshalling/unmarshalling special ntprinting structures
+
+   Copyright (C) Guenther Deschner 2010
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "includes.h"
+#include "../librpc/gen_ndr/ndr_ntprinting.h"
+
+_PUBLIC_ enum ndr_err_code ndr_pull_ntprinting_printer(struct ndr_pull *ndr, int ndr_flags, struct ntprinting_printer *r);