summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGünther Deschner <gd@samba.org>2010-02-11 00:44:06 +0100
committerKarolin Seeger <kseeger@samba.org>2010-02-15 14:46:55 +0100
commit6f807f57cd10fd92e8ffb305650a693ed99d336e (patch)
treea3350574495fd1824e08fc89bae7b21ad4a55680
parent7b6b5c40e79e50c6affb52325b775ddfd28654f9 (diff)
downloadsamba-6f807f57cd10fd92e8ffb305650a693ed99d336e.tar.gz
samba-6f807f57cd10fd92e8ffb305650a693ed99d336e.tar.xz
samba-6f807f57cd10fd92e8ffb305650a693ed99d336e.zip
s3-spoolss: implement spoolss_EnumJobs level 3.
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 (cherry picked from commit 25001bbd1b0b32073073dab7cf5b78a2b902163f) (cherry picked from commit eacb3b7be16884bb6bfcc3b4db97708566d66c40) Fix bug #7130 (enumjobs level 3 is required by win7). (cherry picked from commit 7132ca8d41ce936287e5f64e3596c5d1d1b67769)
-rw-r--r--source3/rpc_server/srv_spoolss_nt.c76
1 files changed, 76 insertions, 0 deletions
diff --git a/source3/rpc_server/srv_spoolss_nt.c b/source3/rpc_server/srv_spoolss_nt.c
index 3870da98115..680d9af75a3 100644
--- a/source3/rpc_server/srv_spoolss_nt.c
+++ b/source3/rpc_server/srv_spoolss_nt.c
@@ -6487,6 +6487,27 @@ static WERROR fill_job_info2(TALLOC_CTX *mem_ctx,
}
/****************************************************************************
+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.
****************************************************************************/
@@ -6584,6 +6605,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
****************************************************************/
@@ -6640,6 +6712,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;