Added CUPS printing support.
diff --git a/dlls/wineps/init.c b/dlls/wineps/init.c
index 751b20b..f17a3bb 100644
--- a/dlls/wineps/init.c
+++ b/dlls/wineps/init.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 @@
/* dmCopies */ 1,
/* dmDefaultSource */ DMBIN_AUTO,
/* dmPrintQuality */ 0,
-/* dmColor */ DMCOLOR_MONOCHROME,
+/* dmColor */ DMCOLOR_COLOR,
/* dmDuplex */ 0,
/* dmYResolution */ 0,
/* dmTTOption */ DMTT_SUBDEV,
@@ -427,13 +434,13 @@
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 @@
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 @@
(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 @@
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 @@
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 @@
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;
}