293 lines
5.7 KiB
Perl
293 lines
5.7 KiB
Perl
#!/usr/bin/perl -w
|
|
# This file was preprocessed, do not edit!
|
|
|
|
|
|
package Debconf::Question;
|
|
use strict;
|
|
use Debconf::Db;
|
|
use Debconf::Template;
|
|
use Debconf::Iterator;
|
|
use Debconf::Log qw(:all);
|
|
|
|
|
|
use fields qw(name priority);
|
|
|
|
our %question;
|
|
|
|
|
|
sub new {
|
|
my Debconf::Question $this=shift;
|
|
my $name=shift;
|
|
my $owner=shift;
|
|
my $type=shift || die "no type given for question";
|
|
die "A question called \"$name\" already exists"
|
|
if exists $question{$name};
|
|
unless (ref $this) {
|
|
$this = fields::new($this);
|
|
}
|
|
$this->{name}=$name;
|
|
return unless defined $this->addowner($owner, $type);
|
|
$this->flag('seen', 'false');
|
|
return $question{$name}=$this;
|
|
}
|
|
|
|
|
|
sub get {
|
|
my Debconf::Question $this=shift;
|
|
my $name=shift;
|
|
return $question{$name} if exists $question{$name};
|
|
if ($Debconf::Db::config->exists($name)) {
|
|
$this = fields::new($this);
|
|
$this->{name}=$name;
|
|
return $question{$name}=$this;
|
|
}
|
|
return undef;
|
|
}
|
|
|
|
|
|
sub iterator {
|
|
my $this=shift;
|
|
|
|
my $real_iterator=$Debconf::Db::config->iterator;
|
|
return Debconf::Iterator->new(callback => sub {
|
|
return unless my $name=$real_iterator->iterate;
|
|
return $this->get($name);
|
|
});
|
|
}
|
|
|
|
|
|
sub _expand_vars {
|
|
my $this=shift;
|
|
my $text=shift;
|
|
|
|
return '' unless defined $text;
|
|
|
|
my @vars=$Debconf::Db::config->variables($this->{name});
|
|
|
|
my $rest=$text;
|
|
my $result='';
|
|
my $variable;
|
|
my $varval;
|
|
my $escape;
|
|
while ($rest =~ m/^(.*?)(\\)?\$\{([^{}]+)\}(.*)$/sg) {
|
|
$result.=$1; # copy anything before the variable
|
|
$escape=$2;
|
|
$variable=$3;
|
|
$rest=$4; # continue trying to expand rest of text
|
|
if (defined $escape && length $escape) {
|
|
$result.="\${$variable}";
|
|
}
|
|
else {
|
|
$varval=$Debconf::Db::config->getvariable($this->{name}, $variable);
|
|
$result.=$varval if defined($varval); # expand the variable
|
|
}
|
|
}
|
|
$result.=$rest; # add on anything that's left.
|
|
|
|
return $result;
|
|
}
|
|
|
|
|
|
sub description {
|
|
my $this=shift;
|
|
return $this->_expand_vars($this->template->description);
|
|
}
|
|
|
|
|
|
sub extended_description {
|
|
my $this=shift;
|
|
return $this->_expand_vars($this->template->extended_description);
|
|
}
|
|
|
|
|
|
sub choices {
|
|
my $this=shift;
|
|
|
|
return $this->_expand_vars($this->template->choices);
|
|
}
|
|
|
|
|
|
sub choices_split {
|
|
my $this=shift;
|
|
|
|
my @items;
|
|
my $item='';
|
|
for my $chunk (split /(\\[, ]|,\s+)/, $this->choices) {
|
|
if ($chunk=~/^\\([, ])$/) {
|
|
$item.=$1;
|
|
} elsif ($chunk=~/^,\s+$/) {
|
|
push @items, $item;
|
|
$item='';
|
|
} else {
|
|
$item.=$chunk;
|
|
}
|
|
}
|
|
push @items, $item if $item ne '';
|
|
return @items;
|
|
}
|
|
|
|
|
|
sub variable {
|
|
my $this=shift;
|
|
my $var=shift;
|
|
|
|
if (@_) {
|
|
return $Debconf::Db::config->setvariable($this->{name}, $var, shift);
|
|
}
|
|
else {
|
|
return $Debconf::Db::config->getvariable($this->{name}, $var);
|
|
}
|
|
}
|
|
|
|
|
|
sub flag {
|
|
my $this=shift;
|
|
my $flag=shift;
|
|
|
|
if ($flag eq 'isdefault') {
|
|
debug developer => "The isdefault flag is deprecated, use the seen flag instead";
|
|
if (@_) {
|
|
my $value=(shift eq 'true') ? 'false' : 'true';
|
|
$Debconf::Db::config->setflag($this->{name}, 'seen', $value);
|
|
}
|
|
return ($Debconf::Db::config->getflag($this->{name}, 'seen') eq 'true') ? 'false' : 'true';
|
|
}
|
|
|
|
if (@_) {
|
|
return $Debconf::Db::config->setflag($this->{name}, $flag, shift);
|
|
}
|
|
else {
|
|
return $Debconf::Db::config->getflag($this->{name}, $flag);
|
|
}
|
|
}
|
|
|
|
|
|
sub value {
|
|
my $this = shift;
|
|
|
|
unless (@_) {
|
|
my $ret=$Debconf::Db::config->getfield($this->{name}, 'value');
|
|
return $ret if defined $ret;
|
|
return $this->template->default if ref $this->template;
|
|
} else {
|
|
return $Debconf::Db::config->setfield($this->{name}, 'value', shift);
|
|
}
|
|
}
|
|
|
|
|
|
sub value_split {
|
|
my $this=shift;
|
|
|
|
my $value=$this->value;
|
|
$value='' if ! defined $value;
|
|
my @items;
|
|
my $item='';
|
|
for my $chunk (split /(\\[, ]|,\s+)/, $value) {
|
|
if ($chunk=~/^\\([, ])$/) {
|
|
$item.=$1;
|
|
} elsif ($chunk=~/^,\s+$/) {
|
|
push @items, $item;
|
|
$item='';
|
|
} else {
|
|
$item.=$chunk;
|
|
}
|
|
}
|
|
push @items, $item if $item ne '';
|
|
return @items;
|
|
}
|
|
|
|
|
|
sub addowner {
|
|
my $this=shift;
|
|
|
|
return $Debconf::Db::config->addowner($this->{name}, shift, shift);
|
|
}
|
|
|
|
|
|
sub removeowner {
|
|
my $this=shift;
|
|
|
|
my $template=$Debconf::Db::config->getfield($this->{name}, 'template');
|
|
return unless $Debconf::Db::config->removeowner($this->{name}, shift);
|
|
if (length $template and
|
|
not $Debconf::Db::config->exists($this->{name})) {
|
|
$Debconf::Db::templates->removeowner($template, $this->{name});
|
|
delete $question{$this->{name}};
|
|
}
|
|
}
|
|
|
|
|
|
sub owners {
|
|
my $this=shift;
|
|
|
|
return join(", ", sort($Debconf::Db::config->owners($this->{name})));
|
|
}
|
|
|
|
|
|
sub template {
|
|
my $this=shift;
|
|
if (@_) {
|
|
my $oldtemplate=$Debconf::Db::config->getfield($this->{name}, 'template');
|
|
my $newtemplate=shift;
|
|
if (not defined $oldtemplate or $oldtemplate ne $newtemplate) {
|
|
$Debconf::Db::templates->removeowner($oldtemplate, $this->{name})
|
|
if defined $oldtemplate and length $oldtemplate;
|
|
|
|
$Debconf::Db::config->setfield($this->{name}, 'template', $newtemplate);
|
|
|
|
$Debconf::Db::templates->addowner($newtemplate, $this->{name},
|
|
$Debconf::Db::templates->getfield($newtemplate, "type"));
|
|
}
|
|
}
|
|
return Debconf::Template->get(
|
|
$Debconf::Db::config->getfield($this->{name}, 'template'));
|
|
}
|
|
|
|
|
|
sub name {
|
|
my $this=shift;
|
|
|
|
return $this->{name};
|
|
}
|
|
|
|
|
|
sub priority {
|
|
my $this=shift;
|
|
|
|
$this->{priority}=shift if @_;
|
|
|
|
return $this->{priority};
|
|
}
|
|
|
|
|
|
sub AUTOLOAD {
|
|
(my $field = our $AUTOLOAD) =~ s/.*://;
|
|
|
|
no strict 'refs';
|
|
*$AUTOLOAD = sub {
|
|
my $this=shift;
|
|
|
|
if (@_) {
|
|
return $Debconf::Db::config->setfield($this->{name}, $field, shift);
|
|
}
|
|
my $ret=$Debconf::Db::config->getfield($this->{name}, $field);
|
|
unless (defined $ret) {
|
|
$ret = $this->template->$field() if ref $this->template;
|
|
}
|
|
if (defined $ret) {
|
|
if ($field =~ /^(?:description|extended_description|choices)-/i) {
|
|
return $this->_expand_vars($ret);
|
|
} else {
|
|
return $ret;
|
|
}
|
|
}
|
|
};
|
|
goto &$AUTOLOAD;
|
|
}
|
|
|
|
sub DESTROY {
|
|
}
|
|
|
|
|
|
1
|