Hello,
From what was said from the last comments, I have modified the code and
I have added the test patch.
What do you think ?
Thank you
Loïc
---
dlls/winspool.drv/tests/info.c | 31 +++++++++++++++++++++++++++++++
1 files changed, 31 insertions(+), 0 deletions(-)
diff --git a/dlls/winspool.drv/tests/info.c b/dlls/winspool.drv/tests/info.c
index da4fc38..6ea6cc6 100644
--- a/dlls/winspool.drv/tests/info.c
+++ b/dlls/winspool.drv/tests/info.c
@@ -2733,6 +2733,36 @@ static void test_EnumPrinters(void)
ok(neededA == neededW, "neededA %d neededW %d\n", neededA, neededW);
}
+static void test_AbortPrinter(void)
+{
+ DWORD res;
+ HANDLE hprn;
+
+ SetLastError(MAGIC_DEAD);
+ res = AbortPrinter(NULL);
+ ok(!res && (GetLastError() == ERROR_INVALID_HANDLE),
+ "returned %d with %d (expected '0' with ERROR_INVALID_HANDLE)\n",
+ res, GetLastError());
+
+ if(default_printer)
+ {
+ res = OpenPrinter(default_printer, &hprn, NULL);
+ if (!res)
+ {
+ skip("Unable to open the default printer (%s)\n", default_printer);
+ return;
+ }
+
+ SetLastError(MAGIC_DEAD);
+ res = AbortPrinter(hprn);
+ ok(!res && (GetLastError() == ERROR_SPL_NO_STARTDOC),
+ "returned %d with %d (expected '0' with ERROR_SPL_NO_STARTDOC)\n",
+ res, GetLastError());
+
+ ClosePrinter(hprn);
+ }
+}
+
static void test_DeviceCapabilities(void)
{
HANDLE hComdlg32;
@@ -2898,6 +2928,7 @@ START_TEST(info)
test_SetDefaultPrinter();
test_XcvDataW_MonitorUI();
test_XcvDataW_PortIsValid();
+ test_AbortPrinter();
/* Cleanup our temporary file */
DeleteFileA(tempfileA);
--
1.7.4.3
---
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