summaryrefslogtreecommitdiffstats
path: root/perl-install/scanner.pm
diff options
context:
space:
mode:
Diffstat (limited to 'perl-install/scanner.pm')
-rwxr-xr-xperl-install/scanner.pm134
1 files changed, 134 insertions, 0 deletions
diff --git a/perl-install/scanner.pm b/perl-install/scanner.pm
new file mode 100755
index 000000000..3803a206e
--- /dev/null
+++ b/perl-install/scanner.pm
@@ -0,0 +1,134 @@
+#!/usr/bin/perl
+
+# scanner.pm $Id$
+# Yves Duret <yduret at mandrakesoft.com>
+# Copyright (C) 2001 MandrakeSoft
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# pbs/TODO:
+# - no scsi support
+# - devfs use dev_is_devfs()
+# - with 2 scanners same manufacturer -> will overwrite previous conf -> only 1 conf !!
+# - lp: see printerdrake
+# - install: prefix ??
+
+package scanner;
+use lib qw(/usr/lib/libDrakX);
+use standalone;
+use common;
+use detect_devices;
+
+
+my $_sanedir = "/etc/sane.d";
+my $_scannerDBdir = "$ENV{SHARE_PATH}/ldetect-lst";
+$scannerDB = readScannerDB("$_scannerDBdir/ScannerDB");
+
+sub confScanner {
+ my ($model, $port) = @_;
+ $port = detect_devices::dev_is_devfs() ? "/dev/usb/scanner0" : "/dev/scanner" if (!$port);
+ my $a = $scannerDB->{$model}{server};
+ output("$_sanedir/$a.conf", (join "\n",@{$scannerDB->{$model}{lines}}));
+ substInFile {s/\$DEVICE/$port/} "$_sanedir/$a.conf";
+ add2dll($a);
+}
+
+sub add2dll {
+ return if member($_[0], chomp_(cat_("$_sanedir/dll.conf")));
+ local *F;
+ open F, ">>$_sanedir/dll.conf" or die "can't write SANE config in $_sanedir/dll.conf: $!";
+ print F $_[0];
+ close F;
+}
+
+sub findScannerUsbport {
+ my ($i, $elem, @res) = (0, {});
+ foreach (grep { $_->{driver} =~ /scanner/ } detect_devices::usb_probe()) {
+ #my ($manufacturer, $model) = split '\|', $_->{description};
+ #$_->{description} =~ s/Hewlett[-\s_]Packard/HP/;
+ push @res, { port => "/dev/usb/scanner$i", val => { #CLASS => 'SCANNER',
+ #MODEL => $model,
+ #MANUFACTURER => $manufacturer,
+ DESCRIPTION => $_->{description},
+ #id => $_->{id},
+ #vendor => $_->{vendor},
+ }};
+ ++$i;
+ }
+ @res;
+}
+
+sub readScannerDB {
+ my ($file) = @_;
+ my ($card, %cards);
+
+ my $F = common::openFileMaybeCompressed($file);
+
+ my ($lineno, $cmd, $val) = 0;
+ my $fs = {
+ LINE => sub { push @{$card->{lines}}, $val },
+ NAME => sub {
+ $cards{$card->{type}} = $card if $card;
+ $card = { type => $val };
+ },
+ SEE => sub {
+ my $c = $cards{$val} or die "Error in database, invalid reference $val at line $lineno";
+
+ push @{$card->{lines}}, @{$c->{lines} || []};
+ add2hash($card->{flags}, $c->{flags});
+ add2hash($card, $c);
+ },
+ SERVER => sub { $card->{server} = $val; },
+ DRIVER => sub { $card->{driver} = $val; },
+ UNSUPPORTED => sub { $card->{flags}{unsupported} = 1 },
+ COMMENT => sub {},
+ };
+
+ local $_;
+ while (<$F>) { $lineno++;
+ s/\s+$//;
+ /^#/ and next;
+ /^$/ and next;
+ /^END/ and do { $cards{$card->{type}} = $card if $card; last };
+ ($cmd, $val) = /(\S+)\s*(.*)/ or next; #log::l("bad line $lineno ($_)"), next;
+ my $f = $fs->{$cmd};
+ $f ? $f->() : log::l("unknown line $lineno ($_)");
+ }
+ \%cards;
+}
+
+sub updateScannerDBfromUsbtable {
+ substInFile {s/END//} "ScannerDB";
+ local *F;
+ open F, ">>ScannerDB" or die "can't write ScannerDB config in ScannerDB: $!";
+ foreach (cat_("$ENV{SHARE_PATH}/ldetect-lst/usbtable")) {
+ my (undef, undef, $mod, $name) = chomp_(split /\s/,$_,4);
+ next unless ($mod eq "\"scanner\"");
+ $name =~ s/\"(.*)\"$/$1/;
+ if (member($name, keys %$scanner::scannerDB)) {
+ print "$name already in ScannerDB\n";
+ next;
+ }
+ print F "NAME $name\nDRIVER usb\nUNSUPPORTED\n\n";
+ }
+ print F "END\n";
+ close F;
+}
+
+#-----------------------------------------------
+# $Log$
+# Revision 1.1 2001/10/10 12:44:59 yduret
+# *** empty log message ***
+#