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:
parent
5e1dd19221
commit
25001bbd1b
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user