Added CUPS printing support.

This commit is contained in:
Marcus Meissner 2001-04-27 18:02:46 +00:00 committed by Alexandre Julliard
parent 485cefd02d
commit ab8b7dba77
11 changed files with 369 additions and 255 deletions

309
configure vendored

File diff suppressed because it is too large Load Diff

View File

@ -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(

View File

@ -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)

View File

@ -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)

View File

@ -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 \

View File

@ -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;
} }

View File

@ -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

View File

@ -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 */

View File

@ -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;
} }

View File

@ -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

View File

@ -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