diff options
| author | Andreas Brachold <vdr07@deltab.de> | 2008-05-09 20:43:07 +0000 |
|---|---|---|
| committer | Andreas Brachold <vdr07@deltab.de> | 2008-05-09 20:43:07 +0000 |
| commit | 45a83ae70347e03cec97821a8bc55c3d04574d05 (patch) | |
| tree | 94f8eb69f30c609063c961f87dc29eb38d06bc7f /lib | |
| parent | 07a8421cdf6fd70d217de1b1b6367752a4b42620 (diff) | |
| download | xxv-45a83ae70347e03cec97821a8bc55c3d04574d05.tar.gz xxv-45a83ae70347e03cec97821a8bc55c3d04574d05.tar.bz2 | |
* SHARE: Submit event data delayed and transmit data as block
* SHARE: use persist random id
* UTF-8: Reorder defines
* UTF-8: Replace 'SET NAMES' with 'set character set'
* alist: Move generation of channels name from template to perl code
* skins: header add generator meta-tag with version
* RECORDS: Replace character by Hexnibble
* HTTPD: Speedup lookup find skins
* HTTPD: Build options for start page delayed, avoid wrong UTF8 translation
* CHRONICLE: add cgi-parameter start/limit for paging query
* EPG: now: add cgi-parameter __cgrp=all to get all data
* CHRONICLE: Add message to console by delete entry
* OUTPUT/Ajax: optimize callback 'questions'
Diffstat (limited to 'lib')
30 files changed, 530 insertions, 173 deletions
diff --git a/lib/Tools.pm b/lib/Tools.pm index e4a1b5d..682fdde 100644 --- a/lib/Tools.pm +++ b/lib/Tools.pm @@ -6,7 +6,6 @@ use FindBin qw($RealBin); use lib sprintf("%s", $RealBin); use lib sprintf("%s/../lib", $RealBin); use Locale::gettext qw/!gettext/; -use utf8; use Encode; use Data::Dumper; @@ -756,11 +755,6 @@ sub setcharset($) { sub gettext($) { my $text = shift; - unless($CHARSET) { - my ($stack, $evalon) = &stackTrace; - print $stack if($evalon != 1); - } - unless($LOCALE) { $LOCALE = Locale::gettext->domain_raw("xxv"); $LOCALE->codeset($CHARSET); diff --git a/lib/XXV/MODULES/AUTOTIMER.pm b/lib/XXV/MODULES/AUTOTIMER.pm index 8f54038..ca43d20 100644 --- a/lib/XXV/MODULES/AUTOTIMER.pm +++ b/lib/XXV/MODULES/AUTOTIMER.pm @@ -230,9 +230,14 @@ ORDER BY # ------------------ sub new { # ------------------ - my($class, %attr) = @_; - my $self = {}; - bless($self, $class); + my($class, %attr) = @_; + my $self = {}; + bless($self, $class); + + $self->{charset} = delete $attr{'-charset'}; + if($self->{charset} eq 'UTF-8'){ + eval 'use utf8'; + } # paths $self->{paths} = delete $attr{'-paths'}; @@ -1220,7 +1225,26 @@ sub list { my $fields = $sth->{'NAME'}; my $erg = $sth->fetchall_arrayref(); + + + my $exclude; + if($obj->{exclude}) { + $sql .= sprintf('NOT (%s)', $obj->{exclude}); + } + my $channels = main::getModule('CHANNELS')->ChannelHash('Id',$exclude); + map { + if($_->[3]) { + my @ch; + foreach my $c (split(',',$_->[3])) { + my $name = $channels->{$c} ? $channels->{$c}->{'Name'} : undef; + unless($name) { + $name = sprintf(gettext('Unknown channel : %s'),$c); + } + push(@ch, $name); + } + $_->[3] = join(',',@ch); + } $_->[5] = fmttime($_->[5]); $_->[6] = fmttime($_->[6]); } @$erg; @@ -1234,7 +1258,6 @@ sub list { }; if($console->typ eq 'HTML') { $info->{sortable} = '1'; - $info->{channels} = main::getModule('CHANNELS')->ChannelHash('Id'); $info->{timers} = main::getModule('TIMERS')->getTimersByAutotimer(); } $console->table($erg, $info ); diff --git a/lib/XXV/MODULES/CHANNELS.pm b/lib/XXV/MODULES/CHANNELS.pm index d821ca6..5d4a036 100644 --- a/lib/XXV/MODULES/CHANNELS.pm +++ b/lib/XXV/MODULES/CHANNELS.pm @@ -135,15 +135,18 @@ sub status { # ------------------ sub new { # ------------------ - my($class, %attr) = @_; - my $self = {}; - bless($self, $class); + my($class, %attr) = @_; + my $self = {}; + bless($self, $class); + + $self->{charset} = delete $attr{'-charset'}; + if($self->{charset} eq 'UTF-8'){ + eval 'use utf8'; + } # paths $self->{paths} = delete $attr{'-paths'}; - $self->{charset} = delete $attr{'-charset'}; - # who am I $self->{MOD} = $self->module; diff --git a/lib/XXV/MODULES/CHRONICLE.pm b/lib/XXV/MODULES/CHRONICLE.pm index 2b1b790..c833fd8 100644 --- a/lib/XXV/MODULES/CHRONICLE.pm +++ b/lib/XXV/MODULES/CHRONICLE.pm @@ -54,9 +54,14 @@ sub module { # ------------------ sub new { # ------------------ - my($class, %attr) = @_; - my $self = {}; - bless($self, $class); + my($class, %attr) = @_; + my $self = {}; + bless($self, $class); + + $self->{charset} = delete $attr{'-charset'}; + if($self->{charset} eq 'UTF-8'){ + eval 'use utf8'; + } # paths $self->{paths} = delete $attr{'-paths'}; @@ -162,6 +167,8 @@ sub list { my $self = shift; my $watcher = shift || return error('No watcher defined!'); my $console = shift || return error('No console defined!'); + my $data = shift; + my $params = shift; my %f = ( 'id' => gettext('Service'), @@ -186,16 +193,49 @@ SELECT SQL_CACHE FROM CHRONICLE WHERE id > 0 ORDER BY starttime |; - my $sth = $self->{dbh}->prepare($sql); - $sth->execute() + + my $rows = 0; + my $sth; + my $limit = $console->{cgi} && $console->{cgi}->param('limit') ? CORE::int($console->{cgi}->param('limit')) : 0; + if($limit > 0) { + # Query total count of rows + my $rsth = $self->{dbh}->prepare($sql); + $rsth->execute() + or return error sprintf("Couldn't execute query: %s.",$rsth->errstr); + $rows = $rsth->rows; + if($rows <= $limit) { + $sth = $rsth; + } else { + # Add limit query + if($console->{cgi}->param('start')) { + $sql .= " LIMIT " . CORE::int($console->{cgi}->param('start')); + $sql .= "," . $limit; + } else { + $sql .= " LIMIT " . $limit; + } + } + } + + unless($sth) { + $sth = $self->{dbh}->prepare($sql); + $sth->execute() or return error sprintf("Couldn't execute query: %s.",$sth->errstr); + $rows = $sth->rows unless($rows); + } + my $fields = $sth->{'NAME'}; my $erg = $sth->fetchall_arrayref(); - map { - $_->[3] = datum($_->[3],'weekday'); - } @$erg; - unshift(@$erg, $fields); - $console->table($erg); + + unless($console->typ eq 'AJAX') { + map { + $_->[3] = datum($_->[3],'weekday'); + } @$erg; + unshift(@$erg, $fields); + } + my $info = { + rows => $rows + }; + $console->table($erg,$info); return 1; } @@ -207,6 +247,7 @@ sub search { my $watcher = shift || return error('No watcher defined!'); my $console = shift || return error('No console defined!'); my $text = shift || return $console->err(gettext("No 'string' to search for! Please use chrsearch 'text'.")); + my $params = shift; my $query = buildsearch("title",$text); @@ -233,16 +274,51 @@ SELECT SQL_CACHE FROM CHRONICLE |; $sql .= sprintf("WHERE %s ORDER BY starttime",$query->{query}); - my $sth = $self->{dbh}->prepare($sql); - $sth->execute(@{$query->{term}}) + + + + my $rows = 0; + my $sth; + my $limit = $console->{cgi} && $console->{cgi}->param('limit') ? CORE::int($console->{cgi}->param('limit')) : 0; + if($limit > 0) { + # Query total count of rows + my $rsth = $self->{dbh}->prepare($sql); + $rsth->execute(@{$query->{term}}) + or return error sprintf("Couldn't execute query: %s.",$rsth->errstr); + $rows = $rsth->rows; + if($rows <= $limit) { + $sth = $rsth; + } else { + # Add limit query + if($console->{cgi}->param('start')) { + $sql .= " LIMIT " . CORE::int($console->{cgi}->param('start')); + $sql .= "," . $limit; + } else { + $sql .= " LIMIT " . $limit; + } + } + } + + unless($sth) { + $sth = $self->{dbh}->prepare($sql); + $sth->execute(@{$query->{term}}) or return error sprintf("Couldn't execute query: %s.",$sth->errstr); + $rows = $sth->rows unless($rows); + } + my $fields = $sth->{'NAME'}; my $erg = $sth->fetchall_arrayref(); - map { - $_->[3] = datum($_->[3],'weekday'); - } @$erg; - unshift(@$erg, $fields); - $console->table($erg); + + unless($console->typ eq 'AJAX') { + map { + $_->[3] = datum($_->[3],'weekday'); + } @$erg; + unshift(@$erg, $fields); + } + my $info = { + rows => $rows + }; + $console->table($erg,$info); return 1; } @@ -262,7 +338,13 @@ sub delete { $sth->execute(@ids) or return error sprintf("Couldn't execute query: %s.",$sth->errstr); - return 1; + $console->message(sprintf gettext("Chronicle entry %s deleted."), join(',', @ids)); + debug sprintf('Chronicle entry "%s" is deleted%s', + join(',', @ids), + ( $console->{USER} && $console->{USER}->{Name} ? sprintf(' from user: %s', $console->{USER}->{Name}) : "" ) + ); + $console->redirect({url => '?cmd=chrlist', wait => 1}) + if($console->typ eq 'HTML'); } 1; diff --git a/lib/XXV/MODULES/CONFIG.pm b/lib/XXV/MODULES/CONFIG.pm index bbe8751..8ff319e 100644 --- a/lib/XXV/MODULES/CONFIG.pm +++ b/lib/XXV/MODULES/CONFIG.pm @@ -70,9 +70,14 @@ sub module { # ------------------ sub new { # ------------------ - my($class, %attr) = @_; - my $self = {}; - bless($self, $class); + my($class, %attr) = @_; + my $self = {}; + bless($self, $class); + + $self->{charset} = delete $attr{'-charset'}; + if($self->{charset} eq 'UTF-8'){ + eval 'use utf8'; + } # paths $self->{paths} = delete $attr{'-paths'}; diff --git a/lib/XXV/MODULES/EPG.pm b/lib/XXV/MODULES/EPG.pm index 35631e3..7e49470 100644 --- a/lib/XXV/MODULES/EPG.pm +++ b/lib/XXV/MODULES/EPG.pm @@ -162,6 +162,11 @@ sub new { my $self = {}; bless($self, $class); + $self->{charset} = delete $attr{'-charset'}; + if($self->{charset} eq 'UTF-8'){ + eval 'use utf8'; + } + # paths $self->{paths} = delete $attr{'-paths'}; @@ -1008,13 +1013,26 @@ INSERT INTO NEXTEPG select FROM EPG as e, CHANNELS as c WHERE e.channel_id = c.Id AND e.starttime > NOW() -AND c.GRP = ? +|; +if($cgrp ne 'all') { + $sqltemp .= qq| + AND c.GRP = ? +|; } + + $sqltemp .= qq| GROUP BY c.Id |; + + my $sthtemp = $obj->{dbh}->prepare($sqltemp); - $sthtemp->execute($cgrp) + if($cgrp ne 'all') { + $sthtemp->execute($cgrp) + or return con_err($console, sprintf("Couldn't execute query: %s.",$sthtemp->errstr)); + } else { + $sthtemp->execute() or return con_err($console, sprintf("Couldn't execute query: %s.",$sthtemp->errstr)); + } my %f = ( 'Service' => gettext('Service'), @@ -1059,13 +1077,52 @@ WHERE AND n.channel_id = c.Id AND c.GRP = g.Id AND e.starttime = n.nexttime +|; + +if($cgrp ne 'all') { + $sql .= qq| AND c.GRP = ? -ORDER BY - c.POS|; +|; } + + $sql .= qq| +ORDER BY c.POS +|; + + my $rows; + my $sth; + my $limit = $console->{cgi} && $console->{cgi}->param('limit') ? CORE::int($console->{cgi}->param('limit')) : 0; + if($limit > 0) { + # Query total count of rows + my $rsth = $obj->{dbh}->prepare($sql); + if($cgrp ne 'all') { + $rsth->execute($cgrp) + or return error sprintf("Couldn't execute query: %s.",$rsth->errstr); + } else { + $rsth->execute() + or return error sprintf("Couldn't execute query: %s.",$rsth->errstr); + } + $rows = $rsth->rows; + if($rows <= $limit) { + $sth = $rsth; + } else { + # Add limit query + if($console->{cgi}->param('start')) { + $sql .= " LIMIT " . CORE::int($console->{cgi}->param('start')); + $sql .= "," . $limit; + } else { + $sql .= " LIMIT " . $limit; + } + } + } + + unless($sth) { + $sth = $obj->{dbh}->prepare($sql); + $sth->execute(($cgrp ne 'all') ? $cgrp : undef) + or return error sprintf("Couldn't execute query: %s.",$sth->errstr); + $rows = $sth->rows unless($rows); + } + - my $sth = $obj->{dbh}->prepare($sql); - $sth->execute($cgrp) - or return con_err($console, sprintf("Couldn't execute query: %s.",$sth->errstr)); my $fields = $sth->{'NAME'}; my $erg = $sth->fetchall_arrayref(); unless($console->typ eq 'AJAX') { @@ -1080,6 +1137,7 @@ ORDER BY periods => $obj->{periods}, cgroups => $cgroups, channelgroup => $cgrp, + rows => $rows } ); } @@ -1151,16 +1209,53 @@ WHERE AND c.GRP = g.Id AND ? BETWEEN UNIX_TIMESTAMP(e.starttime) AND (UNIX_TIMESTAMP(e.starttime) + e.duration) - AND c.GRP = ? -ORDER BY - c.POS|; +|; + + my $term; + push(@{$term},$zeit); + if($cgrp ne 'all') { + push(@{$term},$cgrp); + + $sql .= qq| + AND c.GRP = ? + |; + } + + $sql .= qq| +ORDER BY c.POS +|; + + my $rows; + my $sth; + my $limit = $console->{cgi} && $console->{cgi}->param('limit') ? CORE::int($console->{cgi}->param('limit')) : 0; + if($limit > 0) { + # Query total count of rows + my $rsth = $obj->{dbh}->prepare($sql); + $rsth->execute(@{$term}) + or return error sprintf("Couldn't execute query: %s.",$rsth->errstr); + $rows = $rsth->rows; + if($rows <= $limit) { + $sth = $rsth; + } else { + # Add limit query + if($console->{cgi}->param('start')) { + $sql .= " LIMIT " . CORE::int($console->{cgi}->param('start')); + $sql .= "," . $limit; + } else { + $sql .= " LIMIT " . $limit; + } + } + } + + unless($sth) { + $sth = $obj->{dbh}->prepare($sql); + $sth->execute(@{$term}) + or return error sprintf("Couldn't execute query: %s.",$sth->errstr); + $rows = $sth->rows unless($rows); + } - my $sth = $obj->{dbh}->prepare($sql); - $sth->execute($zeit, $cgrp) - or return con_err($console, sprintf("Couldn't execute query: %s.",$sth->errstr)); my $fields = $sth->{'NAME'}; my $erg = $sth->fetchall_arrayref(); - unless($console->typ eq 'AJAX') { # map { # $_->[5] = datum($_->[5],'short'); @@ -1174,6 +1269,7 @@ ORDER BY periods => $obj->{periods}, cgroups => $cgroups, channelgroup => $cgrp, + rows => $rows } ); } diff --git a/lib/XXV/MODULES/EVENTS.pm b/lib/XXV/MODULES/EVENTS.pm index f6b3937..fb458ee 100644 --- a/lib/XXV/MODULES/EVENTS.pm +++ b/lib/XXV/MODULES/EVENTS.pm @@ -64,7 +64,10 @@ sub new { my $self = {}; bless($self, $class); - $self->{Trenner} = "\n#-- NextSub --#\n"; + $self->{charset} = delete $attr{'-charset'}; + if($self->{charset} eq 'UTF-8'){ + eval 'use utf8'; + } # paths $self->{paths} = delete $attr{'-paths'}; diff --git a/lib/XXV/MODULES/GRAB.pm b/lib/XXV/MODULES/GRAB.pm index 996ac90..30c6a4b 100644 --- a/lib/XXV/MODULES/GRAB.pm +++ b/lib/XXV/MODULES/GRAB.pm @@ -134,6 +134,11 @@ sub new { my $self = {}; bless($self, $class); + $self->{charset} = delete $attr{'-charset'}; + if($self->{charset} eq 'UTF-8'){ + eval 'use utf8'; + } + # paths $self->{paths} = delete $attr{'-paths'}; diff --git a/lib/XXV/MODULES/HTTPD.pm b/lib/XXV/MODULES/HTTPD.pm index 2106d75..f9d6bb0 100644 --- a/lib/XXV/MODULES/HTTPD.pm +++ b/lib/XXV/MODULES/HTTPD.pm @@ -91,18 +91,11 @@ sub module { default => 'now', type => 'list', required => gettext('This is required!'), - choices => [ - [ gettext('Schema'), 'schema'], - [ gettext('Running now'), 'now'], - [ gettext('Program guide'), 'program'], - [ gettext('Autotimer'), 'alist'], - [ gettext('Timers'), 'tlist'], - [ gettext('Recordings'), 'rlist'], - [ gettext('Music'), 'mlist'], - [ gettext('Remote'), 'remote'], - [ gettext('Teletext'), 'vtxpage'], - [ gettext('Status'), 'sa'], - ], + choices => sub { + my $erg = $self->_get_startpage_as_array(); + map { my $x = $_->[1]; $_->[1] = $_->[0]; $_->[0] = $x; } @$erg; + return $erg; + } }, Debug => { description => gettext('Dump additional debugging information, required only for software development.'), @@ -127,11 +120,14 @@ sub new { my $self = {}; bless($self, $class); + $self->{charset} = delete $attr{'-charset'}; + if($self->{charset} eq 'UTF-8'){ + eval 'use utf8'; + } + # paths $self->{paths} = delete $attr{'-paths'}; - $self->{charset} = delete $attr{'-charset'}; - # who am I $self->{MOD} = $self->module; @@ -531,8 +527,14 @@ sub findskins { my $self = shift || return error('No object defined!'); my @skins; - find({ wanted => sub{ + + my $max_depth = $self->{paths}->{HTMLDIR} =~ tr[/][]; + + find({ wanted => sub { + my $depth = $File::Find::dir =~ tr[/][]; + if(-d $File::Find::name + and ( $depth <= $max_depth ) and ( -e $File::Find::name.'/index.tmpl' or -e $File::Find::name.'/index.html') ) { @@ -634,5 +636,22 @@ sub checkvalue { if(ref $console); } +# ------------------ +sub _get_startpage_as_array { +# ------------------ + my $self = shift || return error('No object defined!'); + return [ + [ 'schema', gettext('Schema')], + [ 'now', gettext('Running now')], + [ 'program',gettext('Program guide')], + [ 'alist', gettext('Autotimer')], + [ 'tlist', gettext('Timers')], + [ 'rlist', gettext('Recordings')], + [ 'mlist', gettext('Music')], + [ 'remote', gettext('Remote')], + [ 'vtxpage',gettext('Teletext')], + [ 'sa', gettext('Status')] + ]; +} 1; diff --git a/lib/XXV/MODULES/INTERFACE.pm b/lib/XXV/MODULES/INTERFACE.pm index 243ac15..84d3dca 100644 --- a/lib/XXV/MODULES/INTERFACE.pm +++ b/lib/XXV/MODULES/INTERFACE.pm @@ -55,6 +55,11 @@ sub new { my $self = {}; bless($self, $class); + $self->{charset} = delete $attr{'-charset'}; + if($self->{charset} eq 'UTF-8'){ + eval 'use utf8'; + } + # paths $self->{paths} = delete $attr{'-paths'}; diff --git a/lib/XXV/MODULES/LOGREAD.pm b/lib/XXV/MODULES/LOGREAD.pm index a211922..4665c55 100644 --- a/lib/XXV/MODULES/LOGREAD.pm +++ b/lib/XXV/MODULES/LOGREAD.pm @@ -67,6 +67,11 @@ sub new { my $self = {}; bless($self, $class); + $self->{charset} = delete $attr{'-charset'}; + if($self->{charset} eq 'UTF-8'){ + eval 'use utf8'; + } + # paths $self->{paths} = delete $attr{'-paths'}; diff --git a/lib/XXV/MODULES/MEDIALIB.pm b/lib/XXV/MODULES/MEDIALIB.pm index 76eb612..794c9fb 100644 --- a/lib/XXV/MODULES/MEDIALIB.pm +++ b/lib/XXV/MODULES/MEDIALIB.pm @@ -160,6 +160,11 @@ sub new { my $self = {}; bless($self, $class); + $self->{charset} = delete $attr{'-charset'}; + if($self->{charset} eq 'UTF-8'){ + eval 'use utf8'; + } + # paths $self->{paths} = delete $attr{'-paths'}; diff --git a/lib/XXV/MODULES/MOVETIMER.pm b/lib/XXV/MODULES/MOVETIMER.pm index 648359c..6b92d30 100644 --- a/lib/XXV/MODULES/MOVETIMER.pm +++ b/lib/XXV/MODULES/MOVETIMER.pm @@ -74,6 +74,11 @@ sub new { my $self = {}; bless($self, $class); + $self->{charset} = delete $attr{'-charset'}; + if($self->{charset} eq 'UTF-8'){ + eval 'use utf8'; + } + # paths $self->{paths} = delete $attr{'-paths'}; diff --git a/lib/XXV/MODULES/MUSIC.pm b/lib/XXV/MODULES/MUSIC.pm index d15e4d9..ad705cc 100644 --- a/lib/XXV/MODULES/MUSIC.pm +++ b/lib/XXV/MODULES/MUSIC.pm @@ -160,11 +160,14 @@ sub new { my $self = {}; bless($self, $class); + $self->{charset} = delete $attr{'-charset'}; + if($self->{charset} eq 'UTF-8'){ + eval 'use utf8'; + } + # paths $self->{paths} = delete $attr{'-paths'}; - $self->{charset} = delete $attr{'-charset'}; - # who am I $self->{MOD} = $self->module; diff --git a/lib/XXV/MODULES/RECORDS.pm b/lib/XXV/MODULES/RECORDS.pm index 74d6da7..4c2ffef 100644 --- a/lib/XXV/MODULES/RECORDS.pm +++ b/lib/XXV/MODULES/RECORDS.pm @@ -234,6 +234,11 @@ sub new { my $self = {}; bless($self, $class); + $self->{charset} = delete $attr{'-charset'}; + if($self->{charset} eq 'UTF-8'){ + eval 'use utf8'; + } + # paths $self->{paths} = delete $attr{'-paths'}; @@ -414,14 +419,13 @@ sub parseData { my $dataHash = {}; foreach my $record (@{$vdata}) { - if($record =~ /\s+\d+´\s+/) { # VDR is patched with recording length patch - # 250-1 01.11 15:14* 50´ Discovery~Die Rose von Kerrymore Spielfilm D/2000 - ($id, $date, $hour, $minute, $state, $duration, $title) + if($record =~ /\s+\d+\xB4\s+/) { # VDR is patched with recording length patch + ($id, $date, $hour, $minute, $state, $duration, $title) = $record =~ /^250[\-|\s](\d+)\s+([\d|\.]+)\s+(\d+)\:(\d+)(.?)\s*(\d*).*?\s+(.+)/si; } else { # Vanilla VDR - # 250-1 01.11 15:14* Discovery~Die Rose von Kerrymore Spielfilm D/2000 - ($id, $date, $hour, $minute, $state, $title) - = $record =~ /^250[\-|\s](\d+)\s+([\d|\.]+)\s+(\d+)\:(\d+)(.?).*?\s+(.+)/si; + # 250-1 01.11 15:14* Discovery~Die Rose von Kerrymore Spielfilm D/2000 + ($id, $date, $hour, $minute, $state, $title) + = $record =~ /^250[\-|\s](\d+)\s+([\d|\.]+)\s+(\d+)\:(\d+)(.?).*?\s+(.+)/si; } unless($id) { @@ -2229,7 +2233,7 @@ sub conv { ); my $output; - if(open P, $command .' |') { # Kommando ausführen und stdout einlesen + if(open P, $command .' |') { # execute command and read result from stdout @$output = <P>; close P; if( $? >> 8 > 0) { @@ -2377,8 +2381,8 @@ sub translate { if($vfat eq 'y') { - $title =~ s/([^üäößa-z0-9\&\!\-\s\.\@\~\,\(\)\%\+])/sprintf('#%X', ord($1))/seig; - $title =~ s/[^üäößa-z0-9\!\&\-\#\.\@\~\,\(\)\%\+]/_/sig; + $title =~ s/([^\xDC\xC4\xD6\xFC\xE4\xF6\xDFa-z0-9\&\!\-\s\.\@\~\,\(\)\%\+])/sprintf('#%X', ord($1))/seig; + $title =~ s/[^\xDC\xC4\xD6\xFC\xE4\xF6\xDFa-z0-9\!\&\-\#\.\@\~\,\(\)\%\+]/_/sig; # Windows couldn't handle '.' at the end of directory names $title =~ s/(\.$)/\#2E/sig; $title =~ s/(\.~)/\#2E~/sig; diff --git a/lib/XXV/MODULES/REMOTE.pm b/lib/XXV/MODULES/REMOTE.pm index e313672..972ee86 100644 --- a/lib/XXV/MODULES/REMOTE.pm +++ b/lib/XXV/MODULES/REMOTE.pm @@ -77,6 +77,11 @@ sub new { my $self = {}; bless($self, $class); + $self->{charset} = delete $attr{'-charset'}; + if($self->{charset} eq 'UTF-8'){ + eval 'use utf8'; + } + # paths $self->{paths} = delete $attr{'-paths'}; diff --git a/lib/XXV/MODULES/REPORT.pm b/lib/XXV/MODULES/REPORT.pm index eb6edcf..dfcdc72 100644 --- a/lib/XXV/MODULES/REPORT.pm +++ b/lib/XXV/MODULES/REPORT.pm @@ -74,6 +74,11 @@ sub new { my $self = {}; bless($self, $class); + $self->{charset} = delete $attr{'-charset'}; + if($self->{charset} eq 'UTF-8'){ + eval 'use utf8'; + } + # paths $self->{paths} = delete $attr{'-paths'}; diff --git a/lib/XXV/MODULES/ROBOT.pm b/lib/XXV/MODULES/ROBOT.pm index 6e88113..e030abe 100644 --- a/lib/XXV/MODULES/ROBOT.pm +++ b/lib/XXV/MODULES/ROBOT.pm @@ -46,6 +46,11 @@ sub new { my $self = {}; bless($self, $class); + $self->{charset} = delete $attr{'-charset'}; + if($self->{charset} eq 'UTF-8'){ + eval 'use utf8'; + } + # paths $self->{paths} = delete $attr{'-paths'}; diff --git a/lib/XXV/MODULES/SHARE.pm b/lib/XXV/MODULES/SHARE.pm index 3a78718..6188298 100644 --- a/lib/XXV/MODULES/SHARE.pm +++ b/lib/XXV/MODULES/SHARE.pm @@ -10,22 +10,34 @@ $SIG{CHLD} = 'IGNORE'; # ------------------ sub AUTOLOAD { # ------------------ - my $obj = shift || return error('No object defined!'); + my $self = shift || return error('No object defined!'); my $cmd = (split('::', $AUTOLOAD))[-1]; return if($cmd eq 'DESTROY'); - # Den Hash per Hand nachpflegen - # bis zum nächsten Refresh ... if($cmd eq 'setEventLevel') { - $obj->StoreEventLevel($_[0],$_[1]); - $_[2] += $obj->{TimeOffset} if(exists $obj->{TimeOffset}); + # Den Hash per Hand nachpflegen + # bis zum nächsten Refresh ... + $self->StoreEventLevel($_[0],$_[1]); + $_[2] += $self->{TimeOffset} if(exists $self->{TimeOffset}); + + # Den Hash in Warteschlange einfügen ... + foreach my $d (@{$self->{setEventLevelQueue}}) { + if($d->[0] == $_[0]) { + $d->[1] = $_[1]; + $d->[2] = $_[2]; + return 1; + } + } + push(@{$self->{setEventLevelQueue}}, [$_[0],$_[1],$_[2]] ); + return 1; } - if($obj->{SOAP} && $obj->{active} eq 'y') { - my $erg = $obj->CmdToService($obj->{SOAP}, $cmd, $obj->{SessionId}, @_); + if($self->{SOAP} && $self->{active} eq 'y') { + my $erg = $self->CmdToService($self->{SOAP}, $cmd, $self->{randomid}, @_); return $erg; } + return 0; } @@ -33,7 +45,7 @@ sub AUTOLOAD { # ------------------ sub module { # ------------------ - my $obj = shift || return error('No object defined!'); + my $self = shift || return error('No object defined!'); my $args = { Name => 'SHARE', Prereq => { @@ -74,14 +86,18 @@ sub module { type => 'integer', required => gettext('This is required!'), }, + randomid => { + default => "", + type => 'hidden' + } }, Commands => { topten => { description => gettext("Display the TopTen list of timers."), short => 't10', - callback => sub{ $obj->TopTen(@_) }, - }, - }, + callback => sub{ $self->TopTen(@_) }, + } + } }; return $args; } @@ -93,6 +109,11 @@ sub new { my $self = {}; bless($self, $class); + $self->{charset} = delete $attr{'-charset'}; + if($self->{charset} eq 'UTF-8'){ + eval 'use utf8'; + } + # paths $self->{paths} = delete $attr{'-paths'}; @@ -102,6 +123,8 @@ sub new { # read the DB Handle $self->{dbh} = delete $attr{'-dbh'}; + $self->{MOD}->{Preferences}->{randomid}->{default} = $self->generateRandomID(); + # all configvalues to $self without parents (important for ConfigModule) map { $self->{$_} = $attr{'-config'}->{$self->{MOD}->{Name}}->{$_}; @@ -126,21 +149,21 @@ sub new { # ------------------ sub _init { # ------------------ - my $obj = shift || return error('No object defined!'); + my $self = shift || return error('No object defined!'); - $obj->{SessionId} = $obj->generateUniqueId - unless($obj->{SessionId}); + $self->{randomid} = $self->generateRandomID() + unless($self->{randomid}); my $version = 27; # Must be increment if rows of table changed # this tables hasen't handmade user data, # therefore old table could dropped if updated rows # remove old table, if updated version - if(!tableUpdated($obj->{dbh},'SHARE',$version,1)) { + if(!tableUpdated($self->{dbh},'SHARE',$version,1)) { return 0; } - $obj->{dbh}->do(qq| + $self->{dbh}->do(qq| CREATE TABLE IF NOT EXISTS SHARE ( eventid int unsigned default '0', level float, @@ -153,37 +176,44 @@ sub _init { main::after(sub{ - $obj->{SOAP} = $obj->ConnectToService($obj->{SessionId},$obj->{rating}); + $self->{SOAP} = $self->ConnectToService($self->{randomid},$self->{rating}); - unless($obj->{SOAP}) { - error sprintf("Couldn't connect to popularity web service %s!", $obj->{rating}); + unless($self->{SOAP}) { + error sprintf("Couldn't connect to popularity web service %s!", $self->{rating}); return 0; } else { - my $servertime = $obj->getServerTime(); + my $servertime = $self->getServerTime(); if($servertime) { my $offset = time - $servertime; if($offset > 60 || $offset < -60) { - $obj->{TimeOffset} = $offset; + $self->{TimeOffset} = $offset; lg sprintf('Popularity web service has time offset %d seconds.',$offset); } } } return 1; - }, "SHARE: Connect to popularity web service ...",4) if($obj->{active} eq 'y'); + }, "SHARE: Connect to popularity web service ...",4) if($self->{active} eq 'y'); main::after(sub{ - if($obj->{SOAP}) { - $obj->getSoapData(); + if($self->{SOAP}) { + $self->getSoapData(); Event->timer( - interval => $obj->{update} * 3600, + interval => $self->{update} * 3600, prio => 6, # -1 very hard ... 6 very low cb => sub{ - $obj->getSoapData() + $self->getSoapData(); + }, + ); + Event->timer( + interval => ($self->{update}/12) * 1800, + prio => 6, # -1 very hard ... 6 very low + cb => sub{ + $self->flushEventLevelQueue(); }, ); } - return 1; - }, "SHARE: Update data with popularity web service ...",48) if($obj->{active} eq 'y'); + return 1; + }, "SHARE: Update data with popularity web service ...",48) if($self->{active} eq 'y'); return 1; } @@ -191,14 +221,14 @@ sub _init { # ------------------ sub getSoapData { # ------------------ - my $obj = shift || return error('No object defined!'); - return unless($obj->{SOAP} and $obj->{active} eq 'y'); + my $self = shift || return error('No object defined!'); + return unless($self->{SOAP} and $self->{active} eq 'y'); lg 'Start interval to get popularity top ten events!'; - my $topevents = $obj->getTopTen(1000); + my $topevents = $self->getTopTen(1000); my $time = time; foreach my $t (@$topevents) { - my $sth = $obj->{dbh}->prepare('REPLACE INTO SHARE(eventid, level, quantity, rank, addtime) VALUES (?,?,?,?,FROM_UNIXTIME(?))'); + my $sth = $self->{dbh}->prepare('REPLACE INTO SHARE(eventid, level, quantity, rank, addtime) VALUES (?,?,?,?,FROM_UNIXTIME(?))'); $sth->execute( $t->{e}, # eventid $t->{l}, # level @@ -208,39 +238,39 @@ sub getSoapData { ); } - my $dsth = $obj->{dbh}->prepare('DELETE FROM SHARE WHERE addtime != FROM_UNIXTIME(?)'); + my $dsth = $self->{dbh}->prepare('DELETE FROM SHARE WHERE addtime != FROM_UNIXTIME(?)'); $dsth->execute($time); } # ------------------ -sub generateUniqueId { +sub generateRandomID { # ------------------ - my $obj = shift || return error('No object defined!'); + my $self = shift || return error('No object defined!'); - my $sessionId; + my $randomid; for(my $i=0 ; $i< 16 ;) { my $j = chr(int(rand(127))); if($j =~ /[a-zA-Z0-9]/) { - $sessionId .=$j; + $randomid .=$j; $i++; } } - return $sessionId; + return $randomid; } # ------------------ sub ConnectToService { # ------------------ - my $obj = shift || return error('No object defined!'); - my $sid = shift || $obj->{SessionId} || return error('No session id defined!'); + my $self = shift || return error('No object defined!'); + my $sid = shift || $self->{randomid} || return error('No session id defined!'); my $service = shift; return undef - if($obj->{active} ne 'y'); + if($self->{active} ne 'y'); my $version = main::getVersion(); @@ -256,13 +286,13 @@ sub ConnectToService { my $usrkey; if($webservice) { - $usrkey = $obj->CmdToService($webservice,'getUsrKey',$obj->{SessionId}) + $usrkey = $self->CmdToService($webservice,'getUsrKey',$self->{randomid}) or error "Couldn't get user key"; - error "Response contain wrong answer" if($usrkey ne $obj->{SessionId}); + error "Response contain wrong answer" if($usrkey ne $self->{randomid}); } return $webservice - if($usrkey eq $obj->{SessionId}); + if($usrkey eq $self->{randomid}); return undef; } @@ -270,7 +300,7 @@ sub ConnectToService { # ------------------ sub getEventLevel { # ------------------ - my $obj = shift || return error('No object defined!'); + my $self = shift || return error('No object defined!'); my $eid = shift || return; my $sql = qq| @@ -280,7 +310,7 @@ where eventid = ? |; - my $sth = $obj->{dbh}->prepare($sql); + my $sth = $self->{dbh}->prepare($sql); $sth->execute($eid) or return error(sprintf("Event '%s' does not exist in the database!",$eid)); my $erg = $sth->fetchrow_hashref(); @@ -290,11 +320,11 @@ where # ------------------ sub StoreEventLevel { # ------------------ - my $obj = shift || return error('No object defined!'); + my $self = shift || return error('No object defined!'); my $eid = shift || return; my $level = shift || return; - my $sth = $obj->{dbh}->prepare('REPLACE INTO SHARE(eventid, level, quantity, rank, addtime) VALUES (?,?,1,1,NOW())'); + my $sth = $self->{dbh}->prepare('REPLACE INTO SHARE(eventid, level, quantity, rank, addtime) VALUES (?,?,1,1,NOW())'); $sth->execute( $eid, # eventid $level # level @@ -304,7 +334,7 @@ sub StoreEventLevel { # ------------------ sub TopTen { # ------------------ - my $obj = shift || return error('No object defined!'); + my $self = shift || return error('No object defined!'); my $watcher = shift || return error('No watcher defined!'); my $console = shift || return error('No console defined!'); my $anzahl = shift || 10; @@ -364,7 +394,7 @@ sub TopTen { LIMIT ? |; - my $sth = $obj->{dbh}->prepare($sql); + my $sth = $self->{dbh}->prepare($sql); $sth->execute($anzahl) or return con_err($console, sprintf("Couldn't execute query: %s.",$sth->errstr)); my $fields = $sth->{'NAME'}; @@ -378,17 +408,35 @@ sub TopTen { } # ------------------ +sub flushEventLevelQueue { +# ------------------ + my $self = shift || return error('No object defined!'); + + do { + my @Queue = splice(@{$self->{setEventLevelQueue}},0,25); + if(scalar @Queue) { + lg(sprintf("Flush %d item from event level queue",scalar @Queue)); + my $result = $self->setEventArray(\@Queue); + if($result != 1) { + error(sprintf("Wrong response from soap service setEventArray(%s)", $result)); + } + } + } while (scalar @{$self->{setEventLevelQueue}}); + +} + +# ------------------ sub CmdToService { # ------------------ - my $obj = shift || return error('No object defined!'); + my $self = shift || return error('No object defined!'); my $service = shift || return error('No service defined!'); my $cmd = shift || return error('No command defined!'); my @arg = @_; - lg(sprintf("CmdToService : %s - %s",$cmd, join(", ",@arg))); + lg(sprintf("Call %s from soap service : %s",$cmd, $arg[0])); my $res = eval "\$service->$cmd(\@arg)"; - $@ ? return error('SyntaxError: $@') + $@ ? return error("SyntaxError: $@") : return $res; } diff --git a/lib/XXV/MODULES/STATUS.pm b/lib/XXV/MODULES/STATUS.pm index 1b0dc60..75eb80e 100644 --- a/lib/XXV/MODULES/STATUS.pm +++ b/lib/XXV/MODULES/STATUS.pm @@ -129,6 +129,11 @@ sub new { my $self = {}; bless($self, $class); + $self->{charset} = delete $attr{'-charset'}; + if($self->{charset} eq 'UTF-8'){ + eval 'use utf8'; + } + # paths $self->{paths} = delete $attr{'-paths'}; diff --git a/lib/XXV/MODULES/STREAM.pm b/lib/XXV/MODULES/STREAM.pm index 9f96a3d..c4deab0 100644 --- a/lib/XXV/MODULES/STREAM.pm +++ b/lib/XXV/MODULES/STREAM.pm @@ -131,6 +131,11 @@ sub new { my $self = {}; bless($self, $class); + $self->{charset} = delete $attr{'-charset'}; + if($self->{charset} eq 'UTF-8'){ + eval 'use utf8'; + } + # paths $self->{paths} = delete $attr{'-paths'}; diff --git a/lib/XXV/MODULES/SVDRP.pm b/lib/XXV/MODULES/SVDRP.pm index 0a02831..e18eeff 100644 --- a/lib/XXV/MODULES/SVDRP.pm +++ b/lib/XXV/MODULES/SVDRP.pm @@ -68,6 +68,11 @@ sub new { my $self = {}; bless($self, $class); + $self->{charset} = delete $attr{'-charset'}; + if($self->{charset} eq 'UTF-8'){ + eval 'use utf8'; + } + # paths $self->{paths} = delete $attr{'-paths'}; diff --git a/lib/XXV/MODULES/TELNET.pm b/lib/XXV/MODULES/TELNET.pm index 1564bc5..47b4585 100644 --- a/lib/XXV/MODULES/TELNET.pm +++ b/lib/XXV/MODULES/TELNET.pm @@ -92,6 +92,11 @@ sub new { my $self = {}; bless($self, $class); + $self->{charset} = delete $attr{'-charset'}; + if($self->{charset} eq 'UTF-8'){ + eval 'use utf8'; + } + # paths $self->{paths} = delete $attr{'-paths'}; diff --git a/lib/XXV/MODULES/TIMERS.pm b/lib/XXV/MODULES/TIMERS.pm index f788af9..c542d9a 100644 --- a/lib/XXV/MODULES/TIMERS.pm +++ b/lib/XXV/MODULES/TIMERS.pm @@ -364,6 +364,11 @@ sub new { my $self = {}; bless($self, $class); + $self->{charset} = delete $attr{'-charset'}; + if($self->{charset} eq 'UTF-8'){ + eval 'use utf8'; + } + # paths $self->{paths} = delete $attr{'-paths'}; diff --git a/lib/XXV/MODULES/USER.pm b/lib/XXV/MODULES/USER.pm index 95cf1f3..76eebe6 100644 --- a/lib/XXV/MODULES/USER.pm +++ b/lib/XXV/MODULES/USER.pm @@ -153,6 +153,11 @@ sub new { my $self = {}; bless($self, $class); + $self->{charset} = delete $attr{'-charset'}; + if($self->{charset} eq 'UTF-8'){ + eval 'use utf8'; + } + # paths $self->{paths} = delete $attr{'-paths'}; diff --git a/lib/XXV/MODULES/VTX.pm b/lib/XXV/MODULES/VTX.pm index bc7ba39..ffb5173 100644 --- a/lib/XXV/MODULES/VTX.pm +++ b/lib/XXV/MODULES/VTX.pm @@ -74,6 +74,11 @@ sub new { my $self = {}; bless($self, $class); + $self->{charset} = delete $attr{'-charset'}; + if($self->{charset} eq 'UTF-8'){ + eval 'use utf8'; + } + # paths $self->{paths} = delete $attr{'-paths'}; diff --git a/lib/XXV/MODULES/WAPD.pm b/lib/XXV/MODULES/WAPD.pm index ff5dcc6..4ff424f 100644 --- a/lib/XXV/MODULES/WAPD.pm +++ b/lib/XXV/MODULES/WAPD.pm @@ -95,11 +95,14 @@ sub new { my $self = {}; bless($self, $class); + $self->{charset} = delete $attr{'-charset'}; + if($self->{charset} eq 'UTF-8'){ + eval 'use utf8'; + } + # paths $self->{paths} = delete $attr{'-paths'}; - $self->{charset} = delete $attr{'-charset'}; - # who am I $self->{MOD} = $self->module; diff --git a/lib/XXV/MODULES/XMLTV.pm b/lib/XXV/MODULES/XMLTV.pm index 753ffcd..b3ed74b 100644 --- a/lib/XXV/MODULES/XMLTV.pm +++ b/lib/XXV/MODULES/XMLTV.pm @@ -4,7 +4,6 @@ use strict; use File::Find; use File::Basename; use Tools; -use utf8; use Encode; # This module method must exist for XXV @@ -81,11 +80,14 @@ sub new { my $self = {}; bless($self, $class); + $self->{charset} = delete $attr{'-charset'}; + if($self->{charset} eq 'UTF-8'){ + eval 'use utf8'; + } + # paths $self->{paths} = delete $attr{'-paths'}; - $self->{charset} = delete $attr{'-charset'}; - # who am I $self->{MOD} = $self->module; @@ -347,11 +349,12 @@ sub _ProcessXML { my $text = shift; my $xdata = $self->{xml}->XMLin($text); - # Ausgabe return error "Missing channel" unless $xdata->{channel}; return error "Missing program data" unless $xdata->{programme}; + # Create output + my $epgdata = ''; @@ -731,7 +734,7 @@ sub findfiles find({ wanted => sub{ if(-r $File::Find::name) { if($File::Find::name =~ /\.xml$/sig # Lookup for *.xml - or $File::Find::name =~ /\.tpl$/sig) { # Lookup for *.xml + or $File::Find::name =~ /\.tpl$/sig) { # Lookup for *.tpl my $l = basename($File::Find::name); push(@files,[$l,$l]); } diff --git a/lib/XXV/OUTPUT/Ajax.pm b/lib/XXV/OUTPUT/Ajax.pm index 927e4f6..a072c68 100644 --- a/lib/XXV/OUTPUT/Ajax.pm +++ b/lib/XXV/OUTPUT/Ajax.pm @@ -1,7 +1,6 @@ package XXV::OUTPUT::Ajax; use strict; -use utf8; use Encode; use vars qw($AUTOLOAD); use Tools; @@ -38,10 +37,9 @@ sub AUTOLOAD { my $name = (split('::', $AUTOLOAD))[-1]; return if($name eq 'DESTROY'); - $self->{nopack} = 1; $self->out( $data, $params, $name ); - $self->{call} = ''; + #$self->{call} = ''; } # ------------------ @@ -51,6 +49,11 @@ sub new { my $self = {}; bless($self, $class); + $self->{charset} = delete $attr{'-charset'} || 'ISO-8859-1'; + if($self->{charset} eq 'UTF-8'){ + eval 'use utf8'; + } + # who am I $self->{MOD} = $self->module; @@ -78,9 +81,6 @@ sub new { $self->{debug} = $attr{'-debug'} || 0; - $self->{charset} = $attr{'-charset'} - || 'ISO-8859-15'; - $self->{types} = { 'xml' => 'application/xml; charset='. $self->{charset}, 'json' => 'application/json; charset='. $self->{charset}, @@ -102,6 +102,13 @@ sub new { } $self->{TYP} = 'AJAX'; + # Forward name of Server for CGI::server_software + $ENV{'SERVER_SOFTWARE'} = sprintf("xxvd %s",main::getVersion()); + $ENV{'SERVER_PROTOCOL'} = 'HTTP/1.1'; + + eval "use Compress::Zlib"; + $self->{Zlib} = ($@ ? 0 : 1); + return $self; } @@ -299,6 +306,9 @@ sub question { my $out = []; if(ref $questions eq 'ARRAY') { @$quest = @$questions; + } else { + @$quest = [ $questions ]; + } while (my ($name, $data) = splice(@$quest, 0, 2)) { my $type = $data->{typ} || 'string'; my $def ; @@ -321,33 +331,16 @@ sub question { } } - push(@$out,[$name,$data->{msg},$type,$def,$data->{req} ? 1 : 0,$data->{readonly} ? 1 : 0,$choices]); - } - $self->out( $out, 0 , 'question' ); - } else { - my $type = $questions->{typ} || 'string'; - my $def ; - if(ref $questions->{def} eq 'CODE') { - $def = $questions->{def}(); - } elsif(ref $questions->{def} eq 'ARRAY') { - $def = join(',',@{$questions->{def}}); - } else { - $def = $questions->{def}; - } + if($type eq 'list' + && $data->{options} + && $data->{options} eq 'multi') { + $type = 'multilist'; + } - my $choices ; - if($questions->{choices}) { - if(ref $questions->{choices} eq 'CODE') { - $choices = $questions->{choices}(); - } else { - $choices = $questions->{choices}; - } + push(@$out,[$name,$data->{msg},$type,$def,$data->{req} ? 1 : 0,$data->{readonly} ? 1 : 0,$choices]); } - - push(@$out,[$type,$questions->{msg},$type,$def,$questions->{req} ? 1 : 0,$questions->{readonly} ? 1 : 0,$choices]); $self->out( $out, 0 , 'question' ); - } - return undef; + return undef; } # ------------------ @@ -367,7 +360,7 @@ sub msg { $self->out( $msg, { state => $state }, 'msg' ); - $self->{call} = ''; + #$self->{call} = ''; } # ------------------ @@ -400,8 +393,8 @@ sub setCall { my $self = shift || return error('No object defined!'); my $name = shift || return error('No name defined!'); - $self->{call} = $name; - return $self->{call}; + #$self->{call} = $name; + #return $self->{call}; } # ------------------ diff --git a/lib/XXV/OUTPUT/Html.pm b/lib/XXV/OUTPUT/Html.pm index b918e81..1b0ece7 100644 --- a/lib/XXV/OUTPUT/Html.pm +++ b/lib/XXV/OUTPUT/Html.pm @@ -58,6 +58,11 @@ sub new { my $self = {}; bless($self, $class); + $self->{charset} = delete $attr{'-charset'} || 'ISO-8859-1'; + if($self->{charset} eq 'UTF-8'){ + eval 'use utf8'; + } + # who am I $self->{MOD} = $self->module; @@ -97,9 +102,6 @@ sub new { $self->{debug} = $attr{'-debug'} || 0; - $self->{charset} = $attr{'-charset'} - || 'ISO-8859-1'; - $self->{TYP} = 'HTML'; # Forward name of Server for CGI::server_software @@ -433,6 +435,7 @@ sub statusmsg { $self->{output_header} = $self->{cgi}->header( -type => $typ, -status => $status, + -charset => $self->{charset}, %{$arg}, ); } |
