r5672: Use switch_type() and the token storage mechanism for unions:
[samba.git] / source4 / librpc / ndr / ndr_spoolss_buf.c
index 2290150b1db1f074ee4559e4acb3730c63562289..4b1483709aa10db48d06821abb97563c2a1a5c54 100644 (file)
 
 
 #include "includes.h"
+#include "librpc/gen_ndr/ndr_spoolss.h"
 
-NTSTATUS ndr_pull_spoolss_PrinterEnum(struct ndr_pull *ndr, int ndr_flags, 
-                                     uint16 *level, union spoolss_PrinterEnum *info)
+#define NDR_SPOOLSS_PUSH_ENUM_OUT(fn,type) do { \
+       DATA_BLOB buffer;\
+       if (r->out.info) {\
+               int i;\
+               struct ndr_push *ndr2;\
+\
+               ndr2 = ndr_push_init_ctx(ndr);\
+               if (!ndr2) {\
+                       return NT_STATUS_NO_MEMORY;\
+               }\
+\
+               for (i=0;i<r->out.count;i++) {\
+                       ndr2->data += ndr2->offset;\
+                       ndr2->offset = 0;\
+                       NDR_CHECK(ndr_push_set_switch_value(ndr2, &(*r->out.info)[i], r->in.level)); \
+                       NDR_CHECK(ndr_push_##type(ndr2, NDR_SCALARS|NDR_BUFFERS, &(*r->out.info)[i]));\
+               }\
+               if (*r->in.buf_size >= ndr2->offset) {\
+                       buffer = data_blob_const(ndr2->data, ndr2->offset);\
+               } else {\
+                       r->out.info = NULL;\
+                       r->out.count = 0;\
+                       r->out.result = WERR_INSUFFICIENT_BUFFER;\
+               }\
+               *r->out.buf_size = ndr2->offset;\
+       }\
+       NDR_CHECK(ndr_push_unique_ptr(ndr, r->out.info));\
+       if (r->out.info) {\
+               NDR_CHECK(ndr_push_DATA_BLOB(ndr, NDR_SCALARS|NDR_BUFFERS, buffer));\
+       }\
+       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS|NDR_BUFFERS, *r->out.buf_size));\
+       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS|NDR_BUFFERS, r->out.count));\
+       NDR_CHECK(ndr_push_WERROR(ndr, NDR_SCALARS, r->out.result));\
+} while(0)
+
+#define NDR_SPOOLSS_PULL_ENUM_OUT(fn,type) do { \
+       int i;\
+       DATA_BLOB buffer;\
+       struct ndr_pull *ndr2;\
+\
+       NDR_CHECK(ndr_pull_unique_ptr(ndr, &_ptr_info));\
+       if (_ptr_info) {\
+               NDR_ALLOC(ndr, r->out.info);\
+       } else {\
+               r->out.info = NULL;\
+       }\
+       if (r->out.info) {\
+               NDR_CHECK(ndr_pull_DATA_BLOB(ndr, NDR_SCALARS|NDR_BUFFERS, &buffer));\
+               *r->out.info = NULL;\
+       }\
+       if (ndr->flags & LIBNDR_FLAG_REF_ALLOC) {\
+               NDR_ALLOC(ndr, r->out.buf_size);\
+       }\
+       NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS|NDR_BUFFERS, r->out.buf_size));\
+       NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS|NDR_BUFFERS, &r->out.count));\
+       NDR_CHECK(ndr_pull_WERROR(ndr, NDR_SCALARS, &r->out.result));\
+\
+       if (r->out.info == NULL && r->out.count) {\
+               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE,\
+                                     #fn ": r->out.count[%d] but r->out.info == NULL\n",\
+                                     r->out.count);\
+       }\
+\
+       if (r->out.info && r->out.count) {\
+               ndr2 = ndr_pull_init_blob(&buffer, ndr);\
+               if (!ndr2) return NT_STATUS_NO_MEMORY;\
+               NDR_ALLOC_N(ndr2, *r->out.info, r->out.count);\
+               for (i=0;i<r->out.count;i++) {\
+                       ndr2->data += ndr2->offset;\
+                       ndr2->offset = 0;\
+                       NDR_CHECK(ndr_pull_set_switch_value(ndr2, &(*r->out.info)[i], r->in.level)); \
+                       NDR_CHECK(ndr_pull_##type(ndr2, NDR_SCALARS|NDR_BUFFERS, &(*r->out.info)[i]));\
+               }\
+       }\
+} while(0)
+
+#define NDR_SPOOLSS_PRINT_ENUM_OUT(fn,type) do { \
+       ndr_print_struct(ndr, "out", #fn);\
+       ndr->depth++;\
+       ndr_print_ptr(ndr, "info", r->out.info);\
+       ndr->depth++;\
+       if (r->out.info) {\
+               int i;\
+               ndr->print(ndr, "%s: ARRAY(%d)", "info", r->out.count);\
+               ndr->depth++;\
+               for (i=0;i<r->out.count;i++) {\
+                       char *idx=NULL;\
+                       asprintf(&idx, "[%d]", i);\
+                       if (idx) {\
+                               ndr_print_##type(ndr, idx, r->in.level, &((*r->out.info)[i]));\
+                               free(idx);\
+                       }\
+               }\
+               ndr->depth--;\
+       }\
+       ndr->depth--;\
+       ndr_print_ptr(ndr, "buf_size", r->out.buf_size);\
+       ndr->depth++;\
+       ndr_print_uint32(ndr, "buf_size", *r->out.buf_size);\
+       ndr->depth--;\
+       ndr_print_uint32(ndr, "count", r->out.count);\
+       ndr_print_WERROR(ndr, "result", r->out.result);\
+       ndr->depth--;\
+} while(0)
+
+/*
+  spoolss_EnumPrinters
+*/
+NTSTATUS ndr_push_spoolss_EnumPrinters(struct ndr_push *ndr, int flags, struct spoolss_EnumPrinters *r)
+{
+       if (!(flags & NDR_IN)) goto ndr_out;
+
+       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS|NDR_BUFFERS, r->in.flags));
+       { uint32_t _flags_save_string = ndr->flags;
+       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_SIZE4|LIBNDR_FLAG_STR_LEN4);
+       NDR_CHECK(ndr_push_unique_ptr(ndr, r->in.server));
+       ndr->flags = _flags_save_string;
+       }
+       { uint32_t _flags_save_string = ndr->flags;
+       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_SIZE4|LIBNDR_FLAG_STR_LEN4);
+       if (r->in.server) {
+               NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS|NDR_BUFFERS, r->in.server));
+       }
+       ndr->flags = _flags_save_string;
+       }
+       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS|NDR_BUFFERS, r->in.level));
+       NDR_CHECK(ndr_push_unique_ptr(ndr, r->in.buffer));
+       if (r->in.buffer) {
+               NDR_CHECK(ndr_push_DATA_BLOB(ndr, NDR_SCALARS|NDR_BUFFERS, *r->in.buffer));
+       }
+       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS|NDR_BUFFERS, *r->in.buf_size));
+       ndr_out:
+       if (!(flags & NDR_OUT)) goto done;
+
+       NDR_SPOOLSS_PUSH_ENUM_OUT(spoolss_EnumPrinters,spoolss_PrinterInfo);
+
+       done:
+       return NT_STATUS_OK;
+}
+
+NTSTATUS ndr_pull_spoolss_EnumPrinters(struct ndr_pull *ndr, int flags, struct spoolss_EnumPrinters *r)
+{
+       uint32_t _ptr_server;
+       uint32_t _ptr_buffer;
+       uint32_t _ptr_info;
+       if (!(flags & NDR_IN)) goto ndr_out;
+
+       ZERO_STRUCT(r->out);
+
+       NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS|NDR_BUFFERS, &r->in.flags));
+       { uint32_t _flags_save_string = ndr->flags;
+       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_SIZE4|LIBNDR_FLAG_STR_LEN4);
+       NDR_CHECK(ndr_pull_unique_ptr(ndr, &_ptr_server));
+       if (_ptr_server) {
+               NDR_ALLOC(ndr, r->in.server);
+       } else {
+               r->in.server = NULL;
+       }
+       ndr->flags = _flags_save_string;
+       }
+       { uint32_t _flags_save_string = ndr->flags;
+       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_SIZE4|LIBNDR_FLAG_STR_LEN4);
+       if (r->in.server) {
+               NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS|NDR_BUFFERS, &r->in.server));
+       }
+       ndr->flags = _flags_save_string;
+       }
+       NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS|NDR_BUFFERS, &r->in.level));
+       NDR_CHECK(ndr_pull_unique_ptr(ndr, &_ptr_buffer));
+       if (_ptr_buffer) {
+               NDR_ALLOC(ndr, r->in.buffer);
+       } else {
+               r->in.buffer = NULL;
+       }
+       if (r->in.buffer) {
+               NDR_CHECK(ndr_pull_DATA_BLOB(ndr, NDR_SCALARS|NDR_BUFFERS, r->in.buffer));
+       }
+       NDR_ALLOC(ndr, r->in.buf_size);
+       NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS|NDR_BUFFERS, r->in.buf_size));
+       NDR_ALLOC(ndr, r->out.buf_size);
+       *r->out.buf_size = *r->in.buf_size;
+       ndr_out:
+       if (!(flags & NDR_OUT)) goto done;
+
+       NDR_SPOOLSS_PULL_ENUM_OUT(spoolss_EnumPrinters,spoolss_PrinterInfo);
+
+       done:
+
+       return NT_STATUS_OK;
+}
+
+void ndr_print_spoolss_EnumPrinters(struct ndr_print *ndr, const char *name, int flags, struct spoolss_EnumPrinters *r)
+{
+       ndr_print_struct(ndr, name, "spoolss_EnumPrinters");
+       ndr->depth++;
+       if (flags & NDR_SET_VALUES) {
+               ndr->flags |= LIBNDR_PRINT_SET_VALUES;
+       }
+       if (flags & NDR_IN) {
+               ndr_print_struct(ndr, "in", "spoolss_EnumPrinters");
+               ndr->depth++;
+               ndr_print_uint32(ndr, "flags", r->in.flags);
+               ndr_print_ptr(ndr, "server", r->in.server);
+               ndr->depth++;
+               if (r->in.server) {
+                       ndr_print_string(ndr, "server", r->in.server);
+               }
+               ndr->depth--;
+               ndr_print_uint32(ndr, "level", r->in.level);
+               ndr_print_ptr(ndr, "buffer", r->in.buffer);
+               ndr->depth++;
+               if (r->in.buffer) {
+                       ndr_print_DATA_BLOB(ndr, "buffer", *r->in.buffer);
+               }
+               ndr->depth--;
+               ndr_print_ptr(ndr, "buf_size", r->in.buf_size);
+               ndr->depth++;
+               ndr_print_uint32(ndr, "buf_size", *r->in.buf_size);
+               ndr->depth--;
+               ndr->depth--;
+       }
+       if (flags & NDR_OUT) {
+               NDR_SPOOLSS_PRINT_ENUM_OUT(spoolss_EnumPrinters,spoolss_PrinterInfo);
+       }
+       ndr->depth--;
+}
+
+/*
+  spoolss_EnumJobs
+*/
+NTSTATUS ndr_push_spoolss_EnumJobs(struct ndr_push *ndr, int flags, struct spoolss_EnumJobs *r)
+{
+       if (!(flags & NDR_IN)) goto ndr_out;
+
+       NDR_CHECK(ndr_push_policy_handle(ndr, NDR_SCALARS|NDR_BUFFERS, r->in.handle));
+       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS|NDR_BUFFERS, r->in.firstjob));
+       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS|NDR_BUFFERS, r->in.numjobs));
+       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS|NDR_BUFFERS, r->in.level));
+       NDR_CHECK(ndr_push_unique_ptr(ndr, r->in.buffer));
+       if (r->in.buffer) {
+               NDR_CHECK(ndr_push_DATA_BLOB(ndr, NDR_SCALARS|NDR_BUFFERS, *r->in.buffer));
+       }
+       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS|NDR_BUFFERS, *r->in.buf_size));
+       ndr_out:
+       if (!(flags & NDR_OUT)) goto done;
+
+       NDR_SPOOLSS_PUSH_ENUM_OUT(spoolss_EnumJobs,spoolss_JobInfo);
+
+       done:
+       return NT_STATUS_OK;
+}
+
+NTSTATUS ndr_pull_spoolss_EnumJobs(struct ndr_pull *ndr, int flags, struct spoolss_EnumJobs *r)
+{
+       uint32_t _ptr_buffer;
+       uint32_t _ptr_info;
+       if (!(flags & NDR_IN)) goto ndr_out;
+
+       ZERO_STRUCT(r->out);
+
+       NDR_ALLOC(ndr, r->in.handle);
+       NDR_CHECK(ndr_pull_policy_handle(ndr, NDR_SCALARS|NDR_BUFFERS, r->in.handle));
+       NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS|NDR_BUFFERS, &r->in.firstjob));
+       NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS|NDR_BUFFERS, &r->in.numjobs));
+       NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS|NDR_BUFFERS, &r->in.level));
+       NDR_CHECK(ndr_pull_unique_ptr(ndr, &_ptr_buffer));
+       if (_ptr_buffer) {
+               NDR_ALLOC(ndr, r->in.buffer);
+       } else {
+               r->in.buffer = NULL;
+       }
+       if (r->in.buffer) {
+               NDR_CHECK(ndr_pull_DATA_BLOB(ndr, NDR_SCALARS|NDR_BUFFERS, r->in.buffer));
+       }
+       NDR_ALLOC(ndr, r->in.buf_size);
+       NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS|NDR_BUFFERS, r->in.buf_size));
+       NDR_ALLOC(ndr, r->out.buf_size);
+       *r->out.buf_size = *r->in.buf_size;
+       ndr_out:
+       if (!(flags & NDR_OUT)) goto done;
+
+       NDR_SPOOLSS_PULL_ENUM_OUT(spoolss_EnumJobs,spoolss_JobInfo);
+
+       done:
+
+       return NT_STATUS_OK;
+}
+
+void ndr_print_spoolss_EnumJobs(struct ndr_print *ndr, const char *name, int flags, struct spoolss_EnumJobs *r)
+{
+       ndr_print_struct(ndr, name, "spoolss_EnumJobs");
+       ndr->depth++;
+       if (flags & NDR_SET_VALUES) {
+               ndr->flags |= LIBNDR_PRINT_SET_VALUES;
+       }
+       if (flags & NDR_IN) {
+               ndr_print_struct(ndr, "in", "spoolss_EnumJobs");
+               ndr->depth++;
+               ndr_print_ptr(ndr, "handle", r->in.handle);
+               ndr->depth++;
+               ndr_print_policy_handle(ndr, "handle", r->in.handle);
+               ndr->depth--;
+               ndr_print_uint32(ndr, "firstjob", r->in.firstjob);
+               ndr_print_uint32(ndr, "numjobs", r->in.numjobs);
+               ndr_print_uint32(ndr, "level", r->in.level);
+               ndr_print_ptr(ndr, "buffer", r->in.buffer);
+               ndr->depth++;
+               if (r->in.buffer) {
+                       ndr_print_DATA_BLOB(ndr, "buffer", *r->in.buffer);
+               }
+               ndr->depth--;
+               ndr_print_ptr(ndr, "buf_size", r->in.buf_size);
+               ndr->depth++;
+               ndr_print_uint32(ndr, "buf_size", *r->in.buf_size);
+               ndr->depth--;
+               ndr->depth--;
+       }
+       if (flags & NDR_OUT) {
+               NDR_SPOOLSS_PRINT_ENUM_OUT(spoolss_EnumJobs,spoolss_JobInfo);
+       }
+       ndr->depth--;
+}
+
+/*
+  spoolss_EnumPrinterDrivers
+*/
+NTSTATUS ndr_push_spoolss_EnumPrinterDrivers(struct ndr_push *ndr, int flags, struct spoolss_EnumPrinterDrivers *r)
+{
+       if (!(flags & NDR_IN)) goto ndr_out;
+
+       { uint32_t _flags_save_string = ndr->flags;
+       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_SIZE4|LIBNDR_FLAG_STR_LEN4);
+       NDR_CHECK(ndr_push_unique_ptr(ndr, r->in.server));
+       ndr->flags = _flags_save_string;
+       }
+       { uint32_t _flags_save_string = ndr->flags;
+       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_SIZE4|LIBNDR_FLAG_STR_LEN4);
+       if (r->in.server) {
+               NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS|NDR_BUFFERS, r->in.server));
+       }
+       ndr->flags = _flags_save_string;
+       }
+       { uint32_t _flags_save_string = ndr->flags;
+       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_SIZE4|LIBNDR_FLAG_STR_LEN4);
+       NDR_CHECK(ndr_push_unique_ptr(ndr, r->in.environment));
+       ndr->flags = _flags_save_string;
+       }
+       { uint32_t _flags_save_string = ndr->flags;
+       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_SIZE4|LIBNDR_FLAG_STR_LEN4);
+       if (r->in.environment) {
+               NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS|NDR_BUFFERS, r->in.environment));
+       }
+       ndr->flags = _flags_save_string;
+       }
+       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS|NDR_BUFFERS, r->in.level));
+       NDR_CHECK(ndr_push_unique_ptr(ndr, r->in.buffer));
+       if (r->in.buffer) {
+               NDR_CHECK(ndr_push_DATA_BLOB(ndr, NDR_SCALARS|NDR_BUFFERS, *r->in.buffer));
+       }
+       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS|NDR_BUFFERS, *r->in.buf_size));
+       ndr_out:
+       if (!(flags & NDR_OUT)) goto done;
+
+       NDR_SPOOLSS_PUSH_ENUM_OUT(spoolss_EnumPrinterDrivers,spoolss_DriverInfo);
+
+       done:
+       return NT_STATUS_OK;
+}
+
+NTSTATUS ndr_pull_spoolss_EnumPrinterDrivers(struct ndr_pull *ndr, int flags, struct spoolss_EnumPrinterDrivers *r)
 {
-       switch (*level) {
-       case 1:
-               NDR_CHECK(ndr_pull_spoolss_PrinterEnum1(ndr, NDR_SCALARS|NDR_BUFFERS, &info->info1));
-               break;
-       case 2:
-               NDR_CHECK(ndr_pull_spoolss_PrinterEnum2(ndr, NDR_SCALARS|NDR_BUFFERS, &info->info2));
-               break;
-       default:
-               return NT_STATUS_INVALID_LEVEL;
+       uint32_t _ptr_server;
+       uint32_t _ptr_environment;
+       uint32_t _ptr_buffer;
+       uint32_t _ptr_info;
+       if (!(flags & NDR_IN)) goto ndr_out;
+
+       ZERO_STRUCT(r->out);
+
+       { uint32_t _flags_save_string = ndr->flags;
+       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_SIZE4|LIBNDR_FLAG_STR_LEN4);
+       NDR_CHECK(ndr_pull_unique_ptr(ndr, &_ptr_server));
+       if (_ptr_server) {
+               NDR_ALLOC(ndr, r->in.server);
+       } else {
+               r->in.server = NULL;
+       }
+       ndr->flags = _flags_save_string;
+       }
+       { uint32_t _flags_save_string = ndr->flags;
+       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_SIZE4|LIBNDR_FLAG_STR_LEN4);
+       if (r->in.server) {
+               NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS|NDR_BUFFERS, &r->in.server));
+       }
+       ndr->flags = _flags_save_string;
+       }
+       { uint32_t _flags_save_string = ndr->flags;
+       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_SIZE4|LIBNDR_FLAG_STR_LEN4);
+       NDR_CHECK(ndr_pull_unique_ptr(ndr, &_ptr_environment));
+       if (_ptr_environment) {
+               NDR_ALLOC(ndr, r->in.environment);
+       } else {
+               r->in.environment = NULL;
+       }
+       ndr->flags = _flags_save_string;
+       }
+       { uint32_t _flags_save_string = ndr->flags;
+       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_SIZE4|LIBNDR_FLAG_STR_LEN4);
+       if (r->in.environment) {
+               NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS|NDR_BUFFERS, &r->in.environment));
        }
+       ndr->flags = _flags_save_string;
+       }
+       NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS|NDR_BUFFERS, &r->in.level));
+       NDR_CHECK(ndr_pull_unique_ptr(ndr, &_ptr_buffer));
+       if (_ptr_buffer) {
+               NDR_ALLOC(ndr, r->in.buffer);
+       } else {
+               r->in.buffer = NULL;
+       }
+       if (r->in.buffer) {
+               NDR_CHECK(ndr_pull_DATA_BLOB(ndr, NDR_SCALARS|NDR_BUFFERS, r->in.buffer));
+       }
+       NDR_ALLOC(ndr, r->in.buf_size);
+       NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS|NDR_BUFFERS, r->in.buf_size));
+       NDR_ALLOC(ndr, r->out.buf_size);
+       *r->out.buf_size = *r->in.buf_size;
+       ndr_out:
+       if (!(flags & NDR_OUT)) goto done;
+
+       NDR_SPOOLSS_PULL_ENUM_OUT(spoolss_EnumPrinterDrivers,spoolss_DriverInfo);
+
+       done:
+
        return NT_STATUS_OK;
 }
 
+void ndr_print_spoolss_EnumPrinterDrivers(struct ndr_print *ndr, const char *name, int flags, struct spoolss_EnumPrinterDrivers *r)
+{
+       ndr_print_struct(ndr, name, "spoolss_EnumPrinterDrivers");
+       ndr->depth++;
+       if (flags & NDR_SET_VALUES) {
+               ndr->flags |= LIBNDR_PRINT_SET_VALUES;
+       }
+       if (flags & NDR_IN) {
+               ndr_print_struct(ndr, "in", "spoolss_EnumPrinterDrivers");
+               ndr->depth++;
+               ndr_print_ptr(ndr, "server", r->in.server);
+               ndr->depth++;
+               if (r->in.server) {
+                       ndr_print_string(ndr, "server", r->in.server);
+               }
+               ndr->depth--;
+               ndr_print_ptr(ndr, "environment", r->in.environment);
+               ndr->depth++;
+               if (r->in.environment) {
+                       ndr_print_string(ndr, "environment", r->in.environment);
+               }
+               ndr->depth--;
+               ndr_print_uint32(ndr, "level", r->in.level);
+               ndr_print_ptr(ndr, "buffer", r->in.buffer);
+               ndr->depth++;
+               if (r->in.buffer) {
+                       ndr_print_DATA_BLOB(ndr, "buffer", *r->in.buffer);
+               }
+               ndr->depth--;
+               ndr_print_ptr(ndr, "buf_size", r->in.buf_size);
+               ndr->depth++;
+               ndr_print_uint32(ndr, "buf_size", *r->in.buf_size);
+               ndr->depth--;
+               ndr->depth--;
+       }
+       if (flags & NDR_OUT) {
+               NDR_SPOOLSS_PRINT_ENUM_OUT(spoolss_EnumPrinterDrivers,spoolss_DriverInfo);
+       }
+       ndr->depth--;
+}
+
+/*
+  spoolss_EnumForms
+*/
+NTSTATUS ndr_push_spoolss_EnumForms(struct ndr_push *ndr, int flags, struct spoolss_EnumForms *r)
+{
+       if (!(flags & NDR_IN)) goto ndr_out;
+
+       NDR_CHECK(ndr_push_policy_handle(ndr, NDR_SCALARS|NDR_BUFFERS, r->in.handle));
+       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS|NDR_BUFFERS, r->in.level));
+       NDR_CHECK(ndr_push_unique_ptr(ndr, r->in.buffer));
+       if (r->in.buffer) {
+               NDR_CHECK(ndr_push_DATA_BLOB(ndr, NDR_SCALARS|NDR_BUFFERS, *r->in.buffer));
+       }
+       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS|NDR_BUFFERS, *r->in.buf_size));
+       ndr_out:
+       if (!(flags & NDR_OUT)) goto done;
+
+       NDR_SPOOLSS_PUSH_ENUM_OUT(spoolss_EnumForms,spoolss_FormInfo);
 
-void ndr_print_spoolss_PrinterEnum(struct ndr_print *ndr, const char *name, uint16 level,
-                                  union spoolss_PrinterEnum *info)
+       done:
+       return NT_STATUS_OK;
+}
+
+NTSTATUS ndr_pull_spoolss_EnumForms(struct ndr_pull *ndr, int flags, struct spoolss_EnumForms *r)
 {
-       ndr_print_struct(ndr, name, "spoolss_PrinterEnum");
+       uint32_t _ptr_buffer;
+       uint32_t _ptr_info;
+       if (!(flags & NDR_IN)) goto ndr_out;
+
+       ZERO_STRUCT(r->out);
+
+       NDR_ALLOC(ndr, r->in.handle);
+       NDR_CHECK(ndr_pull_policy_handle(ndr, NDR_SCALARS|NDR_BUFFERS, r->in.handle));
+       NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS|NDR_BUFFERS, &r->in.level));
+       NDR_CHECK(ndr_pull_unique_ptr(ndr, &_ptr_buffer));
+       if (_ptr_buffer) {
+               NDR_ALLOC(ndr, r->in.buffer);
+       } else {
+               r->in.buffer = NULL;
+       }
+       if (r->in.buffer) {
+               NDR_CHECK(ndr_pull_DATA_BLOB(ndr, NDR_SCALARS|NDR_BUFFERS, r->in.buffer));
+       }
+       NDR_ALLOC(ndr, r->in.buf_size);
+       NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS|NDR_BUFFERS, r->in.buf_size));
+       NDR_ALLOC(ndr, r->out.buf_size);
+       *r->out.buf_size = *r->in.buf_size;
+       ndr_out:
+       if (!(flags & NDR_OUT)) goto done;
 
-       switch (level) {
-       case 1:
-               ndr_print_spoolss_PrinterEnum1(ndr, "info1", &info->info1);
-               break;
-       case 2:
-               ndr_print_spoolss_PrinterEnum2(ndr, "info2", &info->info2);
-               break;
+       NDR_SPOOLSS_PULL_ENUM_OUT(spoolss_EnumForms,spoolss_FormInfo);
+
+       done:
+
+       return NT_STATUS_OK;
+}
+
+void ndr_print_spoolss_EnumForms(struct ndr_print *ndr, const char *name, int flags, struct spoolss_EnumForms *r)
+{
+       ndr_print_struct(ndr, name, "spoolss_EnumForms");
+       ndr->depth++;
+       if (flags & NDR_SET_VALUES) {
+               ndr->flags |= LIBNDR_PRINT_SET_VALUES;
+       }
+       if (flags & NDR_IN) {
+               ndr_print_struct(ndr, "in", "spoolss_EnumForms");
+               ndr->depth++;
+               ndr_print_ptr(ndr, "handle", r->in.handle);
+               ndr->depth++;
+               ndr_print_policy_handle(ndr, "handle", r->in.handle);
+               ndr->depth--;
+               ndr_print_uint32(ndr, "level", r->in.level);
+               ndr_print_ptr(ndr, "buffer", r->in.buffer);
+               ndr->depth++;
+               if (r->in.buffer) {
+                       ndr_print_DATA_BLOB(ndr, "buffer", *r->in.buffer);
+               }
+               ndr->depth--;
+               ndr_print_ptr(ndr, "buf_size", r->in.buf_size);
+               ndr->depth++;
+               ndr_print_uint32(ndr, "buf_size", *r->in.buf_size);
+               ndr->depth--;
+               ndr->depth--;
+       }
+       if (flags & NDR_OUT) {
+               NDR_SPOOLSS_PRINT_ENUM_OUT(spoolss_EnumForms,spoolss_FormInfo);
+       }
+       ndr->depth--;
+}
+
+/*
+  spoolss_EnumPorts
+*/
+NTSTATUS ndr_push_spoolss_EnumPorts(struct ndr_push *ndr, int flags, struct spoolss_EnumPorts *r)
+{
+       if (!(flags & NDR_IN)) goto ndr_out;
+
+       { uint32_t _flags_save_string = ndr->flags;
+       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_SIZE4|LIBNDR_FLAG_STR_LEN4);
+       NDR_CHECK(ndr_push_unique_ptr(ndr, r->in.servername));
+       ndr->flags = _flags_save_string;
+       }
+       { uint32_t _flags_save_string = ndr->flags;
+       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_SIZE4|LIBNDR_FLAG_STR_LEN4);
+       if (r->in.servername) {
+               NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS|NDR_BUFFERS, r->in.servername));
+       }
+       ndr->flags = _flags_save_string;
+       }
+       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS|NDR_BUFFERS, r->in.level));
+       NDR_CHECK(ndr_push_unique_ptr(ndr, r->in.buffer));
+       if (r->in.buffer) {
+               NDR_CHECK(ndr_push_DATA_BLOB(ndr, NDR_SCALARS|NDR_BUFFERS, *r->in.buffer));
+       }
+       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS|NDR_BUFFERS, *r->in.buf_size));
+       ndr_out:
+       if (!(flags & NDR_OUT)) goto done;
+
+       NDR_SPOOLSS_PUSH_ENUM_OUT(spoolss_EnumPorts,spoolss_PortInfo);
+
+       done:
+       return NT_STATUS_OK;
+}
+
+NTSTATUS ndr_pull_spoolss_EnumPorts(struct ndr_pull *ndr, int flags, struct spoolss_EnumPorts *r)
+{
+       uint32_t _ptr_servername;
+       uint32_t _ptr_buffer;
+       uint32_t _ptr_info;
+       if (!(flags & NDR_IN)) goto ndr_out;
+
+       ZERO_STRUCT(r->out);
+
+       { uint32_t _flags_save_string = ndr->flags;
+       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_SIZE4|LIBNDR_FLAG_STR_LEN4);
+       NDR_CHECK(ndr_pull_unique_ptr(ndr, &_ptr_servername));
+       if (_ptr_servername) {
+               NDR_ALLOC(ndr, r->in.servername);
+       } else {
+               r->in.servername = NULL;
+       }
+       ndr->flags = _flags_save_string;
+       }
+       { uint32_t _flags_save_string = ndr->flags;
+       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_SIZE4|LIBNDR_FLAG_STR_LEN4);
+       if (r->in.servername) {
+               NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS|NDR_BUFFERS, &r->in.servername));
+       }
+       ndr->flags = _flags_save_string;
+       }
+       NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS|NDR_BUFFERS, &r->in.level));
+       NDR_CHECK(ndr_pull_unique_ptr(ndr, &_ptr_buffer));
+       if (_ptr_buffer) {
+               NDR_ALLOC(ndr, r->in.buffer);
+       } else {
+               r->in.buffer = NULL;
+       }
+       if (r->in.buffer) {
+               NDR_CHECK(ndr_pull_DATA_BLOB(ndr, NDR_SCALARS|NDR_BUFFERS, r->in.buffer));
+       }
+       NDR_ALLOC(ndr, r->in.buf_size);
+       NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS|NDR_BUFFERS, r->in.buf_size));
+       NDR_ALLOC(ndr, r->out.buf_size);
+       *r->out.buf_size = *r->in.buf_size;
+       ndr_out:
+       if (!(flags & NDR_OUT)) goto done;
+
+       NDR_SPOOLSS_PULL_ENUM_OUT(spoolss_EnumPorts,spoolss_PortInfo);
+
+       done:
+
+       return NT_STATUS_OK;
+}
+
+void ndr_print_spoolss_EnumPorts(struct ndr_print *ndr, const char *name, int flags, struct spoolss_EnumPorts *r)
+{
+       ndr_print_struct(ndr, name, "spoolss_EnumPorts");
+       ndr->depth++;
+       if (flags & NDR_SET_VALUES) {
+               ndr->flags |= LIBNDR_PRINT_SET_VALUES;
+       }
+       if (flags & NDR_IN) {
+               ndr_print_struct(ndr, "in", "spoolss_EnumPorts");
+               ndr->depth++;
+               ndr_print_ptr(ndr, "servername", r->in.servername);
+               ndr->depth++;
+               if (r->in.servername) {
+                       ndr_print_string(ndr, "servername", r->in.servername);
+               }
+               ndr->depth--;
+               ndr_print_uint32(ndr, "level", r->in.level);
+               ndr_print_ptr(ndr, "buffer", r->in.buffer);
+               ndr->depth++;
+               if (r->in.buffer) {
+                       ndr_print_DATA_BLOB(ndr, "buffer", *r->in.buffer);
+               }
+               ndr->depth--;
+               ndr_print_ptr(ndr, "buf_size", r->in.buf_size);
+               ndr->depth++;
+               ndr_print_uint32(ndr, "buf_size", *r->in.buf_size);
+               ndr->depth--;
+               ndr->depth--;
+       }
+       if (flags & NDR_OUT) {
+               NDR_SPOOLSS_PRINT_ENUM_OUT(spoolss_EnumPorts,spoolss_PortInfo);
        }
+       ndr->depth--;
 }