s3-spoolss: use pidl for _spoolss_EnumPrinterDataEx.
authorGünther Deschner <gd@samba.org>
Tue, 17 Mar 2009 23:38:40 +0000 (00:38 +0100)
committerGünther Deschner <gd@samba.org>
Wed, 18 Mar 2009 16:07:39 +0000 (17:07 +0100)
Please note that this has been the last call in samba3 that was
using hand-marshalled rpc. With this commit all named pipe rpc services
in samba3 have now fully moved to pidl generated code :-)

Guenther

source3/include/proto.h
source3/rpc_server/srv_spoolss.c
source3/rpc_server/srv_spoolss_nt.c

index deee1bbf9887c1ba6cbcfe5d47b8bbfc4cd4218c..2f4c360410fcc6ef9a48d81743e288f951f86676 100644 (file)
@@ -6032,7 +6032,6 @@ struct spoolss_DeviceMode *construct_dev_mode(TALLOC_CTX *mem_ctx,
 WERROR add_port_hook(TALLOC_CTX *ctx, NT_USER_TOKEN *token, const char *portname, const char *uri );
 bool add_printer_hook(TALLOC_CTX *ctx, NT_USER_TOKEN *token, NT_PRINTER_INFO_LEVEL *printer);
 WERROR enumports_hook(TALLOC_CTX *ctx, int *count, char ***lines );
-WERROR _spoolss_enumprinterdataex(pipes_struct *p, SPOOL_Q_ENUMPRINTERDATAEX *q_u, SPOOL_R_ENUMPRINTERDATAEX *r_u);
 
 /* The following definitions come from rpc_server/srv_srvsvc_nt.c  */
 
index 1b9cdb343845ed9d7c8bc6b53059ff3936d4062c..301d4a7dd1598bfe275bc87561a7b74e1d1cbda5 100644 (file)
@@ -464,27 +464,7 @@ static bool api_spoolss_enumprinterkey(pipes_struct *p)
 
 static bool api_spoolss_enumprinterdataex(pipes_struct *p)
 {
-       SPOOL_Q_ENUMPRINTERDATAEX q_u;
-       SPOOL_R_ENUMPRINTERDATAEX 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_enumprinterdataex("", &q_u, data, 0)) {
-               DEBUG(0,("spoolss_io_q_enumprinterdataex: unable to unmarshall SPOOL_Q_ENUMPRINTERDATAEX.\n"));
-               return False;
-       }
-       
-       r_u.status = _spoolss_enumprinterdataex(p, &q_u, &r_u);
-                               
-       if(!spoolss_io_r_enumprinterdataex("", &r_u, rdata, 0)) {
-               DEBUG(0,("spoolss_io_r_enumprinterdataex: unable to marshall SPOOL_R_ENUMPRINTERDATAEX.\n"));
-               return False;
-       }
-
-       return True;
+       return proxy_spoolss_call(p, NDR_SPOOLSS_ENUMPRINTERDATAEX);
 }
 
 /****************************************************************************
index a31a7d3023d3f543778fcd228bfa58eee3e984c7..d3e342ba0d8bcc0a3651eda9755327675210de70 100644 (file)
@@ -9014,34 +9014,32 @@ static WERROR registry_value_to_printer_enum_value(TALLOC_CTX *mem_ctx,
        return WERR_OK;
 }
 
-/********************************************************************
* spoolss_enumprinterdataex
- ********************************************************************/
+/****************************************************************
_spoolss_EnumPrinterDataEx
+****************************************************************/
 
-WERROR _spoolss_enumprinterdataex(pipes_struct *p, SPOOL_Q_ENUMPRINTERDATAEX *q_u, SPOOL_R_ENUMPRINTERDATAEX *r_u)
+WERROR _spoolss_EnumPrinterDataEx(pipes_struct *p,
+                                 struct spoolss_EnumPrinterDataEx *r)
 {
-       POLICY_HND      *handle = &q_u->handle;
-       uint32          in_size = q_u->size;
-       uint32          num_entries,
-                       needed;
+       uint32_t        count = 0;
        NT_PRINTER_INFO_LEVEL   *printer = NULL;
-       PRINTER_ENUM_VALUES     *enum_values = NULL;
+       struct spoolss_PrinterEnumValues *info = NULL;
        NT_PRINTER_DATA         *p_data;
-       fstring         key;
-       Printer_entry   *Printer = find_printer_index_by_hnd(p, handle);
+       Printer_entry   *Printer = find_printer_index_by_hnd(p, r->in.handle);
        int             snum;
        WERROR          result;
        int             key_index;
        int             i;
-       REGISTRY_VALUE  *val;
-       char            *value_name;
-       uint32          data_len;
 
+       DEBUG(4,("_spoolss_EnumPrinterDataEx\n"));
 
-       DEBUG(4,("_spoolss_enumprinterdataex\n"));
+       *r->out.count = 0;
+       *r->out.needed = 0;
+       *r->out.info = NULL;
 
        if (!Printer) {
-               DEBUG(2,("_spoolss_enumprinterdataex: Invalid handle (%s:%u:%u1<).\n", OUR_HANDLE(handle)));
+               DEBUG(2,("_spoolss_EnumPrinterDataEx: Invalid handle (%s:%u:%u1<).\n",
+                       OUR_HANDLE(r->in.handle)));
                return WERR_BADFID;
        }
 
@@ -9052,51 +9050,50 @@ WERROR _spoolss_enumprinterdataex(pipes_struct *p, SPOOL_Q_ENUMPRINTERDATAEX *q_
         * --jerry
         */
 
-       unistr2_to_ascii(key, &q_u->key, sizeof(key));
-       if ( !strlen(key) ) {
+       if (!strlen(r->in.key_name)) {
                result = WERR_INVALID_PARAM;
                goto done;
        }
 
        /* get the printer off of disk */
 
-       if (!get_printer_snum(p,handle, &snum, NULL))
+       if (!get_printer_snum(p, r->in.handle, &snum, NULL)) {
                return WERR_BADFID;
+       }
 
        ZERO_STRUCT(printer);
        result = get_a_printer(Printer, &printer, 2, lp_const_servicename(snum));
-       if (!W_ERROR_IS_OK(result))
+       if (!W_ERROR_IS_OK(result)) {
                return result;
+       }
 
        /* now look for a match on the key name */
 
        p_data = printer->info_2->data;
 
-       unistr2_to_ascii(key, &q_u->key, sizeof(key));
-       if ( (key_index = lookup_printerkey( p_data, key)) == -1  )
-       {
-               DEBUG(10,("_spoolss_enumprinterdataex: Unknown keyname [%s]\n", key));
+       key_index = lookup_printerkey(p_data, r->in.key_name);
+       if (key_index == -1) {
+               DEBUG(10,("_spoolss_EnumPrinterDataEx: Unknown keyname [%s]\n",
+                       r->in.key_name));
                result = WERR_INVALID_PARAM;
                goto done;
        }
 
-       result = WERR_OK;
-       needed = 0;
-
        /* allocate the memory for the array of pointers -- if necessary */
 
-       num_entries = regval_ctr_numvals( p_data->keys[key_index].values );
-       if ( num_entries )
-       {
-               if ( (enum_values=TALLOC_ARRAY(p->mem_ctx, PRINTER_ENUM_VALUES, num_entries)) == NULL )
-               {
-                       DEBUG(0,("_spoolss_enumprinterdataex: talloc() failed to allocate memory for [%lu] bytes!\n",
-                               (unsigned long)num_entries*sizeof(PRINTER_ENUM_VALUES)));
-                       result = WERR_NOMEM;
-                       goto done;
-               }
+       count = regval_ctr_numvals(p_data->keys[key_index].values);
+       if (!count) {
+               result = WERR_OK; /* ??? */
+               goto done;
+       }
 
-               memset( enum_values, 0x0, num_entries*sizeof(PRINTER_ENUM_VALUES) );
+       info = TALLOC_ZERO_ARRAY(p->mem_ctx,
+                                struct spoolss_PrinterEnumValues,
+                                count);
+       if (!info) {
+               DEBUG(0,("_spoolss_EnumPrinterDataEx: talloc() failed\n"));
+               result = WERR_NOMEM;
+               goto done;
        }
 
        /*
@@ -9104,37 +9101,25 @@ WERROR _spoolss_enumprinterdataex(pipes_struct *p, SPOOL_Q_ENUMPRINTERDATAEX *q_
         * back to the  client
         */
 
-       for ( i=0; i<num_entries; i++ )
-       {
-               /* lookup the registry value */
+       for (i=0; i < count; i++) {
 
-               val = regval_ctr_specific_value( p_data->keys[key_index].values, i );
-               DEBUG(10,("retrieved value number [%d] [%s]\n", i, regval_name(val) ));
+               REGISTRY_VALUE  *val;
 
-               /* copy the data */
+               /* lookup the registry value */
 
-               value_name = regval_name( val );
-               init_unistr( &enum_values[i].valuename, value_name );
-               enum_values[i].value_len = (strlen(value_name)+1) * 2;
-               enum_values[i].type      = regval_type( val );
+               val = regval_ctr_specific_value(p_data->keys[key_index].values, i);
 
-               data_len = regval_size( val );
-               if ( data_len ) {
-                       if ( !(enum_values[i].data = (uint8 *)TALLOC_MEMDUP(p->mem_ctx, regval_data_p(val), data_len)) )
-                       {
-                               DEBUG(0,("TALLOC_MEMDUP failed to allocate memory [data_len=%d] for data!\n",
-                                       data_len ));
-                               result = WERR_NOMEM;
-                               goto done;
-                       }
-               }
-               enum_values[i].data_len = data_len;
+               DEBUG(10,("retrieved value number [%d] [%s]\n", i, regval_name(val)));
 
-               /* keep track of the size of the array in bytes */
+               /* copy the data */
 
-               needed += spoolss_size_printer_enum_values(&enum_values[i]);
+               result = registry_value_to_printer_enum_value(info, val, &info[i]);
+               if (!W_ERROR_IS_OK(result)) {
+                       goto done;
+               }
        }
 
+#if 0 /* FIXME - gd */
        /* housekeeping information in the reply */
 
        /* Fix from Martin Zielinski <mz@seh.de> - ensure
@@ -9145,32 +9130,24 @@ WERROR _spoolss_enumprinterdataex(pipes_struct *p, SPOOL_Q_ENUMPRINTERDATAEX *q_
        if (needed % 4) {
                needed += 4-(needed % 4);
        }
+#endif
+       *r->out.count   = count;
+       *r->out.info    = info;
 
-       r_u->needed     = needed;
-       r_u->returned   = num_entries;
+ done:
 
-       if (needed > in_size) {
-               result = WERR_MORE_DATA;
-               goto done;
+       if (printer) {
+               free_a_printer(&printer, 2);
        }
 
-       /* copy data into the reply */
-
-       /* mz: Vista x64 returns 0x6f7 (The stub received bad data), if the
-          response buffer size is != the offered buffer size
-
-               r_u->ctr.size           = r_u->needed;
-       */
-       r_u->ctr.size           = in_size;
-
-       r_u->ctr.size_of_array  = r_u->returned;
-       r_u->ctr.values         = enum_values;
-
-done:
-       if ( printer )
-       free_a_printer(&printer, 2);
+       *r->out.needed  = SPOOLSS_BUFFER_ARRAY(p->mem_ctx,
+                                              spoolss_EnumPrinterDataEx, NULL,
+                                              *r->out.info,
+                                              *r->out.count);
+       *r->out.info    = SPOOLSS_BUFFER_OK(*r->out.info, NULL);
+       *r->out.count   = SPOOLSS_BUFFER_OK(*r->out.count, *r->out.count);
 
-       return result;
+       return SPOOLSS_BUFFER_OK(WERR_OK, WERR_MORE_DATA);
 }
 
 /****************************************************************************
@@ -9942,17 +9919,6 @@ WERROR _spoolss_4c(pipes_struct *p,
        return WERR_NOT_SUPPORTED;
 }
 
-/****************************************************************
- _spoolss_EnumPrinterDataEx
-****************************************************************/
-
-WERROR _spoolss_EnumPrinterDataEx(pipes_struct *p,
-                                 struct spoolss_EnumPrinterDataEx *r)
-{
-       p->rng_fault_state = true;
-       return WERR_NOT_SUPPORTED;
-}
-
 /****************************************************************
  _spoolss_53
 ****************************************************************/