Alexandre Julliard : gdi.exe: Use 32-bit printer functions for print jobs.

Alexandre Julliard julliard at winehq.org
Tue Mar 10 16:24:57 CDT 2020


Module: wine
Branch: master
Commit: 41ec44bf3f413315c921dfccd9ed437cafd0fc18
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=41ec44bf3f413315c921dfccd9ed437cafd0fc18

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Tue Mar 10 17:02:53 2020 +0100

gdi.exe: Use 32-bit printer functions for print jobs.

Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/gdi.exe16/printdrv.c | 196 +++++-----------------------------------------
 1 file changed, 18 insertions(+), 178 deletions(-)

diff --git a/dlls/gdi.exe16/printdrv.c b/dlls/gdi.exe16/printdrv.c
index 3e49af203a..b0e1e31600 100644
--- a/dlls/gdi.exe16/printdrv.c
+++ b/dlls/gdi.exe16/printdrv.c
@@ -21,23 +21,12 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
  */
 
-#include "config.h"
-#include "wine/port.h"
-
 #include <stdarg.h>
 #include <stdio.h>
 #include <signal.h>
 #include <stdlib.h>
 #include <string.h>
-#include <ctype.h>
-#include <errno.h>
-#ifdef HAVE_SYS_WAIT_H
-# include <sys/wait.h>
-#endif
-#ifdef HAVE_UNISTD_H
-# include <unistd.h>
-#endif
-#include <fcntl.h>
+
 #include "windef.h"
 #include "winbase.h"
 #include "winuser.h"
@@ -199,13 +188,10 @@ INT16 WINAPI SizePQ16(HPQ16 hPQ, INT16 sizechange)
  */
 typedef struct PRINTJOB
 {
-    char	*pszOutput;
-    char 	*pszTitle;
     HDC16  	hDC;
     HANDLE16 	hHandle;
     int		nIndex;
-    int		fd;
-    pid_t       pid;
+    int		id;
 } PRINTJOB, *PPRINTJOB;
 
 #define MAX_PRINT_JOBS 1
@@ -219,127 +205,6 @@ static PPRINTJOB FindPrintJobFromHandle(HANDLE16 hHandle)
     return gPrintJobsTable[0];
 }
 
-static int CreateSpoolFile(LPCSTR pszOutput, pid_t *out_pid)
-{
-    int fd=-1;
-    char psCmd[1024];
-    const char *psCmdP = psCmd;
-    HKEY hkey;
-
-    /* TTD convert the 'output device' into a spool file name */
-
-    if (pszOutput == NULL || *pszOutput == '\0' || out_pid == NULL)
-      return -1;
-
-    *out_pid = -1;
-
-    psCmd[0] = 0;
-    /* @@ Wine registry key: HKCU\Software\Wine\Printing\Spooler */
-    if(!RegOpenKeyA(HKEY_CURRENT_USER, "Software\\Wine\\Printing\\Spooler", &hkey))
-    {
-        DWORD type, count = sizeof(psCmd);
-        RegQueryValueExA(hkey, pszOutput, 0, &type, (LPBYTE)psCmd, &count);
-        RegCloseKey(hkey);
-    }
-    if (!psCmd[0] && !strncmp("LPR:",pszOutput,4))
-        sprintf(psCmd,"|lpr -P'%s'",pszOutput+4);
-
-    TRACE("Got printerSpoolCommand '%s' for output device '%s'\n",
-	  psCmd, pszOutput);
-    if (!*psCmd)
-        psCmdP = pszOutput;
-    else
-    {
-        while (*psCmdP && isspace(*psCmdP))
-        {
-            psCmdP++;
-        }
-        if (!*psCmdP)
-            return -1;
-    }
-    TRACE("command: '%s'\n", psCmdP);
-#ifdef HAVE_FORK
-    if (*psCmdP == '|')
-    {
-        int fds[2];
-        if (pipe(fds)) {
-	    ERR("pipe() failed!\n");
-            return -1;
-	}
-        if ((*out_pid = fork()) == 0)
-        {
-            psCmdP++;
-
-            TRACE("In child need to exec %s\n",psCmdP);
-            close(0);
-            dup2(fds[0],0);
-            close (fds[1]);
-
-            /* reset signals that we previously set to SIG_IGN */
-            signal( SIGPIPE, SIG_DFL );
-
-            execl("/bin/sh", "/bin/sh", "-c", psCmdP, NULL);
-            _exit(1);
-
-        }
-        close (fds[0]);
-        fd = fds[1];
-        TRACE("Need to execute a cmnd and pipe the output to it\n");
-    }
-    else
-#endif
-    {
-        char *buffer;
-        WCHAR psCmdPW[MAX_PATH];
-
-        TRACE("Just assume it's a file\n");
-
-        /**
-         * The file name can be dos based, we have to find its
-         * corresponding Unix file name.
-         */
-        MultiByteToWideChar(CP_ACP, 0, psCmdP, -1, psCmdPW, MAX_PATH);
-        if ((buffer = wine_get_unix_file_name(psCmdPW)))
-        {
-            if ((fd = open(buffer, O_CREAT | O_TRUNC | O_WRONLY, 0666)) < 0)
-            {
-                ERR("Failed to create spool file '%s' ('%s'). (error %s)\n",
-                    buffer, psCmdP, strerror(errno));
-            }
-            HeapFree(GetProcessHeap(), 0, buffer);
-        }
-    }
-    return fd;
-}
-
-static int FreePrintJob(HANDLE16 hJob)
-{
-    int nRet = SP_ERROR;
-    PPRINTJOB pPrintJob;
-
-    pPrintJob = FindPrintJobFromHandle(hJob);
-    if (pPrintJob != NULL)
-    {
-	nRet = SP_OK;
-	gPrintJobsTable[pPrintJob->nIndex] = NULL;
-	HeapFree(GetProcessHeap(), 0, pPrintJob->pszOutput);
-	HeapFree(GetProcessHeap(), 0, pPrintJob->pszTitle);
-	if (pPrintJob->fd >= 0) close(pPrintJob->fd);
-	if (pPrintJob->pid > 0)
-	{
-	    pid_t wret;
-            int status;
-            do {
-                wret = waitpid(pPrintJob->pid, &status, 0);
-            } while (wret < 0 && errno == EINTR);
-            if (wret < 0 || !WIFEXITED(status) || WEXITSTATUS(status))
-                nRet = SP_ERROR;
-	}
-	HeapFree(GetProcessHeap(), 0, pPrintJob);
-    }
-    return nRet;
-}
-
 /**********************************************************************
  *           OpenJob   (GDI.240)
  *
@@ -354,12 +219,11 @@ HPJOB16 WINAPI OpenJob16(LPCSTR lpOutput, LPCSTR lpTitle, HDC16 hDC)
     pPrintJob = gPrintJobsTable[0];
     if (pPrintJob == NULL)
     {
-	int fd;
-	pid_t pid;
+        DOCINFOA info = { sizeof(info), lpTitle, lpOutput, NULL, 0 };
+        int id;
 
-	/* Try and create a spool file */
-	fd = CreateSpoolFile(lpOutput, &pid);
-	if (fd >= 0)
+        id = StartDocA( HDC_32(hDC), &info );
+        if (id > 0)
 	{
 	    pPrintJob = HeapAlloc(GetProcessHeap(), 0, sizeof(PRINTJOB));
             if(pPrintJob == NULL) {
@@ -369,16 +233,8 @@ HPJOB16 WINAPI OpenJob16(LPCSTR lpOutput, LPCSTR lpTitle, HDC16 hDC)
 
             hHandle = 1;
 
-	    pPrintJob->pszOutput = HeapAlloc(GetProcessHeap(), 0, strlen(lpOutput)+1);
-	    strcpy( pPrintJob->pszOutput, lpOutput );
-	    if(lpTitle)
-            {
-	        pPrintJob->pszTitle = HeapAlloc(GetProcessHeap(), 0, strlen(lpTitle)+1);
-	        strcpy( pPrintJob->pszTitle, lpTitle );
-            }
 	    pPrintJob->hDC = hDC;
-	    pPrintJob->fd = fd;
-	    pPrintJob->pid = pid;
+	    pPrintJob->id = id;
 	    pPrintJob->nIndex = 0;
 	    pPrintJob->hHandle = hHandle;
 	    gPrintJobsTable[pPrintJob->nIndex] = pPrintJob;
@@ -400,11 +256,7 @@ INT16 WINAPI CloseJob16(HPJOB16 hJob)
     TRACE("%04x\n", hJob);
 
     pPrintJob = FindPrintJobFromHandle(hJob);
-    if (pPrintJob != NULL)
-    {
-	FreePrintJob(hJob);
-	nRet  = 1;
-    }
+    if (pPrintJob != NULL) nRet = EndDoc( HDC_32(pPrintJob->hDC) );
     return nRet;
 }
 
@@ -420,25 +272,16 @@ INT16 WINAPI WriteSpool16(HPJOB16 hJob, LPSTR lpData, INT16 cch)
     TRACE("%04x %p %04x\n", hJob, lpData, cch);
 
     pPrintJob = FindPrintJobFromHandle(hJob);
-    if (pPrintJob != NULL && pPrintJob->fd >= 0 && cch)
+    if (pPrintJob != NULL && cch)
     {
-	if (write(pPrintJob->fd, lpData, cch) != cch)
-	  nRet = SP_OUTOFDISK;
-	else
-	  nRet = cch;
-#if 0
-	/* FIXME: We just cannot call 16 bit functions from here, since we
-	 * have acquired several locks (DC). And we do not really need to.
-	 */
-	if (pPrintJob->hDC == 0) {
-	    TRACE("hDC == 0 so no QueryAbort\n");
-	}
-        else if (!(QueryAbort16(pPrintJob->hDC, (nRet == SP_OUTOFDISK) ? nRet : 0 )))
-	{
-	    CloseJob16(hJob); /* printing aborted */
-	    nRet = SP_APPABORT;
-	}
-#endif
+        WORD *data = HeapAlloc( GetProcessHeap(), 0, cch + 2 );
+
+        if (!data) return SP_OUTOFDISK;
+        *data = cch;
+        memcpy( data + 1, lpData, cch );
+        ExtEscape( HDC_32(pPrintJob->hDC), PASSTHROUGH, cch + 2, (char *)data, 0, NULL );
+        HeapFree( GetProcessHeap(), 0, data );
+        nRet = cch;
     }
     return nRet;
 }
@@ -472,12 +315,9 @@ INT16 WINAPI WriteDialog16(HPJOB16 hJob, LPSTR lpMsg, INT16 cchMsg)
  */
 INT16 WINAPI DeleteJob16(HPJOB16 hJob, INT16 nNotUsed)
 {
-    int nRet;
-
     TRACE("%04x\n", hJob);
 
-    nRet = FreePrintJob(hJob);
-    return nRet;
+    return CloseJob16( hJob );
 }
 
 /*




More information about the wine-cvs mailing list