summaryrefslogtreecommitdiffstats
path: root/perl-install/interactive/http.pm
diff options
context:
space:
mode:
Diffstat (limited to 'perl-install/interactive/http.pm')
-rw-r--r--perl-install/interactive/http.pm164
1 files changed, 164 insertions, 0 deletions
diff --git a/perl-install/interactive/http.pm b/perl-install/interactive/http.pm
new file mode 100644
index 000000000..70017c41d
--- /dev/null
+++ b/perl-install/interactive/http.pm
@@ -0,0 +1,164 @@
+package interactive::http;
+
+use diagnostics;
+use strict;
+use vars qw(@ISA);
+
+@ISA = qw(interactive);
+
+use CGI;
+use interactive;
+use common;
+use log;
+
+my $script_name = $ENV{INTERACTIVE_HTTP};
+my $no_header;
+my $pipe_r = "/tmp/interactive_http_r";
+my $pipe_w = "/tmp/interactive_http_w";
+
+sub open_stdout() {
+ open STDOUT, ">$pipe_w" or die;
+ $| = 1;
+ print CGI::header();
+ $no_header = 1;
+}
+
+# cont_stdout must be called after open_stdout and before the first print
+sub cont_stdout {
+ my ($o_title) = @_;
+ print CGI::start_html('-title' => $o_title) if $no_header;
+ $no_header = 0;
+}
+
+sub new_uid() {
+ my ($s, $ms) = gettimeofday();
+ $s * 256 + $ms % 256;
+}
+
+sub new {
+ open_stdout();
+ bless {}, $_[0];
+}
+
+sub end {
+ -e $pipe_r or return; # do not run this twice
+ my $q = CGI->new;
+ cont_stdout("Exit");
+ print "It's done, thanks for playing", $q->end_html;
+ close STDOUT;
+ unlink $pipe_r, $pipe_w;
+}
+sub exit { end(); exit($_[1]) }
+END { end() }
+
+sub ask_fromW {
+ my ($o, $common, $l, $_l2) = @_;
+
+ redisplay:
+ my $uid = new_uid();
+ my $q = CGI->new;
+ $q->param(state => 'next_step');
+ $q->param(uid => $uid);
+ cont_stdout($common->{title});
+
+# print $q->img({ -src => "/icons/$o->{icon}" }) if $o->{icon};
+ print @{$common->{messages}};
+ print $q->start_form('-name' => 'form', '-action' => $script_name, '-method' => 'post');
+
+ print "<table>\n";
+
+ each_index {
+ my $e = $_;
+
+ print "<tr><td>$e->{label}</td><td>\n";
+
+ $e->{type} = 'list' if $e->{type} =~ /(icon|tree)list/;
+
+ #- combo does not exist, fallback to a sensible default
+ $e->{type} = $e->{not_edit} ? 'list' : 'entry' if $e->{type} eq 'combo';
+
+ if ($e->{type} eq 'bool') {
+ print $q->checkbox('-name' => "w$::i", '-checked' => ${$e->{val}} && 'on', '-label' => $e->{text} || " ");
+ } elsif ($e->{type} eq 'button') {
+ print "nobuttonyet";
+ } elsif ($e->{type} =~ /list/) {
+ my %t;
+ $t{$_} = may_apply($e->{format}, $_) foreach @{$e->{list}};
+
+ print $q->scrolling_list('-name' => "w$::i",
+ '-values' => $e->{list},
+ '-default' => [ ${$e->{val}} ],
+ '-size' => 5, '-multiple' => '', '-labels' => \%t);
+ } else {
+ print $e->{hidden} ?
+ $q->password_field('-name' => "w$::i", '-default' => ${$e->{val}}) :
+ $q->textfield('-name' => "w$::i", '-default' => ${$e->{val}});
+ }
+
+ print "</td></tr>\n";
+ } @$l;
+
+ print "</table>\n";
+ print $q->p;
+ print $q->submit('-name' => 'ok_submit', '-value' => $common->{ok} || N("Ok"));
+ print $q->submit('-name' => 'cancel_submit', '-value' => $common->{cancel} || N("Cancel")) if $common->{cancel} || !exists $common->{ok};
+ print $q->hidden('state'), $q->hidden('uid');
+ print $q->end_form, $q->end_html;
+
+ close STDOUT; # page terminated
+
+ while (1) {
+ open(my $F, "<$pipe_r") or die;
+ $q = CGI->new($F);
+ $q->param('force_exit_dead_prog') and $o->exit;
+ last if $q->param('uid') == $uid;
+
+ open_stdout(); # re-open for writing
+ cont_stdout(N("Error"));
+ print $q->h1(N("Error")), $q->p("Sorry, you cannot go back");
+ goto redisplay;
+ }
+ each_index {
+ my $e = $_;
+ my $v = $q->param("w$::i");
+ if ($e->{type} eq 'bool') {
+ $v = $v eq 'on';
+ }
+ ${$e->{val}} = $v;
+ } @$l;
+
+ open_stdout(); # re-open for writing
+ $q->param('ok_submit');
+}
+
+sub p {
+ print "\n" . CGI::br($_) foreach @_;
+}
+
+sub wait_messageW {
+ my ($_o, $_title, $message, $message_modifiable) = @_;
+ cont_stdout();
+ print "\n" . CGI::p();
+ p($message, $message_modifiable);
+}
+
+sub wait_message_nextW {
+ my ($_o, $message, $_w) = @_;
+ p($message);
+}
+sub wait_message_endW {
+ my ($_o, $_w) = @_;
+ p(N("Done"));
+ print "\n" . CGI::p();
+}
+
+sub ok {
+ N("Ok");
+}
+
+sub cancel {
+ N("Cancel");
+}
+
+
+1;