Huw Davies : wineps: Move ppd filename retrieval to a separate function.
Alexandre Julliard
julliard at winehq.org
Fri Apr 13 11:03:21 CDT 2012
Module: wine
Branch: master
Commit: 72cfc219f0ba2fc3aea19760558f7820f4883176
URL: http://source.winehq.org/git/wine.git/?a=commit;h=72cfc219f0ba2fc3aea19760558f7820f4883176
Author: Huw Davies <huw at codeweavers.com>
Date: Fri Apr 13 12:57:48 2012 +0100
wineps: Move ppd filename retrieval to a separate function.
---
dlls/wineps.drv/init.c | 205 ++++++++++++++++++++++++++----------------------
1 files changed, 112 insertions(+), 93 deletions(-)
diff --git a/dlls/wineps.drv/init.c b/dlls/wineps.drv/init.c
index 584254c..b2597d7 100644
--- a/dlls/wineps.drv/init.c
+++ b/dlls/wineps.drv/init.c
@@ -573,6 +573,106 @@ 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 )
+{
+ 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
+
+ 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 );
+ }
+
+ return ret;
+}
+
static struct list printer_list = LIST_INIT( printer_list );
/**********************************************************************
@@ -585,11 +685,8 @@ PRINTERINFO *PSDRV_FindPrinterInfo(LPCWSTR name)
FONTNAME *font;
const AFM *afm;
HANDLE hPrinter = 0;
- const char *ppd = NULL;
- DWORD ppdType;
- char *ppdFileName = NULL, *nameA = NULL;
- HKEY hkey;
- BOOL using_default_devmode = FALSE;
+ char *ppd_filename = NULL, *nameA = NULL;
+ BOOL using_default_devmode = FALSE, needs_unlink = FALSE;
int len;
TRACE("'%s'\n", debugstr_w(name));
@@ -618,93 +715,14 @@ PRINTERINFO *PSDRV_FindPrinterInfo(LPCWSTR name)
pi->Devmode = get_devmode( hPrinter, name, &using_default_devmode );
if (!pi->Devmode) goto fail;
-#ifdef SONAME_LIBCUPS
- if (cupshandle != (void*)-1) {
- typeof(cupsGetPPD) * pcupsGetPPD = NULL;
-
- pcupsGetPPD = wine_dlsym(cupshandle, "cupsGetPPD", NULL, 0);
- if (pcupsGetPPD) {
- ppd = pcupsGetPPD( nameA );
-
- if (ppd) {
- needed=strlen(ppd)+1;
- ppdFileName=HeapAlloc(PSDRV_Heap, 0, needed);
- memcpy(ppdFileName, ppd, needed);
- ppdType=REG_SZ;
- res = ERROR_SUCCESS;
- /* we should unlink() that file later */
- } else {
- res = ERROR_FILE_NOT_FOUND;
- WARN("Did not find ppd for %s\n", debugstr_w(name));
- }
- }
- }
-#endif
- if (!ppdFileName) {
- res = GetPrinterDataExA(hPrinter, "PrinterDriverData", "PPD File", NULL, NULL, 0, &needed);
- if ((res==ERROR_SUCCESS) || (res==ERROR_MORE_DATA)) {
- ppdFileName=HeapAlloc(PSDRV_Heap, 0, needed);
- res = GetPrinterDataExA(hPrinter, "PrinterDriverData", "PPD File", &ppdType,
- (LPBYTE)ppdFileName, needed, &needed);
- }
- }
- /* 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((res != ERROR_SUCCESS) && !RegOpenKeyA(HKEY_CURRENT_USER, "Software\\Wine\\Printing\\PPD Files", &hkey))
- {
- const char* value_name;
-
- 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";
- } else {
- value_name=NULL;
- }
- if (value_name) {
- HeapFree(PSDRV_Heap, 0, ppdFileName);
- ppdFileName=HeapAlloc(PSDRV_Heap, 0, needed);
- RegQueryValueExA(hkey, value_name, 0, &ppdType, (LPBYTE)ppdFileName, &needed);
- }
- RegCloseKey(hkey);
- }
+ ppd_filename = get_ppd_filename( hPrinter, nameA, &needs_unlink );
+ if (!ppd_filename) goto fail;
- if (!ppdFileName)
+ pi->ppd = PSDRV_ParsePPD( ppd_filename );
+ if (!pi->ppd)
{
- const char *data_dir, *filename;
-
- 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
- {
- res = ERROR_FILE_NOT_FOUND;
- ERR ("Error %i getting PPD file name for printer '%s'\n", res, debugstr_w(name));
- goto fail;
- }
- ppdFileName = HeapAlloc( PSDRV_Heap, 0, strlen(data_dir) + strlen(filename) + 1 );
- strcpy( ppdFileName, data_dir );
- strcat( ppdFileName, filename );
- } else {
- res = ERROR_SUCCESS;
- if (ppdType==REG_EXPAND_SZ) {
- char* tmp;
-
- /* Expand environment variable references */
- needed=ExpandEnvironmentStringsA(ppdFileName,NULL,0);
- tmp=HeapAlloc(PSDRV_Heap, 0, needed);
- ExpandEnvironmentStringsA(ppdFileName,tmp,needed);
- HeapFree(PSDRV_Heap, 0, ppdFileName);
- ppdFileName=tmp;
- }
- }
-
- pi->ppd = PSDRV_ParsePPD(ppdFileName);
- if(!pi->ppd) {
- MESSAGE("Couldn't find PPD file '%s', expect a crash now!\n",
- ppdFileName);
- goto fail;
+ WARN( "Couldn't parse PPD file '%s'\n", ppd_filename );
+ goto fail;
}
if(using_default_devmode) {
@@ -780,19 +798,20 @@ PRINTERINFO *PSDRV_FindPrinterInfo(LPCWSTR name)
}
ClosePrinter( hPrinter );
HeapFree( GetProcessHeap(), 0, nameA );
- if (ppd) unlink(ppd);
+ if (needs_unlink) unlink( ppd_filename );
+ HeapFree( GetProcessHeap(), 0, ppd_filename );
list_add_head( &printer_list, &pi->entry );
return pi;
fail:
if (hPrinter) ClosePrinter( hPrinter );
- HeapFree(PSDRV_Heap, 0, ppdFileName);
HeapFree(PSDRV_Heap, 0, pi->FontSubTable);
HeapFree(PSDRV_Heap, 0, pi->friendly_name);
HeapFree(PSDRV_Heap, 0, pi->Devmode);
HeapFree(PSDRV_Heap, 0, pi);
HeapFree( GetProcessHeap(), 0, nameA );
- if (ppd) unlink(ppd);
+ if (needs_unlink) unlink( ppd_filename );
+ HeapFree( GetProcessHeap(), 0, ppd_filename );
return NULL;
}
More information about the wine-cvs
mailing list