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



Reply via email to