Module: wine Branch: master Commit: 72cfc219f0ba2fc3aea19760558f7820f4883176 URL: http://source.winehq.org/git/wine.git/?a=commit;h=72cfc219f0ba2fc3aea1976055...
Author: Huw Davies huw@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; }