1
0
mirror of https://github.com/samba-team/samba.git synced 2024-12-25 23:21:54 +03:00

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
This commit is contained in:
Günther Deschner 2010-02-11 00:44:06 +01:00
parent 5e1dd19221
commit 25001bbd1b

View 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;