s3-spoolss: implement spoolss_EnumJobs level 3.
authorGünther Deschner <gd@samba.org>
Wed, 10 Feb 2010 23:44:06 +0000 (00:44 +0100)
committerGünther Deschner <gd@samba.org>
Thu, 11 Feb 2010 12:27:46 +0000 (13:27 +0100)
Level 3 has been added with NT 4.0 and Windows 7 (at least 64bit version) makes
use of it in order to display queued jobs. Windows 7 will *not* fall back to
level 2 if we just return WERR_UNKNOWN_LEVEL, instead there will be no printjobs
displayed at all.

Guenther

source3/rpc_server/srv_spoolss_nt.c

index 7a4c9c92638312517ee221446acd4d04b59b2cba..882193aaef6ae1e0cbf513782f6ff6d6783d36bf 100644 (file)
@@ -6110,6 +6110,27 @@ static WERROR fill_job_info2(TALLOC_CTX *mem_ctx,
        return WERR_OK;
 }
 
+/****************************************************************************
+fill_job_info3
+****************************************************************************/
+
+static WERROR fill_job_info3(TALLOC_CTX *mem_ctx,
+                            struct spoolss_JobInfo3 *r,
+                            const print_queue_struct *queue,
+                            const print_queue_struct *next_queue,
+                            int position, int snum,
+                            const NT_PRINTER_INFO_LEVEL *ntprinter)
+{
+       r->job_id               = queue->job;
+       r->next_job_id          = 0;
+       if (next_queue) {
+               r->next_job_id  = next_queue->job;
+       }
+       r->reserved             = 0;
+
+       return WERR_OK;
+}
+
 /****************************************************************************
  Enumjobs at level 1.
 ****************************************************************************/
@@ -6208,6 +6229,57 @@ static WERROR enumjobs_level2(TALLOC_CTX *mem_ctx,
        return WERR_OK;
 }
 
+/****************************************************************************
+ Enumjobs at level 3.
+****************************************************************************/
+
+static WERROR enumjobs_level3(TALLOC_CTX *mem_ctx,
+                             const print_queue_struct *queue,
+                             uint32_t num_queues, int snum,
+                              const NT_PRINTER_INFO_LEVEL *ntprinter,
+                             union spoolss_JobInfo **info_p,
+                             uint32_t *count)
+{
+       union spoolss_JobInfo *info;
+       int i;
+       WERROR result = WERR_OK;
+
+       info = TALLOC_ARRAY(mem_ctx, union spoolss_JobInfo, num_queues);
+       W_ERROR_HAVE_NO_MEMORY(info);
+
+       *count = num_queues;
+
+       for (i=0; i<*count; i++) {
+               const print_queue_struct *next_queue = NULL;
+
+               if (i+1 < *count) {
+                       next_queue = &queue[i+1];
+               }
+
+               result = fill_job_info3(info,
+                                       &info[i].info3,
+                                       &queue[i],
+                                       next_queue,
+                                       i,
+                                       snum,
+                                       ntprinter);
+               if (!W_ERROR_IS_OK(result)) {
+                       goto out;
+               }
+       }
+
+ out:
+       if (!W_ERROR_IS_OK(result)) {
+               TALLOC_FREE(info);
+               *count = 0;
+               return result;
+       }
+
+       *info_p = info;
+
+       return WERR_OK;
+}
+
 /****************************************************************
  _spoolss_EnumJobs
 ****************************************************************/
@@ -6264,6 +6336,10 @@ WERROR _spoolss_EnumJobs(pipes_struct *p,
                result = enumjobs_level2(p->mem_ctx, queue, count, snum,
                                         ntprinter, r->out.info, r->out.count);
                break;
+       case 3:
+               result = enumjobs_level3(p->mem_ctx, queue, count, snum,
+                                        ntprinter, r->out.info, r->out.count);
+               break;
        default:
                result = WERR_UNKNOWN_LEVEL;
                break;