Added CUPS printing support.
This commit is contained in:
parent
485cefd02d
commit
ab8b7dba77
|
@ -368,6 +368,14 @@ then
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
CUPSLIBS=""
|
||||||
|
dnl **** Check for CUPS ****
|
||||||
|
AC_CHECK_LIB(cups,cupsGetPPD,
|
||||||
|
AC_DEFINE(HAVE_CUPS)
|
||||||
|
CUPSLIBS="-lcups"
|
||||||
|
)
|
||||||
|
AC_SUBST(CUPSLIBS)
|
||||||
|
|
||||||
dnl **** Check for IPX (currently Linux only) ****
|
dnl **** Check for IPX (currently Linux only) ****
|
||||||
AC_CACHE_CHECK("for GNU style IPX support", ac_cv_c_ipx_gnu,
|
AC_CACHE_CHECK("for GNU style IPX support", ac_cv_c_ipx_gnu,
|
||||||
AC_TRY_COMPILE(
|
AC_TRY_COMPILE(
|
||||||
|
|
|
@ -1554,7 +1554,7 @@ BOOL WINAPI PrintDlgW( LPPRINTDLGW printdlg )
|
||||||
*/
|
*/
|
||||||
BOOL WINAPI PageSetupDlgA(LPPAGESETUPDLGA setupdlg) {
|
BOOL WINAPI PageSetupDlgA(LPPAGESETUPDLGA setupdlg) {
|
||||||
FIXME("(%p), stub!\n",setupdlg);
|
FIXME("(%p), stub!\n",setupdlg);
|
||||||
return FALSE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* PageSetupDlgW (COMDLG32.16)
|
* PageSetupDlgW (COMDLG32.16)
|
||||||
|
|
|
@ -7,6 +7,9 @@
|
||||||
* Copyright 1999 Klaas van Gend
|
* Copyright 1999 Klaas van Gend
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
|
@ -453,7 +456,10 @@ static int CreateSpoolFile(LPCSTR pszOutput)
|
||||||
if (pszOutput == NULL || *pszOutput == '\0')
|
if (pszOutput == NULL || *pszOutput == '\0')
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
PROFILE_GetWineIniString( "spooler", pszOutput, "", psCmd, sizeof(psCmd) );
|
if (!strncmp("CUPS:",pszOutput,5))
|
||||||
|
sprintf(psCmd,"|lpr -P%s",pszOutput+5);
|
||||||
|
else
|
||||||
|
PROFILE_GetWineIniString("spooler",pszOutput,"",psCmd,sizeof(psCmd));
|
||||||
TRACE("Got printerSpoolCommand '%s' for output device '%s'\n",
|
TRACE("Got printerSpoolCommand '%s' for output device '%s'\n",
|
||||||
psCmd, pszOutput);
|
psCmd, pszOutput);
|
||||||
if (!*psCmd)
|
if (!*psCmd)
|
||||||
|
|
|
@ -6,6 +6,7 @@ MODULE = wineps
|
||||||
SOVERSION = 1.0
|
SOVERSION = 1.0
|
||||||
ALTNAMES = wineps16
|
ALTNAMES = wineps16
|
||||||
IMPORTS = user32 gdi32 winspool.drv kernel32 ntdll
|
IMPORTS = user32 gdi32 winspool.drv kernel32 ntdll
|
||||||
|
EXTRALIBS = @CUPSLIBS@
|
||||||
|
|
||||||
C_SRCS = \
|
C_SRCS = \
|
||||||
afm.c \
|
afm.c \
|
||||||
|
|
|
@ -2,9 +2,12 @@
|
||||||
* PostScript driver initialization functions
|
* PostScript driver initialization functions
|
||||||
*
|
*
|
||||||
* Copyright 1998 Huw D M Davies
|
* Copyright 1998 Huw D M Davies
|
||||||
|
* Copyright 2001 Marcus Meissner
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
#include "gdi.h"
|
#include "gdi.h"
|
||||||
#include "psdrv.h"
|
#include "psdrv.h"
|
||||||
|
@ -15,6 +18,10 @@
|
||||||
#include "winerror.h"
|
#include "winerror.h"
|
||||||
#include "options.h"
|
#include "options.h"
|
||||||
|
|
||||||
|
#ifdef HAVE_CUPS
|
||||||
|
# include <cups/cups.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
DEFAULT_DEBUG_CHANNEL(psdrv);
|
DEFAULT_DEBUG_CHANNEL(psdrv);
|
||||||
|
|
||||||
static BOOL PSDRV_CreateDC( DC *dc, LPCSTR driver, LPCSTR device,
|
static BOOL PSDRV_CreateDC( DC *dc, LPCSTR driver, LPCSTR device,
|
||||||
|
@ -187,7 +194,7 @@ static PSDRV_DEVMODEA DefaultDevmode =
|
||||||
/* dmCopies */ 1,
|
/* dmCopies */ 1,
|
||||||
/* dmDefaultSource */ DMBIN_AUTO,
|
/* dmDefaultSource */ DMBIN_AUTO,
|
||||||
/* dmPrintQuality */ 0,
|
/* dmPrintQuality */ 0,
|
||||||
/* dmColor */ DMCOLOR_MONOCHROME,
|
/* dmColor */ DMCOLOR_COLOR,
|
||||||
/* dmDuplex */ 0,
|
/* dmDuplex */ 0,
|
||||||
/* dmYResolution */ 0,
|
/* dmYResolution */ 0,
|
||||||
/* dmTTOption */ DMTT_SUBDEV,
|
/* dmTTOption */ DMTT_SUBDEV,
|
||||||
|
@ -427,13 +434,13 @@ PRINTERINFO *PSDRV_FindPrinterInfo(LPCSTR name)
|
||||||
FONTNAME *font;
|
FONTNAME *font;
|
||||||
AFM *afm;
|
AFM *afm;
|
||||||
HANDLE hPrinter;
|
HANDLE hPrinter;
|
||||||
|
const char *ppd = NULL;
|
||||||
|
|
||||||
TRACE("'%s'\n", name);
|
TRACE("'%s'\n", name);
|
||||||
|
|
||||||
for( ; pi; last = &pi->next, pi = pi->next) {
|
for( ; pi; last = &pi->next, pi = pi->next)
|
||||||
if(!strcmp(pi->FriendlyName, name))
|
if(!strcmp(pi->FriendlyName, name))
|
||||||
return pi;
|
return pi;
|
||||||
}
|
|
||||||
|
|
||||||
pi = *last = HeapAlloc( PSDRV_Heap, 0, sizeof(*pi) );
|
pi = *last = HeapAlloc( PSDRV_Heap, 0, sizeof(*pi) );
|
||||||
pi->FriendlyName = HEAP_strdupA( PSDRV_Heap, 0, name );
|
pi->FriendlyName = HEAP_strdupA( PSDRV_Heap, 0, name );
|
||||||
|
@ -443,6 +450,7 @@ PRINTERINFO *PSDRV_FindPrinterInfo(LPCSTR name)
|
||||||
if(res == ERROR_INVALID_PRINTER_NAME || needed != sizeof(DefaultDevmode)) {
|
if(res == ERROR_INVALID_PRINTER_NAME || needed != sizeof(DefaultDevmode)) {
|
||||||
pi->Devmode = HeapAlloc( PSDRV_Heap, 0, sizeof(DefaultDevmode) );
|
pi->Devmode = HeapAlloc( PSDRV_Heap, 0, sizeof(DefaultDevmode) );
|
||||||
memcpy(pi->Devmode, &DefaultDevmode, sizeof(DefaultDevmode) );
|
memcpy(pi->Devmode, &DefaultDevmode, sizeof(DefaultDevmode) );
|
||||||
|
strcpy(pi->Devmode->dmPublic.dmDeviceName,name);
|
||||||
DrvSetPrinterData16((LPSTR)name, (LPSTR)INT_PD_DEFAULT_DEVMODE,
|
DrvSetPrinterData16((LPSTR)name, (LPSTR)INT_PD_DEFAULT_DEVMODE,
|
||||||
REG_BINARY, (LPBYTE)&DefaultDevmode, sizeof(DefaultDevmode) );
|
REG_BINARY, (LPBYTE)&DefaultDevmode, sizeof(DefaultDevmode) );
|
||||||
|
|
||||||
|
@ -453,34 +461,31 @@ PRINTERINFO *PSDRV_FindPrinterInfo(LPCSTR name)
|
||||||
(LPBYTE)pi->Devmode, needed, &needed);
|
(LPBYTE)pi->Devmode, needed, &needed);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (OpenPrinterA (pi->FriendlyName, &hPrinter, NULL) == 0)
|
if (OpenPrinterA (pi->FriendlyName, &hPrinter, NULL) == 0) {
|
||||||
{
|
|
||||||
ERR ("OpenPrinterA failed with code %li\n", GetLastError ());
|
ERR ("OpenPrinterA failed with code %li\n", GetLastError ());
|
||||||
if (HeapFree (PSDRV_Heap, 0, pi->FriendlyName) == 0)
|
goto cleanup;
|
||||||
WARN ("HeapFree failed with code %li\n", GetLastError ());
|
|
||||||
if (HeapFree (PSDRV_Heap, 0, pi->Devmode) == 0)
|
|
||||||
WARN ("HeapFree failed with code %li\n", GetLastError ());
|
|
||||||
if (HeapFree (PSDRV_Heap, 0, pi) == 0)
|
|
||||||
WARN ("HeapFree failed with code %li\n", GetLastError ());
|
|
||||||
*last = NULL;
|
|
||||||
return NULL;
|
|
||||||
}
|
}
|
||||||
|
pi->Devmode->dmDrvPrivate.ppdFileName[0]='\0';
|
||||||
res = GetPrinterDataA (hPrinter, "PPD File", NULL,
|
#ifdef HAVE_CUPS
|
||||||
pi->Devmode->dmDrvPrivate.ppdFileName, 256, &needed);
|
|
||||||
if (res != ERROR_SUCCESS)
|
|
||||||
{
|
{
|
||||||
|
ppd = cupsGetPPD(name);
|
||||||
|
|
||||||
|
if (ppd) {
|
||||||
|
strcpy(pi->Devmode->dmDrvPrivate.ppdFileName,ppd);
|
||||||
|
res = ERROR_SUCCESS;
|
||||||
|
/* we should unlink() that file later */
|
||||||
|
} else {
|
||||||
|
ERR("Did not find ppd for %s\n",name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
if (!pi->Devmode->dmDrvPrivate.ppdFileName[0]) {
|
||||||
|
res = GetPrinterDataA (hPrinter, "PPD File", NULL,
|
||||||
|
pi->Devmode->dmDrvPrivate.ppdFileName, 256, &needed);
|
||||||
|
}
|
||||||
|
if (res != ERROR_SUCCESS) {
|
||||||
ERR ("Error %li getting PPD file name for printer '%s'\n", res, name);
|
ERR ("Error %li getting PPD file name for printer '%s'\n", res, name);
|
||||||
if (ClosePrinter (hPrinter) == 0)
|
goto closeprinter;
|
||||||
WARN ("ClosePrinter failed with code %li\n", GetLastError ());
|
|
||||||
if (HeapFree(PSDRV_Heap, 0, pi->FriendlyName) == 0)
|
|
||||||
WARN ("HeapFree failed with code %li\n", GetLastError ());
|
|
||||||
if (HeapFree(PSDRV_Heap, 0, pi->Devmode) == 0)
|
|
||||||
WARN ("HeapFree failed with code %li\n", GetLastError ());
|
|
||||||
if (HeapFree(PSDRV_Heap, 0, pi) == 0)
|
|
||||||
WARN ("HeapFree failed with code %li\n", GetLastError ());
|
|
||||||
*last = NULL;
|
|
||||||
return NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
res = GetPrinterDataA (hPrinter, "Paper Size", NULL, (LPBYTE) &dwPaperSize,
|
res = GetPrinterDataA (hPrinter, "Paper Size", NULL, (LPBYTE) &dwPaperSize,
|
||||||
|
@ -489,19 +494,9 @@ PRINTERINFO *PSDRV_FindPrinterInfo(LPCSTR name)
|
||||||
pi->Devmode->dmPublic.u1.s1.dmPaperSize = (SHORT) dwPaperSize;
|
pi->Devmode->dmPublic.u1.s1.dmPaperSize = (SHORT) dwPaperSize;
|
||||||
else if (res == ERROR_FILE_NOT_FOUND)
|
else if (res == ERROR_FILE_NOT_FOUND)
|
||||||
TRACE ("No 'Paper Size' for printer '%s'\n", name);
|
TRACE ("No 'Paper Size' for printer '%s'\n", name);
|
||||||
else
|
else {
|
||||||
{
|
|
||||||
ERR ("GetPrinterDataA returned %li\n", res);
|
ERR ("GetPrinterDataA returned %li\n", res);
|
||||||
if (ClosePrinter (hPrinter) == 0)
|
goto closeprinter;
|
||||||
WARN ("ClosePrinter failed with code %li\n", GetLastError ());
|
|
||||||
if (HeapFree(PSDRV_Heap, 0, pi->FriendlyName) == 0)
|
|
||||||
WARN ("HeapFree failed with code %li\n", GetLastError ());
|
|
||||||
if (HeapFree(PSDRV_Heap, 0, pi->Devmode) == 0)
|
|
||||||
WARN ("HeapFree failed with code %li\n", GetLastError ());
|
|
||||||
if (HeapFree(PSDRV_Heap, 0, pi) == 0)
|
|
||||||
WARN ("HeapFree failed with code %li\n", GetLastError ());
|
|
||||||
*last = NULL;
|
|
||||||
return NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
res = EnumPrinterDataExA (hPrinter, "PrinterDriverData\\FontSubTable", NULL,
|
res = EnumPrinterDataExA (hPrinter, "PrinterDriverData\\FontSubTable", NULL,
|
||||||
|
@ -511,83 +506,33 @@ PRINTERINFO *PSDRV_FindPrinterInfo(LPCSTR name)
|
||||||
else if (res == ERROR_MORE_DATA)
|
else if (res == ERROR_MORE_DATA)
|
||||||
{
|
{
|
||||||
pi->FontSubTable = HeapAlloc (PSDRV_Heap, 0, needed);
|
pi->FontSubTable = HeapAlloc (PSDRV_Heap, 0, needed);
|
||||||
if (pi->FontSubTable == NULL)
|
if (pi->FontSubTable == NULL) {
|
||||||
{
|
|
||||||
ERR ("Failed to allocate %li bytes from heap\n", needed);
|
ERR ("Failed to allocate %li bytes from heap\n", needed);
|
||||||
if (ClosePrinter (hPrinter) == 0)
|
goto closeprinter;
|
||||||
WARN ("ClosePrinter failed with code %li\n", GetLastError ());
|
|
||||||
if (HeapFree(PSDRV_Heap, 0, pi->FriendlyName) == 0)
|
|
||||||
WARN ("HeapFree failed with code %li\n", GetLastError ());
|
|
||||||
if (HeapFree(PSDRV_Heap, 0, pi->Devmode) == 0)
|
|
||||||
WARN ("HeapFree failed with code %li\n", GetLastError ());
|
|
||||||
if (HeapFree(PSDRV_Heap, 0, pi) == 0)
|
|
||||||
WARN ("HeapFree failed with code %li\n", GetLastError ());
|
|
||||||
*last = NULL;
|
|
||||||
return NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
res = EnumPrinterDataExA (hPrinter, "PrinterDriverData\\FontSubTable",
|
res = EnumPrinterDataExA (hPrinter, "PrinterDriverData\\FontSubTable",
|
||||||
(LPBYTE) pi->FontSubTable, needed, &needed,
|
(LPBYTE) pi->FontSubTable, needed, &needed,
|
||||||
&pi->FontSubTableSize);
|
&pi->FontSubTableSize);
|
||||||
if (res != ERROR_SUCCESS)
|
if (res != ERROR_SUCCESS) {
|
||||||
{
|
|
||||||
ERR ("EnumPrinterDataExA returned %li\n", res);
|
ERR ("EnumPrinterDataExA returned %li\n", res);
|
||||||
if (ClosePrinter (hPrinter) == 0)
|
goto closeprinter;
|
||||||
WARN ("ClosePrinter failed with code %li\n", GetLastError ());
|
|
||||||
if (HeapFree (PSDRV_Heap, 0, pi->FontSubTable) == 0)
|
|
||||||
WARN ("HeapFree failed with code %li\n", GetLastError ());
|
|
||||||
if (HeapFree(PSDRV_Heap, 0, pi->FriendlyName) == 0)
|
|
||||||
WARN ("HeapFree failed with code %li\n", GetLastError ());
|
|
||||||
if (HeapFree(PSDRV_Heap, 0, pi->Devmode) == 0)
|
|
||||||
WARN ("HeapFree failed with code %li\n", GetLastError ());
|
|
||||||
if (HeapFree(PSDRV_Heap, 0, pi) == 0)
|
|
||||||
WARN ("HeapFree failed with code %li\n", GetLastError ());
|
|
||||||
*last = NULL;
|
|
||||||
return NULL;
|
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else /* error in 1st call to EnumPrinterDataExA */
|
FIXME ("EnumPrinterDataExA returned %li\n", res);
|
||||||
{
|
/* ignore error */
|
||||||
ERR ("EnumPrinterDataExA returned %li\n", res);
|
|
||||||
if (ClosePrinter (hPrinter) == 0)
|
|
||||||
WARN ("ClosePrinter failed with code %li\n", GetLastError ());
|
|
||||||
if (HeapFree(PSDRV_Heap, 0, pi->FriendlyName) == 0)
|
|
||||||
WARN ("HeapFree failed with code %li\n", GetLastError ());
|
|
||||||
if (HeapFree(PSDRV_Heap, 0, pi->Devmode) == 0)
|
|
||||||
WARN ("HeapFree failed with code %li\n", GetLastError ());
|
|
||||||
if (HeapFree(PSDRV_Heap, 0, pi) == 0)
|
|
||||||
WARN ("HeapFree failed with code %li\n", GetLastError ());
|
|
||||||
*last = NULL;
|
|
||||||
return NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ClosePrinter (hPrinter) == 0)
|
if (ClosePrinter (hPrinter) == 0) {
|
||||||
{
|
|
||||||
ERR ("ClosePrinter failed with code %li\n", GetLastError ());
|
ERR ("ClosePrinter failed with code %li\n", GetLastError ());
|
||||||
if (ClosePrinter (hPrinter) == 0)
|
goto cleanup;
|
||||||
WARN ("ClosePrinter failed with code %li\n", GetLastError ());
|
|
||||||
if (HeapFree (PSDRV_Heap, 0, pi->FontSubTable) == 0)
|
|
||||||
WARN ("HeapFree failed with code %li\n", GetLastError ());
|
|
||||||
if (HeapFree(PSDRV_Heap, 0, pi->FriendlyName) == 0)
|
|
||||||
WARN ("HeapFree failed with code %li\n", GetLastError ());
|
|
||||||
if (HeapFree(PSDRV_Heap, 0, pi->Devmode) == 0)
|
|
||||||
WARN ("HeapFree failed with code %li\n", GetLastError ());
|
|
||||||
if (HeapFree(PSDRV_Heap, 0, pi) == 0)
|
|
||||||
WARN ("HeapFree failed with code %li\n", GetLastError ());
|
|
||||||
*last = NULL;
|
|
||||||
return NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pi->ppd = PSDRV_ParsePPD(pi->Devmode->dmDrvPrivate.ppdFileName);
|
pi->ppd = PSDRV_ParsePPD(pi->Devmode->dmDrvPrivate.ppdFileName);
|
||||||
if(!pi->ppd) {
|
if(!pi->ppd) {
|
||||||
HeapFree(PSDRV_Heap, 0, pi->FontSubTable);
|
|
||||||
HeapFree(PSDRV_Heap, 0, pi->FriendlyName);
|
|
||||||
HeapFree(PSDRV_Heap, 0, pi->Devmode);
|
|
||||||
HeapFree(PSDRV_Heap, 0, pi);
|
|
||||||
*last = NULL;
|
|
||||||
MESSAGE("Couldn't find PPD file '%s', expect a crash now!\n",
|
MESSAGE("Couldn't find PPD file '%s', expect a crash now!\n",
|
||||||
pi->Devmode->dmDrvPrivate.ppdFileName);
|
pi->Devmode->dmDrvPrivate.ppdFileName);
|
||||||
return NULL;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
pi->next = NULL;
|
pi->next = NULL;
|
||||||
|
@ -595,14 +540,23 @@ PRINTERINFO *PSDRV_FindPrinterInfo(LPCSTR name)
|
||||||
|
|
||||||
for(font = pi->ppd->InstalledFonts; font; font = font->next) {
|
for(font = pi->ppd->InstalledFonts; font; font = font->next) {
|
||||||
afm = PSDRV_FindAFMinList(PSDRV_AFMFontList, font->Name);
|
afm = PSDRV_FindAFMinList(PSDRV_AFMFontList, font->Name);
|
||||||
if(!afm) {
|
if(!afm)
|
||||||
TRACE(
|
TRACE( "Couldn't find AFM file for installed printer font '%s' - ignoring\n", font->Name);
|
||||||
"Couldn't find AFM file for installed printer font '%s' - ignoring\n",
|
else
|
||||||
font->Name);
|
|
||||||
} else {
|
|
||||||
PSDRV_AddAFMtoList(&pi->Fonts, afm);
|
PSDRV_AddAFMtoList(&pi->Fonts, afm);
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
}
|
||||||
|
if (ppd) unlink(ppd);
|
||||||
return pi;
|
return pi;
|
||||||
|
|
||||||
|
closeprinter:
|
||||||
|
ClosePrinter(hPrinter);
|
||||||
|
cleanup:
|
||||||
|
HeapFree (PSDRV_Heap, 0, pi->FontSubTable);
|
||||||
|
HeapFree(PSDRV_Heap, 0, pi->FriendlyName);
|
||||||
|
HeapFree(PSDRV_Heap, 0, pi->Devmode);
|
||||||
|
HeapFree(PSDRV_Heap, 0, pi);
|
||||||
|
if (ppd) unlink(ppd);
|
||||||
|
*last = NULL;
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,6 +3,7 @@ TOPOBJDIR = ../..
|
||||||
SRCDIR = @srcdir@
|
SRCDIR = @srcdir@
|
||||||
VPATH = @srcdir@
|
VPATH = @srcdir@
|
||||||
MODULE = winspool.drv
|
MODULE = winspool.drv
|
||||||
|
EXTRALIBS = @CUPSLIBS@
|
||||||
|
|
||||||
LDDLLFLAGS = @LDDLLFLAGS@
|
LDDLLFLAGS = @LDDLLFLAGS@
|
||||||
SYMBOLFILE = $(MODULE).tmp.o
|
SYMBOLFILE = $(MODULE).tmp.o
|
||||||
|
|
|
@ -5,13 +5,19 @@
|
||||||
* Copyright 1998 Andreas Mohr
|
* Copyright 1998 Andreas Mohr
|
||||||
* Copyright 1999 Klaas van Gend
|
* Copyright 1999 Klaas van Gend
|
||||||
* Copyright 1999, 2000 Huw D M Davies
|
* Copyright 1999, 2000 Huw D M Davies
|
||||||
|
* Copyright 2001 Marcus Meissner
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
#ifdef HAVE_CUPS
|
||||||
|
# include <cups/cups.h>
|
||||||
|
#endif
|
||||||
#include "winspool.h"
|
#include "winspool.h"
|
||||||
#include "winbase.h"
|
#include "winbase.h"
|
||||||
#include "winerror.h"
|
#include "winerror.h"
|
||||||
|
@ -69,6 +75,79 @@ static WCHAR Separator_FileW[] = {'S','e','p','a','r','a','t','o','r',' ','F',
|
||||||
static WCHAR Share_NameW[] = {'S','h','a','r','e',' ','N','a','m','e',0};
|
static WCHAR Share_NameW[] = {'S','h','a','r','e',' ','N','a','m','e',0};
|
||||||
static WCHAR WinPrintW[] = {'W','i','n','P','r','i','n','t',0};
|
static WCHAR WinPrintW[] = {'W','i','n','P','r','i','n','t',0};
|
||||||
|
|
||||||
|
static HKEY WINSPOOL_OpenDriverReg( LPVOID pEnvironment, BOOL unicode);
|
||||||
|
|
||||||
|
#ifdef HAVE_CUPS
|
||||||
|
void
|
||||||
|
CUPS_LoadPrinters(void) {
|
||||||
|
cups_dest_t *dests;
|
||||||
|
int i,nrofdests;
|
||||||
|
PRINTER_INFO_2A pinfo2a;
|
||||||
|
DRIVER_INFO_3A di3a;
|
||||||
|
const char* def = cupsGetDefault();
|
||||||
|
|
||||||
|
nrofdests = cupsGetDests(&dests);
|
||||||
|
|
||||||
|
di3a.cVersion = 0x400;
|
||||||
|
di3a.pName = "PS Driver";
|
||||||
|
di3a.pEnvironment = NULL; /* NULL means auto */
|
||||||
|
di3a.pDriverPath = "wineps.drv";
|
||||||
|
di3a.pDataFile = "<datafile?>";
|
||||||
|
di3a.pConfigFile = "wineps.drv";
|
||||||
|
di3a.pHelpFile = "<helpfile?>";
|
||||||
|
di3a.pDependentFiles = "<dependend files?>";
|
||||||
|
di3a.pMonitorName = "<monitor name?>";
|
||||||
|
di3a.pDefaultDataType = "RAW";
|
||||||
|
|
||||||
|
|
||||||
|
if (!AddPrinterDriverA(NULL,3,(LPBYTE)&di3a)) {
|
||||||
|
ERR("Failed adding PS Driver (%ld)\n",GetLastError());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
for (i=0;i<nrofdests;i++) {
|
||||||
|
const char *ppd = cupsGetPPD(dests[i].name);
|
||||||
|
char *port,*devline;
|
||||||
|
|
||||||
|
if (!ppd)
|
||||||
|
continue;
|
||||||
|
unlink(ppd);
|
||||||
|
|
||||||
|
if (!strcmp(def,dests[i].name)) {
|
||||||
|
char *buf = HeapAlloc(GetProcessHeap(),0,2*strlen(dests[i].name)+strlen(",WINEPS,CUPS:")+1);
|
||||||
|
|
||||||
|
sprintf(buf,"%s,WINEPS,CUPS:%s",dests[i].name,dests[i].name);
|
||||||
|
WriteProfileStringA("windows","device",buf);
|
||||||
|
HeapFree(GetProcessHeap(),0,buf);
|
||||||
|
}
|
||||||
|
memset(&pinfo2a,0,sizeof(pinfo2a));
|
||||||
|
pinfo2a.pPrinterName = dests[i].name;
|
||||||
|
pinfo2a.pDatatype = "RAW";
|
||||||
|
pinfo2a.pPrintProcessor = "WinPrint";
|
||||||
|
pinfo2a.pDriverName = "PS Driver";
|
||||||
|
pinfo2a.pComment = "WINEPS Printer using CUPS";
|
||||||
|
pinfo2a.pLocation = "<physical location of printer>";
|
||||||
|
port = HeapAlloc(GetProcessHeap(),0,strlen("CUPS:")+strlen(dests[i].name)+1);
|
||||||
|
sprintf(port,"CUPS:%s",dests[i].name);
|
||||||
|
pinfo2a.pPortName = port;
|
||||||
|
pinfo2a.pParameters = "<parameters?>";
|
||||||
|
pinfo2a.pShareName = "<share name?>";
|
||||||
|
pinfo2a.pSepFile = "<sep file?>";
|
||||||
|
|
||||||
|
devline=HeapAlloc(GetProcessHeap(),0,strlen("WINEPS,")+strlen(port)+1);
|
||||||
|
sprintf(devline,"WINEPS,%s",port);
|
||||||
|
WriteProfileStringA("devices",dests[i].name,devline);
|
||||||
|
HeapFree(GetProcessHeap(),0,devline);
|
||||||
|
|
||||||
|
if (!AddPrinterA(NULL,2,(LPBYTE)&pinfo2a)) {
|
||||||
|
if (GetLastError()!=ERROR_PRINTER_ALREADY_EXISTS)
|
||||||
|
ERR("%s not added by AddPrinterA (%ld)\n",dests[i].name,GetLastError());
|
||||||
|
}
|
||||||
|
HeapFree(GetProcessHeap(),0,port);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/******************************************************************
|
/******************************************************************
|
||||||
* WINSPOOL_GetOpenedPrinterEntry
|
* WINSPOOL_GetOpenedPrinterEntry
|
||||||
* Get the first place empty in the opened printer table
|
* Get the first place empty in the opened printer table
|
||||||
|
@ -374,7 +453,10 @@ LONG WINAPI DocumentPropertiesA(HWND hWnd,HANDLE hPrinter,
|
||||||
|
|
||||||
if(!pDeviceName) {
|
if(!pDeviceName) {
|
||||||
LPCWSTR lpNameW = WINSPOOL_GetOpenedPrinter(hPrinter);
|
LPCWSTR lpNameW = WINSPOOL_GetOpenedPrinter(hPrinter);
|
||||||
if(!lpNameW) return -1;
|
if(!lpNameW) {
|
||||||
|
ERR("no name from hPrinter?\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
lpName = HEAP_strdupWtoA(GetProcessHeap(),0,lpNameW);
|
lpName = HEAP_strdupWtoA(GetProcessHeap(),0,lpNameW);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -382,7 +464,10 @@ LONG WINAPI DocumentPropertiesA(HWND hWnd,HANDLE hPrinter,
|
||||||
{
|
{
|
||||||
GDI_CallExtDeviceMode16 = (void*)GetProcAddress( GetModuleHandleA("gdi32"),
|
GDI_CallExtDeviceMode16 = (void*)GetProcAddress( GetModuleHandleA("gdi32"),
|
||||||
(LPCSTR)102 );
|
(LPCSTR)102 );
|
||||||
if (!GDI_CallExtDeviceMode16) return -1;
|
if (!GDI_CallExtDeviceMode16) {
|
||||||
|
ERR("No CallExtDeviceMode16?\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
ret = GDI_CallExtDeviceMode16(hWnd, pDevModeOutput, lpName, "LPT1:",
|
ret = GDI_CallExtDeviceMode16(hWnd, pDevModeOutput, lpName, "LPT1:",
|
||||||
pDevModeInput, NULL, fMode);
|
pDevModeInput, NULL, fMode);
|
||||||
|
@ -484,7 +569,7 @@ BOOL WINAPI OpenPrinterW(LPWSTR lpPrinterName,HANDLE *phPrinter,
|
||||||
|
|
||||||
if(RegOpenKeyW(hkeyPrinters, lpPrinterName, &hkeyPrinter)
|
if(RegOpenKeyW(hkeyPrinters, lpPrinterName, &hkeyPrinter)
|
||||||
!= ERROR_SUCCESS) {
|
!= ERROR_SUCCESS) {
|
||||||
WARN("Can't find printer %s in registry\n", debugstr_w(lpPrinterName));
|
ERR("Can't find printer %s in registry\n", debugstr_w(lpPrinterName));
|
||||||
RegCloseKey(hkeyPrinters);
|
RegCloseKey(hkeyPrinters);
|
||||||
SetLastError(ERROR_INVALID_PARAMETER);
|
SetLastError(ERROR_INVALID_PARAMETER);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
@ -698,12 +783,12 @@ HANDLE WINAPI AddPrinterW(LPWSTR pName, DWORD Level, LPBYTE pPrinter)
|
||||||
TRACE("(%s,%ld,%p)\n", debugstr_w(pName), Level, pPrinter);
|
TRACE("(%s,%ld,%p)\n", debugstr_w(pName), Level, pPrinter);
|
||||||
|
|
||||||
if(pName != NULL) {
|
if(pName != NULL) {
|
||||||
FIXME("pName = %s - unsupported\n", debugstr_w(pName));
|
ERR("pName = %s - unsupported\n", debugstr_w(pName));
|
||||||
SetLastError(ERROR_INVALID_PARAMETER);
|
SetLastError(ERROR_INVALID_PARAMETER);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if(Level != 2) {
|
if(Level != 2) {
|
||||||
WARN("Level = %ld\n", Level);
|
ERR("Level = %ld, unsupported!\n", Level);
|
||||||
SetLastError(ERROR_INVALID_LEVEL);
|
SetLastError(ERROR_INVALID_LEVEL);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -741,7 +826,7 @@ HANDLE WINAPI AddPrinterW(LPWSTR pName, DWORD Level, LPBYTE pPrinter)
|
||||||
RegCloseKey(hkeyDrivers);
|
RegCloseKey(hkeyDrivers);
|
||||||
|
|
||||||
if(lstrcmpiW(pi->pPrintProcessor, WinPrintW)) { /* FIXME */
|
if(lstrcmpiW(pi->pPrintProcessor, WinPrintW)) { /* FIXME */
|
||||||
WARN("Can't find processor %s\n", debugstr_w(pi->pPrintProcessor));
|
FIXME("Can't find processor %s\n", debugstr_w(pi->pPrintProcessor));
|
||||||
SetLastError(ERROR_UNKNOWN_PRINTPROCESSOR);
|
SetLastError(ERROR_UNKNOWN_PRINTPROCESSOR);
|
||||||
RegCloseKey(hkeyPrinters);
|
RegCloseKey(hkeyPrinters);
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -751,20 +836,20 @@ HANDLE WINAPI AddPrinterW(LPWSTR pName, DWORD Level, LPBYTE pPrinter)
|
||||||
*/
|
*/
|
||||||
size = DocumentPropertiesW(0, -1, pi->pPrinterName, NULL, NULL, 0);
|
size = DocumentPropertiesW(0, -1, pi->pPrinterName, NULL, NULL, 0);
|
||||||
if(size < 0) {
|
if(size < 0) {
|
||||||
WARN("DocumentProperties fails\n");
|
FIXME("DocumentProperties fails\n");
|
||||||
SetLastError(ERROR_UNKNOWN_PRINTER_DRIVER);
|
size = sizeof(DEVMODEW);
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
if(pi->pDevMode) {
|
if(pi->pDevMode) {
|
||||||
dmW = pi->pDevMode;
|
dmW = pi->pDevMode;
|
||||||
} else {
|
} else {
|
||||||
dmW = HeapAlloc(GetProcessHeap(), 0, size);
|
dmW = HeapAlloc(GetProcessHeap(), 0, size);
|
||||||
|
dmW->dmSize = size;
|
||||||
DocumentPropertiesW(0, -1, pi->pPrinterName, dmW, NULL, DM_OUT_BUFFER);
|
DocumentPropertiesW(0, -1, pi->pPrinterName, dmW, NULL, DM_OUT_BUFFER);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(RegCreateKeyW(hkeyPrinters, pi->pPrinterName, &hkeyPrinter) !=
|
if(RegCreateKeyW(hkeyPrinters, pi->pPrinterName, &hkeyPrinter) !=
|
||||||
ERROR_SUCCESS) {
|
ERROR_SUCCESS) {
|
||||||
WARN("Can't create printer %s\n", debugstr_w(pi->pPrinterName));
|
FIXME("Can't create printer %s\n", debugstr_w(pi->pPrinterName));
|
||||||
SetLastError(ERROR_INVALID_PRINTER_NAME);
|
SetLastError(ERROR_INVALID_PRINTER_NAME);
|
||||||
RegCloseKey(hkeyPrinters);
|
RegCloseKey(hkeyPrinters);
|
||||||
if(!pi->pDevMode)
|
if(!pi->pDevMode)
|
||||||
|
@ -775,7 +860,6 @@ HANDLE WINAPI AddPrinterW(LPWSTR pName, DWORD Level, LPBYTE pPrinter)
|
||||||
(LPBYTE)&pi->Attributes, sizeof(DWORD));
|
(LPBYTE)&pi->Attributes, sizeof(DWORD));
|
||||||
RegSetValueExW(hkeyPrinter, DatatypeW, 0, REG_SZ, (LPBYTE)pi->pDatatype,
|
RegSetValueExW(hkeyPrinter, DatatypeW, 0, REG_SZ, (LPBYTE)pi->pDatatype,
|
||||||
0);
|
0);
|
||||||
|
|
||||||
/* Write DEVMODEA not DEVMODEW into reg. This is what win9x does
|
/* Write DEVMODEA not DEVMODEW into reg. This is what win9x does
|
||||||
and we support these drivers. NT writes DEVMODEW so somehow
|
and we support these drivers. NT writes DEVMODEW so somehow
|
||||||
we'll need to distinguish between these when we support NT
|
we'll need to distinguish between these when we support NT
|
||||||
|
@ -832,7 +916,7 @@ HANDLE WINAPI AddPrinterA(LPSTR pName, DWORD Level, LPBYTE pPrinter)
|
||||||
|
|
||||||
TRACE("(%s,%ld,%p): stub\n", debugstr_a(pName), Level, pPrinter);
|
TRACE("(%s,%ld,%p): stub\n", debugstr_a(pName), Level, pPrinter);
|
||||||
if(Level != 2) {
|
if(Level != 2) {
|
||||||
WARN("Level = %ld\n", Level);
|
ERR("Level = %ld, unsupported!\n", Level);
|
||||||
SetLastError(ERROR_INVALID_LEVEL);
|
SetLastError(ERROR_INVALID_LEVEL);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -1080,7 +1164,7 @@ static BOOL WINSPOOL_GetDevModeFromReg(HKEY hkey, LPCWSTR ValueName,
|
||||||
if ((ret != ERROR_SUCCESS && ret != ERROR_MORE_DATA)) sz = 0;
|
if ((ret != ERROR_SUCCESS && ret != ERROR_MORE_DATA)) sz = 0;
|
||||||
if (sz < sizeof(DEVMODEA))
|
if (sz < sizeof(DEVMODEA))
|
||||||
{
|
{
|
||||||
ERR("corrupted registry for %s\n", debugstr_w(ValueName));
|
ERR("corrupted registry for %s ( size %ld)\n",debugstr_w(ValueName),sz);
|
||||||
sz = sizeof(DEVMODEA);
|
sz = sizeof(DEVMODEA);
|
||||||
}
|
}
|
||||||
/* ensures that dmSize is not erratically bogus if registry is invalid */
|
/* ensures that dmSize is not erratically bogus if registry is invalid */
|
||||||
|
|
|
@ -5,6 +5,9 @@
|
||||||
* Copyright 1999 Thuy Nguyen
|
* Copyright 1999 Thuy Nguyen
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
#include "winspool.h"
|
||||||
#include "debugtools.h"
|
#include "debugtools.h"
|
||||||
|
|
||||||
DEFAULT_DEBUG_CHANNEL(winspool);
|
DEFAULT_DEBUG_CHANNEL(winspool);
|
||||||
|
@ -22,14 +25,16 @@ BOOL WINAPI WINSPOOL_EntryPoint(HINSTANCE hInstance,
|
||||||
{
|
{
|
||||||
switch (reason)
|
switch (reason)
|
||||||
{
|
{
|
||||||
case DLL_PROCESS_ATTACH:
|
case DLL_PROCESS_ATTACH: {
|
||||||
|
#ifdef HAVE_CUPS
|
||||||
|
extern void CUPS_LoadPrinters();
|
||||||
|
CUPS_LoadPrinters();
|
||||||
|
#endif
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
case DLL_PROCESS_DETACH:
|
case DLL_PROCESS_DETACH:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -119,3 +119,6 @@
|
||||||
|
|
||||||
/* Define if we have linux/input.h AND it contains the INPUT event API */
|
/* Define if we have linux/input.h AND it contains the INPUT event API */
|
||||||
#undef HAVE_CORRECT_LINUXINPUT_H
|
#undef HAVE_CORRECT_LINUXINPUT_H
|
||||||
|
|
||||||
|
/* Define if we have CUPS */
|
||||||
|
#undef HAVE_CUPS
|
||||||
|
|
|
@ -151,6 +151,9 @@
|
||||||
/* Define if we have linux/input.h AND it contains the INPUT event API */
|
/* Define if we have linux/input.h AND it contains the INPUT event API */
|
||||||
#undef HAVE_CORRECT_LINUXINPUT_H
|
#undef HAVE_CORRECT_LINUXINPUT_H
|
||||||
|
|
||||||
|
/* Define if we have CUPS */
|
||||||
|
#undef HAVE_CUPS
|
||||||
|
|
||||||
/* The number of bytes in a long long. */
|
/* The number of bytes in a long long. */
|
||||||
#undef SIZEOF_LONG_LONG
|
#undef SIZEOF_LONG_LONG
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue