winspool: GetJob

Huw D M Davies h.davies1 at physics.ox.ac.uk
Mon Jul 18 05:41:02 CDT 2005


        Huw Davies <huw at codeweavers.com>
        Partial implementation of GetJob.
-- 
Huw Davies
huw at codeweavers.com
Index: dlls/winspool/info.c
===================================================================
RCS file: /home/wine/wine/dlls/winspool/info.c,v
retrieving revision 1.118
diff -u -p -r1.118 info.c
--- dlls/winspool/info.c	15 Jul 2005 09:55:23 -0000	1.118
+++ dlls/winspool/info.c	18 Jul 2005 10:39:48 -0000
@@ -4854,15 +4854,183 @@ BOOL WINAPI FreePrinterNotifyInfo( PPRIN
 }
 
 /*****************************************************************************
+ *          string_to_buf
+ *
+ * Copies a unicode string into a buffer.  The buffer will either contain unicode or
+ * ansi depending on the unicode parameter.
+ */
+static BOOL string_to_buf(LPCWSTR str, LPBYTE ptr, DWORD cb, DWORD *size, BOOL unicode)
+{
+    if(!str)
+    {
+        *size = 0;
+        return TRUE;
+    }
+
+    if(unicode)
+    {
+        *size = (strlenW(str) + 1) * sizeof(WCHAR);
+        if(*size <= cb)
+        {
+            memcpy(ptr, str, *size);
+            return TRUE;
+        }
+        return FALSE;
+    }
+    else
+    {
+        *size = WideCharToMultiByte(CP_ACP, 0, str, -1, NULL, 0, NULL, NULL);
+        if(*size <= cb)
+        {
+            WideCharToMultiByte(CP_ACP, 0, str, -1, ptr, *size, NULL, NULL);
+            return TRUE;
+        }
+        return FALSE;
+    }
+}
+
+/*****************************************************************************
+ *          get_job_info_1
+ */
+static BOOL get_job_info_1(job_t *job, JOB_INFO_1W *ji1, LPBYTE buf, DWORD cbBuf,
+                           LPDWORD pcbNeeded, BOOL unicode)
+{
+    DWORD size, left = cbBuf;
+    BOOL space = (cbBuf > 0);
+    LPBYTE ptr = buf;
+
+    *pcbNeeded = 0;
+
+    if(space)
+    {
+        ji1->JobId = job->job_id;
+    }
+
+    string_to_buf(job->document_title, ptr, left, &size, unicode);
+    if(space && size <= left)
+    {
+        ji1->pDocument = (LPWSTR)ptr;
+        ptr += size;
+        left -= size;
+    }
+    else
+        space = FALSE;
+    *pcbNeeded += size;
+
+    return space;
+}
+
+/*****************************************************************************
+ *          get_job_info_2
+ */
+static BOOL get_job_info_2(job_t *job, JOB_INFO_2W *ji2, LPBYTE buf, DWORD cbBuf,
+                           LPDWORD pcbNeeded, BOOL unicode)
+{
+    DWORD size, left = cbBuf;
+    BOOL space = (cbBuf > 0);
+    LPBYTE ptr = buf;
+
+    *pcbNeeded = 0;
+
+    if(space)
+    {
+        ji2->JobId = job->job_id;
+    }
+
+    string_to_buf(job->document_title, ptr, left, &size, unicode);
+    if(space && size <= left)
+    {
+        ji2->pDocument = (LPWSTR)ptr;
+        ptr += size;
+        left -= size;
+    }
+    else
+        space = FALSE;
+    *pcbNeeded += size;
+
+    return space;
+}
+
+/*****************************************************************************
+ *          get_job_info
+ */
+static BOOL get_job_info(HANDLE hPrinter, DWORD JobId, DWORD Level, LPBYTE pJob,
+                         DWORD cbBuf, LPDWORD pcbNeeded, BOOL unicode)
+{
+    BOOL ret = FALSE;
+    DWORD needed = 0, size;
+    job_t *job;
+    LPBYTE ptr = pJob;
+
+    TRACE("%p %ld %ld %p %ld %p\n", hPrinter, JobId, Level, pJob, cbBuf, pcbNeeded);
+
+    EnterCriticalSection(&printer_handles_cs);
+    job = get_job(hPrinter, JobId);
+    if(!job)
+        goto end;
+
+    switch(Level)
+    {
+    case 1:
+        size = sizeof(JOB_INFO_1W);
+        if(cbBuf >= size)
+        {
+            cbBuf -= size;
+            ptr += size;
+            memset(pJob, 0, size);
+        }
+        else
+            cbBuf = 0;
+        ret = get_job_info_1(job, (JOB_INFO_1W *)pJob, ptr, cbBuf, &needed, unicode);
+        needed += size;
+        break;
+
+    case 2:
+        size = sizeof(JOB_INFO_2W);
+        if(cbBuf >= size)
+        {
+            cbBuf -= size;
+            ptr += size;
+            memset(pJob, 0, size);
+        }
+        else
+            cbBuf = 0;
+        ret = get_job_info_2(job, (JOB_INFO_2W *)pJob, ptr, cbBuf, &needed, unicode);
+        needed += size;
+        break;
+
+    case 3:
+        size = sizeof(JOB_INFO_3);
+        if(cbBuf >= size)
+        {
+            cbBuf -= size;
+            memset(pJob, 0, size);
+            ret = TRUE;
+        }
+        else
+            cbBuf = 0;
+        needed = size;
+        break;
+
+    default:
+        SetLastError(ERROR_INVALID_LEVEL);
+        goto end;
+    }
+    if(pcbNeeded)
+        *pcbNeeded = needed;
+end:
+    LeaveCriticalSection(&printer_handles_cs);
+    return ret;
+}
+
+/*****************************************************************************
  *          GetJobA [WINSPOOL.@]
  *
  */
 BOOL WINAPI GetJobA(HANDLE hPrinter, DWORD JobId, DWORD Level, LPBYTE pJob,
-                           DWORD cbBuf, LPDWORD pcbNeeded)
+                    DWORD cbBuf, LPDWORD pcbNeeded)
 {
-    FIXME("Stub: %p %ld %ld %p %ld %p\n", hPrinter, JobId, Level, pJob,
-          cbBuf, pcbNeeded);
-    return FALSE;
+    return get_job_info(hPrinter, JobId, Level, pJob, cbBuf, pcbNeeded, FALSE);
 }
 
 /*****************************************************************************
@@ -4870,11 +5038,9 @@ BOOL WINAPI GetJobA(HANDLE hPrinter, DWO
  *
  */
 BOOL WINAPI GetJobW(HANDLE hPrinter, DWORD JobId, DWORD Level, LPBYTE pJob,
-                           DWORD cbBuf, LPDWORD pcbNeeded)
+                    DWORD cbBuf, LPDWORD pcbNeeded)
 {
-    FIXME("Stub: %p %ld %ld %p %ld %p\n", hPrinter, JobId, Level, pJob,
-          cbBuf, pcbNeeded);
-    return FALSE;
+    return get_job_info(hPrinter, JobId, Level, pJob, cbBuf, pcbNeeded, TRUE);
 }
 
 /*****************************************************************************



More information about the wine-patches mailing list