diff options
Diffstat (limited to 'perl-install/printerdrake.pm')
-rw-r--r-- | perl-install/printerdrake.pm | 1047 |
1 files changed, 607 insertions, 440 deletions
diff --git a/perl-install/printerdrake.pm b/perl-install/printerdrake.pm index e511fc1f6..70ef3e1a9 100644 --- a/perl-install/printerdrake.pm +++ b/perl-install/printerdrake.pm @@ -14,6 +14,132 @@ use printer; 1; +sub choose_printer_type { + my ($printer, $in) = @_; + $in->set_help('configurePrinterConnected') if $::isInstall; + my $queue = $printer->{OLD_QUEUE}; + $printer->{str_type} = $printer::printer_type_inv{$printer->{TYPE}}; + $printer->{str_type} = + $in->ask_from_list_(_("Select Printer Connection"), + _("How is the printer connected?") . + ($printer->{SPOOLER} eq "cups" ? + _(" +Printers on remote CUPS servers you do not have to configure +here; these printers will be automatically detected. In case +of doubt, select \"Printer on remote CUPS server\".") : ()), + [ printer::printer_type($printer) ], + $printer->{str_type}, + ) or return 0; + $printer->{TYPE} = $printer::printer_type{$printer->{str_type}}; + 1; +} + +sub setup_remote_cups_server { + my ($printer, $in) = @_; + $in->set_help('configureRemoteCUPSServer') if $::isInstall; + my $queue = $printer->{OLD_QUEUE}; + #- hack to handle cups remote server printing, + #- first read /etc/cups/cupsd.conf for variable BrowsePoll address:port + my @cupsd_conf = printer::read_cupsd_conf(); + my ($server, $port); + + foreach (@cupsd_conf) { + /^\s*BrowsePoll\s+(\S+)/ and $server = $1, last; + } + $server =~ /([^:]*):(.*)/ and ($server, $port) = ($1, $2); + + #- then ask user for this combination + #- and rewrite /etc/cups/cupsd.conf according to new settings. + #- there are no other point where such information is written in this file. + if ($in->ask_from_entries_refH + (_("Remote CUPS server"), +_("With a remote CUPS server, you do not have to configure +any printer here; printers will be automatically detected +unless you have a server on a different network; in the +latter case, you have to give the CUPS server IP address +and optionally the port number."), + [ + { label => _("CUPS server IP"), val => \$server }, + { label => _("Port"), val => \$port } ], + complete => sub { + unless (!$server || network::is_ip($server)) { + $in->ask_warn('', _("IP address should be in format 1.2.3.4")); + return (1,0); + } + if ($port !~ /^\d*$/) { + $in->ask_warn('', _("Port number should be numeric")); + return (1,1); + } + return 0; + }, + )) { + $server && $port and $server = "$server:$port"; + if ($server) { + @cupsd_conf = map { $server and s/^\s*BrowsePoll\s+(\S+)/BrowsePoll $server/ and $server = ''; + $_ } @cupsd_conf; + $server and push @cupsd_conf, "\nBrowsePoll $server\n"; + } else { + @cupsd_conf = map { s/^\s*BrowsePoll\s+(\S+)/\#BrowsePoll $1/; + $_ } @cupsd_conf; + } + printer::write_cupsd_conf(@cupsd_conf); + } else { + return 0; + } + 1; +} + +sub choose_printer_name { + my ($printer, $in) = @_; + # Name, description, location + my $queue = $printer->{OLD_QUEUE}; + $in->set_help('configurePrinterLocal') if $::isInstall; + $in->ask_from_entries_refH_powered + ( + { title => _("Enter Printer Name and Comments"), + #cancel => !$printer->{configured}{$queue} ? '' : _("Remove queue"), + callbacks => { complete => sub { + unless ($printer->{currentqueue}{'queue'} =~ /^\w+$/) { + $in->ask_warn('', _("Name of printer should contain only letters, numbers and the underscore")); + return (1,0); + } + return 0; + }, + }, + messages => +_("Every printer needs a name (for example lp). +The Description and Location fields do not need +to be filled in. They are comments for the users.") }, + [ + { label => _("Name of printer"), + val => \$printer->{currentqueue}{'queue'} }, + { label => _("Description"), + val => \$printer->{currentqueue}{'desc'} }, + { label => _("Location"), + val => \$printer->{currentqueue}{'loc'} }, + ]) or return 0; + + $printer->{QUEUE} = $printer->{currentqueue}{'queue'}; + 1; +} + +sub setup_printer_connection { + my ($printer, $in) = @_; + # Choose the appropriate connection config dialog + my $done = 1; + for ($printer->{TYPE}) { + /LOCAL/ and setup_local ($printer, $in) and last; + /LPD/ and setup_lpd ($printer, $in) and last; + /SOCKET/ and setup_socket ($printer, $in) and last; + /SMB/ and setup_smb ($printer, $in) and last; + /NCP/ and setup_ncp ($printer, $in) and last; + /URI/ and setup_uri ($printer, $in) and last; + /POSTPIPE/ and setup_postpipe ($printer, $in) and last; + $done = 0; last; + } + return $done; +} + sub auto_detect { my ($in) = @_; { @@ -64,7 +190,7 @@ _("What device is your printer connected to { label => _("Printer Device"), val => \$device, list => \@port, not_edit => !$::expert } ], complete => sub { unless ($device ne "") { - $in->ask_warn('', __("Device/file name missing!")); + $in->ask_warn('', _("Device/file name missing!")); return (1,0); } return 0; @@ -108,18 +234,18 @@ sub setup_lpd { } return if !$in->ask_from_entries_refH(_("Remote lpd Printer Options"), -__("To use a remote lpd print queue, you need to supply +_("To use a remote lpd print queue, you need to supply the hostname of the printer server and the queue name on that server."), [ { label => _("Remote hostname"), val => \$remotehost }, { label => _("Remote queue"), val => \$remotequeue } ], complete => sub { unless ($remotehost ne "") { - $in->ask_warn('', __("Remote host name missing!")); + $in->ask_warn('', _("Remote host name missing!")); return (1,0); } unless ($remotequeue ne "") { - $in->ask_warn('', __("Remote queue name missing!")); + $in->ask_warn('', _("Remote queue name missing!")); return (1,1); } return 0; @@ -203,11 +329,11 @@ complete => sub { return (1,1); } unless (($smbserver ne "") || ($smbserverip ne "")) { - $in->ask_warn('', __("Either the server name or the server's IP must be given!")); + $in->ask_warn('', _("Either the server name or the server's IP must be given!")); return (1,0); } unless ($smbshare ne "") { - $in->ask_warn('', __("Samba share name missing!")); + $in->ask_warn('', _("Samba share name missing!")); return (1,2); } return 0; @@ -274,11 +400,11 @@ wish to access and any applicable user name and password."), [ { label => _("Password"), val => \$ncppassword, hidden => 1 } ], complete => sub { unless ($ncpserver ne "") { - $in->ask_warn('', __("NCP server name missing!")); + $in->ask_warn('', _("NCP server name missing!")); return (1,0); } unless ($ncpqueue ne "") { - $in->ask_warn('', __("NCP queue name missing!")); + $in->ask_warn('', _("NCP queue name missing!")); return (1,1); } return 0; @@ -320,11 +446,11 @@ hostname of the printer and optionally the port number."), [ { label => _("Port"), val => \$remoteport } ], complete => sub { unless ($remotehost ne "") { - $in->ask_warn('', __("Printer host name missing!")); + $in->ask_warn('', _("Printer host name missing!")); return (1,0); } unless ($remoteport =~ /^[0-9]+$/) { - $in->ask_warn('', __("The port must be an integer number!")); + $in->ask_warn('', _("The port must be an integer number!")); return (1,1); } return 0; @@ -345,7 +471,7 @@ sub setup_uri { my ($printer, $in) = @_; return if !$in->ask_from_entries_refH(_("Printer Device URI"), -__("You can specify directly the URI to access the printer. The URI must fulfill either the CUPS or the Foomatic specifications. Not that not all URI types are supported by all the spoolers."), [ +_("You can specify directly the URI to access the printer. The URI must fulfill either the CUPS or the Foomatic specifications. Note that not all URI types are supported by all the spoolers."), [ { label => _("Printer Device URI"), val => \$printer->{currentqueue}{'connect'}, list => [ $printer->{currentqueue}{'connect'}, @@ -360,7 +486,7 @@ list => [ $printer->{currentqueue}{'connect'}, ], not_edit => 0 }, ], complete => sub { unless ($printer->{currentqueue}{'connect'} =~ /[^:]+:.+/) { - $in->ask_warn('', __("A valid URI must be entered!")); + $in->ask_warn('', _("A valid URI must be entered!")); return (1,0); } return 0; @@ -392,13 +518,13 @@ sub setup_postpipe { $commandline = ""; } - return if !$in->ask_from_entries_refH(__("Pipe into command"), -__("Here you can specify any arbitrary command line into which the job should be piped instead of being sent directly to a printer."), [ + return if !$in->ask_from_entries_refH(_("Pipe into command"), +_("Here you can specify any arbitrary command line into which the job should be piped instead of being sent directly to a printer."), [ { label => _("Command line"), val => \$commandline }, ], complete => sub { unless ($commandline ne "") { - $in->ask_warn('', __("A command line must be entered!")); + $in->ask_warn('', _("A command line must be entered!")); return (1,0); } return 0; @@ -411,306 +537,355 @@ complete => sub { 1; } -sub setup_gsdriver { - my ($printer, $in, $upNetwork) = @_; +sub get_db_entry { + my ($printer) = @_; #- Read the printer driver database if necessary if ((keys %printer::thedb) == 0) { printer::read_printer_db($printer->{SPOOLER}); } my $queue = $printer->{OLD_QUEUE}; - $in->set_help('configurePrinterType') if $::isInstall; - while (1) { - if ($printer->{configured}{$queue}) { - # The queue was already configured - if ($printer->{configured}{$queue}{'queuedata'}{'foomatic'}) { - # The queue was configured with Foomatic - my $driverstr; - if ($printer->{configured}{$queue}{'driver'} eq "Postscript") { - $driverstr = "PostScript"; - } else { - $driverstr = - "GhostScript + $printer->{configured}{$queue}{'driver'}"; - } - my $make = $printer->{configured}{$queue}{'make'}; - my $model = - $printer->{configured}{$queue}{'model'}; - if ($::expert) { - $printer->{DBENTRY} = "$make|$model|$driverstr"; - # database key contains te "(recommended)" for the - # recommended driver, so add it if necessary - if (!($printer::thedb{$printer->{DBENTRY}}{id})) { - $printer->{DBENTRY} .= " (recommended)"; - } - } else { - $printer->{DBENTRY} = "$make|$model"; - # Make sure that we use the recommended driver - $printer->{currentqueue}{'driver'} = - $printer::thedb{$printer->{DBENTRY}}{driver}; + if ($printer->{configured}{$queue}) { + # The queue was already configured + if ($printer->{configured}{$queue}{'queuedata'}{'foomatic'}) { + # The queue was configured with Foomatic + my $driverstr; + if ($printer->{configured}{$queue}{'driver'} eq "Postscript") { + $driverstr = "PostScript"; + } else { + $driverstr = + "GhostScript + $printer->{configured}{$queue}{'driver'}"; + } + my $make = $printer->{configured}{$queue}{'make'}; + my $model = + $printer->{configured}{$queue}{'model'}; + if ($::expert) { + $printer->{DBENTRY} = "$make|$model|$driverstr"; + # database key contains te "(recommended)" for the + # recommended driver, so add it if necessary + if (!($printer::thedb{$printer->{DBENTRY}}{id})) { + $printer->{DBENTRY} .= " (recommended)"; } - } elsif (($::expert) && ($printer->{SPOOLER} eq "cups")) { - # Do we have a native CUPS driver or a PostScript PPD file? - $printer->{DBENTRY} = printer::get_descr_from_ppd($printer) || - $printer->{DBENTRY}; + } else { + $printer->{DBENTRY} = "$make|$model"; + # Make sure that we use the recommended driver + $printer->{currentqueue}{'driver'} = + $printer::thedb{$printer->{DBENTRY}}{driver}; } - } else { - if (($::expert) && ($printer->{DBENTRY} !~ (recommended))) { - $printer->{DBENTRY} =~ /^([^\|]+)\|([^\|]+)\|/; - my $make = $1; - my $model = $2; - my $key; - for $key (keys %printer::thedb) { - if ($key =~ /^$make\|$model\|.*\(recommended\)$/) { - $printer->{DBENTRY} = $key; - } + } elsif (($::expert) && ($printer->{SPOOLER} eq "cups")) { + # Do we have a native CUPS driver or a PostScript PPD file? + $printer->{DBENTRY} = printer::get_descr_from_ppd($printer) || + $printer->{DBENTRY}; + } + } else { + if (($::expert) && ($printer->{DBENTRY} !~ (recommended))) { + $printer->{DBENTRY} =~ /^([^\|]+)\|([^\|]+)\|/; + my $make = $1; + my $model = $2; + my $key; + for $key (keys %printer::thedb) { + if ($key =~ /^$make\|$model\|.*\(recommended\)$/) { + $printer->{DBENTRY} = $key; } } } - # Choose the printer/driver from the list - my $oldchoice = $printer->{DBENTRY}; - - $printer->{DBENTRY} = $in->ask_from_treelist - (__("Printer model selection"), - __("Which printer model do you have?"), '|', - [ keys %printer::thedb ], $printer->{DBENTRY}) or return; - $printer->{currentqueue}{'id'} = - $printer::thedb{$printer->{DBENTRY}}{id}; - $printer->{currentqueue}{'ppd'} = - $printer::thedb{$printer->{DBENTRY}}{ppd}; - $printer->{currentqueue}{'driver'} = - $printer::thedb{$printer->{DBENTRY}}{driver}; - $printer->{currentqueue}{'make'} = - $printer::thedb{$printer->{DBENTRY}}{make}; - $printer->{currentqueue}{'model'} = - $printer::thedb{$printer->{DBENTRY}}{model}; - if (($printer->{currentqueue}{'id'}) || # We have a Foomatic queue - ($printer->{currentqueue}{'ppd'})) { # We have a CUPS+PPD queue - if ($printer->{currentqueue}{'id'}) { # Foomatic queue? - $printer->{currentqueue}{'foomatic'} = 1; - # Now get the options for this printer/driver combo - if (($printer->{configured}{$queue}) && - ($printer->{configured}{$queue}{'queuedata'}{'foomatic'})) { - # The queue was already configured with Foomatic ... - if ($printer->{DBENTRY} eq $oldchoice) { - # ... and the user didn't change the printer/driver - $printer->{ARGS} = - $printer->{configured}{$queue}{'args'}; - } else { - # ... and the user has chosen another printer/driver - $printer->{ARGS} = - printer::read_foomatic_options($printer); - } + } + $printer->{OLD_CHOICE} = $printer->{DBENTRY}; +} + +sub choose_model { + my ($printer, $in) = @_; + #- Read the printer driver database if necessary + if ((keys %printer::thedb) == 0) { + printer::read_printer_db($printer->{SPOOLER}); + } + $in->set_help('configurePrinterType') if $::isInstall; + # Choose the printer/driver from the list + + return ($printer->{DBENTRY} = $in->ask_from_treelist + (_("Printer model selection"), + _("Which printer model do you have?"), '|', + [ keys %printer::thedb ], $printer->{DBENTRY})); + +} + +sub get_printer_info { + my ($printer) = @_; + #- Read the printer driver database if necessary + if ((keys %printer::thedb) == 0) { + printer::read_printer_db($printer->{SPOOLER}); + } + my $queue = $printer->{OLD_QUEUE}; + my $oldchoice = $printer->{OLD_CHOICE}; + $printer->{currentqueue}{'id'} = + $printer::thedb{$printer->{DBENTRY}}{id}; + $printer->{currentqueue}{'ppd'} = + $printer::thedb{$printer->{DBENTRY}}{ppd}; + $printer->{currentqueue}{'driver'} = + $printer::thedb{$printer->{DBENTRY}}{driver}; + $printer->{currentqueue}{'make'} = + $printer::thedb{$printer->{DBENTRY}}{make}; + $printer->{currentqueue}{'model'} = + $printer::thedb{$printer->{DBENTRY}}{model}; + if (($printer->{currentqueue}{'id'}) || # We have a Foomatic queue + ($printer->{currentqueue}{'ppd'})) { # We have a CUPS+PPD queue + if ($printer->{currentqueue}{'id'}) { # Foomatic queue? + $printer->{currentqueue}{'foomatic'} = 1; + # Now get the options for this printer/driver combo + if (($printer->{configured}{$queue}) && + ($printer->{configured}{$queue}{'queuedata'}{'foomatic'})) { + # The queue was already configured with Foomatic ... + if ($printer->{DBENTRY} eq $oldchoice) { + # ... and the user didn't change the printer/driver + $printer->{ARGS} = + $printer->{configured}{$queue}{'args'}; } else { - # The queue was not configured with Foomatic before - $printer->{ARGS} = printer::read_foomatic_options($printer); + # ... and the user has chosen another printer/driver + $printer->{ARGS} = + printer::read_foomatic_options($printer); } - } elsif ($printer->{currentqueue}{'ppd'}) { # CUPS+PPD queue? - # Now get the options from this PPD file - if ($printer->{configured}{$queue}) { - # The queue was already configured - if ($printer->{DBENTRY} eq $oldchoice) { - # ... and the user didn't change the printer/driver - $printer->{ARGS} = - printer::read_cups_options($queue); - } else { - # ... and the user has chosen another printer/driver - $printer->{ARGS} = - printer::read_cups_options - ("/usr/share/cups/model/" . - $printer->{currentqueue}{ppd}); - } + } else { + # The queue was not configured with Foomatic before + $printer->{ARGS} = printer::read_foomatic_options($printer); + } + } elsif ($printer->{currentqueue}{'ppd'}) { # CUPS+PPD queue? + # Now get the options from this PPD file + if ($printer->{configured}{$queue}) { + # The queue was already configured + if ($printer->{DBENTRY} eq $oldchoice) { + # ... and the user didn't change the printer/driver + $printer->{ARGS} = + printer::read_cups_options($queue); } else { - # The queue was not configured before + # ... and the user has chosen another printer/driver $printer->{ARGS} = - printer::read_cups_options - ("/usr/share/cups/model/" . - $printer->{currentqueue}{ppd}); + printer::read_cups_options + ("/usr/share/cups/model/" . + $printer->{currentqueue}{ppd}); } + } else { + # The queue was not configured before + $printer->{ARGS} = + printer::read_cups_options + ("/usr/share/cups/model/" . + $printer->{currentqueue}{ppd}); } - # Set up the widgets for the option dialog - my @widgets; - my @userinputs; - my @choicelists; - my @shortchoicelists; - my $i; - for ($i = 0; $i <= $#{$printer->{ARGS}}; $i++) { - my $optshortdefault = $printer->{ARGS}[$i]{'default'}; - if ($printer->{ARGS}[$i]{'type'} eq 'enum') { - # enumerated option - push(@choicelists, []); - push(@shortchoicelists, []); - my $choice; - for $choice (@{$printer->{ARGS}[$i]{'vals'}}) { - push(@{$choicelists[$i]}, $choice->{'comment'}); - push(@{$shortchoicelists[$i]}, $choice->{'value'}); - if ($choice->{'value'} eq $optshortdefault) { - push(@userinputs, $choice->{'comment'}); - } + } + } +} + +sub setup_options { + my ($printer, $in) = @_; + $in->set_help('configurePrinterOptions') if $::isInstall; + if (($printer->{currentqueue}{'id'}) || # We have a Foomatic queue + ($printer->{currentqueue}{'ppd'})) { # We have a CUPS+PPD queue + # Set up the widgets for the option dialog + my @widgets; + my @userinputs; + my @choicelists; + my @shortchoicelists; + my $i; + for ($i = 0; $i <= $#{$printer->{ARGS}}; $i++) { + my $optshortdefault = $printer->{ARGS}[$i]{'default'}; + if ($printer->{ARGS}[$i]{'type'} eq 'enum') { + # enumerated option + push(@choicelists, []); + push(@shortchoicelists, []); + my $choice; + for $choice (@{$printer->{ARGS}[$i]{'vals'}}) { + push(@{$choicelists[$i]}, $choice->{'comment'}); + push(@{$shortchoicelists[$i]}, $choice->{'value'}); + if ($choice->{'value'} eq $optshortdefault) { + push(@userinputs, $choice->{'comment'}); } - push(@widgets, - { label => $printer->{ARGS}[$i]{'comment'}, - val => \$userinputs[$i], - not_edit => 1, - list => \@{$choicelists[$i]} }); - } elsif ($printer->{ARGS}[$i]{'type'} eq 'bool') { - # boolean option - push(@choicelists, [$printer->{ARGS}[$i]{'name'}, - $printer->{ARGS}[$i]{'name_false'}]); - push(@shortchoicelists, []); - push(@userinputs, $choicelists[$i][1-$optshortdefault]); - push(@widgets, - { label => $printer->{ARGS}[$i]{'comment'}, - val => \$userinputs[$i], - not_edit => 1, - list => \@{$choicelists[$i]} }); - } else { - # numerical option - push(@choicelists, []); - push(@shortchoicelists, []); - push(@userinputs, $optshortdefault); - push(@widgets, - { label => $printer->{ARGS}[$i]{'comment'} . - " ($printer->{ARGS}[$i]{'min'} ... " . - "$printer->{ARGS}[$i]{'max'})", - #type => 'range', - #min => $printer->{ARGS}[$i]{'min'}, - #max => $printer->{ARGS}[$i]{'max'}, - val => \$userinputs[$i] } ); } - } - # Show the options dialog. The call-back function does a - # range check of the numerical options. - my $windowtitle; - if ($::expert) { - $windowtitle = $printer->{DBENTRY}; - $windowtitle =~ s/\|/ /; - $windowtitle =~ s/\|/, /; + push(@widgets, + { label => $printer->{ARGS}[$i]{'comment'}, + val => \$userinputs[$i], + not_edit => 1, + list => \@{$choicelists[$i]} }); + } elsif ($printer->{ARGS}[$i]{'type'} eq 'bool') { + # boolean option + push(@choicelists, [$printer->{ARGS}[$i]{'name'}, + $printer->{ARGS}[$i]{'name_false'}]); + push(@shortchoicelists, []); + push(@userinputs, $choicelists[$i][1-$optshortdefault]); + push(@widgets, + { label => $printer->{ARGS}[$i]{'comment'}, + val => \$userinputs[$i], + not_edit => 1, + list => \@{$choicelists[$i]} }); } else { - $windowtitle = "$printer->{currentqueue}{'make'} " . - "$printer->{currentqueue}{'model'}" + # numerical option + push(@choicelists, []); + push(@shortchoicelists, []); + push(@userinputs, $optshortdefault); + push(@widgets, + { label => $printer->{ARGS}[$i]{'comment'} . + " ($printer->{ARGS}[$i]{'min'} ... " . + "$printer->{ARGS}[$i]{'max'})", + #type => 'range', + #min => $printer->{ARGS}[$i]{'min'}, + #max => $printer->{ARGS}[$i]{'max'}, + val => \$userinputs[$i] } ); } - return if !$in->ask_from_entries_refH - ($windowtitle, - _("Printer options"), \@widgets, - complete => sub { - my $i; - for ($i = 0; $i <= $#{$printer->{ARGS}}; $i++) { - if (($printer->{ARGS}[$i]{'type'} eq 'int') || - ($printer->{ARGS}[$i]{'type'} eq 'float')) { - unless - (($printer->{ARGS}[$i]{'type'} eq 'float') || - ($userinputs[$i] =~ /^[0-9]+$/)) { - $in->ask_warn - ('', __("Option $printer->{ARGS}[$i]{'comment'} must be an integer number!")); - return (1, $i); - } - unless - (($printer->{ARGS}[$i]{'type'} eq 'int') || - ($userinputs[$i] =~ /^[0-9\.]+$/)) { + } + # Show the options dialog. The call-back function does a + # range check of the numerical options. + my $windowtitle; + if ($::expert) { + $windowtitle = $printer->{DBENTRY}; + $windowtitle =~ s/\|/ /; + $windowtitle =~ s/\|/, /; + } else { + $windowtitle = "$printer->{currentqueue}{'make'} " . + "$printer->{currentqueue}{'model'}" + } + return 0 if !$in->ask_from_entries_refH + ($windowtitle, + _("Printer options"), \@widgets, + complete => sub { + my $i; + for ($i = 0; $i <= $#{$printer->{ARGS}}; $i++) { + if (($printer->{ARGS}[$i]{'type'} eq 'int') || + ($printer->{ARGS}[$i]{'type'} eq 'float')) { + unless + (($printer->{ARGS}[$i]{'type'} eq 'float') || + ($userinputs[$i] =~ /^[0-9]+$/)) { $in->ask_warn - ('', __("Option $printer->{ARGS}[$i]{'comment'} must be a number!")); + ('', _("Option $printer->{ARGS}[$i]{'comment'} must be an integer number!")); return (1, $i); } - unless (($userinputs[$i] >= - $printer->{ARGS}[$i]{'min'}) && - ($userinputs[$i] <= - $printer->{ARGS}[$i]{'max'})) { + unless + (($printer->{ARGS}[$i]{'type'} eq 'int') || + ($userinputs[$i] =~ /^[0-9\.]+$/)) { $in->ask_warn - ('', __("Option $printer->{ARGS}[$i]{'comment'} out of range!")); + ('', _("Option $printer->{ARGS}[$i]{'comment'} must be a number!")); return (1, $i); } + unless (($userinputs[$i] >= + $printer->{ARGS}[$i]{'min'}) && + ($userinputs[$i] <= + $printer->{ARGS}[$i]{'max'})) { + $in->ask_warn + ('', _("Option $printer->{ARGS}[$i]{'comment'} out of range!")); + return (1, $i); } } - return (0); - } ); - # Read out the user's choices - @{$printer->{OPTIONS}} = (); - for ($i = 0; $i <= $#{$printer->{ARGS}}; $i++) { - push(@{$printer->{OPTIONS}}, "-o"); - if ($printer->{ARGS}[$i]{'type'} eq 'enum') { - # enumerated option - my $j; - for ($j = 0; $j <= $#{$choicelists[$i]}; $j++) { - if ($choicelists[$i][$j] eq $userinputs[$i]) { - push(@{$printer->{OPTIONS}}, - $printer->{ARGS}[$i]{'name'} . - "=". $shortchoicelists[$i][$j]); - } + } + return (0); + } ); + # Read out the user's choices + @{$printer->{OPTIONS}} = (); + for ($i = 0; $i <= $#{$printer->{ARGS}}; $i++) { + push(@{$printer->{OPTIONS}}, "-o"); + if ($printer->{ARGS}[$i]{'type'} eq 'enum') { + # enumerated option + my $j; + for ($j = 0; $j <= $#{$choicelists[$i]}; $j++) { + if ($choicelists[$i][$j] eq $userinputs[$i]) { + push(@{$printer->{OPTIONS}}, + $printer->{ARGS}[$i]{'name'} . + "=". $shortchoicelists[$i][$j]); } - } elsif ($printer->{ARGS}[$i]{'type'} eq 'bool') { - # boolean option - push(@{$printer->{OPTIONS}}, - $printer->{ARGS}[$i]{'name'} . - "=". - (($choicelists[$i][0] eq $userinputs[$i]) ? - "1" : "0")); - } else { - # numerical option - push(@{$printer->{OPTIONS}}, - $printer->{ARGS}[$i]{'name'} . - "=" . $userinputs[$i]); } + } elsif ($printer->{ARGS}[$i]{'type'} eq 'bool') { + # boolean option + push(@{$printer->{OPTIONS}}, + $printer->{ARGS}[$i]{'name'} . + "=". + (($choicelists[$i][0] eq $userinputs[$i]) ? + "1" : "0")); + } else { + # numerical option + push(@{$printer->{OPTIONS}}, + $printer->{ARGS}[$i]{'name'} . + "=" . $userinputs[$i]); } } - $printer->{complete} = 1; - printer::configure_queue($printer); - $printer->{complete} = 0; - # print test pages - my $standard = 1; - my $altletter = 0; - my $alta4 = 0; - my $photo = 0; - my $ascii = 0; - if ($in->ask_from_entries_refH_powered - ({ title => __("Test pages"), - messages => __("Please select the test pages you want to print. -Note: the photo test page can take a rather long time to get printed. -In most cases it is enough to print the standard test page."), - cancel => __("No test pages"), - ok => __("Print")}, -[ -{ text => __("Standard test page"), type => 'bool', val => \$standard }, -{ text => __("Alternative test page (Letter)"), type => 'bool', - val => \$altletter }, -{ text => __("Alternative test page (A4)"), type => 'bool', val => \$alta4 }, -{ text => __("Photo test page"), type => 'bool', val => \$photo }, -{ text => __("Plain text test page"), type => 'bool', val => \$ascii } -])) { -# if ($in->ask_yesorno('', __("Do you want to print a test page?"), 1)) { - my @lpq_output; - { - my $w = $in->wait_message('', _("Printing test page(s)...")); - - $upNetwork and do { &$upNetwork(); undef $upNetwork; sleep(1) }; - my $stdtestpage = "/usr/share/printer-testpages/testprint.ps"; - my $altlttestpage = "/usr/share/printer-testpages/testpage.ps"; - my $alta4testpage = "/usr/share/printer-testpages/testpage-a4.ps"; - my $phototestpage = "/usr/share/printer-testpages/photo-testpage.jpg"; - my $asciitestpage = "/usr/share/printer-testpages/testpage.asc"; - my @testpages; - # Install the filter to convert the photo test page to PS - $photo && $in->do_pkgs->install('ImageMagick'); - # set up list of pages to print - $standard && push (@testpages, $stdtestpage); - $altletter && push (@testpages, $altlttestpage); - $alta4 && push (@testpages, $alta4testpage); - $photo && push (@testpages, $phototestpage); - $ascii && push (@testpages, $asciitestpage); - # print the stuff - @lpq_output = printer::print_pages($printer, @testpages); - } + } + 1; +} - if (@lpq_output) { - $in->ask_yesorno('', _("Test page(s) have been sent to the printer daemon. -It may take some time before the printer starts. -Printing status:\n%s\n\nDoes it work properly?", "@lpq_output"), 1) and last; - } else { - $in->ask_yesorno('', _("Test page(s) have been sent to the printer daemon. +sub print_testpages { + my ($printer, $in, $upNetwork) = @_; + # print test pages + my $standard = 1; + my $altletter = 0; + my $alta4 = 0; + my $photo = 0; + my $ascii = 0; + if ($in->ask_from_entries_refH_powered + ({ title => _("Test pages"), + messages => _("Please select the test pages you want to print. +Note: the photo test page can take a rather long time to get printed +and on laser printers with too low memory it can even not come out. +In most cases it is enough to print the standard test page."), + cancel => _("No test pages"), + ok => _("Print")}, + [ + { text => _("Standard test page"), type => 'bool', + val => \$standard }, + ($::expert ? + { text => _("Alternative test page (Letter)"), type => 'bool', + val => \$altletter } : ()), + ($::expert ? + { text => _("Alternative test page (A4)"), type => 'bool', + val => \$alta4 } : ()), + { text => _("Photo test page"), type => 'bool', val => \$photo } + #{ text => _("Plain text test page"), type => 'bool', + # val => \$ascii } + ])) { + # if ($in->ask_yesorno('', _("Do you want to print a test page?"), 1)) { + my @lpq_output; + { + my $w = $in->wait_message('', _("Printing test page(s)...")); + + $upNetwork and do { &$upNetwork(); undef $upNetwork; sleep(1) }; + my $stdtestpage = "/usr/share/printer-testpages/testprint.ps"; + my $altlttestpage = "/usr/share/printer-testpages/testpage.ps"; + my $alta4testpage = "/usr/share/printer-testpages/testpage-a4.ps"; + my $phototestpage = "/usr/share/printer-testpages/photo-testpage.jpg"; + my $asciitestpage = "/usr/share/printer-testpages/testpage.asc"; + my @testpages; + # Install the filter to convert the photo test page to PS + $photo && $in->do_pkgs->install('ImageMagick'); + # set up list of pages to print + $standard && push (@testpages, $stdtestpage); + $altletter && push (@testpages, $altlttestpage); + $alta4 && push (@testpages, $alta4testpage); + $photo && push (@testpages, $phototestpage); + $ascii && push (@testpages, $asciitestpage); + # print the stuff + @lpq_output = printer::print_pages($printer, @testpages); + } + + if (@lpq_output) { + $in->ask_yesorno('',_("Test page(s) have been sent to the printer. It may take some time before the printer starts. -Does it work properly?"), 1) and last; - } +Printing status:\n%s\n\nDoes it work properly?", @lpq_output), 1) and return 1; } else { - last; + $in->ask_yesorno('', _("Test page(s) have been sent to the printer. +It may take some time before the printer starts. +Does it work properly?"), 1) and return 1; } + } else { + return 1; + } + return 0; +} + +sub setup_gsdriver { + my ($printer, $in, $upNetwork) = @_; + my $queue = $printer->{OLD_QUEUE}; + while (1) { + get_db_entry($printer); + choose_model($printer, $in) || return; + get_printer_info($printer); + setup_options($printer, $in) || return; + $printer->{complete} = 1; + printer::configure_queue($printer); + $printer->{complete} = 0; + print_testpages($printer, $in, $upNetwork) && last; } $printer->{complete} = 1; } @@ -719,8 +894,8 @@ sub setup_default_spooler { my ($printer, $in) = @_; $printer->{SPOOLER} ||= 'cups'; my $str_spooler = - $in->ask_from_list_(__("Select Printer Spooler"), - __("Which printing system (spooler) do you want to use?"), + $in->ask_from_list_(_("Select Printer Spooler"), + _("Which printing system (spooler) do you want to use?"), [ printer::spooler() ], $printer::spooler_inv{$printer->{SPOOLER}}, ) or return; @@ -751,14 +926,14 @@ sub install_spooler { $in->do_pkgs->remove_nodeps('LPRng'); $in->do_pkgs->install('lpr'); # Start daemon - printer::start_service("lpd"); + printer::restart_service("lpd"); sleep 1; } elsif ($printer->{SPOOLER} eq "lprng") { # "LPRng" conflicts with "lpr", remove "lpr" $in->do_pkgs->remove_nodeps('lpr'); $in->do_pkgs->install('LPRng'); # Start daemon - printer::start_service("lpd"); + printer::restart_service("lpd"); sleep 1; } elsif ($printer->{SPOOLER} eq "pdq") { $in->do_pkgs->install('pdq'); @@ -767,7 +942,7 @@ sub install_spooler { } } -#- Program entry point for configuration with lpr or cups (stored in $mode). +#- Program entry point for configuration with of the printing system. sub main { my ($printer, $in, $ask_multiple_printer, $upNetwork) = @_; @@ -786,14 +961,19 @@ sub main { install_spooler($printer, $in); } - my ($queue, $continue) = ('', 1); + my ($queue, $continue, $newqueue) = ('', 1, 0); while ($continue) { + $newqueue = 0; + # When the queue list is not shown, cancelling the printer type + # dislog should leave the program + $continue = 0; if (!$ask_multiple_printer && %{$printer->{configured} || {}} == ()) { + $newqueue = 1; $queue = $printer->{want} || $in->ask_yesorno(_("Printer"), - __("Would you like to configure printing?"), - 0) ? 'lp' : __("Done"); - if ($queue ne __("Done")) { + _("Would you like to configure printing?"), + 0) ? 'lp' : _("Done"); + if ($queue ne _("Done")) { $printer->{SPOOLER} ||= setup_default_spooler ($printer, $in) || return; @@ -806,27 +986,34 @@ sub main { # Show a queue list window when there is at least one queue # or when we are in expert mode unless ((%{$printer->{configured} || {}} == ()) && (!$::expert)) { + # Cancelling the printer type dialog should leed to this + # dialog + $continue = 1; $in->ask_from_entries_refH_powered( {messages => - _("Here are the following print queues.\nYou can add some more or change the existing ones."), + _("The following printers are configured.\nYou can add some more or modify the existing ones."), cancel => '', }, # List the queues [ { val => \$queue, format => \&translate, list => [ (sort keys %{$printer->{configured} || {}}), # Button to add a new queue - __("Add printer"), + _("Add printer"), # In expert mode we can change the spooler ($::expert ? - ( __("Spooler: ") . + ( _("Spooler: ") . $printer::spooler_inv{$printer->{SPOOLER}} ) : ()), # Bored by configuring your printers, get out of here! - __("Done") ] } ] + _("Done") ] } ] ); - } else { $queue = __("Add printer") }#- as there are no printers - #- already configured, Add one - #- automatically. - if ($queue eq __("Add printer")) { + } else { + #- as there are no printer already configured, Add one + #- automatically. + $queue = _("Add printer"); + } + + if ($queue eq _("Add printer")) { + $newqueue = 1; my %queues; @queues{map { split '\|', $_ } keys %{$printer->{configured}}} = (); my $i = ''; while ($i < 100) { last unless exists $queues{"lp$i"}; ++$i; } @@ -842,20 +1029,83 @@ sub main { # Save the default spooler printer::set_default_spooler($printer); #- Close printerdrake - $queue eq __("Done") and last; - - #- Copy the queue data and work on the copy - $printer->{currentqueue} = {}; - printer::copy_printer_params - ($printer->{configured}{$queue}{'queuedata'}, - $printer->{currentqueue}) - if $printer->{configured}{$queue}; - #- keep in mind old name of queue (in case of changing) - $printer->{OLD_QUEUE} = $printer->{QUEUE} = $queue; - - while ($continue) { - $in->set_help('configurePrinterConnected') if $::isInstall; - if ($printer->{configured}{$queue}) { + $queue eq _("Done") and last; + + if ($newqueue) { + #- Set default values for a new queue + $printer::printer_type_inv{$printer->{TYPE}} or + $printer->{TYPE} = printer::default_printer_type($printer); + $printer->{currentqueue} = {}; + $printer->{currentqueue}{'queue'} = $queue; + $printer->{currentqueue}{'foomatic'} = 0; + $printer->{currentqueue}{'desc'} = ""; + $printer->{currentqueue}{'loc'} = ""; + $printer->{currentqueue}{'make'} = ""; + $printer->{currentqueue}{'model'} = ""; + $printer->{currentqueue}{'spooler'} = + $printer->{SPOOLER}; + #- Set OLD_QUEUE field so that the subroutines for the + #- configuration work correctly. + $printer->{OLD_QUEUE} = $printer->{QUEUE} = $queue; + #- Do all the configuration steps for a new queue + choose_printer_type($printer, $in) or next; + #- Cancelling one of the following dialogs should restart + #- printerdrake + $continue = 1; + if ($printer->{TYPE} eq 'CUPS') { + if (setup_remote_cups_server($printer, $in)) { + $continue = $::expert || !$::isInstall; + } else { + $continue = 1; + } + next; + } + setup_printer_connection($printer, $in) or next; + choose_printer_name($printer, $in) or next; + + #- configure the printer driver + if (setup_gsdriver($printer, $in, + $printer->{TYPE} !~ /LOCAL/ && $upNetwork)) { + #if (lc($printer->{QUEUE}) ne lc($printer->{OLD_QUEUE})) { + # printer::remove_queue($printer, $printer->{OLD_QUEUE}); + #} + #delete $printer->{OLD_QUEUE} + # if (($printer->{QUEUE} ne $printer->{OLD_QUEUE}) && + # ($printer->{configured}{$printer->{QUEUE}})); + $continue = $::expert || !$::isInstall; + } else { + $continue = 1; + } + } else { + # Modify a queue, ask which part should be modified + my $modify = _("Printer options"); + while ($in->ask_from_entries_refH_powered + ({ title => _("Modify printer"), + messages => _("Printer %s: %s %s +What do you want to modify on this printer?", + $queue, + $printer->{configured}{$queue}{make}, + $printer->{configured}{$queue}{model}), + cancel => _("Close"), + ok => _("Do it!") + }, + [ { val => \$modify, format => \&translate, + list => [ _("Printer connection type"), + _("Printer name, description, location"), + ($::expert ? + _("Printer manufacturer, model, driver") : + _("Printer manufacturer, model")), + _("Printer options"), + _("Print test pages"), + _("Remove printer") ] } ] ) ) { + #- Copy the queue data and work on the copy + $printer->{currentqueue} = {}; + printer::copy_printer_params + ($printer->{configured}{$queue}{'queuedata'}, + $printer->{currentqueue}) + if $printer->{configured}{$queue}; + #- keep in mind old name of queue (in case of changing) + $printer->{OLD_QUEUE} = $printer->{QUEUE} = $queue; #- Which printer type did we have before (check beginning of #- URI) my $type; @@ -867,139 +1117,56 @@ sub main { last; } } - } else { - #- Set default values for a new queue - $printer::printer_type_inv{$printer->{TYPE}} or - $printer->{TYPE} = printer::default_printer_type($printer); - $printer->{currentqueue}{'queue'} = $queue; - $printer->{currentqueue}{'foomatic'} = 0; - $printer->{currentqueue}{'desc'} = ""; - $printer->{currentqueue}{'loc'} = ""; - $printer->{currentqueue}{'spooler'} = - $printer->{SPOOLER}; - } - $printer->{str_type}=$printer::printer_type_inv{$printer->{TYPE}}; - $printer->{str_type} = - $in->ask_from_list_(_("Select Printer Connection"), - _("How is the printer connected?"), - [ printer::printer_type($printer) ], - $printer->{str_type}, - ) or return; - $printer->{TYPE} = $printer::printer_type{$printer->{str_type}}; -# if ($printer->{TYPE} eq 'REMOTE') { -# $printer->{str_type} = $printer::printer_type_inv{CUPS}; -# $printer->{str_type} = -# $in->ask_from_list_(_("Select Remote Printer Connection"), -#_("With a remote CUPS server, you do not have to configure -#any printer here; printers will be automatically detected. -#In case of doubt, select \"Remote CUPS server\"."), -# [ @printer::printer_type_inv{qw(CUPS LPD SOCKET)} ], -# $printer->{str_type}, -# ) or return; -# $printer->{TYPE} = $printer::printer_type{$printer->{str_type}}; -# } - if ($printer->{TYPE} eq 'CUPS') { - #- hack to handle cups remote server printing, - #- first read /etc/cups/cupsd.conf for variable BrowsePoll address:port - my @cupsd_conf = printer::read_cupsd_conf(); - my ($server, $port); - - foreach (@cupsd_conf) { - /^\s*BrowsePoll\s+(\S+)/ and $server = $1, last; - } - $server =~ /([^:]*):(.*)/ and ($server, $port) = ($1, $2); - - #- then ask user for this combination - #- and rewrite /etc/cups/cupsd.conf according to new settings. - #- there are no other point where such information is written in this file. - if ($in->ask_from_entries_refH - (_("Remote CUPS server"), -_("With a remote CUPS server, you do not have to configure -any printer here; printers will be automatically detected -unless you have a server on a different network; in the -latter case, you have to give the CUPS server IP address -and optionally the port number."), - [ - { label => _("CUPS server IP"), val => \$server }, - { label => _("Port"), val => \$port } ], - complete => sub { - unless (!$server || network::is_ip($server)) { - $in->ask_warn('', _("IP address should be in format 1.2.3.4")); - return (1,0); - } - if ($port !~ /^\d*$/) { - $in->ask_warn('', _("Port number should be numeric")); - return (1,1); - } - return 0; - }, - )) { - $server && $port and $server = "$server:$port"; - if ($server) { - @cupsd_conf = map { $server and s/^\s*BrowsePoll\s+(\S+)/BrowsePoll $server/ and $server = ''; - $_ } @cupsd_conf; - $server and push @cupsd_conf, "\nBrowsePoll $server\n"; - } else { - @cupsd_conf = map { s/^\s*BrowsePoll\s+(\S+)/\#BrowsePoll $1/; - $_ } @cupsd_conf; + # Get all info about the printer model and options + get_db_entry($printer); + get_printer_info($printer); + # Do the chosen task + if ($modify eq _("Printer connection type")) { + choose_printer_type($printer, $in) && + setup_printer_connection($printer, $in) && do { + $printer->{complete} = 1; + printer::configure_queue($printer); + $printer->{complete} = 0; + } + } elsif ($modify eq _("Printer name, description, location")) { + choose_printer_name($printer, $in) && do { + $printer->{complete} = 1; + printer::configure_queue($printer); + $printer->{complete} = 0; + }; + # Delete old queue when it was renamed + if (lc($printer->{QUEUE}) ne lc($printer->{OLD_QUEUE})) { + printer::remove_queue($printer, $printer->{OLD_QUEUE}); + $queue = $printer->{QUEUE}; } - printer::write_cupsd_conf(@cupsd_conf); + } elsif (($modify eq + _("Printer manufacturer, model, driver")) || + ($modify eq _("Printer manufacturer, model"))) { + choose_model($printer, $in) && do { + get_printer_info($printer); + setup_options($printer, $in) && do { + $printer->{complete} = 1; + printer::configure_queue($printer); + $printer->{complete} = 0; + } + } + } elsif ($modify eq _("Printer options")) { + get_printer_info($printer); + setup_options($printer, $in) && do { + $printer->{complete} = 1; + printer::configure_queue($printer); + $printer->{complete} = 0; + } + } elsif ($modify eq _("Print test pages")) { + print_testpages($printer, $in, $upNetwork); + } elsif ($modify eq _("Remove printer")) { + $in->ask_yesorno('', + _("Do you really want to remove the printer \"%s\"?", $queue), 1) && + printer::remove_queue($printer, $queue) && last; } - return; #- exit printer configuration, here is another hack for simplification. - } - # Name, description, location - $in->set_help('configurePrinterLocal') if $::isInstall; - $in->ask_from_entries_refH_powered - ( - { title => __("Enter Printer Name and Comments"), - cancel => !$printer->{configured}{$queue} ? '' : _("Remove queue"), - callbacks => { complete => sub { - unless ($printer->{currentqueue}{'queue'} =~ /^\w+$/) { - $in->ask_warn('', _("Name of printer should contain only letters, numbers and the underscore")); - return (1,0); - } - return 0; - }, - }, - messages => -__("Every printer needs a name (for example lp). -The Description and Location fields do not need -to be filled in. They are comments for the users.") }, - [ - { label => _("Name of printer"), - val => \$printer->{currentqueue}{'queue'} }, - { label => _("Description"), - val => \$printer->{currentqueue}{'desc'} }, - { label => _("Location"), - val => \$printer->{currentqueue}{'loc'} }, - ]) or - printer::remove_queue($printer, $printer->{currentqueue}{'queue'}), - $continue = 1, last; - - $printer->{QUEUE} = $printer->{currentqueue}{'queue'}; - $continue = 0; - for ($printer->{TYPE}) { - /LOCAL/ and setup_local ($printer, $in) and last; - /LPD/ and setup_lpd ($printer, $in) and last; - /SOCKET/ and setup_socket ($printer, $in) and last; - /SMB/ and setup_smb ($printer, $in) and last; - /NCP/ and setup_ncp ($printer, $in) and last; - /URI/ and setup_uri ($printer, $in) and last; - /POSTPIPE/ and setup_postpipe ($printer, $in) and last; - $continue = 1; last; - } - } - #- configure the printer driver - if (!$continue && setup_gsdriver($printer, $in, $printer->{TYPE} !~ /LOCAL/ && $upNetwork)) { - if (lc($printer->{QUEUE}) ne lc($printer->{OLD_QUEUE})) { - printer::remove_queue($printer, $printer->{OLD_QUEUE}); + # Reinitialize $printer data structure + printer::resetinfo($printer); } - delete $printer->{OLD_QUEUE} - if (($printer->{QUEUE} ne $printer->{OLD_QUEUE}) && - ($printer->{configured}{$printer->{QUEUE}})); - $continue = $::expert; - } else { - $continue = 1; } if ($continue) { # Reinitialize $printer data structure |