gdi.exe: Use 32-bit printer functions for print jobs.
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
762f51cf93
commit
41ec44bf3f
|
@ -21,23 +21,12 @@
|
||||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "config.h"
|
|
||||||
#include "wine/port.h"
|
|
||||||
|
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.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 "windef.h"
|
||||||
#include "winbase.h"
|
#include "winbase.h"
|
||||||
#include "winuser.h"
|
#include "winuser.h"
|
||||||
|
@ -199,13 +188,10 @@ INT16 WINAPI SizePQ16(HPQ16 hPQ, INT16 sizechange)
|
||||||
*/
|
*/
|
||||||
typedef struct PRINTJOB
|
typedef struct PRINTJOB
|
||||||
{
|
{
|
||||||
char *pszOutput;
|
|
||||||
char *pszTitle;
|
|
||||||
HDC16 hDC;
|
HDC16 hDC;
|
||||||
HANDLE16 hHandle;
|
HANDLE16 hHandle;
|
||||||
int nIndex;
|
int nIndex;
|
||||||
int fd;
|
int id;
|
||||||
pid_t pid;
|
|
||||||
} PRINTJOB, *PPRINTJOB;
|
} PRINTJOB, *PPRINTJOB;
|
||||||
|
|
||||||
#define MAX_PRINT_JOBS 1
|
#define MAX_PRINT_JOBS 1
|
||||||
|
@ -219,127 +205,6 @@ static PPRINTJOB FindPrintJobFromHandle(HANDLE16 hHandle)
|
||||||
return gPrintJobsTable[0];
|
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)
|
* OpenJob (GDI.240)
|
||||||
*
|
*
|
||||||
|
@ -354,12 +219,11 @@ HPJOB16 WINAPI OpenJob16(LPCSTR lpOutput, LPCSTR lpTitle, HDC16 hDC)
|
||||||
pPrintJob = gPrintJobsTable[0];
|
pPrintJob = gPrintJobsTable[0];
|
||||||
if (pPrintJob == NULL)
|
if (pPrintJob == NULL)
|
||||||
{
|
{
|
||||||
int fd;
|
DOCINFOA info = { sizeof(info), lpTitle, lpOutput, NULL, 0 };
|
||||||
pid_t pid;
|
int id;
|
||||||
|
|
||||||
/* Try and create a spool file */
|
id = StartDocA( HDC_32(hDC), &info );
|
||||||
fd = CreateSpoolFile(lpOutput, &pid);
|
if (id > 0)
|
||||||
if (fd >= 0)
|
|
||||||
{
|
{
|
||||||
pPrintJob = HeapAlloc(GetProcessHeap(), 0, sizeof(PRINTJOB));
|
pPrintJob = HeapAlloc(GetProcessHeap(), 0, sizeof(PRINTJOB));
|
||||||
if(pPrintJob == NULL) {
|
if(pPrintJob == NULL) {
|
||||||
|
@ -369,16 +233,8 @@ HPJOB16 WINAPI OpenJob16(LPCSTR lpOutput, LPCSTR lpTitle, HDC16 hDC)
|
||||||
|
|
||||||
hHandle = 1;
|
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->hDC = hDC;
|
||||||
pPrintJob->fd = fd;
|
pPrintJob->id = id;
|
||||||
pPrintJob->pid = pid;
|
|
||||||
pPrintJob->nIndex = 0;
|
pPrintJob->nIndex = 0;
|
||||||
pPrintJob->hHandle = hHandle;
|
pPrintJob->hHandle = hHandle;
|
||||||
gPrintJobsTable[pPrintJob->nIndex] = pPrintJob;
|
gPrintJobsTable[pPrintJob->nIndex] = pPrintJob;
|
||||||
|
@ -400,11 +256,7 @@ INT16 WINAPI CloseJob16(HPJOB16 hJob)
|
||||||
TRACE("%04x\n", hJob);
|
TRACE("%04x\n", hJob);
|
||||||
|
|
||||||
pPrintJob = FindPrintJobFromHandle(hJob);
|
pPrintJob = FindPrintJobFromHandle(hJob);
|
||||||
if (pPrintJob != NULL)
|
if (pPrintJob != NULL) nRet = EndDoc( HDC_32(pPrintJob->hDC) );
|
||||||
{
|
|
||||||
FreePrintJob(hJob);
|
|
||||||
nRet = 1;
|
|
||||||
}
|
|
||||||
return nRet;
|
return nRet;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -420,25 +272,16 @@ INT16 WINAPI WriteSpool16(HPJOB16 hJob, LPSTR lpData, INT16 cch)
|
||||||
TRACE("%04x %p %04x\n", hJob, lpData, cch);
|
TRACE("%04x %p %04x\n", hJob, lpData, cch);
|
||||||
|
|
||||||
pPrintJob = FindPrintJobFromHandle(hJob);
|
pPrintJob = FindPrintJobFromHandle(hJob);
|
||||||
if (pPrintJob != NULL && pPrintJob->fd >= 0 && cch)
|
if (pPrintJob != NULL && cch)
|
||||||
{
|
{
|
||||||
if (write(pPrintJob->fd, lpData, cch) != cch)
|
WORD *data = HeapAlloc( GetProcessHeap(), 0, cch + 2 );
|
||||||
nRet = SP_OUTOFDISK;
|
|
||||||
else
|
if (!data) return SP_OUTOFDISK;
|
||||||
nRet = cch;
|
*data = cch;
|
||||||
#if 0
|
memcpy( data + 1, lpData, cch );
|
||||||
/* FIXME: We just cannot call 16 bit functions from here, since we
|
ExtEscape( HDC_32(pPrintJob->hDC), PASSTHROUGH, cch + 2, (char *)data, 0, NULL );
|
||||||
* have acquired several locks (DC). And we do not really need to.
|
HeapFree( GetProcessHeap(), 0, data );
|
||||||
*/
|
nRet = cch;
|
||||||
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
|
|
||||||
}
|
}
|
||||||
return nRet;
|
return nRet;
|
||||||
}
|
}
|
||||||
|
@ -472,12 +315,9 @@ INT16 WINAPI WriteDialog16(HPJOB16 hJob, LPSTR lpMsg, INT16 cchMsg)
|
||||||
*/
|
*/
|
||||||
INT16 WINAPI DeleteJob16(HPJOB16 hJob, INT16 nNotUsed)
|
INT16 WINAPI DeleteJob16(HPJOB16 hJob, INT16 nNotUsed)
|
||||||
{
|
{
|
||||||
int nRet;
|
|
||||||
|
|
||||||
TRACE("%04x\n", hJob);
|
TRACE("%04x\n", hJob);
|
||||||
|
|
||||||
nRet = FreePrintJob(hJob);
|
return CloseJob16( hJob );
|
||||||
return nRet;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in New Issue