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