<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
</head>
<body bgcolor="#ffffff" text="#000000">
Hello,<br>
<br>
I try to implement my first stub function - <b>AbortPrinter()</b>.<br>
But before to make a patch, I need your advice.<br>
<br>
For what I understood, AbortPrinter(), remove the document <br>
spool file for a printer, created by StartDocPrinter(), who indicate
<br>
that a document was spooled.<br>
<br>
I saw that the API printer functions are in dlls/winspool.drv/info.c<br>
<br>
I understood that there are 4 structures used, <b>opened_printer_t</b>
for manage a printer, <br>
<b>jobqueue_t</b> for a list of job for a printer, <b>started_doc_t</b>
who manage a document,<br>
and <b>job_t</b> for manage a job.<br>
<br>
I am on Mac Os 10.6, with CUPS.<br>
<br>
Here is the code, what do you think ?<br>
<br>
BOOL WINAPI AbortPrinter(HANDLE hPrinter)<br>
{<br>
PRINTER_INFO_5W *pi5 = NULL;<br>
BOOL ret = FALSE;<br>
opened_printer_t *printer;<br>
struct list *cursor, *cursor2;<br>
job_t *job = 0;<br>
DWORD jobDocId;<br>
DWORD needed;<br>
LPWSTR portname;<br>
<br>
#if defined(__APPLE__)<br>
<br>
EnterCriticalSection(&printer_handles_cs);<br>
<br>
printer = get_opened_printer(hPrinter);<br>
<br>
if(!printer)<br>
{<br>
ERR("The handle for the printer is invalid.\n");<br>
SetLastError(ERROR_INVALID_HANDLE);<br>
goto end;<br>
}<br>
<br>
TRACE("(%s, %s, %p, %d, %d)\n",debugstr_w(printer->name)<br>
,debugstr_w(printer->printername)<br>
,printer->backend_printer<br>
,printer->queue->ref<br>
,list_count(&printer->queue->jobs));<br>
<br>
/* No jobs to manage. */<br>
if(list_count(&printer->queue->jobs) == 0)<br>
{<br>
ERR("No job in the list.\n");<br>
SetLastError(ERROR_SPL_NO_STARTDOC);<br>
goto end;<br>
}<br>
<br>
if(printer->doc) {<br>
TRACE("Document inside for job id : %d\n",
printer->doc->job_id);<br>
jobDocId = printer->doc->job_id;<br>
}<br>
else {<br>
ERR("No document.\n");<br>
SetLastError(ERROR_SPL_NO_STARTDOC);<br>
goto end;<br>
}<br>
<br>
/* For each jobs, get the job document in the double linked list
*/<br>
LIST_FOR_EACH_SAFE(cursor, cursor2,
&printer->queue->jobs)<br>
{<br>
/* Take a job. */<br>
job = LIST_ENTRY(cursor, job_t, entry);<br>
<br>
TRACE("(job id : %d, filename : %s, portname : %s, document
title : %s, printer name %s)\n",job->job_id<br>
,debugstr_w(job->filename)<br>
,debugstr_w(job->portname)<br>
,debugstr_w(job->document_title)<br>
,debugstr_w(job->printer_name));<br>
if(jobDocId == job->job_id)<br>
{ <br>
TRACE("(hf : %p, job id : %d)\n",printer->doc->hf<br>
,printer->doc->job_id);<br>
<br>
/* Get portname. */<br>
if (!job->portname)<br>
{<br>
GetPrinterW(hPrinter, 5, NULL, 0, &needed);<br>
pi5 = HeapAlloc(GetProcessHeap(), 0, needed);<br>
GetPrinterW(hPrinter, 5, (LPBYTE)pi5, needed,
&needed);<br>
portname = pi5->pPortName;<br>
}<br>
<br>
TRACE("portname : %s\n", debugstr_w(portname));<br>
<br>
/* Cups Port */<br>
if(!strncmpW(portname, CUPS_Port, strlenW(CUPS_Port)))<br>
{<br>
TRACE("Remove job from the list.\n");<br>
list_remove(cursor);<br>
CloseHandle(printer->doc->hf);<br>
DeleteFileW(job->filename);<br>
HeapFree(GetProcessHeap(), 0,
job->document_title);<br>
HeapFree(GetProcessHeap(), 0, job->printer_name);<br>
HeapFree(GetProcessHeap(), 0, job->portname);<br>
HeapFree(GetProcessHeap(), 0, job->filename);<br>
HeapFree(GetProcessHeap(), 0, job->devmode);<br>
HeapFree(GetProcessHeap(), 0, job);<br>
job = 0;<br>
ret = TRUE;<br>
<br>
if(pi5)<br>
HeapFree(GetProcessHeap(), 0, pi5);<br>
}<br>
else<br>
FIXME("only CUPS for now.\n");<br>
}<br>
}<br>
<br>
end: <br>
LeaveCriticalSection(&printer_handles_cs);<br>
<br>
TRACE("return %d\n", ret);<br>
return ret;<br>
<br>
#else<br>
TRACE("Only CUPS for Mac Os is managed for now.\n");<br>
return FALSE;<br>
#endif <br>
}<br>
<br>
Merci<br>
<br>
Loïc<br>
<br>
</body>
</html>