--- rat/lonuserstate.pm 2000/10/30 15:12:49 1.13 +++ rat/lonuserstate.pm 2000/11/16 11:58:30 1.19 @@ -11,7 +11,8 @@ # 7/1,7/3,7/4,7/7,7/8,7/10 Gerd Kortemeyer) # # 7/15,7/17,7/18,8/1,8/2,8/4,8/5,8/21,8/22,8/23,8/30, -# 9/2,9/4,9/29,9/30,10/2,10/11,10/30 Gerd Kortemeyer +# 9/2,9/4,9/29,9/30,10/2,10/11,10/30,10/31, +# 11/1,11/2,11/14,11/16 Gerd Kortemeyer package Apache::lonuserstate; @@ -22,11 +23,14 @@ use HTML::TokeParser; use Apache::lonnet(); use GDBM_File; use Apache::lonmsg; +use Safe; +use Opcode; # ---------------------------------------------------- Globals for this package my $pc; # Package counter my %hash; # The big tied hash +my %parmhash;# The hash with the parameters my @cond; # Array with all of the conditions my $errtext; # variable with all errors @@ -165,6 +169,20 @@ sub loadmap { } else { $hash{'from_'.$goesto}=''.$linkid; } + } elsif ($token->[1] eq 'param') { +# ------------------------------------------------------------------- Parameter + + my $referid=$lpc.'.'.$token->[2]->{'to'}; + my $newparam= + &Apache::lonnet::escape($token->[2]->{'type'}).':'. + &Apache::lonnet::escape($token->[2]->{'name'}).'='. + &Apache::lonnet::escape($token->[2]->{'value'}); + if (defined($hash{'param_'.$referid})) { + $hash{'param_'.$referid}.='&'.$newparam; + } else { + $hash{'param_'.$referid}=''.$newparam; + } + } } @@ -236,7 +254,7 @@ sub traceroute { } } -# ------------------------------------------ Cascading conditions, quick access +# ------------------------------ Cascading conditions, quick access, parameters sub accinit { my ($uri,$short,$fn)=@_; @@ -265,7 +283,18 @@ sub accinit { $captured{$expr}=$condcounter; $acchash{'acc.cond.'.$short.'.'.$condcounter}=$expr; } - } + } elsif ($_=~/^param_(\d+)\.(\d+)/) { + my $prefix=&Apache::lonnet::declutter($hash{'map_id_'.$1}). + '___'.$2.'___'.&Apache::lonnet::declutter($hash{'src_'.$1.'.'.$2}); + map { + my ($typename,$value)=split(/\=/,$_); + my ($type,$name)=split(/\:/,$typename); + $parmhash{$prefix.'.'.&Apache::lonnet::unescape($name)}= + &Apache::lonnet::unescape($value); + $parmhash{$prefix.'.'.&Apache::lonnet::unescape($name).'.type'}= + &Apache::lonnet::unescape($type); + } split(/\&/,$hash{$_}); + } } keys %hash; map { if ($_=~/^ids/) { @@ -300,6 +329,7 @@ sub accinit { } keys %hash; my $courseuri=$uri; $courseuri=~s/^\/res\///; + &Apache::lonnet::delenv('(acc\.|httpref\.)'); &Apache::lonnet::appenv(%acchash, "request.course.id" => $short, "request.course.fn" => $fn, @@ -324,8 +354,11 @@ sub readmap { unlink($fn.'.db'); unlink($fn.'_symb.db'); unlink($fn.'.state'); - if (tie(%hash,'GDBM_File',"$fn.db",&GDBM_WRCREAT,0640)) { + unlink($fn.'parms.db'); + if ((tie(%hash,'GDBM_File',"$fn.db",&GDBM_WRCREAT,0640)) && + (tie(%parmhash,'GDBM_File',$fn.'_parms.db',&GDBM_WRCREAT,0640))) { %hash=(); + %parmhash=(); $errtext=''; $pc=0; loadmap($uri); @@ -333,7 +366,7 @@ sub readmap { &traceroute('0',$hash{'map_start_'.$uri},'&'); &accinit($uri,$short,$fn); } - unless (untie(%hash)) { + unless ((untie(%hash)) && (untie(%parmhash))) { &Apache::lonnet::logthis("WARNING: ". "Could not untie coursemap $fn for $uri."); } @@ -353,7 +386,46 @@ sub readmap { &Apache::lonmsg::author_res_msg($ENV{'request.course.uri'},$errtext); return $errtext; } - + +# ------------------------------------------------------- Evaluate state string + +sub evalstate { + my $safeeval = new Safe; + my $fn=$ENV{'request.course.fn'}.'.state'; + my $state='2'; + if (-e $fn) { + my @conditions=(); + { + my $fh=Apache::File->new($fn); + @conditions=<$fh>; + } + $safeeval->permit("entereval"); + $safeeval->permit(":base_math"); + $safeeval->deny(":base_io"); + $safeeval->share_from('Apache::lonnet',['&EXT']); + map { + my $line=$_; + chomp($line); + my ($condition,$weight)=split(/\:/,$_); + if ($safeeval->reval($condition)) { + if ($weight eq 'force') { + $state.='3'; + } else { + $state.='2'; + } + } else { + if ($weight eq 'stop') { + $state.='0'; + } else { + $state.='1'; + } + } + } @conditions; + } + &Apache::lonnet::appenv('user.state.'.$ENV{'request.course.id'} => $state); + return $state; +} + 1; __END__