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