<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <meta content="text/html; charset=ISO-8859-1"
      http-equiv="Content-Type">
  </head>
  <body bgcolor="#ffffff" text="#000000">
    On 2/3/2011 13:51, Lo&iuml;c Maury wrote:
    <blockquote cite="mid:4D4A88CE.5010608@gmail.com" type="cite">
      <meta http-equiv="content-type" content="text/html;
        charset=ISO-8859-1">
      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>
    </blockquote>
    Patch needs to be a diff, not a copy of a call. Some useful links
    <a class="moz-txt-link-freetext" href="http://wiki.winehq.org/GitWine">http://wiki.winehq.org/GitWine</a>,
    <a class="moz-txt-link-freetext" href="http://wiki.winehq.org/SubmittingPatches">http://wiki.winehq.org/SubmittingPatches</a>.<br>
    <br>
    <blockquote cite="mid:4D4A88CE.5010608@gmail.com" type="cite"> BOOL
      WINAPI AbortPrinter(HANDLE hPrinter)<br>
      {<br>
      &nbsp;&nbsp;&nbsp; PRINTER_INFO_5W *pi5 = NULL;<br>
      &nbsp;&nbsp;&nbsp; BOOL ret = FALSE;<br>
      &nbsp;&nbsp;&nbsp; opened_printer_t *printer;<br>
      &nbsp;&nbsp;&nbsp; struct list *cursor, *cursor2;<br>
      &nbsp;&nbsp;&nbsp; job_t *job = 0;<br>
    </blockquote>
    No need to init 'job' it seems.<br>
    <blockquote cite="mid:4D4A88CE.5010608@gmail.com" type="cite"> &nbsp;&nbsp;&nbsp;
      DWORD jobDocId;<br>
      &nbsp;&nbsp;&nbsp; DWORD needed;<br>
      &nbsp;&nbsp;&nbsp; LPWSTR portname;<br>
      &nbsp;&nbsp;&nbsp; <br>
      #if defined(__APPLE__)<br>
    </blockquote>
    Why it's Mac specific?<br>
    <blockquote cite="mid:4D4A88CE.5010608@gmail.com" type="cite"> <br>
      &nbsp;&nbsp;&nbsp; EnterCriticalSection(&amp;printer_handles_cs);<br>
      &nbsp;&nbsp;&nbsp; <br>
      &nbsp;&nbsp;&nbsp; printer = get_opened_printer(hPrinter);<br>
      &nbsp;&nbsp;&nbsp; <br>
      &nbsp;&nbsp;&nbsp; if(!printer)<br>
      &nbsp;&nbsp;&nbsp; {<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ERR("The handle for the printer is invalid.\n");<br>
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SetLastError(ERROR_INVALID_HANDLE);<br>
    </blockquote>
    If you set last error you should add a test for it.<br>
    <blockquote cite="mid:4D4A88CE.5010608@gmail.com" type="cite">
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; goto end;<br>
      &nbsp;&nbsp;&nbsp; }<br>
      &nbsp;&nbsp;&nbsp; <br>
      &nbsp;&nbsp;&nbsp; TRACE("(%s, %s, %p, %d, %d)\n",debugstr_w(printer-&gt;name)<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;
      ,debugstr_w(printer-&gt;printername)<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; ,printer-&gt;backend_printer<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; ,printer-&gt;queue-&gt;ref<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;
      ,list_count(&amp;printer-&gt;queue-&gt;jobs));<br>
      &nbsp;&nbsp;&nbsp; <br>
      &nbsp;&nbsp;&nbsp; /* No jobs to manage. */<br>
      &nbsp;&nbsp;&nbsp; if(list_count(&amp;printer-&gt;queue-&gt;jobs) == 0)<br>
      &nbsp;&nbsp;&nbsp; {<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ERR("No job in the list.\n");<br>
    </blockquote>
    It's not an error to have no jobs.<br>
    <blockquote cite="mid:4D4A88CE.5010608@gmail.com" type="cite"> &nbsp;&nbsp;&nbsp;
      &nbsp;&nbsp;&nbsp; SetLastError(ERROR_SPL_NO_STARTDOC);<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; goto end;<br>
      &nbsp;&nbsp;&nbsp; }<br>
      &nbsp;&nbsp;&nbsp; <br>
      &nbsp;&nbsp;&nbsp; if(printer-&gt;doc) {<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; TRACE("Document inside for job id : %d\n",
      printer-&gt;doc-&gt;job_id);<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; jobDocId = printer-&gt;doc-&gt;job_id;<br>
      &nbsp;&nbsp;&nbsp; }<br>
      &nbsp;&nbsp;&nbsp; else {<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ERR("No document.\n");<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; SetLastError(ERROR_SPL_NO_STARTDOC);<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; goto end;<br>
      &nbsp;&nbsp;&nbsp; }<br>
      &nbsp;&nbsp;&nbsp; <br>
      &nbsp;&nbsp;&nbsp; /* For each jobs, get the job document in the double linked
      list */<br>
      &nbsp;&nbsp;&nbsp; LIST_FOR_EACH_SAFE(cursor, cursor2,
      &amp;printer-&gt;queue-&gt;jobs)<br>
      &nbsp;&nbsp;&nbsp; {<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; /* Take a job. */<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; job = LIST_ENTRY(cursor, job_t, entry);<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; TRACE("(job id : %d, filename : %s, portname : %s,
      document title : %s, printer name %s)\n",job-&gt;job_id<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; ,debugstr_w(job-&gt;filename)<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; ,debugstr_w(job-&gt;portname)<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;
      ,debugstr_w(job-&gt;document_title)<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;
      ,debugstr_w(job-&gt;printer_name));<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(jobDocId == job-&gt;job_id)<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp; <br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; TRACE("(hf : %p, job id :
      %d)\n",printer-&gt;doc-&gt;hf<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
      ,printer-&gt;doc-&gt;job_id);<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; /* Get portname. */<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (!job-&gt;portname)<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; GetPrinterW(hPrinter, 5, NULL, 0, &amp;needed);<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; pi5 = HeapAlloc(GetProcessHeap(), 0, needed);<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; GetPrinterW(hPrinter, 5, (LPBYTE)pi5, needed,
      &amp;needed);<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; portname = pi5-&gt;pPortName;<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; TRACE("portname : %s\n", debugstr_w(portname));<br>
      <br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; /* Cups Port */<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(!strncmpW(portname, CUPS_Port, strlenW(CUPS_Port)))<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; TRACE("Remove job from the list.\n");<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; list_remove(cursor);<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; CloseHandle(printer-&gt;doc-&gt;hf);<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; DeleteFileW(job-&gt;filename);<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; HeapFree(GetProcessHeap(), 0,
      job-&gt;document_title);<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; HeapFree(GetProcessHeap(), 0,
      job-&gt;printer_name);<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; HeapFree(GetProcessHeap(), 0, job-&gt;portname);<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; HeapFree(GetProcessHeap(), 0, job-&gt;filename);<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; HeapFree(GetProcessHeap(), 0, job-&gt;devmode);<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; HeapFree(GetProcessHeap(), 0, job);<br>
    </blockquote>
    <br>
    <blockquote cite="mid:4D4A88CE.5010608@gmail.com" type="cite"> &nbsp;&nbsp;&nbsp;
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; job = 0;<br>
    </blockquote>
    What is it for?<br>
    <blockquote cite="mid:4D4A88CE.5010608@gmail.com" type="cite"> &nbsp;&nbsp;&nbsp;
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ret = TRUE;<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(pi5)<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; HeapFree(GetProcessHeap(), 0, pi5);<br>
    </blockquote>
    No need to check point here.<br>
    <blockquote cite="mid:4D4A88CE.5010608@gmail.com" type="cite"> &nbsp;&nbsp;&nbsp;
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; else<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; FIXME("only CUPS for now.\n");<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
      &nbsp;&nbsp;&nbsp; }<br>
      &nbsp;&nbsp;&nbsp; <br>
      end:&nbsp;&nbsp;&nbsp; <br>
      &nbsp;&nbsp;&nbsp; LeaveCriticalSection(&amp;printer_handles_cs);<br>
      &nbsp;&nbsp;&nbsp; <br>
      &nbsp;&nbsp;&nbsp; TRACE("return %d\n", ret);<br>
      &nbsp;&nbsp;&nbsp; return ret;<br>
      <br>
      #else<br>
      &nbsp;&nbsp;&nbsp; TRACE("Only CUPS for Mac Os is managed for now.\n");<br>
      &nbsp;&nbsp;&nbsp; return FALSE;<br>
      #endif&nbsp;&nbsp;&nbsp; <br>
    </blockquote>
    This should stay as FIXME obviously.<br>
    <blockquote cite="mid:4D4A88CE.5010608@gmail.com" type="cite"> }<br>
      <br>
      Merci<br>
      <br>
      Lo&iuml;c<br>
      <br>
      <pre wrap="">
<fieldset class="mimeAttachmentHeader"></fieldset>

</pre>
    </blockquote>
    <br>
  </body>
</html>