Huw Davies : wineps: Retrieve the ppd file from the driver directory.
Alexandre Julliard
julliard at winehq.org
Fri Jun 15 13:34:40 CDT 2012
Module: wine
Branch: master
Commit: bdaddc4b7c4b4391b593a5f4ab91b8121c698bef
URL: http://source.winehq.org/git/wine.git/?a=commit;h=bdaddc4b7c4b4391b593a5f4ab91b8121c698bef
Author: Huw Davies <huw at codeweavers.com>
Date: Fri Jun 15 12:53:56 2012 +0100
wineps: Retrieve the ppd file from the driver directory.
---
dlls/wineps.drv/Makefile.in | 1 -
dlls/wineps.drv/init.c | 136 +++++--------------------------------------
2 files changed, 14 insertions(+), 123 deletions(-)
diff --git a/dlls/wineps.drv/Makefile.in b/dlls/wineps.drv/Makefile.in
index 1af9503..bd810f9 100644
--- a/dlls/wineps.drv/Makefile.in
+++ b/dlls/wineps.drv/Makefile.in
@@ -1,6 +1,5 @@
MODULE = wineps.drv
IMPORTS = user32 gdi32 winspool advapi32
-EXTRAINCL = @CUPSINCL@
C_SRCS = \
afm.c \
diff --git a/dlls/wineps.drv/init.c b/dlls/wineps.drv/init.c
index 3d9bf38..64a3c74 100644
--- a/dlls/wineps.drv/init.c
+++ b/dlls/wineps.drv/init.c
@@ -24,12 +24,6 @@
#include <stdarg.h>
#include <string.h>
-#ifdef HAVE_UNISTD_H
-# include <unistd.h>
-#endif
-#ifdef HAVE_CUPS_CUPS_H
-# include <cups/cups.h>
-#endif
#define NONAMELESSUNION
#define NONAMELESSSTRUCT
@@ -46,10 +40,6 @@
WINE_DEFAULT_DEBUG_CHANNEL(psdrv);
-#ifdef SONAME_LIBCUPS
-static void *cupshandle = NULL;
-#endif
-
static const PSDRV_DEVMODE DefaultDevmode =
{
{ /* dmPublic */
@@ -145,25 +135,12 @@ BOOL WINAPI DllMain( HINSTANCE hinst, DWORD reason, LPVOID reserved )
HeapDestroy(PSDRV_Heap);
return FALSE;
}
-#ifdef SONAME_LIBCUPS
- /* dynamically load CUPS if not yet loaded */
- if (!cupshandle) {
- cupshandle = wine_dlopen(SONAME_LIBCUPS, RTLD_NOW, NULL, 0);
- if (!cupshandle) cupshandle = (void*)-1;
- }
-#endif
break;
case DLL_PROCESS_DETACH:
DeleteObject( PSDRV_DefaultFont );
HeapDestroy( PSDRV_Heap );
-#ifdef SONAME_LIBCUPS
- if (cupshandle && (cupshandle != (void*)-1)) {
- wine_dlclose(cupshandle, NULL, 0);
- cupshandle = NULL;
- }
-#endif
break;
}
@@ -573,104 +550,21 @@ static BOOL set_devmode( HANDLE printer, PSDRV_DEVMODE *dm )
return SetPrinterW( printer, 9, (BYTE *)&info, 0 );
}
-static inline char *expand_env_string( char *str, DWORD type )
-{
- if (type == REG_EXPAND_SZ)
- {
- char *tmp;
- DWORD needed = ExpandEnvironmentStringsA( str, NULL, 0 );
- tmp = HeapAlloc( GetProcessHeap(), 0, needed );
- if (tmp)
- {
- ExpandEnvironmentStringsA( str, tmp, needed );
- HeapFree( GetProcessHeap(), 0, str );
- return tmp;
- }
- }
- return str;
-}
-
-static char *get_ppd_filename( HANDLE printer, const char *nameA, BOOL *needs_unlink )
+static char *get_ppd_filename( HANDLE printer )
{
- char *ret = NULL;
- DWORD needed, err, type;
- HKEY hkey;
- const char *data_dir, *filename;
-
- *needs_unlink = FALSE;
-
-#ifdef SONAME_LIBCUPS
- if (cupshandle != (void*)-1)
- {
- typeof(cupsGetPPD) *pcupsGetPPD;
-
- pcupsGetPPD = wine_dlsym( cupshandle, "cupsGetPPD", NULL, 0 );
- if (pcupsGetPPD)
- {
- filename = pcupsGetPPD( nameA );
-
- if (filename)
- {
- needed = strlen( filename ) + 1;
- ret = HeapAlloc( GetProcessHeap(), 0, needed );
- memcpy( ret, filename, needed );
- *needs_unlink = TRUE;
- return ret;
- }
- else
- WARN( "CUPS did not find ppd for %s\n", debugstr_a(nameA) );
- }
- }
-#endif
+ DWORD needed;
+ DRIVER_INFO_2W *info;
+ char *unixname;
- err = GetPrinterDataExA( printer, "PrinterDriverData", "PPD File", NULL, NULL, 0, &needed );
- if (err == ERROR_MORE_DATA)
- {
- ret = HeapAlloc( GetProcessHeap(), 0, needed );
- if (!ret) return NULL;
- GetPrinterDataExA( printer, "PrinterDriverData", "PPD File", &type,
- (BYTE *)ret, needed, &needed );
- return expand_env_string( ret, type );
- }
-
- /* Look for a ppd file for this printer in the config file.
- * First look under that printer's name, and then under 'generic'
- */
- /* @@ Wine registry key: HKCU\Software\Wine\Printing\PPD Files */
- if (RegOpenKeyA( HKEY_CURRENT_USER, "Software\\Wine\\Printing\\PPD Files", &hkey ) == ERROR_SUCCESS )
- {
- const char *value_name = NULL;
-
- if (RegQueryValueExA( hkey, nameA, 0, NULL, NULL, &needed ) == ERROR_SUCCESS)
- value_name = nameA;
- else if (RegQueryValueExA( hkey, "generic", 0, NULL, NULL, &needed ) == ERROR_SUCCESS)
- value_name = "generic";
-
- if (value_name)
- {
- ret = HeapAlloc( GetProcessHeap(), 0, needed );
- if (!ret) return NULL;
- RegQueryValueExA( hkey, value_name, 0, &type, (BYTE *)ret, &needed );
- }
- RegCloseKey( hkey );
- if (ret) return expand_env_string( ret, type );
- }
-
- if ((data_dir = wine_get_data_dir())) filename = "/generic.ppd";
- else if ((data_dir = wine_get_build_dir())) filename = "/dlls/wineps.drv/generic.ppd";
- else
- {
- ERR( "Error getting PPD file name for printer '%s'\n", debugstr_a(nameA) );
- return NULL;
- }
- ret = HeapAlloc( GetProcessHeap(), 0, strlen(data_dir) + strlen(filename) + 1 );
- if (ret)
- {
- strcpy( ret, data_dir );
- strcat( ret, filename );
- }
+ GetPrinterDriverW( printer, NULL, 2, NULL, 0, &needed );
+ if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) return NULL;
+ info = HeapAlloc( GetProcessHeap(), 0, needed );
+ if (!info) return NULL;
+ GetPrinterDriverW( printer, NULL, 2, (BYTE*)info, needed, &needed );
+ unixname = wine_get_unix_file_name( info->pDataFile );
+ HeapFree( GetProcessHeap(), 0, info );
- return ret;
+ return unixname;
}
static struct list printer_list = LIST_INIT( printer_list );
@@ -686,7 +580,7 @@ PRINTERINFO *PSDRV_FindPrinterInfo(LPCWSTR name)
const AFM *afm;
HANDLE hPrinter = 0;
char *ppd_filename = NULL, *nameA = NULL;
- BOOL using_default_devmode = FALSE, needs_unlink = FALSE;
+ BOOL using_default_devmode = FALSE;
int len;
TRACE("'%s'\n", debugstr_w(name));
@@ -715,7 +609,7 @@ PRINTERINFO *PSDRV_FindPrinterInfo(LPCWSTR name)
pi->Devmode = get_devmode( hPrinter, name, &using_default_devmode );
if (!pi->Devmode) goto fail;
- ppd_filename = get_ppd_filename( hPrinter, nameA, &needs_unlink );
+ ppd_filename = get_ppd_filename( hPrinter );
if (!ppd_filename) goto fail;
pi->ppd = PSDRV_ParsePPD( ppd_filename );
@@ -798,7 +692,6 @@ PRINTERINFO *PSDRV_FindPrinterInfo(LPCWSTR name)
}
ClosePrinter( hPrinter );
HeapFree( GetProcessHeap(), 0, nameA );
- if (needs_unlink) unlink( ppd_filename );
HeapFree( GetProcessHeap(), 0, ppd_filename );
list_add_head( &printer_list, &pi->entry );
return pi;
@@ -810,7 +703,6 @@ fail:
HeapFree(PSDRV_Heap, 0, pi->Devmode);
HeapFree(PSDRV_Heap, 0, pi);
HeapFree( GetProcessHeap(), 0, nameA );
- if (needs_unlink) unlink( ppd_filename );
HeapFree( GetProcessHeap(), 0, ppd_filename );
return NULL;
}
More information about the wine-cvs
mailing list