diff options
author | Günther Deschner <gd@samba.org> | 2010-02-11 00:44:06 +0100 |
---|---|---|
committer | Günther Deschner <gd@samba.org> | 2010-02-11 13:27:46 +0100 |
commit | 25001bbd1b0b32073073dab7cf5b78a2b902163f (patch) | |
tree | 924e966484e4c3c3aa58c73308ed9f791db24d1f /source3 | |
parent | 5e1dd19221a412d88540422004b18d190e9caa28 (diff) | |
download | samba-25001bbd1b0b32073073dab7cf5b78a2b902163f.tar.gz samba-25001bbd1b0b32073073dab7cf5b78a2b902163f.tar.bz2 samba-25001bbd1b0b32073073dab7cf5b78a2b902163f.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
Diffstat (limited to 'source3')
-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 7a4c9c9263..882193aaef 100644 --- a/source3/rpc_server/srv_spoolss_nt.c +++ b/source3/rpc_server/srv_spoolss_nt.c @@ -6111,6 +6111,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. ****************************************************************************/ @@ -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; |