Commit 91857a6c authored by Ian Pilcher's avatar Ian Pilcher Committed by Alexandre Julliard

Misc. error checking in PostScript driver.

parent ce7f12c4
...@@ -219,7 +219,6 @@ static PSDRV_DEVMODEA DefaultDevmode = ...@@ -219,7 +219,6 @@ static PSDRV_DEVMODEA DefaultDevmode =
/* dummy */ 0 /* dummy */ 0
}, },
{ /* dmDrvPrivate */ { /* dmDrvPrivate */
/* ppdfilename */ "default.ppd",
/* numInstalledOptions */ 0 /* numInstalledOptions */ 0
} }
}; };
...@@ -467,27 +466,43 @@ PRINTERINFO *PSDRV_FindPrinterInfo(LPCSTR name) ...@@ -467,27 +466,43 @@ PRINTERINFO *PSDRV_FindPrinterInfo(LPCSTR name)
AFM *afm; AFM *afm;
HANDLE hPrinter; HANDLE hPrinter;
const char *ppd = NULL; const char *ppd = NULL;
char ppdFileName[256];
TRACE("'%s'\n", name); TRACE("'%s'\n", name);
/*
* If this loop completes, last will point to the 'next' element of the
* final PRINTERINFO in the list
*/
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, HEAP_ZERO_MEMORY, sizeof(*pi) );
if (pi == NULL)
return NULL;
pi->FriendlyName = HEAP_strdupA( PSDRV_Heap, 0, name ); pi->FriendlyName = HEAP_strdupA( PSDRV_Heap, 0, name );
if (pi->FriendlyName == NULL)
goto fail;
/* Use Get|SetPrinterDataExA instead? */
res = DrvGetPrinterData16((LPSTR)name, (LPSTR)INT_PD_DEFAULT_DEVMODE, &type, res = DrvGetPrinterData16((LPSTR)name, (LPSTR)INT_PD_DEFAULT_DEVMODE, &type,
NULL, 0, &needed ); NULL, 0, &needed );
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) );
if (pi->Devmode == NULL)
goto cleanup;
memcpy(pi->Devmode, &DefaultDevmode, sizeof(DefaultDevmode) ); memcpy(pi->Devmode, &DefaultDevmode, sizeof(DefaultDevmode) );
strcpy(pi->Devmode->dmPublic.dmDeviceName,name); 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) );
/* need to do something here AddPrinter?? */ /* need to do something here AddPrinter?? */
} else { }
else {
pi->Devmode = HeapAlloc( PSDRV_Heap, 0, needed ); pi->Devmode = HeapAlloc( PSDRV_Heap, 0, needed );
DrvGetPrinterData16((LPSTR)name, (LPSTR)INT_PD_DEFAULT_DEVMODE, &type, DrvGetPrinterData16((LPSTR)name, (LPSTR)INT_PD_DEFAULT_DEVMODE, &type,
(LPBYTE)pi->Devmode, needed, &needed); (LPBYTE)pi->Devmode, needed, &needed);
...@@ -497,29 +512,48 @@ PRINTERINFO *PSDRV_FindPrinterInfo(LPCSTR name) ...@@ -497,29 +512,48 @@ PRINTERINFO *PSDRV_FindPrinterInfo(LPCSTR name)
ERR ("OpenPrinterA failed with code %li\n", GetLastError ()); ERR ("OpenPrinterA failed with code %li\n", GetLastError ());
goto cleanup; goto cleanup;
} }
pi->Devmode->dmDrvPrivate.ppdFileName[0]='\0';
ppdFileName[0]='\0';
#ifdef HAVE_CUPS #ifdef HAVE_CUPS
{ {
ppd = cupsGetPPD(name); ppd = cupsGetPPD(name);
if (ppd) { if (ppd) {
strcpy(pi->Devmode->dmDrvPrivate.ppdFileName,ppd); strncpy(ppdFileName, ppd, sizeof(ppdFileName));
res = ERROR_SUCCESS; res = ERROR_SUCCESS;
/* we should unlink() that file later */ /* we should unlink() that file later */
} else { }
else {
ERR("Did not find ppd for %s\n",name); ERR("Did not find ppd for %s\n",name);
} }
} }
#endif #endif
if (!pi->Devmode->dmDrvPrivate.ppdFileName[0]) {
res = GetPrinterDataA (hPrinter, "PPD File", NULL, if (!ppdFileName[0]) {
pi->Devmode->dmDrvPrivate.ppdFileName, 256, &needed); res = GetPrinterDataA (hPrinter, "PPD File", NULL, ppdFileName,
sizeof(ppdFileName), &needed);
} }
if (res != ERROR_SUCCESS) { 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);
goto closeprinter; goto closeprinter;
} }
ppdFileName[sizeof(ppdFileName) - 1] = '\0';
pi->ppd = PSDRV_ParsePPD(ppdFileName);
if(!pi->ppd) {
MESSAGE("Couldn't find PPD file '%s', expect a crash now!\n",
ppdFileName);
goto closeprinter;
}
/*
* This is a hack. The default paper size should be read in as part of
* the Devmode structure, but Wine doesn't currently provide a convenient
* way to configure printers.
*/
res = GetPrinterDataA (hPrinter, "Paper Size", NULL, (LPBYTE) &dwPaperSize, res = GetPrinterDataA (hPrinter, "Paper Size", NULL, (LPBYTE) &dwPaperSize,
sizeof (DWORD), &needed); sizeof (DWORD), &needed);
if (res == ERROR_SUCCESS) if (res == ERROR_SUCCESS)
...@@ -533,10 +567,10 @@ PRINTERINFO *PSDRV_FindPrinterInfo(LPCSTR name) ...@@ -533,10 +567,10 @@ PRINTERINFO *PSDRV_FindPrinterInfo(LPCSTR name)
res = EnumPrinterDataExA (hPrinter, "PrinterDriverData\\FontSubTable", NULL, res = EnumPrinterDataExA (hPrinter, "PrinterDriverData\\FontSubTable", NULL,
0, &needed, &pi->FontSubTableSize); 0, &needed, &pi->FontSubTableSize);
if (res == ERROR_SUCCESS) if (res == ERROR_SUCCESS || res == ERROR_FILE_NOT_FOUND) {
TRACE ("No 'FontSubTable' for printer '%s'\n", name); TRACE ("No 'FontSubTable' for printer '%s'\n", 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);
...@@ -550,9 +584,10 @@ PRINTERINFO *PSDRV_FindPrinterInfo(LPCSTR name) ...@@ -550,9 +584,10 @@ PRINTERINFO *PSDRV_FindPrinterInfo(LPCSTR name)
ERR ("EnumPrinterDataExA returned %li\n", res); ERR ("EnumPrinterDataExA returned %li\n", res);
goto closeprinter; goto closeprinter;
} }
} else { }
FIXME ("EnumPrinterDataExA returned %li\n", res); else {
/* ignore error */ ERR("EnumPrinterDataExA returned %li\n", res);
goto closeprinter;
} }
if (ClosePrinter (hPrinter) == 0) { if (ClosePrinter (hPrinter) == 0) {
...@@ -560,22 +595,21 @@ PRINTERINFO *PSDRV_FindPrinterInfo(LPCSTR name) ...@@ -560,22 +595,21 @@ PRINTERINFO *PSDRV_FindPrinterInfo(LPCSTR name)
goto cleanup; goto cleanup;
} }
pi->ppd = PSDRV_ParsePPD(pi->Devmode->dmDrvPrivate.ppdFileName);
if(!pi->ppd) {
MESSAGE("Couldn't find PPD file '%s', expect a crash now!\n",
pi->Devmode->dmDrvPrivate.ppdFileName);
goto cleanup;
}
pi->next = NULL; pi->next = NULL;
pi->Fonts = NULL; pi->Fonts = NULL;
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( "Couldn't find AFM file for installed printer font '%s' - ignoring\n", font->Name); TRACE( "Couldn't find AFM file for installed printer font '%s' - "
else "ignoring\n", font->Name);
PSDRV_AddAFMtoList(&pi->Fonts, afm); }
else {
if (PSDRV_AddAFMtoList(&pi->Fonts, afm) == FALSE) {
PSDRV_FreeAFMList(pi->Fonts);
goto cleanup;
}
}
} }
if (ppd) unlink(ppd); if (ppd) unlink(ppd);
...@@ -584,9 +618,13 @@ PRINTERINFO *PSDRV_FindPrinterInfo(LPCSTR name) ...@@ -584,9 +618,13 @@ PRINTERINFO *PSDRV_FindPrinterInfo(LPCSTR name)
closeprinter: closeprinter:
ClosePrinter(hPrinter); ClosePrinter(hPrinter);
cleanup: cleanup:
HeapFree (PSDRV_Heap, 0, pi->FontSubTable); if (pi->FontSubTable)
HeapFree(PSDRV_Heap, 0, pi->FriendlyName); HeapFree(PSDRV_Heap, 0, pi->FontSubTable);
HeapFree(PSDRV_Heap, 0, pi->Devmode); if (pi->FriendlyName)
HeapFree(PSDRV_Heap, 0, pi->FriendlyName);
if (pi->Devmode)
HeapFree(PSDRV_Heap, 0, pi->Devmode);
fail:
HeapFree(PSDRV_Heap, 0, pi); HeapFree(PSDRV_Heap, 0, pi);
if (ppd) unlink(ppd); if (ppd) unlink(ppd);
*last = NULL; *last = NULL;
......
...@@ -170,7 +170,6 @@ typedef struct { ...@@ -170,7 +170,6 @@ typedef struct {
int dummy; int dummy;
} dmDocPrivate; } dmDocPrivate;
struct _tagdrvprivate { struct _tagdrvprivate {
char ppdFileName[256]; /* Hack */
UINT numInstalledOptions; /* Options at end of struct */ UINT numInstalledOptions; /* Options at end of struct */
} dmDrvPrivate; } dmDrvPrivate;
...@@ -274,7 +273,7 @@ extern BOOL PSDRV_GetFontMetrics(void); ...@@ -274,7 +273,7 @@ extern BOOL PSDRV_GetFontMetrics(void);
extern PPD *PSDRV_ParsePPD(char *fname); extern PPD *PSDRV_ParsePPD(char *fname);
extern PRINTERINFO *PSDRV_FindPrinterInfo(LPCSTR name); extern PRINTERINFO *PSDRV_FindPrinterInfo(LPCSTR name);
extern AFM *PSDRV_FindAFMinList(FONTFAMILY *head, char *name); extern AFM *PSDRV_FindAFMinList(FONTFAMILY *head, char *name);
extern void PSDRV_AddAFMtoList(FONTFAMILY **head, AFM *afm); extern BOOL PSDRV_AddAFMtoList(FONTFAMILY **head, AFM *afm);
extern void PSDRV_FreeAFMList( FONTFAMILY *head ); extern void PSDRV_FreeAFMList( FONTFAMILY *head );
extern BOOL WINAPI PSDRV_Init(HINSTANCE hinst, DWORD reason, LPVOID reserved); extern BOOL WINAPI PSDRV_Init(HINSTANCE hinst, DWORD reason, LPVOID reserved);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment