winspool: ScheduleJob for lpr

Huw D M Davies h.davies1 at physics.ox.ac.uk
Fri Jul 8 11:14:02 CDT 2005


        Huw Davies <huw at codeweavers.com>
        ScheduleJob for 'lpr' ports.
-- 
Huw Davies
huw at codeweavers.com
Index: dlls/winspool/info.c
===================================================================
RCS file: /home/wine/wine/dlls/winspool/info.c,v
retrieving revision 1.112
diff -u -p -r1.112 info.c
--- dlls/winspool/info.c	8 Jul 2005 14:19:18 -0000	1.112
+++ dlls/winspool/info.c	8 Jul 2005 16:11:44 -0000
@@ -153,6 +153,10 @@ static const WCHAR emptyStringW[] = {0};
 
 static const WCHAR May_Delete_Value[] = {'W','i','n','e','M','a','y','D','e','l','e','t','e','M','e',0};
 
+static const WCHAR CUPS_Port[] = {'C','U','P','S',':',0};
+static const WCHAR FILE_Port[] = {'F','I','L','E',':',0};
+static const WCHAR LPR_Port[] = {'L','P','R',':',0};
+
 static HKEY WINSPOOL_OpenDriverReg( LPVOID pEnvironment, BOOL unicode);
 static BOOL WINSPOOL_GetPrinterDriver(HANDLE hPrinter, LPWSTR pEnvironment,
 				      DWORD Level, LPBYTE pDriverInfo,
@@ -4706,6 +4710,34 @@ BOOL WINAPI GetJobW(HANDLE hPrinter, DWO
 }
 
 /*****************************************************************************
+ *          schedule_lpr
+ */
+static BOOL schedule_lpr(LPCWSTR printer_name, LPCWSTR filename)
+{
+    char *unixname, *queue, *cmd;
+    char fmt[] = "lpr -P%s %s";
+    DWORD len;
+
+    if(!(unixname = wine_get_unix_file_name(filename)))
+        return FALSE;
+
+    len = WideCharToMultiByte(CP_ACP, 0, printer_name, -1, NULL, 0, NULL, NULL);
+    queue = HeapAlloc(GetProcessHeap(), 0, len);
+    WideCharToMultiByte(CP_ACP, 0, printer_name, -1, queue, len, NULL, NULL);
+
+    cmd = HeapAlloc(GetProcessHeap(), 0, strlen(unixname) + len + sizeof(fmt) - 5);
+    sprintf(cmd, fmt, queue, unixname);
+
+    TRACE("printing with: %s\n", cmd);
+    system(cmd);
+
+    HeapFree(GetProcessHeap(), 0, cmd);
+    HeapFree(GetProcessHeap(), 0, queue);
+    HeapFree(GetProcessHeap(), 0, unixname);
+    return TRUE;
+}
+
+/*****************************************************************************
  *          ScheduleJob [WINSPOOL.@]
  *
  */
@@ -4731,7 +4763,25 @@ BOOL WINAPI ScheduleJob( HANDLE hPrinter
         hf = CreateFileW(job->filename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
         if(hf != INVALID_HANDLE_VALUE)
         {
-            FIXME("need to schedule job %ld filename %s\n", job->job_id, debugstr_w(job->filename));
+            PRINTER_INFO_5W *pi5;
+            DWORD needed;
+
+            GetPrinterW(hPrinter, 5, NULL, 0, &needed);
+            pi5 = HeapAlloc(GetProcessHeap(), 0, needed);
+            GetPrinterW(hPrinter, 5, (LPBYTE)pi5, needed, &needed);
+            TRACE("need to schedule job %ld filename %s to port %s\n", job->job_id, debugstr_w(job->filename),
+                  debugstr_w(pi5->pPortName));
+            
+            if(!strncmpW(pi5->pPortName, LPR_Port, strlenW(LPR_Port)))
+            {
+                schedule_lpr(pi5->pPortName + strlenW(LPR_Port), job->filename);
+            }
+            else
+            {
+                FIXME("can't schedule to port %s\n", debugstr_w(pi5->pPortName));
+            }
+
+            HeapFree(GetProcessHeap(), 0, pi5);
             CloseHandle(hf);
             DeleteFileW(job->filename);
         }



More information about the wine-patches mailing list