Wrote some stubs for new win2k only spoolss rpc commands:
authorTim Potter <tpot@samba.org>
Mon, 5 Nov 2001 06:15:02 +0000 (06:15 +0000)
committerTim Potter <tpot@samba.org>
Mon, 5 Nov 2001 06:15:02 +0000 (06:15 +0000)
GetPrinterDataEx() and SetPrinterDataEx().  Not sure what the command
number is for the latter is - I haven't seen it on the wire yet.
(This used to be commit 87614c74b3d66cf2ca706b33e6cf0a32b4166e7a)

source3/include/rpc_spoolss.h
source3/rpc_parse/parse_spoolss.c
source3/rpc_server/srv_spoolss.c
source3/rpc_server/srv_spoolss_nt.c

index 82d7d70d4ffea9e6b53d5a75e29600a9bb0c59bd..2962546122046c8c9a2398839dcea59d172b2370 100755 (executable)
@@ -57,7 +57,6 @@
 #define SPOOLSS_SPOOLERINIT                            0x3f
 #define SPOOLSS_RESETPRINTEREX                         0x40
 #define SPOOLSS_ROUTERREFRESHPRINTERCHANGENOTIFICATION 0x42
-#define SPOOLSS_GETPRINTERDATAEX                       0x4e
 */
 
 /* those are implemented */
 #define SPOOLSS_ADDPRINTEREX                           0x46
 #define SPOOLSS_ENUMPRINTERDATA                                0x48
 #define SPOOLSS_DELETEPRINTERDATA                      0x49
+#define SPOOLSS_GETPRINTERDATAEX                       0x4e
+#define SPOOLSS_SETPRINTERDATAEX                       0xff /* unknown */
 
 #define PRINTER_CONTROL_UNPAUSE                0x00000000
 #define PRINTER_CONTROL_PAUSE          0x00000001
@@ -1857,6 +1858,44 @@ typedef struct spool_r_rrpcn
 }
 SPOOL_R_REPLY_RRPCN;
 
+typedef struct spool_q_getprinterdataex
+{
+       POLICY_HND handle;
+       UNISTR2 keyname;
+        UNISTR2 valuename;
+       uint32 size;
+}
+SPOOL_Q_GETPRINTERDATAEX;
+
+typedef struct spool_r_getprinterdataex
+{
+       uint32 type;
+       uint32 size;
+       uint8 *data;
+       uint32 needed;
+       WERROR status;
+}
+SPOOL_R_GETPRINTERDATAEX;
+
+typedef struct spool_q_setprinterdataex
+{
+       POLICY_HND handle;
+       UNISTR2 key;
+       UNISTR2 value;
+       uint32 type;
+       uint32 max_len;
+       uint8 *data;
+       uint32 real_len;
+       uint32 numeric_data;
+}
+SPOOL_Q_SETPRINTERDATAEX;
+
+typedef struct spool_r_setprinterdataex
+{
+       WERROR status;
+}
+SPOOL_R_SETPRINTERDATAEX;
+
 #define PRINTER_DRIVER_VERSION 2
 #define PRINTER_DRIVER_ARCHITECTURE "Windows NT x86"
 
index 76e06a343ae50f97e0bf0a29bcedd52176227a08..b86c595c6465b537bd27417446b473056b9a0dd9 100644 (file)
@@ -6097,3 +6097,145 @@ BOOL spoolss_io_r_reply_rrpcn(char *desc, SPOOL_R_REPLY_RRPCN *r_u, prs_struct *
 
        return True;            
 }
+
+/*******************************************************************
+ * read a structure.
+ * called from spoolss_q_getprinterdataex (srv_spoolss.c)
+ ********************************************************************/
+
+BOOL spoolss_io_q_getprinterdataex(char *desc, SPOOL_Q_GETPRINTERDATAEX *q_u, prs_struct *ps, int depth)
+{
+       if (q_u == NULL)
+               return False;
+
+       prs_debug(ps, depth, desc, "spoolss_io_q_getprinterdataex");
+       depth++;
+
+       if (!prs_align(ps))
+               return False;
+       if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
+               return False;
+       if (!prs_align(ps))
+               return False;
+       if (!smb_io_unistr2("keyname", &q_u->keyname,True,ps,depth))
+               return False;
+       if (!prs_align(ps))
+               return False;
+       if (!smb_io_unistr2("valuename", &q_u->valuename,True,ps,depth))
+               return False;
+       if (!prs_align(ps))
+               return False;
+       if (!prs_uint32("size", ps, depth, &q_u->size))
+               return False;
+
+       return True;
+}
+
+/*******************************************************************
+ * write a structure.
+ * called from spoolss_r_getprinterdataex (srv_spoolss.c)
+ ********************************************************************/
+
+BOOL spoolss_io_r_getprinterdataex(char *desc, SPOOL_R_GETPRINTERDATAEX *r_u, prs_struct *ps, int depth)
+{
+       if (r_u == NULL)
+               return False;
+
+       prs_debug(ps, depth, desc, "spoolss_io_r_getprinterdataex");
+       depth++;
+
+       if (!prs_align(ps))
+               return False;
+       if (!prs_uint32("type", ps, depth, &r_u->type))
+               return False;
+       if (!prs_uint32("size", ps, depth, &r_u->size))
+               return False;
+       
+       if (!prs_uint8s(False,"data", ps, depth, r_u->data, r_u->size))
+               return False;
+               
+       if (!prs_align(ps))
+               return False;
+       
+       if (!prs_uint32("needed", ps, depth, &r_u->needed))
+               return False;
+       if (!prs_werror("status", ps, depth, &r_u->status))
+               return False;
+               
+       return True;
+}
+
+/*******************************************************************
+ * read a structure.
+ * called from spoolss_q_setprinterdataex (srv_spoolss.c)
+ ********************************************************************/  
+
+BOOL spoolss_io_q_setprinterdataex(char *desc, SPOOL_Q_SETPRINTERDATAEX *q_u, prs_struct *ps, int depth)
+{
+       prs_debug(ps, depth, desc, "spoolss_io_q_setprinterdataex");
+       depth++;
+
+       if(!prs_align(ps))
+               return False;
+       if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
+               return False;
+       if(!smb_io_unistr2("", &q_u->key, True, ps, depth))
+               return False;
+
+       if(!prs_align(ps))
+               return False;
+
+       if(!smb_io_unistr2("", &q_u->value, True, ps, depth))
+               return False;
+
+       if(!prs_align(ps))
+               return False;
+
+       if(!prs_uint32("type", ps, depth, &q_u->type))
+               return False;
+
+       if(!prs_uint32("max_len", ps, depth, &q_u->max_len))
+               return False;
+
+       switch (q_u->type)
+       {
+               case 0x1:
+               case 0x3:
+               case 0x4:
+               case 0x7:
+            if (q_u->max_len) {
+                if (UNMARSHALLING(ps))
+                               q_u->data=(uint8 *)prs_alloc_mem(ps, q_u->max_len * sizeof(uint8));
+                       if(q_u->data == NULL)
+                               return False;
+                       if(!prs_uint8s(False,"data", ps, depth, q_u->data, q_u->max_len))
+                               return False;
+            }
+                       if(!prs_align(ps))
+                               return False;
+                       break;
+       }       
+       
+       if(!prs_uint32("real_len", ps, depth, &q_u->real_len))
+               return False;
+
+       return True;
+}
+
+/*******************************************************************
+ * write a structure.
+ * called from spoolss_q_setprinterdataex (srv_spoolss.c)
+ ********************************************************************/  
+
+BOOL spoolss_io_r_setprinterdataex(char *desc, SPOOL_R_SETPRINTERDATAEX *r_u, prs_struct *ps, int depth)
+{
+       prs_debug(ps, depth, desc, "spoolss_io_r_setprinterdataex");
+       depth++;
+
+       if(!prs_align(ps))
+               return False;
+       if(!prs_werror("status",     ps, depth, &r_u->status))
+               return False;
+
+       return True;
+}
index a5ae418cd481dca7bef7ce832335c198dc39ea35..27331e448b6a27332843b0461cd4733bd4cdaee5 100755 (executable)
@@ -1199,6 +1199,66 @@ static BOOL api_spoolss_getjob(pipes_struct *p)
        return True;
 }
 
+/********************************************************************
+ * api_spoolss_getprinterdataex
+ *
+ * called from the spoolss dispatcher
+ ********************************************************************/
+
+static BOOL api_spoolss_getprinterdataex(pipes_struct *p)
+{
+       SPOOL_Q_GETPRINTERDATAEX q_u;
+       SPOOL_R_GETPRINTERDATAEX r_u;
+       prs_struct *data = &p->in_data.data;
+       prs_struct *rdata = &p->out_data.rdata;
+
+       ZERO_STRUCT(q_u);
+       ZERO_STRUCT(r_u);
+
+       /* read the stream and fill the struct */
+       if (!spoolss_io_q_getprinterdataex("", &q_u, data, 0)) {
+               DEBUG(0,("spoolss_io_q_getprinterdataex: unable to unmarshall SPOOL_Q_GETPRINTERDATAEX.\n"));
+               return False;
+       }
+       
+       r_u.status = _spoolss_getprinterdataex( p, &q_u, &r_u);
+
+       if (!spoolss_io_r_getprinterdataex("", &r_u, rdata, 0)) {
+               DEBUG(0,("spoolss_io_r_getprinterdataex: unable to marshall SPOOL_R_GETPRINTERDATAEX.\n"));
+               return False;
+       }
+
+       return True;
+}
+
+/****************************************************************************
+****************************************************************************/
+
+static BOOL api_spoolss_setprinterdataex(pipes_struct *p)
+{
+       SPOOL_Q_SETPRINTERDATAEX q_u;
+       SPOOL_R_SETPRINTERDATAEX r_u;
+       prs_struct *data = &p->in_data.data;
+       prs_struct *rdata = &p->out_data.rdata;
+       
+       ZERO_STRUCT(q_u);
+       ZERO_STRUCT(r_u);
+       
+       if(!spoolss_io_q_setprinterdataex("", &q_u, data, 0)) {
+               DEBUG(0,("spoolss_io_q_setprinterdataex: unable to unmarshall SPOOL_Q_SETPRINTERDATAEX.\n"));
+               return False;
+       }
+       
+       r_u.status = _spoolss_setprinterdataex(p, &q_u, &r_u);
+                               
+       if(!spoolss_io_r_setprinterdataex("", &r_u, rdata, 0)) {
+               DEBUG(0,("spoolss_io_r_setprinterdataex: unable to marshall SPOOL_R_SETPRINTERDATAEX.\n"));
+               return False;
+       }
+
+       return True;
+}
+
 /*******************************************************************
 \pipe\spoolss commands
 ********************************************************************/
@@ -1245,6 +1305,9 @@ struct api_struct api_spoolss_cmds[] =
  {"SPOOLSS_ENUMMONITORS",              SPOOLSS_ENUMMONITORS,              api_spoolss_enumprintmonitors         },
  {"SPOOLSS_GETJOB",                    SPOOLSS_GETJOB,                    api_spoolss_getjob                    },
  {"SPOOLSS_ENUMPRINTPROCDATATYPES",    SPOOLSS_ENUMPRINTPROCDATATYPES,    api_spoolss_enumprintprocdatatypes    },
+ {"SPOOLSS_GETPRINTERDATAEX",            SPOOLSS_GETPRINTERDATAEX,            api_spoolss_getprinterdataex            },
+ {"SPOOLSS_sETPRINTERDATAEX",            SPOOLSS_SETPRINTERDATAEX,            api_spoolss_setprinterdataex            },
+
  { NULL,                               0,                                 NULL                                  }
 };
 
index 0be836c94499c47a42d6ad39e4836223bb004937..e5ca3734793218b22c7a33d811914889bffc6d8c 100644 (file)
@@ -6755,3 +6755,41 @@ WERROR _spoolss_getjob( pipes_struct *p, SPOOL_Q_GETJOB *q_u, SPOOL_R_GETJOB *r_
                return WERR_UNKNOWN_LEVEL;
        }
 }
+
+/********************************************************************
+ * spoolss_getprinterdataex
+ ********************************************************************/
+
+WERROR _spoolss_getprinterdataex(pipes_struct *p, SPOOL_Q_GETPRINTERDATAEX *q_u, SPOOL_R_GETPRINTERDATAEX *r_u)
+{
+        fstring key;
+
+        /* From MSDN documentation of GetPrinterDataEx: pass request to
+           GetPrinterData if key is "PrinterDriverData" */
+
+        unistr2_to_ascii(key, &q_u->keyname, sizeof(key) - 1);
+
+        if (strcmp(key, "PrinterDriverData") == 0)
+                DEBUG(10, ("pass me to getprinterdata\n"));
+        
+        return WERR_INVALID_PARAM;
+}
+
+/********************************************************************
+ * spoolss_setprinterdata
+ ********************************************************************/
+
+WERROR _spoolss_setprinterdataex(pipes_struct *p, SPOOL_Q_SETPRINTERDATAEX *q_u, SPOOL_R_SETPRINTERDATAEX *r_u)
+{
+        fstring key;
+
+        /* From MSDN documentation of SetPrinterDataEx: pass request to
+           SetPrinterData if key is "PrinterDriverData" */
+
+        unistr2_to_ascii(key, &q_u->key, sizeof(key) - 1);
+
+        if (strcmp(key, "PrinterDriverData") == 0)
+                DEBUG(10, ("pass me to setprinterdata\n"));
+
+        return WERR_INVALID_PARAM;
+}