File Coverage

blib/lib/CGI/Bus.pm
Criterion Covered Total %
statement 27 794 3.4
branch 0 616 0.0
condition 0 400 0.0
subroutine 9 121 7.4
pod 83 93 89.2
total 119 2024 5.8


line stmt bran cond sub pod time code
1             #!perl -w
2             #
3             # CGI::Bus - CGI Application Object Model
4             #
5             # admiral
6             #
7            
8            
9             package CGI::Bus;
10             require 5.000;
11 1     1   774 use strict;
  1         1  
  1         30  
12 1     1   690 use CGI::Carp qw(fatalsToBrowser warningsToBrowser);
  1         4179  
  1         6  
13            
14            
15 1     1   116 use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS $AUTOLOAD);
  1         2  
  1         77  
16             $VERSION = '0.62';
17            
18 1     1   5 use vars qw($SELF);
  1         2  
  1         379  
19            
20             $SELF =undef;
21            
22             if ($ENV{MOD_PERL}) { # $ENV{GATEWAY_INTERFACE} && $ENV{GATEWAY_INTERFACE} =~/^CGI-Perl\//
23             eval('use Apache qw(exit);');
24             # *exit =\&Apache::exit;
25             }
26            
27             1;
28            
29            
30             #######################
31            
32             sub new {
33 0     0 1   my $c=shift;
34 0           my $s ={};
35 0           bless $s,$c;
36 0           $s =$s->initialize(@_);
37             }
38            
39            
40             sub fcgicount {
41 0     0 1   my $s =shift;
42 0 0         if (!ref($s)) {$s =CGI::Bus->new(@_)} # while (fcgicount) {}
  0 0          
  0            
43             elsif (scalar(@_)) {$s =CGI::Bus->new(@_)} # while (fcgicount) {}
44             else {} # while(1) {new ;,,, last if !fcgicount}
45 0 0         return(undef) if !$s->{-cgi};
46 0   0       $s->{-fcgicount} =($s->{-fcgicount} ||0) +1;
47 0 0 0       return(undef) if $s->{-fcgicount} >($s->{-fcgimax}||0);
48 0           $s;
49             }
50            
51            
52             sub initialize {
53 0     0 0   my $s =shift;
54 0           local $SELF =$s;
55 0 0 0       if (ref($_[0]) && eval{$_[0]->isa('CGI::Bus')}) { # reuse
  0            
56 0           my $r =shift; # reuse object
57 0           $r->reset($s->{-reset});
58 0           $s =$r; # in doubt
59 0           $s->{-cache} ={}; # -> reset?
60 0           foreach my $k (qw(-cgi -qpath -qurl)) {
61 0           $s->{$k} =undef;
62             }
63             }
64             else {
65 0 0         shift if !defined($_[0]);
66 0           %$s =(
67             -classes =>{} # Classes to autocreate Objects
68             #,-import =>{} # add Classes or Methods & Packages
69             ,-reset =>{} # Slotes to destroy on reuse
70             ,-endh =>{} # End handlers, used in 'reset'
71             #,-reimport =>{} # add Classes {} or Slotes [] to reset
72             ,-debug =>0 # Debug Mode
73             ,-problem =>undef # Current problem set by problem()
74             ,-cache =>{ # Data cache
75             #,-lngbase =>undef # Language messages base
76             #,-pushmsg =>undef # Messages to accumulate and display
77             #,-qrun =>undef # Query to run
78             #,-user =>undef # Current user name
79             #,-usdomain =>undef # Server's User Domain
80             #,-unames =>undef # User names list
81             #,-ugroups =>undef # User groups list
82             #,-ugnames =>undef # User and groups names list
83             #,-httpheader=>undef # HTTP header output from print->httpheader()
84             #,-htmlstart =>undef # HTML start output from print->htmlstart()
85             #,-htpgstart =>undef # HTML page begin output from print->htpgstart()
86             }
87             ,-lngname =>undef # Name and charset of the language to use
88             ,-pushlog =>undef # Log file name
89            
90             ,-cgi =>undef # CGI predefined object
91             #,-fcgimax =>undef # CGI::Fast requests max
92             #,-fcgicount =>undef # CGI::Fast requests counter
93             ,-dbi =>undef # DBI predefined object
94            
95             #,-qpath =>undef # Query (script) Path
96             #,-qurl =>undef # Query (script) URL
97             #,-spath =>undef # Site Path
98             #,-surl =>undef # Site URL
99             #,-bpath =>undef # Binary Path
100             #,-burl =>undef # Binary URL
101             #,-dpath =>undef # Data Path
102             #,-tpath =>undef # Temporary Files Path
103             #,-ppath =>undef # Publish Path
104             #,-purl =>undef # Publish URL
105             #,-fpath =>undef # Files Store Path
106             #,-furf =>undef # Files Store file URL
107             #,-furl =>undef # Files Store URL
108             #,-hpath =>undef # Homes Store Path
109             #,-hurf =>undef # Homes Store file URL
110             #,-hurl =>undef # Homes Store URL
111             #,-urfcnd =>undef # URFs condition sub{}
112             #,-iurl =>undef # Apaceh Images URL '/images'
113            
114             #,-user =>undef # User name get optional sub
115             #,-usdomain =>undef # Server's User Domain optional sub
116             #,-ugroups =>undef # User groups list optional sub
117             #,-usercnv =>undef # User/Group names convertor optional sub
118             #,-ugrpcnv =>undef # User/Group names convertor optional sub
119             #,-userauth =>undef # User authentication optional sub
120             #,-uadmins =>undef # Administrators list
121             #,-w32IISdpsn =>($ENV{SERVER_SOFTWARE}||'') =~/IIS/ ? 2 : 0 # MsIIS deimpersonation
122            
123             #,-httpheader =>undef # HTTP header hash ref, for httpheader()
124             #,-htmlstart =>undef # HTML start hash ref, for htmlstart()
125             #,-htpnstart =>undef # Navigator pane HTML start
126             #,-htpgstart =>undef # HTML page HTML start
127             #,-htpfstart =>undef # HTML form HTML start
128             #,-htpgtop =>undef # HTML page begin, for htpgstart()
129             #,-htpgend =>undef # HTML page end, for htpgend()
130             );
131             }
132 0           $s->set(@_);
133 0 0         if ($ENV{MOD_PERL}) {
134 0           Apache->push_handlers("PerlCleanupHandler"
135 0     0     ,sub{eval{$s->reset}; eval('Apache::DECLINED;')}); # or '$s->reset' at the bottom of scripts
  0            
  0            
136             }
137 0 0         if (!$s->{-cgi}) {
138 0 0         eval('use CGI::Fast') if $s->{-fcgimax};
139 0           eval('use CGI qw(-no_xhtml);');
140             # $CGI::POST_MAX =-1; # default in CGI.pm
141             # $MultipartBuffer::INITIAL_FILLUNIT =1024*4; # default in CGI.pm
142 0 0 0       local $ENV{CONTENT_TYPE} ='multipart/form-data' # !!! fix CGI.pm: $boundary = "--$boundary" unless CGI::user_agent('MSIE\s+3\.0[12];\s*Mac')
      0        
143             if ($ENV{CONTENT_TYPE}||'') =~m|^multipart/form-data|
144             && !$ENV{MOD_PERL}; # !!! beter to read boundary from input, but CGI.pm BUG: This won't work correctly under mod_perl
145             # $s->pushmsg($ENV{CONTENT_TYPE});
146 1     1   4 no warnings;
  1         6  
  1         8507  
147 0   0       $s->{-cgi} =(!$s->{-fcgimax} ? eval('CGI->new') : eval('CGI::Fast->new'))
148             ||CGI::Carp::croak("'CGI->new' failure: $@\n");
149 0           $CGI::Q =$s->{-cgi};
150 0           $CGI::XHTML =0;
151 0 0 0       if ((($ENV{SERVER_SOFTWARE}||'') =~/IIS/)
      0        
      0        
152             || ($ENV{MOD_PERL} && !$ENV{PERL_SEND_HEADER})) {
153 0           $CGI::NPH =1;
154             }
155             #CGI quote:
156             #die "Malformed multipart POST: "
157             #.'boundary: ' .$self->{BOUNDARY} ."***\n"
158             #.'buffer: ' .$self->{BUFFER} ."***\n"
159             #." start=$start; selflen=" .$self->{LENGTH} .'; '
160             #.join(',', map {($_=>$ENV{$_}||'')} qw (REQUEST_METHOD REQUEST_URI CONTENT_TYPE CONTENT_LENGTH))
161             #unless ($start >= 0) || ($self->{LENGTH} > 0);
162             }
163             $s
164 0           }
165            
166            
167             sub class {
168 0     0 1   substr($_[0], 0, index($_[0],'='))
169             }
170            
171            
172             sub set {
173 0 0   0 1   return(keys(%{$_[0]})) if scalar(@_) ==1;
  0            
174 0 0         return($_[0]->{$_[1]}) if scalar(@_) ==2;
175 0           my ($s, %opt) =@_;
176 0           foreach my $k (keys(%opt)) {
177 0           $s->{$k} =$opt{$k};
178             }
179 0           my $h;
180 0 0         if ($h =$opt{-import}) { # Import Classes or Methods and Packages
181 0           delete $s->{-import};
182 0           foreach my $k (keys %$h) {
183 0           my $l = $h->{$k};
184 0 0         if (ref($l) eq 'HASH') { # 'use...'=>{-method=>call,...},...
    0          
185 0 0         my $p =$k =~/^([^\;\s\(]+)/ ? $1 : $k;
186 0           foreach my $c (keys %$l) {
187 0           my $m =$l->{$c};
188 0     0     $s->{$m} =
189             sub{$s->{$m} =eval("use $k; \\\&$p::$c");
190 0           eval("use $k; &$p::$c(\@_)")}
191 0           }
192             }
193             elsif (ref($l) eq 'ARRAY') { # 'use...'=>[method,...],...
194 0 0         my $p =$k =~/^([^\;\s\(]+)/ ? $1 : $k;
195 0           foreach my $m (@$l) {
196 0     0     $s->{"-$m"} =
197             sub{$s->{"-$m"} =eval("use $k; \\\&$p::$m");
198 0           eval("use $k; &$p::$m(\@_)")}
199 0           }
200             }
201             else { # -key=>class,....
202 0           $s->{-classes}->{$k} =$h->{$k}
203             }
204             }
205             }
206 0 0         if ($h =$opt{-reimport}) { # Reset or Load Classes
207 0           delete $s->{-reimport};
208 0 0         if (ref($h) eq 'HASH') { # {-key=>class,...}
    0          
209 0           foreach my $k (keys %$h) {
210 0           $s->{-classes}->{$k} =$h->{$k};
211 0           $s->{-reset}->{$k} =1
212             }
213             }
214             elsif (ref($h) eq 'ARRAY') { # [-key,...]
215 0           foreach my $k (@$h) {$s->{-reset}->{$k} =1}
  0            
216             }
217             else { # -key
218 0           $s->{-reset}->{$h} =1;
219             }
220             }
221 0 0         if ($opt{-debug}) {
222 0 0   0     $SIG{__WARN__} =sub{return if $^S;
223 0 0         eval{$s->pushmsg('WARN: ' .($_[0] =~/(.+)[\n\r]+$/ ? $1 : $_[0]))}};
  0            
  0            
224             }
225 0 0 0       $TempFile::TMPDIRECTORY =$opt{-tpath} # use CGI
      0        
226             if $opt{-tpath}
227             && ((-d $opt{-tpath}) ||$s->fut->mkdir($opt{-tpath}));
228 0           $s
229             }
230            
231            
232             sub reset {
233 0     0 1   my $s =shift;
234 0           local $SELF =$s;
235 0           my $v =!scalar(@_)
236             ? $s->{-reset}
237             :ref($_[0]) eq 'ARRAY'
238 0 0         ? {map {$_=>1} @{$_[0]}}
  0 0          
239             :$_[0];
240 0           foreach my $k (sort keys %{$s->{-endh}}) {
  0            
241 0           eval{&{$s->{-endh}->{$k}}($s)}
  0            
  0            
242             }
243 0           $s->{-endh} ={};
244 0           foreach my $k (keys %$v) {
245 0           my $o =$s->{$k};
246 0           my $t =ref($o);
247 0 0 0       next if !$t || $t eq 'HASH' || $t eq 'ARRAY';
      0        
248 0           delete $s->{$k};
249 0           eval {$o->DESTROY()};
  0            
250 0 0 0       eval {delete $o->{'CGI::Bus'} if ref($o) && $o->isa('HASH')};
  0            
251             }
252 0           $SELF =undef;
253 0 0 0       if (!scalar(@_) && $ENV{MOD_PERL}) {
254 0           delete $ENV{REMOTE_USER};
255             }
256             $s
257 0           }
258            
259            
260             sub DESTROY {
261 0     0     my $s =shift;
262 0           $s->reset($s);
263 0           $s
264             }
265            
266            
267             sub evalsub {
268 0     0 1   my ($s, $c) =(shift, shift);
269 0           local $SELF =$s;
270 0 0         ref($c) ? &$c(@_) : eval $c
271             }
272            
273            
274             sub AUTOLOAD {# Objects & Methods Loader
275 0 0   0     my $s =shift; confess("!object($s) in AUTOLOAD") if !ref($s);
  0            
276 0           my $m =substr($AUTOLOAD, rindex($AUTOLOAD, '::')+2);
277 0           my $k ='-' .$m;
278 0 0 0       if (ref($s->{$k}) eq 'CODE') {$s->evalsub($s->{$k},@_)}
  0 0          
  0 0          
279             elsif (!scalar(@_) && ref($s->{$k})) {$s->{$k}}
280             elsif ($s->{-classes}->{$k}) {
281 0           local $SELF =$s;
282 0           my $c =$s->{-classes}->{$k};
283 0 0         my $o =ref($c) ? &$c(@_) : eval("use $c; $c->new(\@_)");
284 0 0         $s->die($@) if $@;
285 0 0         eval {$o->{'CGI::Bus'}=$s if $o->isa('HASH')};
  0            
286 0           $s->{$k} =$o; # cycle ref!
287             }
288             #elsif (grep {$m eq $_} qw(select tr link delete accept sub vars))
289             # {$m =ucfirst($m); $s->{-cgi}->$m(@_)}
290             #else {$s->{-cgi}->$m(@_)}
291             #else {eval {$s->{-cgi}->$m(@_)}; $s->_selfload(@_) if $@}
292             else {
293 0           my @r;
294 0 0         wantarray ? eval{@r =$s->{-cgi}->$m(@_)} : eval{$r[0] =$s->{-cgi}->$m(@_)};
  0            
  0            
295 0 0         if ($@) {
296 0 0         if (grep {$m eq $_} qw(select tr link delete accept sub vars)) {
  0            
297 0           $m =ucfirst($m);
298 0 0         wantarray ? eval{@r =$s->{-cgi}->$m(@_)} : eval{$r[0] =$s->{-cgi}->$m(@_)};
  0            
  0            
299             }
300 0 0         $r[0] =$s->_selfload(@_) if $@;
301             }
302 0 0         wantarray ? @r : $r[0]
303             }
304             }
305            
306            
307             sub launch { # Objects Factory
308 0     0 1   my ($s,$m) =(shift, shift);
309 0 0         return CGI::BusLauncher->new($s) if !defined($m);
310 0           my $k ='-' .$m;
311 0           local $SELF =$s;
312 0           local $s->{$k};
313 0           my $o;
314 0 0         if ($s->{-classes}->{$k}) {
315 0           my $c =$s->{-classes}->{$k};
316 0 0         $o =ref($c) ? &$c(@_) : eval("use $c; $c->new(\@_)");
317             }
318             else {
319 0           $o =eval "use CGI::Bus::$m; CGI::Bus::$m->new (\@_)";
320             }
321 0 0         $s->die($@) if $@;
322 0 0         $s->die("Object not created '$m'") if !defined($o);
323 0 0         eval {$o->{'CGI::Bus'}=$s if $o->isa('HASH')};
  0            
324 0           $o
325             }
326            
327            
328             sub _selfload{# Self SubObject Loader
329 0     0     my $s =shift;
330 0           local $SELF =$s;
331 0           my $e =$@; chomp($e);
  0            
332 0           my $o;
333 0           $o =eval "use $AUTOLOAD; $AUTOLOAD->new(\@_)";
334 0 0         if (defined($o)) {
335 0           $s->{'-' .substr($AUTOLOAD, rindex($AUTOLOAD, '::')+2)} =$o;
336 0 0         eval {$o->{'CGI::Bus'}=$s if $o->isa('HASH')};
  0            
337 0           $o
338             }
339             else {
340 0           $s->die("$e. $@")
341             }
342             }
343            
344            
345             sub microtest{# Microtest of the Object
346 0     0 1   my $s =shift;
347 0 0         $s->{-debug} ? $s->print->hr : $s->print->htpgstart;
348             #local $s->{-debug} =0;
349 0 0 0       if (($s->{-debug}||0) >4) {
350 0           $s->print->h2('Methods');
351 0           foreach my $k (qw(class request qpath qurl qrun spath surl bpath burl dpath ppath purl furl user usdomain useron usersn usercn userfn userds unames ugroups ugnames)) {
352 0           $s->print->text("$k = " ._stringify($s->$k()))->br;
353             }
354             }
355 0           $s->print->h2('Slotes');
356 0           foreach my $k (sort keys %$s) {
357 0           $s->print->text("$k = " ._stringify($s->{$k}))->br;
358             }
359 0           $s->print->h2('Environment Variables');
360 0           foreach my $k (sort keys %ENV) {
361 0           $s->print->text($s->htmlescape("$k = '" .$ENV{$k} ."'"))->br;
362             }
363 0   0       $s->print->text($s->htmlescape( "login = '" .(eval{$^O eq 'MSWin32' ? Win32::LoginName() : getlogin()} ||'') ."'"))->br;
364 0           $s->print->text($s->htmlescape("\$0 = '$0'"))->br;
365 0           $s->print->text($s->htmlescape("\$^V = '$^V'"))->br;
366 0 0         $s->print->text($s->htmlescape("\$^X = '$^X'"))->br if $^X;
367 0           local $s->{-debug} =0;
368 0           $s->print->htpgend();
369             }
370            
371            
372             sub microenv {# Microenv text of the Object
373 0     0 0   my $s =shift;
374 0   0       join(', ',('LOGIN=' .(eval{$^O eq 'MSWin32' ? Win32::LoginName() : getlogin()} ||''))
375 0   0       ,map {$_ .'=' .($ENV{$_}||'')} qw(REMOTE_USER REMOTE_ADDR REMOTE_PORT HTTP_USER_AGENT REQUEST_METHOD REQUEST_URI CONTENT_TYPE CONTENT_LENGTH HTTP_COOKIE GATEWAY_INTERFACE))
376             }
377            
378            
379             sub _stringify {
380 0     0     my $v =$_[0];
381 0           my $p ='';
382 0 0 0       if (!defined($v)) {$p ='null'}
  0 0          
    0          
383             elsif (UNIVERSAL::isa($v,'ARRAY')) {
384 0           $p =$v .'[';
385 0           foreach my $e (@$v) {$p .=_stringify($e) .','}
  0            
386 0 0         chop($p) if scalar(@$v);
387 0           $p .=']';
388             }
389             elsif (UNIVERSAL::isa($v,'HASH') && !UNIVERSAL::isa($v,'CGI::Bus')) {
390 0           $p =$v .'{';
391 0           foreach my $e (sort keys %$v) {$p .=$e .'=>' ._stringify($v->{$e}) .','}
  0            
392 0 0         chop($p) if scalar(%$v);
393 0           $p .='}';
394             }
395             else {
396             # if (ref($CGI::Bus::USED{$v})) { $p ="''" ._stringify($CGI::Bus::USED{$v})}
397             # else {$p ="'" .$v ."'"}
398 0           $p ="'" .$v ."'"
399             }
400 0           $p
401             }
402            
403            
404             #######################
405            
406             sub lngname { # language name
407 0 0 0 0 1   if (!$_[0]->{-lngname} || $_[1]) {
408 0 0         if (defined($_[1])) {
409 0           $_[0]->{-lngname} =$_[1]
410             }
411             else {
412 0   0       $_[0]->{-lngname} =$_[0]->{-cgi}->http('Accept_language')||'';
413             # .($_[0]->{-cgi}->http('Accept_charset') ||'')
414 0 0         $_[0]->{-lngname} =$_[0]->{-lngname} =~/^([^ ;,]+)/ ? $1 : $_[0]->{-lngname};
415             }
416             }
417 0           $_[0]->{-lngname}
418             }
419            
420            
421             sub lngload { # language load
422 0     0 1   my ($s, $c, $l) =@_;
423 0 0         $c =$s->class if !$c;
424 0 0         $l =$s->lngname if !$l;
425 0           my $r;
426 0           foreach my $m ($c .'_' .$l, $c) {
427 0           $m =~s/::/_/g;
428 0           $m =~s/[ -]/_/g;
429 0           eval("use CGI::Bus::lngbase::${m}; \$r ={CGI::Bus::lngbase::${m}::lngbase}");
430 0 0         last if $r;
431             }
432 0           return $r
433             }
434            
435            
436             sub lng { # language string
437 0 0   0 1   $_[0]->{-cache}->{-lngbase} =$_[0]->lngload($_[0]->class) if !$_[0]->{-cache}->{-lngbase};
438 0           my $r =$_[0]->{-cache}->{-lngbase};
439 0 0 0       $r = !defined($_[2]) ? $r->{$_[1]}
    0          
440             :!defined($r->{$_[2]}) ||!defined($r->{$_[2]}->[$_[1]]) ? $_[2]
441             :$r->{$_[2]}->[$_[1]];
442 0           foreach my $e (@_[3..$#_]) {
443 0           $r =~s/\$_/$e/e;
  0            
444             }
445             $r
446 0           }
447            
448            
449             sub pushmsg { # messages to accumulate and display
450 0     0 1   my $s =shift;
451 0 0         $s->{-cache}->{-pushmsg} =[] if !$s->{-cache}->{-pushmsg};
452 0 0         push @{$s->{-cache}->{-pushmsg}}, @_ if scalar(@_);
  0            
453 0           $s->{-cache}->{-pushmsg}
454             }
455            
456            
457             sub pushlog { # push messages to log file
458 0     0 1   my $s =shift;
459 0 0         return @_ if !$s->{-pushlog};
460 0           my $b ="[" .$0 ."\t" .$s->user ."\t" .$s->strtime() ."]\t";
461 0 0         $s->fut->fstore('-', '>' .$s->{-pushlog}, map {$b .(defined($_) ?$_ :'')} @_);
  0            
462             @_
463 0           }
464            
465            
466             sub problem { # problem flag
467 0   0 0 1   $_[0]->pushmsg($_[0]->{-problem} =$_[1] || $@ || $!);
468             }
469            
470            
471             sub warn { # warning
472 0     0 1   problem(@_);
473 0   0       my $m =$_[1] || $@ || $!;
474 0 0         if ($m !~/\n/) {
475 0           CGI::Carp::cluck($m) # carp cluck
476             }
477             else {
478 0           eval {$_[0]->pushlog('Warning $m')};
  0            
479 0           $m=$_[0]->htmlescape($m);
480 0 0 0       if (!$_[0] ||!$_[0]->{-cache} ||!$_[0]->{-cache}->{-httpheader}) {
      0        
481 0           print STDOUT "Content-type: text/html\n\n";
482             }
483 0           print STDOUT '

' .$_[0]->lng(0,'Warning') ."

\n";
484 0           print STDOUT "$m
\n";
485             }
486             }
487            
488            
489             sub die { # stop error
490 0   0 0 1   my $m =$_[1] || $@ || $!;
491 0 0         if (!CGI::Carp::ineval) { #!$^S
492 0           eval {$_[0]->pushlog('Error $m', @{$_[0]->pushmsg} ,'<---Error')};
  0            
  0            
493 0 0 0       if ($m !~/\n/ || !$_[0]->{-cgi}) {
494 0           eval{$_[0]->reset}; # for mod_perl
  0            
495 0           CGI::Carp::confess($m) # croak confess
496             }
497 0           $m=$_[0]->htmlescape($m);
498 0 0 0       if (!$_[0] ||!$_[0]->{-cache} ||!$_[0]->{-cache}->{-httpheader}) {
      0        
499 0           print STDOUT "Content-type: text/html\n\n";
500             }
501 0           print STDOUT '

' .$_[0]->lng(0,'Error') ."

\n";
502 0           print STDOUT "$m
\n";
503 0           print STDOUT ''
504 0           , join(';
', map {$_[0]->htmlescape($_)} @{$_[0]->pushmsg})
  0            
505             , '';
506 0           print STDOUT "
\n";
507 0           eval{$_[0]->reset}; # for mod_perl
  0            
508 0           exit;
509             }
510 0 0         $m !~/\n/ ? CGI::Carp::confess($m) : CORE::die($m); # croak confess
511             }
512            
513            
514             #######################
515            
516            
517             sub cgi { # CGI object
518 0     0 1   $_[0]->{-cgi}
519             }
520            
521            
522             sub request { # Web server request object
523 0 0   0 1   $ENV{MOD_PERL} ? Apache->request
524             : $_[0]->{-cgi}
525             }
526            
527            
528             sub dbi { # DBI object
529 0 0 0 0 1   if (scalar(@_) >1) {
    0          
530 0           my $s =shift;
531 0   0       $s->{-dbi} =eval('use DBI; DBI->connect(@_)') ||$s->die("Cannot connect to database\n")
532             }
533             elsif (!$_[0]->{-dbi} && $_[0]->{-classes}->{-dbi}) {
534 0           my $s =shift;
535             # $s->pushmsg('DBI connect');
536 0           my $v =$s->{-classes}->{-dbi};
537 0 0         $s->{-dbi} =ref($v) eq 'CODE' ? &$v($s) : $s->dbi(@$v);
538             }
539             else {
540 0           $_[0]->{-dbi}
541             }
542             }
543            
544            
545             sub dbquote {
546 0           $_[0]->{-dbi} ||$_[0]->{-classes}->{-dbi}
547             ? $_[0]->dbi->quote(@_[1..$#_])
548 0 0 0 0 1   : ('"' .join('', map {my $v=$_; $v=~s/([\\"])/\\$1/g; $v} @_[1..$#_]) .'"')
  0            
  0            
549             }
550            
551            
552             sub dblikesc {
553 0     0 1   join('', map {my $v =$_; $v =~s/([\\%_])/\\$1/g; $v} @_[1..$#_])
  0            
  0            
  0            
554             }
555            
556            
557             #######################
558            
559            
560            
561             sub url { # CGI script URL
562 0 0   0 0   if ($#_ >0) {
563 0           local $^W =0;
564 0   0       my $v =($_[0]->{-cgi}||$_[0]->cgi)->url(@_[1..$#_]);
565 0 0 0       if ($v) {}
    0 0        
    0 0        
    0          
    0          
566             elsif (!($ENV{PERLXS} ||(($ENV{GATEWAY_INTERFACE}||'') =~/PerlEx/))) {}
567             elsif (($#_ >2) ||(($#_ ==2) && !$_[2])) {}
568             elsif ($_[1] eq '-relative') {
569 0           $v =$ENV{SCRIPT_NAME};
570 0 0         $v =$1 if $v =~/[\\\/]([^\\\/]+)$/;
571             }
572             elsif ($_[1] eq '-absolute') {
573 0           $v =$ENV{SCRIPT_NAME}
574             }
575 0           return($v)
576             }
577 0 0         return($_[0]->{-cache}->{-url})
578             if $_[0]->{-cache}->{-url};
579 0           local $^W =0;
580 0           $_[0]->{-cache}->{-url} =$_[0]->cgi->url();
581 0 0 0       if ($ENV{PERLXS} ||(($ENV{GATEWAY_INTERFACE}||'') =~/PerlEx/)) {
      0        
582 0 0 0       $_[0]->{-cache}->{-url} .=
    0 0        
583             (($_[0]->{-cache}->{-url} =~/\/$/) ||($ENV{SCRIPT_NAME} =~/^\//) ? '' : '/')
584             .$ENV{SCRIPT_NAME}
585             if ($_[0]->{-cache}->{-url} !~/\w\/\w/) && $ENV{SCRIPT_NAME};
586             }
587 0           $_[0]->{-cache}->{-url}
588             }
589            
590            
591             sub url_form { # form url for start_form
592 0     0 0   $_[0]->url
593             # $_[0]->url(-absolute=>1,-path=>1)
594             # $_[0]->cgi->self_url()
595             }
596            
597            
598             sub qpath { # Query (script) path
599 0 0 0 0 1   defined($_[0]->{-qpath}) ||($_[0]->{-qpath} =$ENV{SCRIPT_FILENAME} ||$ENV{PATH_TRANSLATED});
600 0 0         (!defined($_[1]) ? $_[0]->{-qpath} : $_[0]->{-qpath} .'/' .$_[1])
601             }
602            
603            
604             sub qurl { # Query (script) URL
605 0 0   0 1   defined($_[0]->{-qurl}) ||($_[0]->{-qurl} =$_[0]->url);
606 0 0 0       (!defined($_[1]) || $_[1] eq '' ? $_[0]->{-qurl} : ($_[0]->{-qurl} .'/'))
    0          
607             .(scalar(@_) >1 ? $_[0]->htmlurl(@_[1..$#_]) :'')
608             }
609            
610            
611             sub qparam { # Query param(s) set or get
612 0     0 1   my $s =shift;
613 0 0         if (!ref($_[0])) { # CGI param call
    0          
    0          
614 0           $s->{-cgi}->param(@_)
615             }
616             elsif (ref($_[0]) eq 'ARRAY') {
617 0 0         if (!defined($_[1])) { # qparam([names]) -> [values]
618 0           my $r =[];
619 0           for (my $i =0; $i <=$#{$_[0]}; $i++) {push @$r, $s->{-cgi}->param($_[0]->[$i])}
  0            
  0            
620 0           $r
621             }
622             else { # qparam([names]=>[values]) -> [values]
623 0           for (my $i =0; $i <=$#{$_[0]}; $i++) {$s->{-cgi}->param($_[0]->[$i], $_[1]->[$i])}
  0            
  0            
624 0           $_[1]
625             }
626             }
627             elsif (ref($_[0]) eq 'HASH') { # qparam({name=>value,...}) -> {name=>value,...}
628 0           foreach my $k (keys(%{$_[0]})) {$s->{-cgi}->param($k,$_[0]->{$k})}
  0            
  0            
629 0           $_[0]
630             }
631             else { # CGI param call
632 0           $s->{-cgi}->param(@_)
633             }
634             }
635            
636            
637             sub param { # CGI param call
638 0     0 1   shift->{-cgi}->param(@_)
639             }
640            
641            
642             sub qparamh { # Query params get as hash ref
643 0     0 1   my $s =shift;
644 0 0 0       return $s->qparam(@_) if ref($_[0]) ne 'ARRAY' || defined($_[1]);
645 0           my $r ={};
646 0           for (my $i =0; $i <=$#{$_[0]}; $i++) {$r->{$_[0]->[$i]} =$s->{-cgi}->param($_[0]->[$i])}
  0            
  0            
647 0           $r
648             }
649            
650            
651             sub qrun { # Query 'run' param - Script to run
652 0 0 0 0 1   $_[0]->{-cache}->{-qrun} =$_[1]
      0        
653             ## || $ENV{REQUEST_URI} ? substr($ENV{REQUEST_URI}, length($ENV{SCRIPT_NAME})+1) :''
654             || $_[0]->{-cgi}->param('_run')
655             || $_[0]->{-cgi}->url_param('')
656             || $_[0]->{-cgi}->url_param('run')
657             if !$_[0]->{-cache}->{-qrun} || $_[1];
658 0           $_[0]->{-cache}->{-qrun}
659             }
660            
661            
662             #######################
663            
664            
665             sub spath { # Site Path
666 0 0   0 1   if (!defined($_[0]->{-spath})) {
667 0   0       $_[0]->{-spath} =substr($ENV{SCRIPT_FILENAME} ||$ENV{PATH_TRANSLATED}
      0        
668             , 0
669             , -length($ENV{SCRIPT_NAME} ||$ENV{PATH_INFO}));
670             }
671 0 0         !defined($_[1]) ? $_[0]->{-spath} : $_[0]->{-spath} .'/' .$_[1]
672             }
673            
674            
675             sub surl { # Site URL
676 0 0 0 0 1   ($_[0]->{-surl}
    0 0        
677             || ($_[0]->{-surl} =
678             $_[0]->url() =~/^([^\/]+:\/\/[^\/]+)/ ? $1 : $_[0]->url()))
679             . ((!defined($_[1]) || $_[1] eq '' ? '' : '/')
680             . (scalar(@_) >1 ? $_[0]->htmlurl(@_[1..$#_]) :''));
681             }
682            
683            
684             sub bpath { # Binary Path
685 0 0   0 1   if (!defined($_[0]->{-bpath})) {
686 0 0 0       $_[0]->{-bpath} =(($ENV{SCRIPT_FILENAME} ||$ENV{PATH_TRANSLATED} ||$0) =~/^(.+?)[\\\/][^\\\/]+$/ ? $1 : '');
687             }
688 0 0         !defined($_[1]) ? $_[0]->{-bpath} : $_[0]->{-bpath} .'/' .$_[1]
689             }
690            
691            
692             sub burl { # Binary URL
693 0 0   0 1   if (!defined($_[0]->{-burl})) {
694 0 0 0       my $pv =(($ENV{SCRIPT_NAME} ||$ENV{PATH_INFO} ||$0) =~/^[\\\/]*(.+?)[\\\/]+[^\\\/]+$/ ? $1 : '');
695 0 0         $_[0]->{-burl} =$_[0]->surl .($pv ? '/' .$pv :'');
696             }
697 0 0 0       (!defined($_[1]) || $_[1] eq '' ? $_[0]->{-burl} : ($_[0]->{-burl} .'/'))
    0          
698             .(scalar(@_) >1 ? $_[0]->htmlurl(@_[1..$#_]) : '')
699             }
700            
701            
702             sub dpath { # Data Path
703 0 0   0 1   if (!defined($_[0]->{-dpath})) {
704 0           $_[0]->{-dpath} =$_[0]->tpath;
705             }
706 0 0         !defined($_[1]) ? $_[0]->{-dpath} : $_[0]->{-dpath} .'/' .$_[1]
707             }
708            
709            
710             sub tpath { # Temporary files Path
711 0 0   0 1   if (!defined($_[0]->{-tpath})) {
712 0   0       $_[0]->{-tpath} =$TempFile::TMPDIRECTORY # use CGI
713             ||$ENV{TMP} ||$ENV{TEMP}
714             ||$_[0]->orarg('-d'
715             ,$^O eq 'MSWin32'
716             ?('c:/tmp','c:/temp')
717             :('/tmp','/temp'));
718 0   0       $_[0]->{-tpath} = ($_[0]->{-tpath} ||'') .'/cgi-bus'
719             }
720 0 0         !defined($_[1]) ? $_[0]->{-tpath} : $_[0]->{-tpath} .'/' .$_[1]
721             }
722            
723            
724             sub ppath { # Publish Path
725 0 0   0 1   if (!defined($_[0]->{-ppath})) {
726 0   0       $_[0]->{-ppath} =$ENV{DOCUMENT_ROOT} ||$ENV{PATH_TRANSLATED} ||'.';
727             }
728 0 0         !defined($_[1]) ? $_[0]->{-ppath} : $_[0]->{-ppath} .'/' .$_[1]
729             }
730            
731            
732             sub purl { # Publish URL
733 0 0   0 1   if (!defined($_[0]->{-purl})) {
734 0           $_[0]->{-purl} =$_[0]->surl;
735             }
736 0 0 0       (!defined($_[1]) || $_[1] eq '' ? $_[0]->{-purl} : ($_[0]->{-purl} .'/'))
    0          
737             .(scalar(@_) >1 ? $_[0]->htmlurl(@_[1..$#_]) : '')
738             }
739            
740            
741             sub fpath { # File Store Path
742 0 0   0 1   $_[0]->{-fpath} =$_[0]->ppath if !defined($_[0]->{-fpath});
743 0 0         !defined($_[1]) ? $_[0]->{-fpath} : $_[0]->{-fpath} .'/' .$_[1]
744             }
745            
746            
747             sub furl { # File Store URL
748 0 0   0 1   $_[0]->{-furl} =$_[0]->purl if !defined($_[0]->{-furl});
749 0 0 0       (!defined($_[1]) || $_[1] eq '' ? $_[0]->{-furl} : ($_[0]->{-furl} .'/'))
    0          
750             .(scalar(@_) >1 ? $_[0]->htmlurl(@_[1..$#_]) : '')
751             }
752            
753            
754             sub furf { # File Store file URL
755 0 0   0 1   $_[0]->{-furf} ='file://' .$_[0]->fpath if !defined($_[0]->{-furf});
756 0 0 0       (!defined($_[1]) || $_[1] eq '' ? $_[0]->{-furf} : ($_[0]->{-furf} .'/'))
    0          
757             .(scalar(@_) >1 ? $_[0]->htmlurl(@_[1..$#_]) : '')
758             }
759            
760            
761             sub hpath { # Homes Store Path
762 0 0   0 1   $_[0]->{-hpath} =$_[0]->ppath if !defined($_[0]->{-hpath});
763 0 0         !defined($_[1]) ? $_[0]->{-hpath} : $_[0]->{-hpath} .'/' .$_[1]
764             }
765            
766            
767             sub hurl { # Homes Store URL
768 0 0   0 1   $_[0]->{-hurl} =$_[0]->purl if !defined($_[0]->{-hurl});
769 0 0 0       (!defined($_[1]) || $_[1] eq '' ? $_[0]->{-hurl} : ($_[0]->{-hurl} .'/'))
    0          
770             .(scalar(@_) >1 ? $_[0]->htmlurl(@_[1..$#_]) : '')
771             }
772            
773            
774             sub hurf { # Homes Store file URL
775 0 0   0 1   $_[0]->{-hurf} ='file://' .$_[0]->hpath if !defined($_[0]->{-hurf});
776 0 0 0       (!defined($_[1]) || $_[1] eq '' ? $_[0]->{-hurf} : ($_[0]->{-hurf} .'/'))
    0          
777             .(scalar(@_) >1 ? $_[0]->htmlurl(@_[1..$#_]) : '')
778             }
779            
780            
781             sub urfcnd { # Use URFs?
782 0     0 1   my $s =shift;
783 0           ($s->{-cgi}->user_agent||'') =~/MSIE|StarOffice/
784 0 0 0       && ( ref($s->{-urfcnd}) eq 'CODE' ? &{$s->{-urfcnd}}(@_)
    0          
    0          
785             : exists $s->{-urfcnd} ? $s->{-urfcnd}
786             : 1 # $ENV{REMOTE_ADDR}
787             )
788             }
789            
790            
791             #######################
792            
793            
794             sub hmerge { # merge hash ref with data given
795 0     0 0   my ($s, $h) =(shift, shift);
796 0 0         my $r =$h ? {%$h} : {};
797 0           my %h =@_;
798 0 0         foreach my $k (keys %h) {$r->{$k} =$h{$k} if !exists($r->{$k})}
  0            
799             $r
800 0           }
801            
802            
803             sub max { # maximal number
804 0 0 0 0 0   (($_[1]||0) >($_[2]||0) ? $_[1] : $_[2])||0
    0 0        
805             }
806            
807            
808             sub min { # minimal number
809 0 0 0 0 0   (($_[1]||0) >($_[2]||0) ? $_[2] : $_[1])||0
    0 0        
810             }
811            
812            
813             sub orarg { # argument of true result
814 0     0 1   shift(@_);
815 0 0         my $s =ref($_[0]) ? shift
    0          
816             :index($_[0], '-') ==0 ? eval('sub{' .shift(@_) .' $_}')
817             :eval('sub{' .shift(@_) .'($_)}');
818 0           local $_;
819 0 0         foreach (@_) {return $_ if &$s($_)};
  0            
820             undef
821 0           }
822            
823            
824             sub strtime { # Stringify Time
825 0     0 1   my $s =shift;
826 0 0 0       my $msk =@_ ==0 || $_[0] =~/^\d+$/i ? 'yyyy-mm-dd hh:mm:ss' : shift;
827 0 0         my @tme =@_ ==0 ? localtime(time) : @_ ==1 ? localtime($_[0]) : @_;
    0          
828 0           $msk =~s/yyyy/%Y/;
829 0           $msk =~s/yy/%y/;
830 0           $msk =~s/mm/%m/;
831 0           $msk =~s/mm/%M/i;
832 0           $msk =~s/dd/%d/;
833 0           $msk =~s/hh/%H/;
834 0           $msk =~s/hh/%h/i;
835 0           $msk =~s/ss/%S/;
836 0           eval('use POSIX');
837 0           POSIX::strftime($msk, @tme)
838             }
839            
840            
841             sub timestr { # Time from String
842 0     0 1   my $s =shift;
843 0 0 0       my $msk =@_ <2 || !$_[1] ? 'yyyy-mm-dd hh:mm:ss' : shift;
844 0           my $ts =shift;
845 0           my %th;
846 0           while ($msk =~/(yyyy|yy|mm|dd|hh|MM|ss)/) {
847 0           my $m=$1; $msk =$';
  0            
848 0 0         last if !($ts =~/(\d+)/);
849 0           my $d =$1; $ts =$';
  0            
850 0 0 0       $d -=1900 if $m eq 'yyyy' ||$m eq '%Y';
851 0           $m =chop($m);
852 0 0 0       $m ='M' if $m eq 'm' && $th{$m};
853 0 0         $m =lc($m) if $m ne 'M';
854 0           $th{$m}=$d;
855             }
856 0           eval('use POSIX');
857 0   0       POSIX::mktime($th{'s'}||0,$th{'M'}||0,$th{'h'}||0,$th{'d'}||0,($th{'m'}||1)-1,$th{'y'}||0)
      0        
      0        
      0        
      0        
      0        
858             }
859            
860            
861             sub timeadd { # Adjust time to years, months, days,...
862 0     0 1   my $s =shift;
863 0           my @t =localtime(shift);
864 0           my $i =5;
865 0   0       foreach my $a (@_) {$t[$i] += ($a||0); $i--}
  0            
  0            
866 0           eval('use POSIX');
867 0           POSIX::mktime(@t[0..5])
868             }
869            
870            
871             sub cptran { # Translate strings between codepages
872 0     0 1   my ($s,$f,$t,@s) =@_;
873 0           foreach my $v ($f, $t) {
874 0 0         if ($v =~/oem|866/i) {$v ='€‚ƒ„…ð†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™œ›šžŸ ¡¢£¤¥ñ¦§¨©ª«¬­®¯àáâãäåæçèéìëêíîï'}
  0 0          
  0 0          
    0          
875 0           elsif ($v =~/ansi|1251/i) {$v ='ÀÁÂÃÄŨÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÜÛÚÝÞßàáâãäå¸æçèéêëìíîïðñòóôõö÷øùüûúýþÿ'}
876 0           elsif ($v =~/koi/i) {$v ='áâ÷çäå³öúéêëìíîïðòóôõæèãþûýøùÿüàñÁÂ×ÇÄÅ£ÖÚÉÊËÌÍÎÏÐÒÓÔÕÆÈÃÞÛÝØÙßÜÀÑ'}
877             elsif ($v =~/8859-5/i) {$v ='°±²³´µ¡¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÌËÊÍÎÏÐÑÒÓÔÕñÖ×ØÙÚÛÜÝÞßàáâãäåæçèéìëêíîï'}
878             }
879 0           map {eval("~tr/$f/$t/")} @s;
  0            
880 0 0         @s >1 ? @s : $s[0];
881             }
882            
883            
884             sub dumpout { # Data dump out
885 0     0 1   my ($s, $d) =@_;
886 0           eval('use Data::Dumper');
887 0           my $o =Data::Dumper->new([$d]);
888 0           $o->Indent(1);
889 0           $o->Dump();
890             }
891            
892            
893             sub dumpin { # Data dump in
894 0     0 1   my ($s, $d) =@_;
895 0   0       my $e; for(my $i=0; !$e && $i<10; $i++) {$e =eval('use Safe; Safe->new()')};
  0            
  0            
896 0 0         defined($e) && $e->reval($d)
897             }
898            
899            
900             sub ishtml { # Is html code?
901 0   0 0 1   ($_[1] ||'') =~m/^<(?:(?:B|BIG|BLOCKQUOTE|CENTER|CITE|CODE|DFN|DIV|EM|I|KBD|P|SAMP|SMALL|SPAN|STRIKE|STRONG|STYLE|SUB|SUP|TT|U|VAR)\s*>|(?:BR|HR)\s*\/{0,1}>|(?:A|BASE|BASEFONT|DIR|DIV|DL|!DOCTYPE|FONT|H\d|HEAD|HTML|IMG|IFRAME|MAP|MENU|OL|P|PRE|TABLE|UL)\b)/i
902             }
903            
904            
905            
906             #######################
907            
908            
909            
910             sub user { # User name
911 0 0 0 0 1   if (!$_[0]->{-cache}->{-user} ||$_[1]) {
912 0           $_[0]->{-cache}->{-user} =$_[0]->{-cache}->{-useron} =
913             $_[1] ? $_[1] :
914 0 0         ref($_[0]->{-user}) eq 'CODE' ? &{$_[0]->{-user}}(@_)
    0          
915             : $_[0]->uauth->user(@_[1..$#_]);
916 0 0         if ($_[0]->{-usercnv}) {
917 0           local $_ =$_[0]->{-cache}->{-user};
918 0           $_[0]->{-cache}->{-user} =&{$_[0]->{-usercnv}}(@_)
  0            
919             }
920             }
921 0           $_[0]->{-cache}->{-user}
922             }
923            
924            
925             sub useron { # User original name
926 0 0   0 1   $_[0]->user if !$_[0]->{-cache}->{-useron};
927 0           $_[0]->{-cache}->{-useron}
928             }
929            
930            
931             sub uadmin { # Is admin?
932 0     0 1   my $s =shift;
933 0           my $u =$s->user;
934 0 0         if (scalar(@_)) {
935 0 0         return $u if $_[0] eq $u;
936 0 0 0       return $s->uadmin ? $s->uglist
    0          
937             : ($s->udata->paramj('uauth_managed') ||[])
938             if ref($_[0]);
939 0   0       my $l =$s->udata->paramj('uauth_managed') ||[];
940 0           foreach my $n (@$l) {
941 0 0         return $n if $n eq $_[0]
942             }
943             }
944 0 0         if (!defined($s->{-uadmins})) {}
  0 0          
    0          
945 0           elsif (ref($s->{-uadmins}) eq 'CODE') {return &{$s->{-uadmins}}($s)}
946 0 0         elsif (ref($s->{-uadmins}) eq 'ARRAY') {
947 0           foreach my $n (@{$s->ugnames}) {
  0            
948 0 0         next if !defined($n);
949 0 0         return $n if grep {$_ eq $n} @{$s->{-uadmins}}
  0            
  0            
950             }
951             }
952             else {return $u if $u eq $s->{-uadmins}}
953 0           return '';
954             }
955            
956            
957             sub uguest { # Is guest?
958 0   0 0 1   ($_[1] ||$_[0]->user ||'') eq $_[0]->uauth->guest
959             }
960            
961            
962             sub usercn { # User name CN
963 0 0   0 1   my $v =scalar(@_) >1 ? $_[1] : $_[0]->user;
964 0 0 0       return($v) if !defined($v) || $v eq '';
965 0 0         $v =~/CN=([^=,]+)/i ? $1
    0          
    0          
966             : $v =~/^([^\@])\@/i ? $1
967             : $v =~/\\([^\\]+)$/ ? $1
968             : $v
969             }
970            
971            
972             sub usersn { # User Shorten Name, remove domain if default
973 0 0   0 1   my $v =scalar(@_) >1 ? $_[1] : $_[0]->user;
974 0 0 0       return($v) if !defined($v) || $v eq '';
975 0           my $d =$_[0]->usdomain;
976 0 0         if ($v =~m/^(.*?)[\/@]\Q$d\E$/i) {$1}
  0 0          
  0            
977 0           elsif ($v =~m/^\Q$d\E[\\](.*)$/i) {$1}
978             else {$v}
979             }
980            
981            
982             sub userfn { # User name translated to filename
983 0 0   0 1   my $v =scalar(@_) >1 ? $_[1] : $_[0]->user;
984 0 0 0       return($v) if !defined($v) || $v eq '';
985 0           $v =~ s/[\\\/|\+\:\*\?\[\]\(\) &,]/-/g;
986 0           $v
987             }
988            
989            
990             sub userds { # User name as dir structure
991 0 0   0 1   my $u =scalar(@_) >1 ? $_[1] : $_[0]->user;
992 0 0 0       return($u) if !defined($u) || $u eq '';
993 0           my $p =$_[0]->userfn($_[0]->usercn($u));
994 0           $p =substr($p,0,1) .'/' .substr($p,0,2) .'/' .$_[0]->userfn($u);
995             }
996            
997            
998             sub unames { # User Names
999 0 0   0 1   if (!defined($_[0]->{-cache}->{-unames})) {
1000 0           my $s =$_[0];
1001 0 0         return('') if !defined($s->user);
1002 0           $s->{-cache}->{-unames} =[];
1003 0           local $_;
1004 0 0         foreach my $v ($_ =$s->user, $s->useron
  0 0          
    0          
    0          
1005             # , lc($s->user), $s->usercn, lc($s->usercn)
1006             #, $s->user =~/^([^\\]+)\\(.+)$/ ? lc("$2\@$1") : ()
1007             #, $s->useron =~/^([^\\]+)\\(.+)$/ ? lc("$2\@$1") : ()
1008             , $s->user =~/^([^@]+)\@(.+)$/ ? lc("$2\\$1") : ()
1009             , $s->useron =~/^([^@]+)\@(.+)$/ ? lc("$2\\$1") : ()
1010             , ref($s->{-unmsadd}) eq 'ARRAY'
1011 0           ? map {&$_($s)} @{$s->{-unmsadd}}
  0            
1012             : ref($s->{-unmsadd})
1013             ? &{$s->{-unmsadd}}($s)
1014             : ()
1015             ) {
1016 0           push @{$s->{-cache}->{-unames}}, $v
  0            
1017 0 0         if !grep /^\Q$v\E$/, @{$s->{-cache}->{-unames}};
1018             }
1019             }
1020 0           $_[0]->{-cache}->{-unames}
1021             }
1022            
1023            
1024             sub usdomain {# User names Server Domain
1025 0 0 0 0 1   if (!$_[0]->{-cache}->{-usdomain} ||$_[1]) {
1026             $_[0]->{-cache}->{-usdomain} =$_[1]
1027             || (ref($_[0]->{-usdomain}) eq 'CODE'
1028 0   0       ? &{$_[0]->{-usdomain}}(@_)
1029             : $_[0]->uauth->usdomain(@_[1..$#_]));
1030             }
1031 0           $_[0]->{-cache}->{-usdomain}
1032             }
1033            
1034            
1035             sub userver { # User names Server
1036 0 0 0 0 1   if (!$_[0]->{-cache}->{-userver} ||$_[1]) {
1037             $_[0]->{-cache}->{-userver} =$_[1]
1038             ||(ref($_[0]->{-userver}) eq 'CODE'
1039 0   0       ? &{$_[0]->{-userver}}(@_)
1040             : $_[0]->uauth->userver(@_[1..$#_]));
1041             }
1042 0           $_[0]->{-cache}->{-userver}
1043             }
1044            
1045            
1046             sub ugroups { # User groups [user name]
1047 0 0 0 0 1   if (!defined($_[0]->{-cache}->{-ugroups})
      0        
      0        
      0        
      0        
1048             || ($_[1] && (lc($_[0]->useron ||'') ne lc($_[1]))
1049             && (lc($_[0]->user ||'') ne lc($_[1])))) {
1050 0           my $s =$_[0];
1051 0           my $r =[];
1052 0 0 0       return($r) if !defined($s->user) && !$_[1];
1053 0           $r = ref($s->{-ugroups}) eq 'CODE'
1054 0 0         ? &{$s->{-ugroups}}(@_)
1055             : $_[0]->uauth->ugroups(@_[1..$#_]);
1056 0 0         if ($_[0]->{-ugrpcnv}) {
1057 0           my $ga =[];
1058 0           local $_;
1059 0           foreach $_ (@$r) {
1060 0           $_ =&{$_[0]->{-ugrpcnv}}(@_);
  0            
1061 0 0 0       push(@$ga, $_) if defined($_) && $_ ne '';
1062             }
1063 0           $r =$ga;
1064             }
1065 0 0         if ($_[0]->{-ugrpadd}) {
1066 0           local $_ =$r;
1067 0 0         my $ugadd=ref($s->{-ugrpadd}) eq 'CODE' ? &{$s->{-ugrpadd}}(@_) : $s->{-ugrpadd};
  0            
1068 0 0         foreach my $e ( ref($ugadd) eq 'ARRAY'
  0 0          
1069             ? @{$ugadd}
1070             : ref($ugadd) eq 'HASH'
1071             ? keys(%$ugadd)
1072             : $ugadd){
1073 0 0         push @$r, $e if !grep /^\Q$e\E$/i, @$r
1074             }
1075             }
1076 1     1   965 { use locale;
  1         274  
  1         6  
  0            
1077 0           $r =[sort {lc($a) cmp lc($b)} @$r];
  0            
1078             }
1079 0 0 0       $s->{-cache}->{-ugroups} =$r
      0        
1080             if !$_[1]
1081             || (lc($_[0]->useron) eq lc($_[1]))
1082             || (lc($_[0]->user) eq lc($_[1]));
1083 0           return($r)
1084             }
1085 0           $_[0]->{-cache}->{-ugroups}
1086             }
1087            
1088            
1089             sub ugnames { # User & Group Names
1090 0 0   0 1   if (!defined($_[0]->{-cache}->{-ugnames})) {
1091 0           my $s =$_[0];
1092 0 0         return('') if !defined($s->user);
1093 0           $s->{-cache}->{-ugnames} =[];
1094 0           push @{$s->{-cache}->{-ugnames}}, @{$s->unames};
  0            
  0            
1095 0           push @{$s->{-cache}->{-ugnames}}, @{$s->ugroups};
  0            
  0            
1096             }
1097 0           $_[0]->{-cache}->{-ugnames}
1098             }
1099            
1100            
1101             sub uglist { # User & Group List
1102 0     0 1   my $s =shift;
1103 0 0 0       my $o =defined($_[0]) && substr($_[0],0,1) eq '-' ? shift : '-ug';
1104 0           my $r =
1105 0 0         ref($s->{-uglist}) eq 'CODE' ? &{$s->{-uglist}}($s,$o,@_)
1106             : $s->uauth->uglist($o,@_);
1107 0 0         if ($s->{-ugrpadd}) {
1108 0           local $_ =$r;
1109 0 0         my $ugadd=ref($s->{-ugrpadd}) eq 'CODE' ? &{$s->{-ugrpadd}}(@_) : $s->{-ugrpadd};
  0            
1110 0 0 0       if ((ref($r) eq 'HASH')
1111             && (ref($ugadd) eq 'HASH')) {
1112 0           foreach my $e (keys(%$ugadd)) {
1113 0 0         $r->{$e} =$ugadd->{$e} if !$r->{$e}
1114             }
1115             }
1116             else {
1117 0 0         foreach my $e ( ref($ugadd) eq 'ARRAY'
  0 0          
1118             ? @{$ugadd}
1119             : ref($ugadd) eq 'HASH'
1120             ? keys(%$ugadd)
1121             : $ugadd){
1122 0 0         if (ref($r) eq 'HASH') {
1123 0 0         $r->{$e} =$e if !$r->{$e}
1124             }
1125             else {
1126 0 0         push @$r, $e if !grep /^\Q$e\E$/i, @$r
1127             }
1128             }
1129             }
1130             }
1131 1 0   1   472 $r =do{use locale; [sort {lc($a) cmp lc($b)} @$r]} if ref($r) eq 'ARRAY';
  1         3  
  1         4  
  0            
  0            
  0            
1132            
1133 0 0         if ($s->{-ugrpcnv}) {
1134 0           local $_;
1135 0 0         if (ref($r) eq 'ARRAY') {
1136 0           my @g;
1137 0           foreach $_ (@$r) {
1138 0           $_ =&{$s->{-ugrpcnv}}($s,$o);
  0            
1139 0 0 0       push(@g, $_) if defined($_) && $_ ne '';
1140             }
1141 0           $r =[sort {lc($a) cmp lc($b)} @g];
  0            
1142             }
1143             else {
1144 0           my $w =$_[1]; # width of label
1145 0           foreach my $k (keys %$r) {
1146 0           $_ =$k;
1147 0           $_ =&{$s->{-ugrpcnv}}($s,$o);
  0            
1148 0 0 0       if (defined($_) && $_ ne '') {
    0 0        
      0        
1149 0           $r->{$_} =$r->{$k};
1150 0 0         $r->{$_} =substr($r->{$_},0,$w) if $w;
1151             }
1152             elsif (!defined($_) || $_ eq '' || $_ ne $k) {
1153 0           delete $r->{$k}
1154             }
1155             }
1156             }
1157             }
1158             $r
1159 0           }
1160            
1161            
1162             sub unamesun {# User Names Unique list
1163 0     0 1   my $s =shift;
1164 0           my $r =[];
1165 0 0         foreach my $n (ref($_[0]) ? @{$_[0]} : @_) {
  0            
1166 0 0         next if grep {lc($n) eq lc($_)
  0 0          
1167             || lc($s->usercn($n)) eq lc($s->usercn($_))} @$r;
1168 0           push @$r, $n;
1169             }
1170             $r
1171 0           }
1172            
1173            
1174             sub userauth {# User Authenticate
1175 0     0 1   my $s =shift;
1176 0 0 0       $s->{-w32IISdpsn} =($ENV{SERVER_SOFTWARE}||'') !~/IIS/
    0 0        
    0          
1177             ? 0
1178             : ($s->{-login}||'') =~/\/$/i
1179             ? 2
1180             : 0
1181             if !defined($s->{-w32IISdpsn});
1182 0 0         ref($s->{-userauth}) eq 'CODE' ? &{$s->{-userauth}}($s,@_)
  0 0          
    0          
1183             : ref($s->{-userauth}) eq 'ARRAY' ? $s->uauth->auth($s->{-userauth},@_)
1184             : $s->{-userauth} ? $s->uauth->auth([$s->{-userauth}],@_)
1185             : $s->uauth->auth(@_);
1186 0           $s->{-cache}->{-userauth} =$s->user
1187             }
1188            
1189            
1190            
1191             sub userauthopt { # User Authenticate optional
1192 0     0 1   my $s =shift;
1193 0 0 0       if ($s->{-cache}->{-userauth}) {
    0 0        
    0 0        
      0        
1194             }
1195             elsif ($s->uguest()
1196             &&(defined($s->{-cgi}->param('_auth'))
1197             || defined($s->{-cgi}->param('_login')))) {
1198 0           $s->userauth(@_)
1199             }
1200             elsif ((($ENV{SERVER_SOFTWARE}||'') =~/IIS/)
1201             &&($s->url() =~/\/_*(login|auth|a|ntlm|search|guest)\//i)) { # !!! IIS impersonation avoid
1202 0           my $url =$s->url();
1203 0 0 0       $s->userauth(@_) if $url !~/\/_*(search|guest)\//i
    0 0        
      0        
      0        
1204             ## && !$s->{-cache}->{-RevertToSelf} # -w32IISdpsn
1205             && (!$s->{-cache}->{-RevertToSelf} && (!defined($s->{-w32IISdpsn}) ? ($s->{-login}||'') =~/\/$/i : $s->{-w32IISdpsn} >1))
1206             && !$s->uauth()->signget(); # $s->uguest
1207 0 0 0       if ((($s->qparam('_run')||'') ne 'SEARCH')
      0        
      0        
      0        
1208             && !$s->{-cache}->{-RevertToSelf}
1209             && (!defined($s->{-w32IISdpsn}) || ($s->{-w32IISdpsn} >1))
1210             ) { # see 'search' in 'upws'
1211 0           $url =~s/\/_*(login|auth|a|ntlm|search|guest)\//\//i;
1212 0 0         $url .=($ENV{QUERY_STRING} ? ('?' .$ENV{QUERY_STRING}) :'');
1213 0           $s->print()->redirect(-uri=>$url, -nph=>1);
1214 0           eval{$s->reset()};
  0            
1215 0           exit;
1216             }
1217             }
1218             $s->user
1219 0           }
1220            
1221            
1222            
1223             sub w32IISdpsn {# deimpersonate Microsoft IIS impersonated process
1224             # 'Win32::API' used.
1225             # Set 'IIS / Home Directory / Application Protection' = 'Low (IIS Process)'
1226             # or see 'Administrative Tools / Component Services'.
1227             # Do not use quering to 'Index Server'.
1228 0 0 0 0 0   return(undef) if (defined($_[0]->{-w32IISdpsn}) && !$_[0]->{-w32IISdpsn})
      0        
      0        
      0        
      0        
      0        
1229             || $_[0]->{-cache}->{-RevertToSelf}
1230             || ($^O ne 'MSWin32')
1231             || !(($ENV{SERVER_SOFTWARE}||'') =~/IIS/)
1232             || $ENV{'FCGI_SERVER_VERSION'};
1233 0           $_[0]->user();
1234 0           my $o =eval('use Win32::API; new Win32::API("advapi32.dll","RevertToSelf",[],"N")');
1235 0   0       my $l =eval{Win32::LoginName()}||'';
1236 0 0 0       if ($o && $o->Call() && ($l ne (eval{Win32::LoginName()} ||''))) {
      0        
      0        
1237 0   0       $_[0]->{-cache}->{-RevertToSelf} =(Win32::LoginName()||'?');
1238 0 0 0       $_[1] && $_[0]->{-debug}
    0          
    0          
1239             && $_[0]->pushmsg('w32IISdpsn(' .(defined($_[0]->{-w32IISdpsn}) ? $_[0]->{-w32IISdpsn} : 'undef') .')' .($_[0]->{-debug} >2 ? ' '. $_[0]->{-cache}->{-RevertToSelf} : ''))
1240             }
1241             else {
1242 0 0         return $_[0]->die($_[0]->lng(0, 'w32IISdpsn') .": Win32::API('RevertToSelf') -> " .join('; ', map {$_ ? $_ : ()} $@,$!,$^E))
  0            
1243             }
1244 0           1
1245             }
1246            
1247            
1248             #######################
1249            
1250            
1251             sub oscmd { # OS Command with logging
1252 0     0 1   my $s =shift;
1253 0 0         my $opt = substr($_[0],0,1) eq '-' ? shift : ''; # 'h'ide, 'i'gnore
1254 0 0         my $sub =ref($_[$#_]) eq 'CODE' ? pop : undef;
1255 0           my $r;
1256             my $o;
1257 0 0         $s->pushmsg(join(' ',@_)) if $opt !~/h/;
1258 0           local(*RDRFH, *WTRFH);
1259 0 0         if ($^X =~/(?:perlis|perlex)\d*\.dll$/i) { # !!! ISAPI IIS problem
1260 0 0         if ($sub) {
1261 0 0 0       open(WTRFH, '|' .join(' ',@_)) && defined(*WTRFH) || $s->die(join(' ',@_) .' -> ' .$!);
1262             # open(WTRFH, '|' ,@_) && defined(*WTRFH) || $s->die(join(' ',@_) .' -> ' .$!);
1263 0           my $ls =select(); select(WTRFH); $| =1;
  0            
  0            
1264 0           &$sub($s);
1265 0           select($ls);
1266 0           eval{close(WTRFH)};
  0            
1267             }
1268             else {
1269 0 0 0       if ($opt !~/h/ && $_[0] =~/cacls/) { # !!! IIS/cacls behaviour debug
1270 0           $r =join(' ',@_,'2>&1');
1271 0           @$o =`$r`;
1272             # push @$o, Win32::LoginName, `logname`; # 'SYSTEM'/'IUSR_' || 'IUSR_'/'IWAM'
1273             }
1274             else {
1275 0           system(@_)
1276             }
1277             }
1278             }
1279             else {
1280 0           eval('use IPC::Open2');
1281 0           my $pid = IPC::Open2::open2(\*RDRFH, \*WTRFH, @_);
1282 0 0         if ($pid) {
1283 0 0         if ($sub) {
1284 0           my $select =select();
1285 0           select(WTRFH);
1286 0           $| =1;
1287 0           &$sub($s);
1288 0           select($select);
1289             }
1290 0           @$o =;
1291 0           waitpid($pid,0);
1292             }
1293             }
1294 0           $r =$?>>8;
1295 0 0 0       $s->pushmsg(@$o) if $o && $opt !~/h/;
1296 0 0 0       $s->die(join(' ',@_) .($opt !~/h/ ? '' : ' -> ' .join('',@{$o||[]})) ." -> $r\n") if $r && $opt !~/i/;
  0 0          
    0          
1297 0           !$r
1298             }
1299            
1300            
1301            
1302             #######################
1303            
1304            
1305             sub httpheader {
1306 0     0 1   my $s =shift;
1307 0 0 0       my %p =!defined($_[0]) ? () : @_==1 && ref($_[0]) ? %{$_[0]} : @_;
  0 0          
1308 0 0         if (ref($s->{-httpheader})) {
1309 0           foreach my $k (keys(%{$s->{-httpheader}})) {
  0            
1310 0 0         if (!exists($p{$k})) {$p{$k} =$s->{-httpheader}->{$k}}
  0            
1311             }
1312             }
1313 0           $s->{-cgi}->header(%p)
1314             }
1315            
1316            
1317             sub htmlstart {
1318 0     0 1   my $s =shift;
1319 0 0 0       my %p =!defined($_[0]) ? () : @_==1 && ref($_[0]) ? %{$_[0]} : @_;
  0 0          
1320 0 0         if (ref($s->{-htmlstart})) {
1321 0           foreach my $k (keys(%{$s->{-htmlstart}})) {
  0            
1322 0 0         if (!exists($p{$k})) {$p{$k} =$s->{-htmlstart}->{$k}}
  0            
1323             }
1324             }
1325 0 0         $p{-style} ={code=>
1326             ".Form, .List, .Help, .MenuArea, .FooterArea {margin-top:0px; font-size: 8pt; font-family: Verdana, Helvetica, Arial, sans-serif; }\n"
1327             #."a:link.ListTable {font-weight: bold}\n"
1328             .".MenuButton {background-color: buttonface; color: black; text-decoration: none; font-size: 7pt;}\n"
1329             #."td.MenuButton {background-color: activeborder;}\n"
1330             #.".MenuArea {background-color: blue; color: white;}"
1331             #.".MenuButton {background-color: blue; color: white; text-decoration: none; font-size: 7pt;}\n"
1332             .".PaneLeft, .PaneForm, .PaneList {margin-top:0px; font-size: 8pt; font-family: Verdana, Helvetica, Arial, sans-serif; }\n"
1333             ."td.ListTable {border-style: inset; border-bottom-width: 1px; border-top-width: 0px; border-left-width: 0px; border-right-width: 0px; padding-top: 0;}\n"
1334             ."th.ListTable {border-style: inset; border-bottom-width: 1px; border-top-width: 0px; border-left-width: 0px; border-right-width: 0px;}\n"
1335             } if !exists($p{-style});
1336 0 0 0       $s->{-debug} && $s->{-debug} >2
1337             ? $s->{-cgi}->start_html(%p)
1338             .("\n\n")
1339             : $s->{-cgi}->start_html(%p)
1340             }
1341            
1342            
1343             sub htmlend {
1344 0 0 0 0 0   $_[0]->microtest if $_[0]->{-debug} && $_[0]->{-debug} >3;
1345 0           $_[0]->{-cgi}->end_html
1346             }
1347            
1348            
1349             sub htpgstart {
1350 0   0 0 1   $_[0]->httpheader($_[1])
1351             .$_[0]->htmlstart($_[2])
1352             .($_[0]->{-htpgtop}||'')
1353             }
1354            
1355            
1356             sub htpgend {
1357 0   0 0 1   ($_[0]->{-htpgbot}||'')
1358             .$_[0]->htmlend
1359             }
1360            
1361            
1362             sub htpfstart {
1363 0     0 1   my $s =shift;
1364 0           $s->htpgstart($_[0],$_[1]) ."\n"
1365             .((($ENV{HTTP_USER_AGENT} ||'') =~m{^[^/]+/(\d)} ? $1 >=3 : 0)
1366             ? $s->{-cgi}->start_multipart_form({-action=>$s->url_form()
1367             , -acceptcharset=>$s->{-httpheader} ?$s->{-httpheader}->{-charset} :undef
1368 0           , $_[2] ? %{$_[2]} : ()
1369             })
1370             : $s->{-cgi}->start_form({-action=>$s->url_form()
1371             , -acceptcharset=>$s->{-httpheader} ?$s->{-httpheader}->{-charset} :undef}
1372 0 0 0       , $_[2] ? %{$_[2]} : ()
    0          
    0          
    0          
    0          
    0          
1373             )
1374             ) ."\n"
1375             }
1376            
1377            
1378             sub htpfend {
1379 0     0 1   "\n\n" .$_[0]->htpgend(@_)
1380             }
1381            
1382            
1383             sub htmlescape {
1384 0 0   0 1   !defined($_[1]) ? '' : shift->{-cgi}->escapeHTML(@_)
1385             }
1386            
1387            
1388             sub htmlescapetext {
1389 0     0 1   my $s =shift;
1390 0           my $r =join("\n",@_);
1391 0           my $g =$s->cgi;
1392 0           my ($e, $m, $l) =('');
1393 0           while ($r =~/\b(\w{3,5}:\/\/[^\s\t,()<>\[\]"']+[^\s\t.,;()<>\[\]"'])/) {
1394 0           $m =$1; $r =$';
  0            
1395 0           $l =$g->escapeHTML($`); $l =~s/( {2,})/' ' x length($1)/ge; $l =~s/\n/
\n/g; $l =~s/\r//g;
  0            
  0            
  0            
  0            
1396 0           $e .=$l;
1397 0           $m =~s/^(host|urlh):\/\//\//;
1398 0           $m =~s/^(url|urlr):\/\//$s->url(-relative=>1)/e;
  0            
1399 0           $e .=$g->a({-href=>$m, -target=>'_blank'}, $g->escapeHTML($m));
1400             }
1401 0           $r =$g->escapeHTML($r); $r =~s/( {2,})/' ' x length($1)/ge; $r =~s/\n/
\n/g; $r =~s/\r//g;
  0            
  0            
  0            
  0            
1402 0           $e .=$r;
1403 0 0         $e ="$e" if $e =~/  /;
1404 0           $e
1405             }
1406            
1407            
1408             sub urlescape {
1409 0 0   0 1   !defined($_[1]) ? '' : shift->{-cgi}->escape(@_)
1410             }
1411            
1412            
1413             sub htmlurl { # Create URL from call string and parameters
1414 0 0   0 0   return($_[0]->url .($ENV{QUERY_STRING} ? '?' .$ENV{QUERY_STRING} : '')) if scalar(@_) <2;
    0          
1415 0           my $rsp = $_[1]; # do not escape at all?!!!
1416 0 0         $rsp ='' if !defined($rsp);
1417 0 0 0       chop $rsp if $rsp ne '' && substr($rsp, length($rsp) -1, 0) eq '/';
1418 0           $rsp =~s/([^a-zA-Z0-9_\.\-\/\?\=\&;:%])/uc sprintf("%%%02x",ord($1))/eg; # see cgi->escape
  0            
1419 0 0         $rsp .=($rsp =~/\?/ ? '&' : '?');
1420 0           for (my $i =2; $i <$#_; $i +=2) { # see cgi->escape
1421 0           my @a =($_[$i], $_[$i+1]);
1422 0 0         map {!defined($_) ? ($_ ='')
  0            
1423 0           : ~s/([^a-zA-Z0-9_.-])/uc sprintf("%%%02x",ord($1))/eg} @a;
1424 0           $rsp .=$a[0] .'=' .$a[1] .'&';
1425             }
1426 0           chop($rsp);
1427 0           $rsp;
1428             }
1429            
1430            
1431             sub htmlddlb { # HTML Drop-Down List Box - Input helper
1432 0     0 1   shift->wg->ddlb(@_);
1433             }
1434            
1435             sub htmltextfield { # HTML Text filed with autosizing
1436 0     0 1   shift->wg->textfield(@_);
1437             }
1438            
1439            
1440             sub htmltextarea { # HTML Text area with autorowing and hrefs
1441 0     0 1   shift->wg->textarea(@_);
1442             }
1443            
1444            
1445             sub htmlfsdir { # HTML Filesystem dir field
1446 0     0 1   shift->wg->fsdir(@_);
1447             }
1448            
1449            
1450             #######################
1451            
1452            
1453             sub print { # print and CGI::BusCgiPrint object
1454 0     0 1   my $s =shift;
1455             #return(undef) if scalar(@_) && !CORE::print @_;
1456 0           CORE::print @_;
1457 0           CGI::BusCgiPrint->new($s);
1458             }
1459            
1460            
1461             sub text { # Retransalte text for print->text()
1462 0     0 1   shift; join('',@_)
  0            
1463             }
1464            
1465            
1466            
1467             #######################
1468            
1469             # Autoload Launcher Object
1470             package CGI::BusLauncher; # Used with 'launch'
1471 1     1   3208 use vars qw($AUTOLOAD);
  1         2  
  1         183  
1472             1;
1473            
1474             sub new {
1475 0     0     my $c=shift;
1476 0           my $s =[$_[0]];
1477 0           bless $s,$c;
1478             }
1479            
1480             sub DESTROY {
1481 0     0     eval {$_[0]->[0] =undef}
  0            
1482             }
1483            
1484             sub AUTOLOAD {
1485 0     0     shift->[0]->launch(substr($AUTOLOAD, rindex($AUTOLOAD, '::')+2), @_)
1486             }
1487            
1488            
1489            
1490             #######################
1491            
1492             # Autoload CGI method, print it result, return self
1493             package CGI::BusCgiPrint; # Used with 'print'
1494 1     1   5 use vars qw($AUTOLOAD);
  1         1  
  1         571  
1495             1;
1496            
1497             sub new {
1498 0     0     my $c=shift;
1499 0           my $s =[$_[0]];
1500 0           bless $s,$c;
1501             }
1502            
1503             sub DESTROY {
1504 0     0     eval {$_[0]->[0] =undef}
  0            
1505             }
1506            
1507            
1508             sub httpheader {
1509 0     0     my $s =shift;
1510 0 0         $s->[0]->print($s->[0]->{-cache}->{-httpheader} ? ''
1511             :($s->[0]->{-cache}->{-httpheader} =$s->[0]->httpheader(@_)));
1512             }
1513            
1514            
1515             sub htmlstart {
1516 0     0     my $s =shift;
1517 0 0         $s->[0]->print($s->[0]->{-cache}->{-htmlstart} ? ''
1518             :($s->[0]->{-cache}->{-htmlstart} =$s->[0]->htmlstart(@_)));
1519             }
1520            
1521            
1522             sub htpgstart {
1523 0     0     $_[0]->httpheader($_[1]);
1524 0           $_[0]->htmlstart ($_[2]);
1525 0 0 0       $_[0]->[0]->print($_[0]->[0]->{-cache}->{-htpgstart} ? ''
1526             :($_[0]->[0]->{-cache}->{-htpgstart} =$_[0]->[0]->{-htpgtop}||''))
1527             }
1528            
1529            
1530             sub htpfstart {
1531 0     0     $_[0]->htpgstart($_[1],$_[2]);
1532 0           $_[0]->[0]->print("\n"
1533             .((($ENV{HTTP_USER_AGENT} ||'') =~m{^[^/]+/(\d)} ? $1 >=3 : 0)
1534             ? $_[0]->[0]->{-cgi}->start_multipart_form({-action=>$_[0]->[0]->url_form()
1535             , -acceptcharset=>$_[0]->[0]->{-httpheader} ?$_[0]->[0]->{-httpheader}->{-charset} :undef
1536 0           , $_[3] ? %{$_[3]} : ()})
1537             : $_[0]->[0]->{-cgi}->start_form({-action=>$_[0]->[0]->url_form()
1538             ,-acceptcharset=>$_[0]->[0]->{-httpheader} ?$_[0]->[0]->{-httpheader}->{-charset} :undef
1539 0 0 0       , $_[3] ? %{$_[3]} : ()})
    0          
    0          
    0          
    0          
    0          
1540             ) ."\n")
1541             }
1542            
1543            
1544             sub br {
1545 0     0     $_[0]->[0]->print('
')
1546             }
1547            
1548            
1549             sub AUTOLOAD {
1550 0     0     my $s =shift;
1551 0           my $m =substr($AUTOLOAD, rindex($AUTOLOAD, '::')+2);
1552 0           $s->[0]->print($s->[0]->$m(@_));
1553             }
1554            
1555