diff options
-rwxr-xr-x | perl-install/scanner.pm | 13 | ||||
-rwxr-xr-x | perl-install/standalone/scannerdrake | 73 |
2 files changed, 80 insertions, 6 deletions
diff --git a/perl-install/scanner.pm b/perl-install/scanner.pm index 34ecb01b9..85341e10c 100755 --- a/perl-install/scanner.pm +++ b/perl-install/scanner.pm @@ -34,7 +34,7 @@ my $scannerDBdir = "$::prefix$ENV{SHARE_PATH}/ldetect-lst"; our $scannerDB = readScannerDB("$scannerDBdir/ScannerDB"); sub confScanner { - my ($model, $port, $vendor, $product) = @_; + my ($model, $port, $vendor, $product, $firmware) = @_; $port ||= detect_devices::dev_is_devfs() ? "$::prefix/dev/usb/scanner0" : "$::prefix/dev/scanner"; my $a = $scannerDB->{$model}{server}; #print "file:[$a]\t[$model]\t[$port]\n| ", (join "\n| ", @{$scannerDB->{$model}{lines}}),"\n"; @@ -47,11 +47,13 @@ sub confScanner { next if $line =~ /\$VENDOR/; $line =~ s/\$PRODUCT/$product/g if $product; next if $line =~ /\$PRODUCT/; + $line =~ s/\$FIRMWARE/$firmware/g if $firmware; + next if $line =~ /\$FIRMWARE/; my $linetype; if ($line =~ /^(\S*)LINE\s+(.*?)$/) { - $linetype = $1; - $line = $2; - } + $linetype = $1; + $line = $2; + } next if !$line; if (!$linetype || ($linetype eq "USB" && ($port =~ /usb/i || $vendor)) || @@ -60,6 +62,8 @@ sub confScanner { ($linetype eq "SCSI" && !$vendor && $port =~ m!(/sg|scsi|/scanner)!i)) { handle_configs::set_directive(\@driverconf, $line, 1); + } elsif ($linetype eq "FIRMWARE" && $firmware) { + handle_configs::set_directive(\@driverconf, $line, 0); } } output("$sanedir/$a.conf", @driverconf); @@ -370,6 +374,7 @@ sub readScannerDB { SCSILINE => sub { push @{$card->{lines}}, "SCSILINE $val" }, USBLINE => sub { push @{$card->{lines}}, "USBLINE $val" }, PARPORTLINE => sub { push @{$card->{lines}}, "PARPORTLINE $val" }, + FIRMWARELINE => sub { push @{$card->{lines}}, "FIRMWARELINE $val" }, NAME => sub { #$cards{$card->{type}} = $card if ($card and !$card->{flags}{unsupported}); $cards{$card->{type}} = $card if $card; diff --git a/perl-install/standalone/scannerdrake b/perl-install/standalone/scannerdrake index 3cdf44302..1e1b3b086 100755 --- a/perl-install/standalone/scannerdrake +++ b/perl-install/standalone/scannerdrake @@ -144,13 +144,77 @@ sub dynamic() { next; } scanner::confScanner($name, $_->{port}, - $_->{val}{vendor}, $_->{val}{id}); + $_->{val}{vendor}, $_->{val}{id}, ""); } else { $in->ask_warn('Scannerdrake', N("The %s is not known by this version of Scannerdrake.", removeverticalbar($name))); } } } +sub installfirmware { + my ($model) = @_; + my $firmware; + my $choice = N("Do not install firmware file"); + while (1) { + # Tell user about firmware installation + $in->ask_from('Scannerdrake', + N("It is possible that your %s needs its Firmware to be uploaded everytime when it is turned on.", removeverticalbar($model)) . " " . + N("If this is the case, you can make this be done automatically for you.") . " " . + N("To do so, you need to supply the firmware file for your scanner so that it can be installed.") . " " . + N("You find the file on the CD or floppy coming with the scanner, on the manufacturer's home page, or on your Windows partition."), + [ + { label => N("Install firmware file from"), + val => \$choice, + list => [N("CD-ROM"), + N("Floppy Disk"), + N("Other place"), + N("Do not install firmware file")], + not_edit => 1, sort => 0 }, + ], + ) or return "///"; + my $dir; + if ($choice eq N("CD-ROM")) { + $dir = "/mnt/cdrom"; + } elsif ($choice eq N("Floppy Disk")) { + $dir = "/mnt/floppy"; + } elsif ($choice eq N("Other place")) { + $dir = "/mnt"; + } else { + return ""; + } + # Let user select a firmware file from a floppy, hard disk, ... + $firmware = $in->ask_file(N("Select firmware file"), "$dir"); + last if !$firmware || (-r $firmware); + $in->ask_warn('Scannerdrake', + N("The firmware file %s does not exist or is unreadable!", + $firmware)); + + } + if ($firmware) { + # Install firmware + run_program::rooted($::prefix, "mkdir", "-p", + "/usr/share/sane/firmware") || do { + $in->ask_warn('Scannerdrake', + N("Could not create directory /usr/share/sane/firmware!")); + return ""; + }; + run_program::rooted($::prefix, "cp", "-f", "$firmware", + "/usr/share/sane/firmware") || do { + $in->ask_warn('Scannerdrake', + N("Could not copy firmware file %s to /usr/share/sane/firmware!", $firmware)); + return ""; + }; + $firmware =~ s!^(.*)(/[^/]+)$!/usr/share/sane/firmware$2!; + run_program::rooted($::prefix, "chmod", "644", + $firmware) || do { + $in->ask_warn('Scannerdrake', + N("Could not set permissions of firmware file %s!", $firmware)); + return ""; + }; + } + return $firmware; +} + sub tryConfScanner { # take care if interactive output is needed (unsupported, parallel..) my ($model, $port, $vendor, $product) = @_; @@ -230,7 +294,12 @@ sub tryConfScanner { } } ($vendor, $product) = scanner::get_usb_ids_for_port($port); - scanner::confScanner($model, $port, $vendor, $product); + my $firmware; + if (grep { /FIRMWARELINE/ } @{$scanner::scannerDB->{$model}{lines}} ) { + $firmware = installfirmware($model); + return 0 if $firmware eq "///"; + } + scanner::confScanner($model, $port, $vendor, $product, $firmware); $in->ask_warn(N("Congratulations!"), N("Your %s has been configured.\nYou may now scan documents using \"XSane\" from Multimedia/Graphics in the applications menu.", removeverticalbar($model))); return 1; |