Added CUPS printing support.
This commit is contained in:
parent
485cefd02d
commit
ab8b7dba77
|
@ -368,6 +368,14 @@ then
|
|||
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) ****
|
||||
AC_CACHE_CHECK("for GNU style IPX support", ac_cv_c_ipx_gnu,
|
||||
AC_TRY_COMPILE(
|
||||
|
|
|
@ -1554,7 +1554,7 @@ BOOL WINAPI PrintDlgW( LPPRINTDLGW printdlg )
|
|||
*/
|
||||
BOOL WINAPI PageSetupDlgA(LPPAGESETUPDLGA setupdlg) {
|
||||
FIXME("(%p), stub!\n",setupdlg);
|
||||
return FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
/***********************************************************************
|
||||
* PageSetupDlgW (COMDLG32.16)
|
||||
|
|
|
@ -7,6 +7,9 @@
|
|||
* Copyright 1999 Klaas van Gend
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
|
@ -453,7 +456,10 @@ static int CreateSpoolFile(LPCSTR pszOutput)
|
|||
if (pszOutput == NULL || *pszOutput == '\0')
|
||||
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",
|
||||
psCmd, pszOutput);
|
||||
if (!*psCmd)
|
||||
|
|
|
@ -6,6 +6,7 @@ MODULE = wineps
|
|||
SOVERSION = 1.0
|
||||
ALTNAMES = wineps16
|
||||
IMPORTS = user32 gdi32 winspool.drv kernel32 ntdll
|
||||
EXTRALIBS = @CUPSLIBS@
|
||||
|
||||
C_SRCS = \
|
||||
afm.c \
|
||||
|
|
|
@ -2,9 +2,12 @@
|
|||
* PostScript driver initialization functions
|
||||
*
|
||||
* Copyright 1998 Huw D M Davies
|
||||
* Copyright 2001 Marcus Meissner
|
||||
*
|
||||
*/
|
||||
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "gdi.h"
|
||||
#include "psdrv.h"
|
||||
|
@ -15,6 +18,10 @@
|
|||
#include "winerror.h"
|
||||
#include "options.h"
|
||||
|
||||
#ifdef HAVE_CUPS
|
||||
# include <cups/cups.h>
|
||||
#endif
|
||||
|
||||
DEFAULT_DEBUG_CHANNEL(psdrv);
|
||||
|
||||
static BOOL PSDRV_CreateDC( DC *dc, LPCSTR driver, LPCSTR device,
|
||||
|
@ -187,7 +194,7 @@ static PSDRV_DEVMODEA DefaultDevmode =
|
|||
/* dmCopies */ 1,
|
||||
/* dmDefaultSource */ DMBIN_AUTO,
|
||||
/* dmPrintQuality */ 0,
|
||||
/* dmColor */ DMCOLOR_MONOCHROME,
|
||||
/* dmColor */ DMCOLOR_COLOR,
|
||||
/* dmDuplex */ 0,
|
||||
/* dmYResolution */ 0,
|
||||
/* dmTTOption */ DMTT_SUBDEV,
|
||||
|
@ -427,13 +434,13 @@ PRINTERINFO *PSDRV_FindPrinterInfo(LPCSTR name)
|
|||
FONTNAME *font;
|
||||
AFM *afm;
|
||||
HANDLE hPrinter;
|
||||
const char *ppd = NULL;
|
||||
|
||||
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))
|
||||
return pi;
|
||||
}
|
||||
|
||||
pi = *last = HeapAlloc( PSDRV_Heap, 0, sizeof(*pi) );
|
||||
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)) {
|
||||
pi->Devmode = HeapAlloc( PSDRV_Heap, 0, sizeof(DefaultDevmode) );
|
||||
memcpy(pi->Devmode, &DefaultDevmode, sizeof(DefaultDevmode) );
|
||||
strcpy(pi->Devmode->dmPublic.dmDeviceName,name);
|
||||
DrvSetPrinterData16((LPSTR)name, (LPSTR)INT_PD_DEFAULT_DEVMODE,
|
||||
REG_BINARY, (LPBYTE)&DefaultDevmode, sizeof(DefaultDevmode) );
|
||||
|
||||
|
@ -453,34 +461,31 @@ PRINTERINFO *PSDRV_FindPrinterInfo(LPCSTR name)
|
|||
(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 ());
|
||||
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;
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
res = GetPrinterDataA (hPrinter, "PPD File", NULL,
|
||||
pi->Devmode->dmDrvPrivate.ppdFileName, 256, &needed);
|
||||
if (res != ERROR_SUCCESS)
|
||||
pi->Devmode->dmDrvPrivate.ppdFileName[0]='\0';
|
||||
#ifdef HAVE_CUPS
|
||||
{
|
||||
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);
|
||||
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;
|
||||
goto closeprinter;
|
||||
}
|
||||
|
||||
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;
|
||||
else if (res == ERROR_FILE_NOT_FOUND)
|
||||
TRACE ("No 'Paper Size' for printer '%s'\n", name);
|
||||
else
|
||||
{
|
||||
else {
|
||||
ERR ("GetPrinterDataA 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;
|
||||
goto closeprinter;
|
||||
}
|
||||
|
||||
res = EnumPrinterDataExA (hPrinter, "PrinterDriverData\\FontSubTable", NULL,
|
||||
|
@ -511,83 +506,33 @@ PRINTERINFO *PSDRV_FindPrinterInfo(LPCSTR name)
|
|||
else if (res == ERROR_MORE_DATA)
|
||||
{
|
||||
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);
|
||||
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;
|
||||
goto closeprinter;
|
||||
}
|
||||
|
||||
res = EnumPrinterDataExA (hPrinter, "PrinterDriverData\\FontSubTable",
|
||||
(LPBYTE) pi->FontSubTable, needed, &needed,
|
||||
&pi->FontSubTableSize);
|
||||
if (res != ERROR_SUCCESS)
|
||||
{
|
||||
if (res != ERROR_SUCCESS) {
|
||||
ERR ("EnumPrinterDataExA returned %li\n", res);
|
||||
if (ClosePrinter (hPrinter) == 0)
|
||||
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;
|
||||
goto closeprinter;
|
||||
}
|
||||
}
|
||||
else /* error in 1st call to EnumPrinterDataExA */
|
||||
{
|
||||
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;
|
||||
} else {
|
||||
FIXME ("EnumPrinterDataExA returned %li\n", res);
|
||||
/* ignore error */
|
||||
}
|
||||
|
||||
if (ClosePrinter (hPrinter) == 0)
|
||||
{
|
||||
if (ClosePrinter (hPrinter) == 0) {
|
||||
ERR ("ClosePrinter failed with code %li\n", GetLastError ());
|
||||
if (ClosePrinter (hPrinter) == 0)
|
||||
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;
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
pi->ppd = PSDRV_ParsePPD(pi->Devmode->dmDrvPrivate.ppdFileName);
|
||||
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",
|
||||
pi->Devmode->dmDrvPrivate.ppdFileName);
|
||||
return NULL;
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
pi->next = NULL;
|
||||
|
@ -595,14 +540,23 @@ PRINTERINFO *PSDRV_FindPrinterInfo(LPCSTR name)
|
|||
|
||||
for(font = pi->ppd->InstalledFonts; font; font = font->next) {
|
||||
afm = PSDRV_FindAFMinList(PSDRV_AFMFontList, font->Name);
|
||||
if(!afm) {
|
||||
TRACE(
|
||||
"Couldn't find AFM file for installed printer font '%s' - ignoring\n",
|
||||
font->Name);
|
||||
} else {
|
||||
if(!afm)
|
||||
TRACE( "Couldn't find AFM file for installed printer font '%s' - ignoring\n", font->Name);
|
||||
else
|
||||
PSDRV_AddAFMtoList(&pi->Fonts, afm);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
if (ppd) unlink(ppd);
|
||||
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@
|
||||
VPATH = @srcdir@
|
||||
MODULE = winspool.drv
|
||||
EXTRALIBS = @CUPSLIBS@
|
||||
|
||||
LDDLLFLAGS = @LDDLLFLAGS@
|
||||
SYMBOLFILE = $(MODULE).tmp.o
|
||||
|
|
|
@ -5,13 +5,19 @@
|
|||
* Copyright 1998 Andreas Mohr
|
||||
* Copyright 1999 Klaas van Gend
|
||||
* Copyright 1999, 2000 Huw D M Davies
|
||||
* Copyright 2001 Marcus Meissner
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
#include <stddef.h>
|
||||
#ifdef HAVE_CUPS
|
||||
# include <cups/cups.h>
|
||||
#endif
|
||||
#include "winspool.h"
|
||||
#include "winbase.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 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
|
||||
* Get the first place empty in the opened printer table
|
||||
|
@ -374,7 +453,10 @@ LONG WINAPI DocumentPropertiesA(HWND hWnd,HANDLE hPrinter,
|
|||
|
||||
if(!pDeviceName) {
|
||||
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);
|
||||
}
|
||||
|
||||
|
@ -382,7 +464,10 @@ LONG WINAPI DocumentPropertiesA(HWND hWnd,HANDLE hPrinter,
|
|||
{
|
||||
GDI_CallExtDeviceMode16 = (void*)GetProcAddress( GetModuleHandleA("gdi32"),
|
||||
(LPCSTR)102 );
|
||||
if (!GDI_CallExtDeviceMode16) return -1;
|
||||
if (!GDI_CallExtDeviceMode16) {
|
||||
ERR("No CallExtDeviceMode16?\n");
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
ret = GDI_CallExtDeviceMode16(hWnd, pDevModeOutput, lpName, "LPT1:",
|
||||
pDevModeInput, NULL, fMode);
|
||||
|
@ -484,7 +569,7 @@ BOOL WINAPI OpenPrinterW(LPWSTR lpPrinterName,HANDLE *phPrinter,
|
|||
|
||||
if(RegOpenKeyW(hkeyPrinters, lpPrinterName, &hkeyPrinter)
|
||||
!= 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);
|
||||
SetLastError(ERROR_INVALID_PARAMETER);
|
||||
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);
|
||||
|
||||
if(pName != NULL) {
|
||||
FIXME("pName = %s - unsupported\n", debugstr_w(pName));
|
||||
ERR("pName = %s - unsupported\n", debugstr_w(pName));
|
||||
SetLastError(ERROR_INVALID_PARAMETER);
|
||||
return 0;
|
||||
}
|
||||
if(Level != 2) {
|
||||
WARN("Level = %ld\n", Level);
|
||||
ERR("Level = %ld, unsupported!\n", Level);
|
||||
SetLastError(ERROR_INVALID_LEVEL);
|
||||
return 0;
|
||||
}
|
||||
|
@ -741,7 +826,7 @@ HANDLE WINAPI AddPrinterW(LPWSTR pName, DWORD Level, LPBYTE pPrinter)
|
|||
RegCloseKey(hkeyDrivers);
|
||||
|
||||
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);
|
||||
RegCloseKey(hkeyPrinters);
|
||||
return 0;
|
||||
|
@ -751,20 +836,20 @@ HANDLE WINAPI AddPrinterW(LPWSTR pName, DWORD Level, LPBYTE pPrinter)
|
|||
*/
|
||||
size = DocumentPropertiesW(0, -1, pi->pPrinterName, NULL, NULL, 0);
|
||||
if(size < 0) {
|
||||
WARN("DocumentProperties fails\n");
|
||||
SetLastError(ERROR_UNKNOWN_PRINTER_DRIVER);
|
||||
return 0;
|
||||
FIXME("DocumentProperties fails\n");
|
||||
size = sizeof(DEVMODEW);
|
||||
}
|
||||
if(pi->pDevMode) {
|
||||
dmW = pi->pDevMode;
|
||||
} else {
|
||||
dmW = HeapAlloc(GetProcessHeap(), 0, size);
|
||||
dmW->dmSize = size;
|
||||
DocumentPropertiesW(0, -1, pi->pPrinterName, dmW, NULL, DM_OUT_BUFFER);
|
||||
}
|
||||
|
||||
if(RegCreateKeyW(hkeyPrinters, pi->pPrinterName, &hkeyPrinter) !=
|
||||
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);
|
||||
RegCloseKey(hkeyPrinters);
|
||||
if(!pi->pDevMode)
|
||||
|
@ -775,7 +860,6 @@ HANDLE WINAPI AddPrinterW(LPWSTR pName, DWORD Level, LPBYTE pPrinter)
|
|||
(LPBYTE)&pi->Attributes, sizeof(DWORD));
|
||||
RegSetValueExW(hkeyPrinter, DatatypeW, 0, REG_SZ, (LPBYTE)pi->pDatatype,
|
||||
0);
|
||||
|
||||
/* Write DEVMODEA not DEVMODEW into reg. This is what win9x does
|
||||
and we support these drivers. NT writes DEVMODEW so somehow
|
||||
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);
|
||||
if(Level != 2) {
|
||||
WARN("Level = %ld\n", Level);
|
||||
ERR("Level = %ld, unsupported!\n", Level);
|
||||
SetLastError(ERROR_INVALID_LEVEL);
|
||||
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 (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);
|
||||
}
|
||||
/* ensures that dmSize is not erratically bogus if registry is invalid */
|
||||
|
|
|
@ -5,6 +5,9 @@
|
|||
* Copyright 1999 Thuy Nguyen
|
||||
*/
|
||||
|
||||
|
||||
#include "config.h"
|
||||
#include "winspool.h"
|
||||
#include "debugtools.h"
|
||||
|
||||
DEFAULT_DEBUG_CHANNEL(winspool);
|
||||
|
@ -22,14 +25,16 @@ BOOL WINAPI WINSPOOL_EntryPoint(HINSTANCE hInstance,
|
|||
{
|
||||
switch (reason)
|
||||
{
|
||||
case DLL_PROCESS_ATTACH:
|
||||
case DLL_PROCESS_ATTACH: {
|
||||
#ifdef HAVE_CUPS
|
||||
extern void CUPS_LoadPrinters();
|
||||
CUPS_LoadPrinters();
|
||||
#endif
|
||||
break;
|
||||
|
||||
}
|
||||
case DLL_PROCESS_DETACH:
|
||||
break;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -119,3 +119,6 @@
|
|||
|
||||
/* Define if we have linux/input.h AND it contains the INPUT event API */
|
||||
#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 */
|
||||
#undef HAVE_CORRECT_LINUXINPUT_H
|
||||
|
||||
/* Define if we have CUPS */
|
||||
#undef HAVE_CUPS
|
||||
|
||||
/* The number of bytes in a long long. */
|
||||
#undef SIZEOF_LONG_LONG
|
||||
|
||||
|
|
Loading…
Reference in New Issue