--- rat/lonpageflip.pm 2004/10/18 22:24:00 1.48 +++ rat/lonpageflip.pm 2005/08/31 07:38:29 1.56 @@ -2,7 +2,7 @@ # # Page flip handler # -# $Id: lonpageflip.pm,v 1.48 2004/10/18 22:24:00 albertel Exp $ +# $Id: lonpageflip.pm,v 1.56 2005/08/31 07:38:29 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -26,23 +26,12 @@ # # http://www.lon-capa.org/ # -# (Page Handler -# -# (TeX Content Handler -# -# 05/29/00,05/30 Gerd Kortemeyer) -# 08/30,08/31,09/06,09/14,09/15,09/16,09/19,09/20,09/21,09/23, -# 10/02 Gerd Kortemeyer) -# -# 10/03,10/05,10/06,10/07,10/09,10/10,10/11,10/16,10/17, -# 11/14,11/16, -# 10/01/01,05/01,05/28,07/05 Gerd Kortemeyer package Apache::lonpageflip; use strict; use Apache::Constants qw(:common :http REDIRECT); -use Apache::lonnet(); +use Apache::lonnet; use HTML::TokeParser; use GDBM_File; @@ -74,7 +63,7 @@ sub addrid { sub fullmove { my ($rid,$mapurl,$direction)=@_; - if (tie(%hash,'GDBM_File',$ENV{'request.course.fn'}.'.db', + if (tie(%hash,'GDBM_File',$env{'request.course.fn'}.'.db', &GDBM_READER(),0640)) { ($rid,$mapurl)=&move($rid,$mapurl,$direction); untie(%hash); @@ -82,6 +71,18 @@ sub fullmove { return($rid,$mapurl); } +sub hash_src { + my ($id)=@_; + my ($mapid,$resid)=split(/\./,$id); + my $symb=&Apache::lonnet::encode_symb($hash{'map_id_'.$mapid}, + $resid,$hash{'src_'.$id}); + if ($hash{'encrypted_'.$id}) { + return (&Apache::lonenc::encrypted($hash{'src_'.$id}), + &Apache::lonenc::encrypted($symb)); + } + return ($hash{'src_'.$id},$symb); +} + sub move { my ($rid,$mapurl,$direction)=@_; my $startoutrid=$rid; @@ -174,6 +175,28 @@ sub move { return ($next,$mapurl); } +sub navlaunch { + my ($r)=@_; + &Apache::loncommon::content_type($r,'text/html'); + &Apache::loncommon::no_cache($r); + $r->send_http_header; + my $html=&Apache::lonxml::xmlbegin(); + $r->print("$html\n"); + $r->print(''. + &Apache::loncommon::bodytag('Launched')); + $r->print(<Goto first resource

+ +

Collapse external navigation window

+ENDNAV + $r->print(&Apache::loncommon::endbodytag().''); +} # ================================================================ Main Handler sub handler { @@ -182,49 +205,73 @@ sub handler { # ------------------------------------------- Set document type for header only if ($r->header_only) { - $r->content_type('text/html'); - $r->send_http_header; - return OK; + &Apache::loncommon::content_type($r,'text/html'); + $r->send_http_header; + return OK; } my %cachehash=(); my $multichoice=0; my %multichoicehash=(); - my $redirecturl=''; + my ($redirecturl,$redirectsymb); my $next=''; my @possibilities=(); &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['postdata']); - if (($ENV{'form.postdata'})&&($ENV{'request.course.fn'})) { - $ENV{'form.postdata'}=~/(\w+)\:(.*)/; + if (($env{'form.postdata'})&&($env{'request.course.fn'})) { + $env{'form.postdata'}=~/(\w+)\:(.*)/; my $direction=$1; my $currenturl=$2; + if ($currenturl=~m|^/enc/|) { + $currenturl=&Apache::lonenc::unencrypted($currenturl); + } $currenturl=~s/\.\d+\.(\w+)$/\.$1/; - if ($direction eq 'return') { + if ($direction eq 'firstres') { + my $furl; + if (tie(my %bighash,'GDBM_File',$env{'request.course.fn'}.'.db', + &GDBM_READER(),0640)) { + $furl=$bighash{'first_url'}; + untie(%bighash); + } + &Apache::loncommon::content_type($r,'text/html'); + $r->header_out(Location => + 'http://'.$ENV{'HTTP_HOST'}.$furl); + + return REDIRECT; + } + if ($direction eq 'return' || $direction eq 'navlaunch') { # -------------------------------------------------------- Return to last known my $last; - if (tie(%hash,'GDBM_File',$ENV{'request.course.fn'}.'_symb.db', + if (tie(%hash,'GDBM_File',$env{'request.course.fn'}.'_symb.db', &GDBM_READER(),0640)) { $last=$hash{'last_known'}; untie(%hash); } my $newloc; - if (($last) && (tie(%hash,'GDBM_File',$ENV{'request.course.fn'}.'.db', + if (($last) && (tie(%hash,'GDBM_File',$env{'request.course.fn'}.'.db', &GDBM_READER(),0640))) { - my ($murl,$fn)=&Apache::lonnet::decode_symb($last); - my $id; - ($murl,$id,$fn)=&Apache::lonnet::decode_symb(&Apache::lonnet::symbread($fn)); - $newloc=$hash{'src_'. - $hash{'map_pc_'.&Apache::lonnet::clutter($murl)}.'.'.$id}; - unless ($newloc) { $newloc='/adm/noidea.html'; } + my ($murl,$id,$fn)=&Apache::lonnet::decode_symb($last); + $id=$hash{'map_pc_'.&Apache::lonnet::clutter($murl)}.'.'.$id; + $newloc=$hash{'src_'.$id}; + if ($newloc) { + if ($hash{'encrypted_'.$id}) { $newloc=&Apache::lonenc::encrypted($newloc); } + + } else { + $newloc='/adm/noidea.html'; + } untie %hash; } else { $newloc='/adm/noidea.html'; } - $r->content_type('text/html'); - $r->header_out(Location => - 'http://'.$ENV{'HTTP_HOST'}.$newloc); - - return REDIRECT; + if ($newloc eq '/adm/noidea.html' && $direction eq 'navlaunch') { + &navlaunch($r); + return OK; + } else { + &Apache::loncommon::content_type($r,'text/html'); + $r->header_out(Location => + 'http://'.$ENV{'HTTP_HOST'}.$newloc); + + return REDIRECT; + } } $currenturl=~s/^http\:\/\///; $currenturl=~s/^[^\/]+//; @@ -233,18 +280,23 @@ sub handler { # unless (&Apache::lonnet::is_on_map($currenturl)) { my $last; - if (tie(%hash,'GDBM_File',$ENV{'request.course.fn'}.'_symb.db', + if (tie(%hash,'GDBM_File',$env{'request.course.fn'}.'_symb.db', &GDBM_READER(),0640)) { $last=$hash{'last_known'}; untie(%hash); } if ($last) { - $currenturl=&Apache::lonnet::clutter((&Apache::lonnet::decode_symb($last))[1]); + $currenturl=&Apache::lonnet::clutter((&Apache::lonnet::decode_symb($last))[2]); } else { - $r->content_type('text/html'); - $r->header_out(Location => - 'http://'.$ENV{'HTTP_HOST'}.'/adm/noidea.html'); - return REDIRECT; + if ($direction eq 'return') { + &Apache::loncommon::content_type($r,'text/html'); + $r->header_out(Location => + 'http://'.$ENV{'HTTP_HOST'}.'/adm/noidea.html'); + return REDIRECT; + } else { + &navlaunch($r); + return OK; + } } } # ------------------------------------------- Do we have any idea where we are? @@ -252,12 +304,12 @@ sub handler { if ($position=Apache::lonnet::symbread($currenturl)) { # ------------------------------------------------------------------------- Yes my ($startoutmap,$mapnum,$thisurl)=&Apache::lonnet::decode_symb($position); - $cachehash{$startoutmap}{$thisurl}=$mapnum; + $cachehash{$startoutmap}{$thisurl}=[$thisurl,$mapnum]; $cachehash{$startoutmap}{'last_known'}= - &Apache::lonnet::declutter($currenturl); + [&Apache::lonnet::declutter($currenturl),$mapnum]; # ============================================================ Tie the big hash - if (tie(%hash,'GDBM_File',$ENV{'request.course.fn'}.'.db', + if (tie(%hash,'GDBM_File',$env{'request.course.fn'}.'.db', &GDBM_READER(),0640)) { my $rid=$hash{'map_pc_'.&Apache::lonnet::clutter($startoutmap)}. '.'.$mapnum; @@ -269,7 +321,7 @@ sub handler { my $safecount=0; while (($next) && ($next!~/\,/) && ((!$hash{'src_'.$next}) || - ($ENV{'request.role.adv'}) && $hash{'randomout_'.$next})) + ((!$env{'request.role.adv'}) && $hash{'randomout_'.$next})) && ($safecount<10000)) { ($next,$endupmap)=&move($next,$endupmap,$direction); $safecount++; @@ -280,10 +332,9 @@ sub handler { @possibilities=split(/\,/,$next); if ($#possibilities==0) { # ---------------------------------------------- Only one possibility, redirect - $redirecturl=$hash{'src_'.$next}; - $cachehash{$endupmap} - {&Apache::lonnet::declutter($redirecturl)} - =(split(/\./,$next))[1]; + ($redirecturl,$redirectsymb)=&hash_src($next); + $cachehash{$endupmap}{$redirecturl}= + [$redirecturl,(split(/\./,$next))[1]]; } else { # ------------------------ There are multiple possibilities for a next resource $multichoice=1; @@ -298,13 +349,9 @@ sub handler { $second.'___'.$symbSrc); my ($choicemap,$choiceres)=split(/\./,$_); - $cachehash - {&Apache::lonnet::declutter($hash{'src_'.$choicemap})} - {&Apache::lonnet::declutter( - $multichoicehash - {'src_'.$_} - )} - =$choiceres; + my $map=&Apache::lonnet::declutter($hash{'src_'.$choicemap}); + my $url=$multichoicehash{'src_'.$_}; + $cachehash{$map}{$url}=[$url,$choiceres]; } @possibilities; } } else { @@ -314,9 +361,12 @@ sub handler { # ----------------- The program must come past this point to untie the big hash untie(%hash); # --------------------------------------------------------- Store position info - $cachehash{$startoutmap}{'last_direction'}=$direction; + $cachehash{$startoutmap}{'last_direction'}=[$direction,'notasymb']; foreach my $thismap (keys %cachehash) { - &Apache::lonnet::symblist($thismap,%{$cachehash{$thismap}}); + my $mapnum=$cachehash{$thismap}->{'mapnum'}; + delete($cachehash{$thismap}->{'mapnum'}); + &Apache::lonnet::symblist($thismap, + %{$cachehash{$thismap}}); } # ============================================== Do not return before this line if ($redirecturl) { @@ -328,26 +378,28 @@ sub handler { &Apache::lonnet::linklog($redirecturl,$currenturl); } # ------------------------------------------------- Check for critical messages - if ((time-$ENV{'user.criticalcheck.time'})>300) { + if ((time-$env{'user.criticalcheck.time'})>300) { my @what=&Apache::lonnet::dump - ('critical',$ENV{'user.domain'}, - $ENV{'user.name'}); + ('critical',$env{'user.domain'}, + $env{'user.name'}); if ($what[0]) { if (($what[0] ne 'con_lost') && ($what[0]!~/^error\:/)) { $redirecturl='/adm/email?critical=display'; + $redirectsymb=''; } } &Apache::lonnet::appenv('user.criticalcheck.time'=>time); } - $r->content_type('text/html'); - $r->header_out(Location => - 'http://'.$ENV{'HTTP_HOST'}.$redirecturl); + &Apache::loncommon::content_type($r,'text/html'); + my $url='http://'.$ENV{'HTTP_HOST'}.$redirecturl; + if ($redirectsymb ne '') { $url.='?symb='.$redirectsymb; } + $r->header_out(Location => $url); return REDIRECT; } else { # --------------------------------------------------------- There was a problem - $r->content_type('text/html'); + &Apache::loncommon::content_type($r,'text/html'); $r->send_http_header; if ($#possibilities>0) { my $bodytag= @@ -393,7 +445,7 @@ ENDNONE } } else { # ------------------------------------------------- Problem, could not tie hash - $ENV{'user.error.msg'}="/adm/flip:bre:0:1:Course Data Missing"; + $env{'user.error.msg'}="/adm/flip:bre:0:1:Course Data Missing"; return HTTP_NOT_ACCEPTABLE; } } else { @@ -405,7 +457,7 @@ ENDNONE } } else { # -------------------------- Class was not initialized or page fliped strangely - $ENV{'user.error.msg'}="/adm/flip:bre:0:0:Choose Course"; + $env{'user.error.msg'}="/adm/flip:bre:0:0:Choose Course"; return HTTP_NOT_ACCEPTABLE; } } 500 Internal Server Error

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at root@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.