Module: wine Branch: master Commit: 41ec44bf3f413315c921dfccd9ed437cafd0fc18 URL: https://source.winehq.org/git/wine.git/?a=commit;h=41ec44bf3f413315c921dfccd...
Author: Alexandre Julliard julliard@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@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 ); }
/*