From c0a23db4a25851d7b09d822ed22d612210309619 Mon Sep 17 00:00:00 2001 From: Till Kamppeter Date: Sat, 1 Feb 2003 04:34:00 +0000 Subject: - Completed support for pre-compiled Foomatic PPDs. - Cleaning of mamufacturer names for menues and for comparing auto-dtected data against Foomatic centralized in one function. - Fixed file name in check for installed packages. - Fixed display of boolean options from native PostScript PPD files in the option setting dialog. --- perl-install/printer/data.pm | 2 +- perl-install/printer/main.pm | 148 ++++++++++++++++++++++++++--------- perl-install/printer/printerdrake.pm | 27 +++---- 3 files changed, 124 insertions(+), 53 deletions(-) (limited to 'perl-install') diff --git a/perl-install/printer/data.pm b/perl-install/printer/data.pm index 651cc10b5..07f85fb6a 100644 --- a/perl-install/printer/data.pm +++ b/perl-install/printer/data.pm @@ -76,7 +76,7 @@ our %spoolers = ('pdq' => { $::isInstall ? 'curl' : 'webfetch'], [ qw(/usr/lib/cups/cgi-bin/printers.cgi /sbin/ifconfig - /usr/bin/xpp, + /usr/bin/xpp /usr/share/cups/model/postscript.ppd.gz), $::isInstall ? '/usr/bin/curl' : '/usr/bin/wget' ] ], 'alternatives' => [ diff --git a/perl-install/printer/main.pm b/perl-install/printer/main.pm index 6ff1163eb..c919287bd 100644 --- a/perl-install/printer/main.pm +++ b/perl-install/printer/main.pm @@ -1351,6 +1351,32 @@ sub get_direct_uri { @direct_uri; } +sub clean_manufacturer_name { + my ($make) = @_; + # Clean some manufacturer's names so that every manufacturer has only + # one entry in the tree list + $make =~ s/^CANON\W.*$/CANON/i; + $make =~ s/^LEXMARK.*$/LEXMARK/i; + $make =~ s/^HEWLETT?[\s\-]*PACKARD/HP/i; + $make =~ s/^SEIKO[\s\-]*EPSON/EPSON/i; + $make =~ s/^KYOCERA[\s\-]*MITA/KYOCERA/i; + $make =~ s/^CITOH/C.ITOH/i; + $make =~ s/^OKI(|[\s\-]*DATA)/OKIDATA/i; + $make =~ s/^(SILENTWRITER2?|COLORMATE)/NEC/i; + $make =~ s/^(XPRINT|MAJESTIX)/XEROX/i; + $make =~ s/^QMS-PS/QMS/i; + $make =~ s/^(PERSONAL|LASERWRITER)/APPLE/i; + $make =~ s/^DIGITAL/DEC/i; + $make =~ s/\s+Inc\.//i; + $make =~ s/\s+Corp\.//i; + $make =~ s/\s+SA\.//i; + $make =~ s/\s+S\.\s*A\.//i; + $make =~ s/\s+Ltd\.//i; + $make =~ s/\s+International//i; + $make =~ s/\s+Int\.//i; + return $make; +} + sub ppd_entry_str { my ($mf, $descr, $lang) = @_; my ($model, $driver); @@ -1370,7 +1396,11 @@ sub ppd_entry_str { # Split model and driver $descr =~ s/\s*Series//i; $descr =~ s/\((.*?(PostScript|PS.*).*?)\)/$1/i; - if (($descr =~ /^([^,]+[^,\s])\s*(\(v?\d\d\d\d\.\d\d\d\).*)$/i) || + if (($descr =~ + /^\s*(Generic\s*PostScript\s*Printer)\s*,?\s*(.*)$/i) || + ($descr =~ + /^\s*(PostScript\s*Printer)\s*,?\s*(.*)$/i) || + ($descr =~ /^([^,]+[^,\s])\s*(\(v?\d\d\d\d\.\d\d\d\).*)$/i) || ($descr =~ /^([^,]+[^,\s])\s+(PS.*)$/i) || ($descr =~ /^([^,]+[^,\s])\s*(PostScript.*)$/i) || ($descr =~ /^([^,]+[^,\s])\s*(v\d+\.\d+.*)$/i) || @@ -1396,20 +1426,27 @@ sub ppd_entry_str { $driver = "PostScript"; } } + # Remove manufacturer's name from the beginning of the model + # name (do not do this with manufacturer names which contain + # odd characters) + $model =~ s/^$mf[\s\-]+//i + if ($mf and ($mf !~ /[\\\/\(\)\[\]\|\.\$\@\%\*\?]/)); + # Clean some manufacturer's names + $mf = clean_manufacturer_name($mf); # Rename Canon "BJC XXXX" models into "BJC-XXXX" so that the # models do not appear twice if ($mf eq "CANON") { $model =~ s/BJC\s+/BJC-/; } - # Remove manufacturer's name from the beginning of the model - # name - $model =~ s/^$mf[\s\-]+// if $mf; - # Clean some manufacturer's names - $mf =~ s/^HEWLETT[\s\-]*PACKARD/HP/i; - $mf =~ s/^SEIKO[\s\-]*EPSON/EPSON/i; - $mf =~ s/^KYOCERA[\s\-]*MITA/KYOCERA/i; - $mf =~ s/^CITOH/C.ITOH/i; - $mf =~ s/^OKI([\s\-]*DATA|)/OKIDATA/i; + # New MF devices from Epson have mis-spelled name in PPD files for + # native CUPS drivers of GIMP-Print + if ($mf eq "EPSON") { + $model =~ s/Stylus CX\-/Stylus CX/; + } + # Try again to remove manufacturer's name from the beginning of the + # model name, this with the cleaned manufacturer name + $model =~ s/^$mf[\s\-]+//i + if ($mf and ($mf !~ /[\\\/\(\)\[\]\|\.\$\@\%\*\?]/)); # Put out the resulting description string uc($mf) . '|' . $model . '|' . $driver . ($lang && " (" . lc(substr($lang, 0, 2)) . ")"); @@ -1483,29 +1520,38 @@ sub poll_ppd_base { my $key = ppd_entry_str($mf, $descr, $lang); $key =~ /^[^\|]+\|([^\|]+)\|(.*)$/; my ($model, $driver) = ($1, $2); + # Clean some manufacturer's names + $mf = clean_manufacturer_name($mf); # Remove language tag - $driver =~ s/\s*\([a-z]{2}(|_[A-Z]{2})\s*$//; + $driver =~ s/\s*\([a-z]{2}(|_[A-Z]{2})\)\s*$//; + # Recommended Foomatic PPD? Extract "(recommended)" + my $isrecommended = + ($driver =~ s/\s+\(recommended\)\s*$//i); # Remove trailing white space $driver =~ s/\s+$//; + # For Foomatic: Driver with "GhostScript + " + my $fullfoomaticdriver = $driver; # Foomatic PPD? Extract driver name my $isfoomatic = ($driver =~ s/^\s*(GhostScript|Foomatic)\s*\+\s*//i); - # Recommended Foomatic PPD? Extract "(recommended)" - my $isrecommended = ($driver =~ s/^\s+\(rcommended\)$//i); # Foomatic PostScript driver? - $isfoomatic ||= ($driver =~ /^PostScript$/i); + $isfoomatic ||= ($descr =~ /Foomatic/i); # Native CUPS? my $isnativecups = ($driver =~ /CUPS/i); # Native PostScript my $isnativeps = (!$isfoomatic and !$isnativecups); - print "#####$key###|$driver|$isnativeps|$isrecommended|\n"; - if (!$isfoomatic) { - $driver = "PPD"; - } # Key without language tag (key as it was produced for the # entries from the Foomatic XML database) my $keynolang = $key; - $keynolang =~ s/\s*\([a-z]{2}(|_[A-Z]{2})\s*$//; + $keynolang =~ s/\s*\([a-z]{2}(|_[A-Z]{2})\)\s*$//; + if (!$isfoomatic) { + # Driver is PPD when the PPD is a non-Foomatic one + $driver = "PPD"; + } else { + # Remove language tag in menu entry when PPD is from + # Foomatic + $key = $keynolang; + } if (!$::expert) { # Remove driver from printer list entry when in # recommended mode @@ -1535,6 +1581,16 @@ sub poll_ppd_base { # Remove the old entry delete $thedb{$key}; } + } elsif (((defined + $thedb{"$mf|$model|$fullfoomaticdriver"}) || + (defined + $thedb{"$mf|$model|$fullfoomaticdriver (recommended)"})) && + ($isfoomatic)) { + # Expert mode: There is already an entry for the + # same printer/driver combo produced by the + # Foomatic XML database, so do not make a second + # entry + next; } elsif (defined $thedb{"$mf|$model|PostScript (recommended)"} && ($isnativeps)) { @@ -1548,28 +1604,48 @@ sub poll_ppd_base { } delete $thedb{"$mf|$model|PostScript (recommended)"}; - $key .= " (recommended)"; - } elsif (($key =~ /PostScript\s*\(recommended\)/i) && - (my @nativepskeys = grep { + if (!$isrecommended) { + $key .= " (recommended)"; + } + } elsif (($driver =~ /PostScript/i) && + $isrecommended && $isfoomatic && + (my @foundkeys = grep { /^$mf\|$model\|/ && !/CUPS/i && $thedb{$_}{driver} eq "PPD" } keys %thedb)) { # Expert mode: "Foomatic + Postscript" driver is # recommended and there was a PostScript PPD? Make - # this PPD the recommended one - my $firstnativeps = $nativepskeys[0]; - for (keys %{$thedb{$firstnativeps}}) { - $thedb{"$firstnativeps (recommended)"}{$_} = - $thedb{$firstnativeps}{$_}; + # the PostScript PPD the recommended one + my $firstfound = $foundkeys[0]; + if (!(grep {/\(recommended\)/} @foundkeys)) { + # Do it only if none of the native PostScript + # PPDs for this printer is already "recommended" + for (keys %{$thedb{$firstfound}}) { + $thedb{"$firstfound (recommended)"}{$_} = + $thedb{$firstfound}{$_}; + } + delete $thedb{$firstfound}; } - delete $thedb{$firstnativeps}; $key =~ s/\s*\(recommended\)//; - } elsif (defined $thedb{"$keynolang"} && ($isfoomatic)) { - # Expert mode: There is already an entry for the - # same printer/driver combo produced by the - # Foomatic XML database, so do not make a second - # entry - next; + } elsif (($driver !~ /PostScript/i) && + $isrecommended && $isfoomatic && + (my @foundkeys = grep { + /^$mf\|$model\|.*\(recommended\)/ && + !/CUPS/i && $thedb{$_}{driver} eq "PPD" + } keys %thedb)) { + # Expert mode: Foomatic driver other than "Foomatic + + # Postscript" is recommended and there was a PostScript + # PPD which was recommended? Make The Foomatic driver + # the recommended one + foreach my $sourcekey (@foundkeys) { + # Remove the "recommended" tag + my $destkey = $sourcekey; + $destkey =~ s/\s+\(recommended\)\s*$//i; + for (keys %{$thedb{$sourcekey}}) { + $thedb{$destkey}{$_} = $thedb{$sourcekey}{$_}; + } + delete $thedb{$sourcekey}; + } } $thedb{$key}{ppd} = $ppd; $thedb{$key}{make} = $mf; @@ -1587,10 +1663,6 @@ sub poll_ppd_base { #- before. sleep 1; } -# Only for debugging, will be removed before MDK 9.1 -# print map { -# "##### |$_|$thedb{$_}{make}|$thedb{$_}{model}|$thedb{$_}{driver}|\n"; -# } keys %thedb #scalar(keys %descr_to_ppd) > 5 or # die "unable to connect to cups server"; diff --git a/perl-install/printer/printerdrake.pm b/perl-install/printer/printerdrake.pm index 56d214eb1..7f502dc1f 100644 --- a/perl-install/printer/printerdrake.pm +++ b/perl-install/printer/printerdrake.pm @@ -1650,26 +1650,24 @@ sub setup_common { ($_->{val}{MANUFACTURER}, $_->{val}{MODEL}, $_->{val}{DESCRIPTION}, $_->{val}{'COMMAND SET'}, $_->{val}{SKU}); + # Clean some manufacturer's names + my $descrmake = printer::main::clean_manufacturer_name($automake); if ($automake && $autosku) { - $descr = "$automake|$autosku"; + $descr = "$descrmake|$autosku"; } elsif ($automake && $automodel) { - $descr = "$automake|$automodel"; + $descr = "$descrmake|$automodel"; } else { $descr = $autodescr; $descr =~ s/ /\|/; } - $descr =~ s/^$automake\|\s*$automake\s*/$automake\|/; + # Remove manufacturer's name from the beginning of the + # description (do not do this with manufacturer names which + # contain odd characters) + $descr =~ s/^$descrmake\|\s*$descrmake\s*/$descrmake\|/i + if ($descrmake and + ($descrmake !~ /[\\\/\(\)\[\]\|\.\$\@\%\*\?]/)); # Clean up the description from noise which makes the best match # difficult - $descr =~ s/Seiko\s+Epson/Epson/i; - $descr =~ s/Kyocera[\s\-]*Mita/Kyocera/i; - $descr =~ s/\s+Inc\.//i; - $descr =~ s/\s+Corp\.//i; - $descr =~ s/\s+SA\.//i; - $descr =~ s/\s+S\.\s*A\.//i; - $descr =~ s/\s+Ltd\.//i; - $descr =~ s/\s+International//i; - $descr =~ s/\s+Int\.//i; $descr =~ s/\s+[Ss]eries//i; $descr =~ s/\s+\(?[Pp]rinter\)?$//i; $printer->{DBENTRY} = ""; @@ -2340,9 +2338,10 @@ sub setup_options { } elsif ($printer->{ARGS}[$i]{type} eq 'bool') { # boolean option push(@choicelists, [($printer->{ARGS}[$i]{comment_true} || - $printer->{ARGS}[$i]{name}), + $printer->{ARGS}[$i]{name} || "Yes"), ($printer->{ARGS}[$i]{comment_false} || - $printer->{ARGS}[$i]{name_false})]); + $printer->{ARGS}[$i]{name_false} || + "No")]); push(@shortchoicelists, []); my $numdefault = ($optshortdefault =~ m!^\s*(true|on|yes|1)\s*$! ? -- cgit v1.2.1