--- dlls/winspool.drv/info.c | 85 ++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 83 insertions(+), 2 deletions(-) diff --git a/dlls/winspool.drv/info.c b/dlls/winspool.drv/info.c index 9d36657..b271be1 100644 --- a/dlls/winspool.drv/info.c +++ b/dlls/winspool.drv/info.c @@ -5962,8 +5962,89 @@ DWORD WINAPI EnumPrinterDataExA(HANDLE hPrinter, LPCSTR pKeyName, */ BOOL WINAPI AbortPrinter( HANDLE hPrinter ) { - FIXME("(%p), stub!\n", hPrinter); - return TRUE; + PRINTER_INFO_2W *pi2 = NULL; + BOOL ret = FALSE; + BOOL retFromGetPrinter = FALSE; + opened_printer_t *printer; + job_t *job, *next_job; + DWORD jobDocId; + DWORD needed; + LPWSTR portname = 0; + + TRACE("(%p)\n", hPrinter); + + EnterCriticalSection(&printer_handles_cs); + + printer = get_opened_printer(hPrinter); + if(!printer) + { + SetLastError(ERROR_INVALID_HANDLE); + goto end; + } + + if(printer->doc) + { + jobDocId = printer->doc->job_id; + } + else + { + SetLastError(ERROR_SPL_NO_STARTDOC); + goto end; + } + + LIST_FOR_EACH_ENTRY_SAFE(job, next_job, &printer->queue->jobs, job_t, entry) + { + TRACE("(job id : %d, filename : %s, portname : %s, document title : %s, printer name %s)\n", + job->job_id, debugstr_w(job->filename), debugstr_w(job->portname), + debugstr_w(job->document_title), debugstr_w(job->printer_name)); + + if(jobDocId == job->job_id) + { + portname = job->portname; + + if(!portname) + { + GetPrinterW(hPrinter, 2, NULL, 0, &needed); + if(GetLastError() != ERROR_INSUFFICIENT_BUFFER) + goto end; + + pi2 = HeapAlloc(GetProcessHeap(), 0, needed); + if(!pi2) + goto end; + + retFromGetPrinter = GetPrinterW(hPrinter, 2, (LPBYTE)pi2, needed, &needed); + if(!retFromGetPrinter) + goto end; + + portname = pi2->pPortName; + } + + if(!strncmpW(portname, CUPS_Port, strlenW(CUPS_Port))) + { + list_remove(&job->entry); + CloseHandle(printer->doc->hf); + DeleteFileW(job->filename); + HeapFree(GetProcessHeap(), 0, job->document_title); + HeapFree(GetProcessHeap(), 0, job->printer_name); + HeapFree(GetProcessHeap(), 0, job->portname); + HeapFree(GetProcessHeap(), 0, job->filename); + HeapFree(GetProcessHeap(), 0, job->devmode); + HeapFree(GetProcessHeap(), 0, job); + + HeapFree(GetProcessHeap(), 0, printer->doc); + printer->doc = 0; + ret = TRUE; + goto end; + } + else + FIXME("AbortPrinter() manage only CUPS for now.\n"); + } + } + +end: + HeapFree(GetProcessHeap(), 0, pi2); + LeaveCriticalSection(&printer_handles_cs); + return ret; } /****************************************************************************** -- 1.7.4.3