winspool: SetJobA

Huw D M Davies h.davies1 at physics.ox.ac.uk
Tue Jul 12 12:49:37 CDT 2005


        Huw Davies <huw at codeweavers.com>
        Forward SetJobA -> SetJobW
Index: dlls/winspool/info.c
===================================================================
RCS file: /home/wine/wine/dlls/winspool/info.c,v
retrieving revision 1.115
diff -u -p -r1.115 info.c
--- dlls/winspool/info.c	12 Jul 2005 17:01:44 -0000	1.115
+++ dlls/winspool/info.c	12 Jul 2005 17:47:43 -0000
@@ -1734,9 +1734,97 @@ BOOL WINAPI SetPrinterA(HANDLE hPrinter,
 BOOL WINAPI SetJobA(HANDLE hPrinter, DWORD JobId, DWORD Level,
                        LPBYTE pJob, DWORD Command)
 {
-    FIXME("(%p,%ld,%ld,%p,%ld): stub\n",hPrinter,JobId,Level,pJob,
-         Command);
-    return FALSE;
+    BOOL ret;
+    LPBYTE JobW;
+    UNICODE_STRING usBuffer;
+
+    TRACE("(%p,%ld,%ld,%p,%ld)\n",hPrinter, JobId, Level, pJob, Command);
+
+    /* JobId, pPrinterName, pMachineName, pDriverName, Size, Submitted, Time and TotalPages
+       are all ignored by SetJob, so we don't bother copying them */
+    switch(Level)
+    {
+    case 0:
+        JobW = NULL;
+        break;
+    case 1:
+      {
+        JOB_INFO_1W *info1W = HeapAlloc(GetProcessHeap(), 0, sizeof(*info1W));
+        JOB_INFO_1A *info1A = (JOB_INFO_1A*)pJob;
+
+        JobW = (LPBYTE)info1W;
+        info1W->pUserName = asciitounicode(&usBuffer, info1A->pUserName);
+        info1W->pDocument = asciitounicode(&usBuffer, info1A->pDocument);
+        info1W->pDatatype = asciitounicode(&usBuffer, info1A->pDatatype);
+        info1W->pStatus = asciitounicode(&usBuffer, info1A->pStatus);
+        info1W->Status = info1A->Status;
+        info1W->Priority = info1A->Priority;
+        info1W->Position = info1A->Position;
+        info1W->PagesPrinted = info1A->PagesPrinted;
+        break;
+      }
+    case 2:
+      {
+        JOB_INFO_2W *info2W = HeapAlloc(GetProcessHeap(), 0, sizeof(*info2W));
+        JOB_INFO_2A *info2A = (JOB_INFO_2A*)pJob;
+
+        JobW = (LPBYTE)info2W;
+        info2W->pUserName = asciitounicode(&usBuffer, info2A->pUserName);
+        info2W->pDocument = asciitounicode(&usBuffer, info2A->pDocument);
+        info2W->pNotifyName = asciitounicode(&usBuffer, info2A->pNotifyName);
+        info2W->pDatatype = asciitounicode(&usBuffer, info2A->pDatatype);
+        info2W->pPrintProcessor = asciitounicode(&usBuffer, info2A->pPrintProcessor);
+        info2W->pParameters = asciitounicode(&usBuffer, info2A->pParameters);
+        info2W->pDevMode = info2A->pDevMode ? GdiConvertToDevmodeW(info2A->pDevMode) : NULL;
+        info2W->pStatus = asciitounicode(&usBuffer, info2A->pStatus);
+        info2W->pSecurityDescriptor = info2A->pSecurityDescriptor;
+        info2W->Status = info2A->Status;
+        info2W->Priority = info2A->Priority;
+        info2W->Position = info2A->Position;
+        info2W->StartTime = info2A->StartTime;
+        info2W->UntilTime = info2A->UntilTime;
+        info2W->PagesPrinted = info2A->PagesPrinted;
+        break;
+      }
+    case 3:
+        JobW = HeapAlloc(GetProcessHeap(), 0, sizeof(JOB_INFO_3));
+        memcpy(JobW, pJob, sizeof(JOB_INFO_3));
+        break;
+    default:
+        SetLastError(ERROR_INVALID_LEVEL);
+        return FALSE;
+    }
+
+    ret = SetJobW(hPrinter, JobId, Level, JobW, Command);
+
+    switch(Level)
+    {
+    case 1:
+      {
+        JOB_INFO_1W *info1W = (JOB_INFO_1W*)JobW;
+        HeapFree(GetProcessHeap(), 0, info1W->pUserName);
+        HeapFree(GetProcessHeap(), 0, info1W->pDocument); 
+        HeapFree(GetProcessHeap(), 0, info1W->pDatatype);
+        HeapFree(GetProcessHeap(), 0, info1W->pStatus);
+        break;
+      }
+    case 2:
+      {
+        JOB_INFO_2W *info2W = (JOB_INFO_2W*)JobW;
+        HeapFree(GetProcessHeap(), 0, info2W->pUserName);
+        HeapFree(GetProcessHeap(), 0, info2W->pDocument); 
+        HeapFree(GetProcessHeap(), 0, info2W->pNotifyName);
+        HeapFree(GetProcessHeap(), 0, info2W->pDatatype);
+        HeapFree(GetProcessHeap(), 0, info2W->pPrintProcessor);
+        HeapFree(GetProcessHeap(), 0, info2W->pParameters);
+        HeapFree(GetProcessHeap(), 0, info2W->pDevMode);
+        HeapFree(GetProcessHeap(), 0, info2W->pStatus);
+        break;
+      }
+    }
+    HeapFree(GetProcessHeap(), 0, JobW);
+
+    return ret;
 }
 
 /*****************************************************************************



More information about the wine-patches mailing list