This is extremely obsolete and doesn't provide the location
of the ppd file anyway.
Signed-off-by: Huw Davies <huw(a)codeweavers.com>
---
dlls/winspool.drv/info.c | 310 ++-------------------------------------
1 file changed, 11 insertions(+), 299 deletions(-)
diff --git a/dlls/winspool.drv/info.c b/dlls/winspool.drv/info.c
index fd02d2b2b3e..badde6ea5ae 100644
--- a/dlls/winspool.drv/info.c
+++ b/dlls/winspool.drv/info.c
@@ -750,20 +750,6 @@ static DWORD WINSPOOL_GetOpenedPrinterRegKey(HANDLE hPrinter, HKEY *phkey)
return open_printer_reg_key( name, phkey );
}
-static void set_default_printer(const char *devname, const char *name)
-{
- char *buf = HeapAlloc(GetProcessHeap(), 0, strlen(name)+strlen(devname)+strlen(",WINEPS.DRV,LPR:")+1);
- HKEY hkey;
-
- sprintf(buf, "%s,WINEPS.DRV,LPR:%s", devname, name);
- if (!RegCreateKeyW(HKEY_CURRENT_USER, user_default_reg_key, &hkey))
- {
- RegSetValueExA(hkey, "Device", 0, REG_SZ, (BYTE *)buf, strlen(buf) + 1);
- RegCloseKey(hkey);
- }
- HeapFree(GetProcessHeap(), 0, buf);
-}
-
static BOOL add_printer_driver(const WCHAR *name, WCHAR *ppd)
{
DRIVER_INFO_3W di3;
@@ -801,52 +787,6 @@ static BOOL add_printer_driver(const WCHAR *name, WCHAR *ppd)
return TRUE;
}
-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_fallback_ppd_name( const char *printer_name )
-{
- static const WCHAR ppds_key[] = {'S','o','f','t','w','a','r','e','\\','W','i','n','e','\\',
- 'P','r','i','n','t','i','n','g','\\','P','P','D',' ','F','i','l','e','s',0};
- HKEY hkey;
- DWORD needed, type;
- char *ret = NULL;
-
- if (RegOpenKeyW( HKEY_CURRENT_USER, ppds_key, &hkey ) == ERROR_SUCCESS )
- {
- const char *value_name = NULL;
-
- if (RegQueryValueExA( hkey, printer_name, 0, NULL, NULL, &needed ) == ERROR_SUCCESS)
- value_name = printer_name;
- 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 );
- }
- return NULL;
-}
-
static BOOL copy_file( const char *src, const char *dst )
{
int fds[2] = {-1, -1}, num;
@@ -893,28 +833,6 @@ static BOOL get_internal_fallback_ppd( const WCHAR *ppd )
return ret;
}
-static BOOL get_fallback_ppd( const char *printer_name, const WCHAR *ppd )
-{
- char *dst, *src = get_fallback_ppd_name( printer_name );
- BOOL ret = FALSE;
-
- if (!src) return get_internal_fallback_ppd( ppd );
-
- TRACE( "(%s %s) found %s\n", debugstr_a(printer_name), debugstr_w(ppd), debugstr_a(src) );
-
- if (!(dst = wine_get_unix_file_name( ppd ))) goto fail;
-
- if (symlink( src, dst ) == -1)
- if (errno != ENOSYS || !copy_file( src, dst ))
- goto fail;
-
- ret = TRUE;
-fail:
- HeapFree( GetProcessHeap(), 0, dst );
- HeapFree( GetProcessHeap(), 0, src );
- return ret;
-}
-
static WCHAR *get_ppd_filename( const WCHAR *dir, const WCHAR *file_name )
{
static const WCHAR dot_ppd[] = {'.','p','p','d',0};
@@ -1039,7 +957,7 @@ static BOOL get_cups_ppd( const char *printer_name, const WCHAR *ppd )
TRACE( "failed to get ppd for printer %s from cups (status %d), calling fallback\n",
debugstr_a(printer_name), http_status );
- return get_fallback_ppd( printer_name, ppd );
+ return get_internal_fallback_ppd( ppd );
}
static WCHAR *get_cups_option( const char *name, int num_options, cups_option_t *options )
@@ -1106,17 +1024,11 @@ static BOOL CUPS_LoadPrinters(void)
continue;
}
- port = HeapAlloc(GetProcessHeap(), 0, sizeof(CUPS_Port) + lstrlenW(nameW) * sizeof(WCHAR));
- lstrcpyW(port, CUPS_Port);
- lstrcatW(port, nameW);
-
if(RegOpenKeyW(hkeyPrinters, nameW, &hkeyPrinter) == ERROR_SUCCESS) {
DWORD status = get_dword_from_reg( hkeyPrinter, StatusW );
/* Printer already in registry, delete the tag added in WINSPOOL_LoadSystemPrinters
and continue */
TRACE("Printer already exists\n");
- /* overwrite old LPR:* port */
- RegSetValueExW(hkeyPrinter, PortW, 0, REG_SZ, (LPBYTE)port, (lstrlenW(port) + 1) * sizeof(WCHAR));
RegDeleteValueW(hkeyPrinter, May_Delete_Value);
/* flag that the PPD file should be checked for an update */
set_reg_DWORD( hkeyPrinter, StatusW, status | PRINTER_STATUS_DRIVER_UPDATE_NEEDED );
@@ -1124,11 +1036,8 @@ static BOOL CUPS_LoadPrinters(void)
} else {
BOOL added_driver = FALSE;
- if (!ppd_dir && !(ppd_dir = get_ppd_dir()))
- {
- HeapFree( GetProcessHeap(), 0, port );
- break;
- }
+ if (!ppd_dir && !(ppd_dir = get_ppd_dir())) break;
+
ppd = get_ppd_filename( ppd_dir, nameW );
if (get_cups_ppd( dests[i].name, ppd ))
{
@@ -1136,11 +1045,11 @@ static BOOL CUPS_LoadPrinters(void)
unlink_ppd( ppd );
}
HeapFree( GetProcessHeap(), 0, ppd );
- if (!added_driver)
- {
- HeapFree( GetProcessHeap(), 0, port );
- continue;
- }
+ if (!added_driver) continue;
+
+ port = heap_alloc( sizeof(CUPS_Port) + lstrlenW( nameW ) * sizeof(WCHAR) );
+ lstrcpyW( port, CUPS_Port );
+ lstrcatW( port, nameW );
memset(&pi2, 0, sizeof(PRINTER_INFO_2W));
pi2.pPrinterName = nameW;
@@ -1159,10 +1068,10 @@ static BOOL CUPS_LoadPrinters(void)
else if (GetLastError() != ERROR_PRINTER_ALREADY_EXISTS)
ERR( "printer '%s' not added by AddPrinter (error %d)\n", debugstr_w(nameW), GetLastError() );
+ heap_free( port );
HeapFree( GetProcessHeap(), 0, pi2.pComment );
HeapFree( GetProcessHeap(), 0, pi2.pLocation );
}
- HeapFree( GetProcessHeap(), 0, port );
hadprinter = TRUE;
if (dests[i].is_default) {
@@ -1292,7 +1201,7 @@ static BOOL update_driver( HANDLE printer )
ret = get_cups_ppd( queue_name, ppd );
else
#endif
- ret = get_fallback_ppd( queue_name, ppd );
+ ret = get_internal_fallback_ppd( ppd );
if (ret)
{
@@ -1312,199 +1221,6 @@ static BOOL update_driver( HANDLE printer )
return ret;
}
-static BOOL PRINTCAP_ParseEntry( const char *pent, BOOL isfirst )
-{
- PRINTER_INFO_2A pinfo2a;
- const char *r;
- size_t name_len;
- char *e,*s,*name,*prettyname,*devname;
- BOOL ret = FALSE, set_default = FALSE;
- char *port = NULL, *env_default;
- HKEY hkeyPrinter, hkeyPrinters = NULL;
- WCHAR devnameW[MAX_PATH], *ppd_dir = NULL, *ppd;
- HANDLE added_printer;
-
- while (isspace(*pent)) pent++;
- r = strchr(pent,':');
- if (r)
- name_len = r - pent;
- else
- name_len = strlen(pent);
- name = HeapAlloc(GetProcessHeap(), 0, name_len + 1);
- memcpy(name, pent, name_len);
- name[name_len] = '\0';
- if (r)
- pent = r;
- else
- pent = "";
-
- TRACE("name=%s entry=%s\n",name, pent);
-
- if(ispunct(*name)) { /* a tc entry, not a real printer */
- TRACE("skipping tc entry\n");
- goto end;
- }
-
- if(strstr(pent,":server")) { /* server only version so skip */
- TRACE("skipping server entry\n");
- goto end;
- }
-
- /* Determine whether this is a postscript printer. */
-
- ret = TRUE;
- env_default = getenv("PRINTER");
- prettyname = name;
- /* Get longest name, usually the one at the right for later display. */
- while((s=strchr(prettyname,'|'))) {
- *s = '\0';
- e = s;
- while(isspace(*--e)) *e = '\0';
- TRACE("\t%s\n", debugstr_a(prettyname));
- if(env_default && !_strnicmp(prettyname, env_default, -1)) set_default = TRUE;
- for(prettyname = s+1; isspace(*prettyname); prettyname++)
- ;
- }
- e = prettyname + strlen(prettyname);
- while(isspace(*--e)) *e = '\0';
- TRACE("\t%s\n", debugstr_a(prettyname));
- if(env_default && !_strnicmp(prettyname, env_default, -1)) set_default = TRUE;
-
- /* prettyname must fit into the dmDeviceName member of DEVMODE struct,
- * if it is too long, we use it as comment below. */
- devname = prettyname;
- if (strlen(devname)>=CCHDEVICENAME-1)
- devname = name;
- if (strlen(devname)>=CCHDEVICENAME-1) {
- ret = FALSE;
- goto end;
- }
-
- port = HeapAlloc(GetProcessHeap(),0,strlen("LPR:")+strlen(name)+1);
- sprintf(port,"LPR:%s",name);
-
- if(RegCreateKeyW(HKEY_LOCAL_MACHINE, PrintersW, &hkeyPrinters) !=
- ERROR_SUCCESS) {
- ERR("Can't create Printers key\n");
- ret = FALSE;
- goto end;
- }
-
- MultiByteToWideChar(CP_ACP, 0, devname, -1, devnameW, ARRAY_SIZE(devnameW));
-
- if(RegOpenKeyA(hkeyPrinters, devname, &hkeyPrinter) == ERROR_SUCCESS) {
- DWORD status = get_dword_from_reg( hkeyPrinter, StatusW );
- /* Printer already in registry, delete the tag added in WINSPOOL_LoadSystemPrinters
- and continue */
- TRACE("Printer already exists\n");
- RegDeleteValueW(hkeyPrinter, May_Delete_Value);
- /* flag that the PPD file should be checked for an update */
- set_reg_DWORD( hkeyPrinter, StatusW, status | PRINTER_STATUS_DRIVER_UPDATE_NEEDED );
- RegCloseKey(hkeyPrinter);
- } else {
- static CHAR data_type[] = "RAW",
- print_proc[] = "WinPrint",
- comment[] = "WINEPS Printer using LPR",
- params[] = "<parameters?>",
- share_name[] = "<share name?>",
- sep_file[] = "<sep file?>";
- BOOL added_driver = FALSE;
-
- if (!ppd_dir && !(ppd_dir = get_ppd_dir())) goto end;
- ppd = get_ppd_filename( ppd_dir, devnameW );
- if (get_fallback_ppd( devname, ppd ))
- {
- added_driver = add_printer_driver( devnameW, ppd );
- unlink_ppd( ppd );
- }
- HeapFree( GetProcessHeap(), 0, ppd );
- if (!added_driver) goto end;
-
- memset(&pinfo2a,0,sizeof(pinfo2a));
- pinfo2a.pPrinterName = devname;
- pinfo2a.pDatatype = data_type;
- pinfo2a.pPrintProcessor = print_proc;
- pinfo2a.pDriverName = devname;
- pinfo2a.pComment = comment;
- pinfo2a.pLocation = prettyname;
- pinfo2a.pPortName = port;
- pinfo2a.pParameters = params;
- pinfo2a.pShareName = share_name;
- pinfo2a.pSepFile = sep_file;
-
- added_printer = AddPrinterA( NULL, 2, (LPBYTE)&pinfo2a );
- if (added_printer) ClosePrinter( added_printer );
- else if (GetLastError() != ERROR_PRINTER_ALREADY_EXISTS)
- ERR( "printer '%s' not added by AddPrinter (error %d)\n", debugstr_a(name), GetLastError() );
- }
-
- if (isfirst || set_default)
- set_default_printer(devname, name);
-
- end:
- if (hkeyPrinters) RegCloseKey( hkeyPrinters );
- if (ppd_dir)
- {
- RemoveDirectoryW( ppd_dir );
- HeapFree( GetProcessHeap(), 0, ppd_dir );
- }
- HeapFree(GetProcessHeap(), 0, port);
- HeapFree(GetProcessHeap(), 0, name);
- return ret;
-}
-
-static BOOL
-PRINTCAP_LoadPrinters(void) {
- BOOL hadprinter = FALSE;
- char buf[200];
- FILE *f;
- char *pent = NULL;
- BOOL had_bash = FALSE;
-
- f = fopen("/etc/printcap","r");
- if (!f)
- return FALSE;
-
- while(fgets(buf,sizeof(buf),f)) {
- char *start, *end;
-
- end=strchr(buf,'\n');
- if (end) *end='\0';
-
- start = buf;
- while(isspace(*start)) start++;
- if(*start == '#' || *start == '\0')
- continue;
-
- if(pent && !had_bash && *start != ':' && *start != '|') { /* start of new entry, parse the previous one */
- hadprinter |= PRINTCAP_ParseEntry(pent,!hadprinter);
- HeapFree(GetProcessHeap(),0,pent);
- pent = NULL;
- }
-
- if (end && *--end == '\\') {
- *end = '\0';
- had_bash = TRUE;
- } else
- had_bash = FALSE;
-
- if (pent) {
- pent=HeapReAlloc(GetProcessHeap(),0,pent,strlen(pent)+strlen(start)+1);
- strcat(pent,start);
- } else {
- pent=HeapAlloc(GetProcessHeap(),0,strlen(start)+1);
- strcpy(pent,start);
- }
-
- }
- if(pent) {
- hadprinter |= PRINTCAP_ParseEntry(pent,!hadprinter);
- HeapFree(GetProcessHeap(),0,pent);
- }
- fclose(f);
- return hadprinter;
-}
-
static inline DWORD set_reg_szW(HKEY hkey, const WCHAR *keyname, const WCHAR *value)
{
if (value)
@@ -1783,7 +1499,6 @@ void WINSPOOL_LoadSystemPrinters(void)
HKEY hkey, hkeyPrinters;
DWORD needed, num, i;
WCHAR PrinterName[256];
- BOOL done = FALSE;
/* FIXME: The init code should be moved to spoolsv.exe */
init_mutex = CreateMutexW( NULL, TRUE, winspool_mutex_name );
@@ -1823,12 +1538,9 @@ void WINSPOOL_LoadSystemPrinters(void)
old_printer_check( FALSE );
#ifdef SONAME_LIBCUPS
- done = CUPS_LoadPrinters();
+ CUPS_LoadPrinters();
#endif
- if(!done) /* If we have any CUPS based printers, skip looking for printcap printers */
- PRINTCAP_LoadPrinters();
-
old_printer_check( TRUE );
ReleaseMutex( init_mutex );
--
2.23.0