diff options
author | Günther Deschner <gd@samba.org> | 2010-02-11 00:44:06 +0100 |
---|---|---|
committer | Karolin Seeger <kseeger@samba.org> | 2010-02-15 14:46:55 +0100 |
commit | 6f807f57cd10fd92e8ffb305650a693ed99d336e (patch) | |
tree | a3350574495fd1824e08fc89bae7b21ad4a55680 | |
parent | 7b6b5c40e79e50c6affb52325b775ddfd28654f9 (diff) | |
download | samba-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.c | 76 |
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; |