r5537: - make use of bitmaps and enums
authorStefan Metzmacher <metze@samba.org>
Thu, 24 Feb 2005 14:05:52 +0000 (14:05 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 18:10:53 +0000 (13:10 -0500)
- add and fix some PrinterInfo levels

- add and fix some DriverInfo levels

- fix EnumPrinterDriver torture test

the curent RPC-SPOOLSS now passes on w2k3

metze
(This used to be commit 14b88ca20dc64702f1c1b457a09b1f13b1964654)

source4/librpc/idl/spoolss.idl
source4/torture/rpc/spoolss.c

index ee33aa9eea4b6cefdeea00575b68df264418d7cf..85c49566b07d8378dba6ea66fd87d58188472a29 100644 (file)
                uint8  private[driverextra];
        } spoolss_DeviceMode;
 
-       typedef [public] struct {
-               uint32 flags;
+       typedef bitmap {
+               PRINTER_ENUM_DEFAULT     = 0x00000001,
+               PRINTER_ENUM_LOCAL       = 0x00000002,
+               PRINTER_ENUM_CONNECTIONS = 0x00000004,
+               PRINTER_ENUM_FAVORITE    = 0x00000004,
+               PRINTER_ENUM_NAME        = 0x00000008,
+               PRINTER_ENUM_REMOTE      = 0x00000010,
+               PRINTER_ENUM_SHARED      = 0x00000020,
+               PRINTER_ENUM_NETWORK     = 0x00000040,
+               PRINTER_ENUM_EXPAND      = 0x00004000,
+               PRINTER_ENUM_CONTAINER   = 0x00008000,
+               PRINTER_ENUM_ICON1       = 0x00010000,
+               PRINTER_ENUM_ICON2       = 0x00020000,
+               PRINTER_ENUM_ICON3       = 0x00040000,
+               PRINTER_ENUM_ICON4       = 0x00080000,
+               PRINTER_ENUM_ICON5       = 0x00100000,
+               PRINTER_ENUM_ICON6       = 0x00200000,
+               PRINTER_ENUM_ICON7       = 0x00400000,
+               PRINTER_ENUM_ICON8       = 0x00800000,
+               PRINTER_ENUM_HIDE        = 0x01000000
+       } spoolss_EnumPrinterFlags;
+
+       typedef struct {
+               spoolss_EnumPrinterFlags flags;
                [relative] nstring *name;
                [relative] nstring *description;
                [relative] nstring *comment;
        } spoolss_PrinterInfo1;
 
-       typedef [public] struct {
+       typedef bitmap {
+               PRINTER_ATTRIBUTE_QUEUED                = 0x00000001,
+               PRINTER_ATTRIBUTE_DIRECT                = 0x00000002,
+               PRINTER_ATTRIBUTE_DEFAULT               = 0x00000004,
+               PRINTER_ATTRIBUTE_SHARED                = 0x00000008,
+               PRINTER_ATTRIBUTE_NETWORK               = 0x00000010,
+               PRINTER_ATTRIBUTE_HIDDEN                = 0x00000020,
+               PRINTER_ATTRIBUTE_LOCAL                 = 0x00000040,
+               PRINTER_ATTRIBUTE_ENABLE_DEVQ           = 0x00000080,
+               PRINTER_ATTRIBUTE_KEEPPRINTEDJOBS       = 0x00000100,
+               PRINTER_ATTRIBUTE_DO_COMPLETE_FIRST     = 0x00000200,
+               PRINTER_ATTRIBUTE_WORK_OFFLINE          = 0x00000400,
+               PRINTER_ATTRIBUTE_ENABLE_BIDI           = 0x00000800,
+               PRINTER_ATTRIBUTE_RAW_ONLY              = 0x00001000,
+               PRINTER_ATTRIBUTE_PUBLISHED             = 0x00002000,
+               PRINTER_ATTRIBUTE_FAX                   = 0x00004000,
+               PRINTER_ATTRIBUTE_TS                    = 0x00008000
+       } spoolss_PrinterAttributes;
+
+       typedef bitmap {
+               PRINTER_STATUS_PAUSED           = 0x00000001,
+               PRINTER_STATUS_ERROR            = 0x00000002,
+               PRINTER_STATUS_PENDING_DELETION = 0x00000004,
+               PRINTER_STATUS_PAPER_JAM        = 0x00000008,
+               PRINTER_STATUS_PAPER_OUT        = 0x00000010,
+               PRINTER_STATUS_MANUAL_FEED      = 0x00000020,
+               PRINTER_STATUS_PAPER_PROBLEM    = 0x00000040,
+               PRINTER_STATUS_OFFLINE          = 0x00000080,
+               PRINTER_STATUS_IO_ACTIVE        = 0x00000100,
+               PRINTER_STATUS_BUSY             = 0x00000200,
+               PRINTER_STATUS_PRINTING         = 0x00000400,
+               PRINTER_STATUS_OUTPUT_BIN_FULL  = 0x00000800,
+               PRINTER_STATUS_NOT_AVAILABLE    = 0x00001000,
+               PRINTER_STATUS_WAITING          = 0x00002000,
+               PRINTER_STATUS_PROCESSING       = 0x00004000,
+               PRINTER_STATUS_INITIALIZING     = 0x00008000,
+               PRINTER_STATUS_WARMING_UP       = 0x00010000,
+               PRINTER_STATUS_TONER_LOW        = 0x00020000,
+               PRINTER_STATUS_NO_TONER         = 0x00040000,
+               PRINTER_STATUS_PAGE_PUNT        = 0x00080000,
+               PRINTER_STATUS_USER_INTERVENTION= 0x00100000,
+               PRINTER_STATUS_OUT_OF_MEMORY    = 0x00200000,
+               PRINTER_STATUS_DOOR_OPEN        = 0x00400000,
+               PRINTER_STATUS_SERVER_UNKNOWN   = 0x00800000,
+               PRINTER_STATUS_POWER_SAVE       = 0x01000000
+       } spoolss_PrinterStatus;
+
+       typedef struct {
                [relative] nstring *servername;
                [relative] nstring *printername;
                [relative] nstring *sharename;
                [relative] nstring *datatype;
                [relative] nstring *parameters;
                [relative,subcontext(0)] security_descriptor *secdesc;
-               uint32 attributes;
+               spoolss_PrinterAttributes attributes;
                uint32 priority;
                uint32 defaultpriority;
                uint32 starttime;
                uint32 untiltime;
-               uint32 status;
+               spoolss_PrinterStatus status;
                uint32 cjobs;
                uint32 averageppm;
        } spoolss_PrinterInfo2;
        typedef struct {
                [relative] nstring *printername;
                [relative] nstring *servername;
-               uint32 attributes;
+               spoolss_PrinterAttributes attributes;
        } spoolss_PrinterInfo4;
 
-       typedef [public] struct {
+       typedef struct {
                [relative] nstring *printername;
                [relative] nstring *portname;
-               uint32 attributes;
+               spoolss_PrinterAttributes attributes;
                uint32 device_not_selected_timeout;
                uint32 transmission_retry_timeout;
        } spoolss_PrinterInfo5;
 
        typedef struct {
-               uint32 unknown;
+               spoolss_PrinterStatus status;
        } spoolss_PrinterInfo6;
 
+       typedef bitmap {
+               DSPRINT_PUBLISH         = 0x00000001,
+               DSPRINT_UPDATE          = 0x00000002,
+               DSPRINT_UNPUBLISH       = 0x00000004,
+               DSPRINT_REPUBLISH       = 0x00000008,
+               DSPRINT_PENDING         = 0x80000000
+       } spoolss_DsPrintAction;
+
        typedef struct {
                [relative] nstring *guid; /* text form of printer guid */
-               uint32 action;
+               spoolss_DsPrintAction action;
        } spoolss_PrinterInfo7;
 
+       typedef struct {
+               [relative] spoolss_DeviceMode *devmode;
+       } spoolss_DeviceModeInfo;
+
        typedef [nodiscriminant,public] union {
                [case(0)] spoolss_PrinterInfo0 info0;
                [case(1)] spoolss_PrinterInfo1 info1;
                [case(5)] spoolss_PrinterInfo5 info5;
                [case(6)] spoolss_PrinterInfo6 info6;
                [case(7)] spoolss_PrinterInfo7 info7;
+               [case(8)] spoolss_DeviceModeInfo info8;
+               [case(9)] spoolss_DeviceModeInfo info9;
        } spoolss_PrinterInfo;
 
-       const int PRINTER_ENUM_DEFAULT     = 0x00000001;
-       const int PRINTER_ENUM_LOCAL       = 0x00000002;
-       const int PRINTER_ENUM_CONNECTIONS = 0x00000004;
-       const int PRINTER_ENUM_FAVORITE    = 0x00000004;
-       const int PRINTER_ENUM_NAME        = 0x00000008;
-       const int PRINTER_ENUM_REMOTE      = 0x00000010;
-       const int PRINTER_ENUM_SHARED      = 0x00000020;
-       const int PRINTER_ENUM_NETWORK     = 0x00000040;
-
        /******************/
        /* Function: 0x00 */
        [noprint,nopull,nopush] WERROR spoolss_EnumPrinters(
-               [in] uint32 flags,
+               [in] spoolss_EnumPrinterFlags flags,
                [in] unistr *server,
                [in] uint32 level,
                [in] DATA_BLOB *buffer,
                [relative] nstring *driver_name;
        } spoolss_DriverInfo1;
 
+       typedef [v1_enum] enum {
+               SPOOLSS_DRIVER_VERSION_9X       = 0,
+               SPOOLSS_DRIVER_VERSION_NT35     = 1,
+               SPOOLSS_DRIVER_VERSION_NT4      = 2,
+               SPOOLSS_DRIVER_VERSION_200X     = 3
+       } spoolss_DriverOSVersion;
+
        typedef struct {
-               uint32 version;
+               spoolss_DriverOSVersion version;
                [relative] nstring *driver_name;
                [relative] nstring *architecture;
                [relative] nstring *driver_path;
        } spoolss_DriverInfo2;
 
        typedef struct {
-               uint32 version;
+               spoolss_DriverOSVersion version;
                [relative] nstring *driver_name;
                [relative] nstring *architecture;
                [relative] nstring *driver_path;
                [relative] nstring *default_datatype;
        } spoolss_DriverInfo3;
 
+       typedef struct {
+               spoolss_DriverOSVersion version;
+               [relative] nstring *driver_name;
+               [relative] nstring *architecture;
+               [relative] nstring *driver_path;
+               [relative] nstring *data_file;
+               [relative] nstring *config_file;
+               [relative] nstring *help_file;
+               [relative] nstring *dependent_files; /* array */
+               [relative] nstring *monitor_name;
+               [relative] nstring *default_datatype;
+               [relative] nstring *previous_names; /* array */
+       } spoolss_DriverInfo4;
+
+       typedef struct {
+               spoolss_DriverOSVersion version;
+               [relative] nstring *driver_name;
+               [relative] nstring *architecture;
+               [relative] nstring *driver_path;
+               [relative] nstring *data_file;
+               [relative] nstring *config_file;
+               uint32 driver_attributes;
+               uint32 config_version;
+               uint32 driver_version;
+       } spoolss_DriverInfo5;
+
+       typedef struct {
+               spoolss_DriverOSVersion version;
+               [relative] nstring *driver_name;
+               [relative] nstring *architecture;
+               [relative] nstring *driver_path;
+               [relative] nstring *data_file;
+               [relative] nstring *config_file;
+               [relative] nstring *help_file;
+               [relative] nstring *dependent_files; /* array */
+               [relative] nstring *monitor_name;
+               [relative] nstring *default_datatype;
+               [relative] nstring *previous_names; /* array */
+               NTTIME driver_data;
+               hyper driver_version;
+               [relative] nstring *manufacturer_name;
+               [relative] nstring *manufacturer_url;
+               [relative] nstring *hardware_id;
+               [relative] nstring *provider;
+       } spoolss_DriverInfo6;
+
        typedef [nodiscriminant,public] union {
                [case(1)] spoolss_DriverInfo1 info1;
                [case(2)] spoolss_DriverInfo2 info2;
                [case(3)] spoolss_DriverInfo3 info3;
+               [case(4)] spoolss_DriverInfo4 info4;
+               [case(5)] spoolss_DriverInfo5 info5;
+               [case(6)] spoolss_DriverInfo6 info6;
        } spoolss_DriverInfo;
 
        /******************/
index 18b9e23b755f0b636f4c94fa3efe89d323f135cc..eb4b3c5da9ba2dc115ae036c36b4de6c494ff30e 100644 (file)
@@ -27,7 +27,7 @@ static BOOL test_GetPrinter(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
 {
        NTSTATUS status;
        struct spoolss_GetPrinter r;
-       uint16_t levels[] = {1, 2, 3, 4, 5, 6, 7};
+       uint16_t levels[] = {0, 1, 2, 3, 4, 5, 6, 7, 8};
        int i;
        BOOL ret = True;
        
@@ -684,7 +684,7 @@ static BOOL test_OpenPrinter_badname(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
        opEx.in.userlevel.level1        = NULL;
        opEx.out.handle                 = &handle;
 
-       printf("\nTesting OpenPrinter(%s) with bad name\n", opEx.in.printername);
+       printf("\nTesting OpenPrinterEx(%s) with bad name\n", opEx.in.printername);
 
        status = dcerpc_spoolss_OpenPrinterEx(p, mem_ctx, &opEx);
        if (!NT_STATUS_IS_OK(status)) {
@@ -711,6 +711,7 @@ static BOOL test_OpenPrinter_badnames(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx
        ret &= test_OpenPrinter_badname(p, mem_ctx, "__INVALID_PRINTER__");
        ret &= test_OpenPrinter_badname(p, mem_ctx, "\\\\127.0.0.1");
        ret &= test_OpenPrinter_badname(p, mem_ctx, "\\\\localhost");
+       ret &= test_OpenPrinter_badname(p, mem_ctx, "");
 
        name = talloc_asprintf(mem_ctx, "\\\\%s\\", dcerpc_server_name(p));
        ret &= test_OpenPrinter_badname(p, mem_ctx, name);
@@ -868,12 +869,12 @@ static BOOL test_EnumPrinters(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx)
                union spoolss_PrinterInfo *info;
                int j;
 
-               r.in.flags = 0x02;
-               r.in.server = "";
-               r.in.level = levels[i];
-               r.in.buffer = NULL;
-               r.in.buf_size = &buf_size;
-               r.out.buf_size = &buf_size;
+               r.in.flags      = PRINTER_ENUM_LOCAL;
+               r.in.server     = "";
+               r.in.level      = levels[i];
+               r.in.buffer     = NULL;
+               r.in.buf_size   = &buf_size;
+               r.out.buf_size  = &buf_size;
 
                printf("\nTesting EnumPrinters level %u\n", r.in.level);
 
@@ -883,14 +884,14 @@ static BOOL test_EnumPrinters(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx)
                        ret = False;
                        continue;
                }
-               
+
                if (W_ERROR_EQUAL(r.out.result, WERR_INSUFFICIENT_BUFFER)) {
                        DATA_BLOB blob = data_blob_talloc(mem_ctx, NULL, buf_size);
                        data_blob_clear(&blob);
                        r.in.buffer = &blob;
                        status = dcerpc_spoolss_EnumPrinters(p, mem_ctx, &r);
                }
-               
+
                if (!NT_STATUS_IS_OK(status) ||
                    !W_ERROR_IS_OK(r.out.result)) {
                        printf("EnumPrinters failed - %s/%s\n", 
@@ -920,10 +921,11 @@ static BOOL test_EnumPrinters(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx)
                        }
                }
        }
-       
+
        return ret;
 }
 
+#if 0
 static BOOL test_GetPrinterDriver2(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
                                   struct policy_handle *handle, 
                                   const char *driver_name)
@@ -963,19 +965,18 @@ static BOOL test_GetPrinterDriver2(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
 
        return True;
 }
+#endif
        
 static BOOL test_EnumPrinterDrivers(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx)
 {
        struct spoolss_EnumPrinterDrivers r;
        NTSTATUS status;
-       uint16_t levels[] = {1, 2, 3};
+       uint16_t levels[] = {1, 2, 3, 4, 5, 6};
        int i;
        BOOL ret = True;
 
        for (i=0;i<ARRAY_SIZE(levels);i++) {
                uint32_t buf_size;
-               union spoolss_DriverInfo *info;
-               uint32_t j;
 
                r.in.server = talloc_asprintf(mem_ctx, "\\\\%s", dcerpc_server_name(p));
                r.in.environment = "Windows NT x86";
@@ -1009,6 +1010,7 @@ static BOOL test_EnumPrinterDrivers(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx)
                    !W_ERROR_IS_OK(r.out.result)) {
                        printf("EnumPrinterDrivers failed - %s/%s\n", 
                               nt_errstr(status), win_errstr(r.out.result));
+                       ret = False;
                        break;
                }
 
@@ -1016,19 +1018,6 @@ static BOOL test_EnumPrinterDrivers(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx)
                        printf("No printer drivers returned");
                        break;
                }
-
-               info = *r.out.info;
-
-               if (r.in.level != 1) continue;
-
-               for (j=0;j<r.out.count;j++) {
-                       struct policy_handle handle;
-
-                       if (!call_OpenPrinterEx(p, mem_ctx, "",&handle)) {
-                               continue;
-                       }
-                       ret &=test_GetPrinterDriver2(p, mem_ctx, &handle, info[j].info1.driver_name);
-               }
        }
 
        return ret;