--- rat/lonambiguous.pm 2002/11/06 22:51:51 1.7 +++ rat/lonambiguous.pm 2004/12/20 20:13:52 1.13 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Handler to resolve ambiguous file locations # -# $Id: lonambiguous.pm,v 1.7 2002/11/06 22:51:51 albertel Exp $ +# $Id: lonambiguous.pm,v 1.13 2004/12/20 20:13:52 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -37,35 +37,56 @@ use strict; use Apache::lonnet; use Apache::Constants qw(:common REDIRECT); use GDBM_File; +use Apache::loncommon; +use Apache::lonlocal; +my %bighash; + +sub cleanup { + if (tied(%bighash)){ + &Apache::lonnet::logthis('Cleanup ambiguous: bighash'); + unless (untie(%bighash)) { + &Apache::lonnet::logthis('Failed cleanup ambiguous: bighash'); + } + } +} # ----------------------------------------------------------- Could not resolve sub getlost { my ($r,$errmsg)=@_; + $errmsg=&mt($errmsg); $r->content_type('text/html'); $r->send_http_header; $r->print( - 'Unknown Error

'. - 'LON-CAPA

Could not handle ambiguous resource reference.

'.$errmsg. + 'Unknown Error'. + &Apache::loncommon::bodytag('Could not handle ambiguous resource reference'). + $errmsg. ''); } # ================================================================ Main Handler +sub make_symb { + my ($id)=@_; + my ($mapid,$resid)=split(/\./,$id); + my $map=$bighash{'map_id_'.$mapid}; + my $res=$bighash{'src_'.$id}; + my $symb=&Apache::lonnet::encode_symb($map,$resid,$res); + return $symb; +} + sub handler { my $r=shift; if ($r->header_only) { - $r->content_type('text/html'); + &Apache::loncommon::content_type($r,'text/html'); $r->send_http_header; return OK; } # ---------------------------------------------------------- Is this selecting? - - my %bighash; - + if ($ENV{'form.selecturl'}) { my $envkey; if (tie(%bighash,'GDBM_File',$ENV{'request.course.fn'}.'.db', @@ -128,7 +149,12 @@ sub handler { return OK; } } - +# ------------------------------------Encrypted requests go straight to navmaps + if ($ENV{'request.enc'}) { + $r->content_type('text/html'); + $r->header_out(Location => 'http://'.$ENV{'HTTP_HOST'}.'/adm/navmaps'); + return REDIRECT; + } # ------------------------------------------------ Would be standalone resource if (tie(%bighash,'GDBM_File',$ENV{'request.course.fn'}.'.db', @@ -139,46 +165,59 @@ sub handler { # ------------------------------------------------------------------- Has ID(s) my @possibilities=split(/\,/,$ids); my $couldbe=''; - map { - if (&Apache::lonnet::allowed('bre',$bighash{'src_'.$_})) { + foreach (@possibilities) { + if ($bighash{'encrypted_'.$_}) { next; } + my $symb=&make_symb($_); + if (&Apache::lonnet::allowed('bre',$bighash{'src_'.$_},$symb)) { if ($couldbe) { $couldbe.=','.$_; } else { $couldbe=$_; } } - } @possibilities; + } if ($couldbe) { @possibilities=split(/\,/,$couldbe); + if ($#possibilities==0) { + my $id=$possibilities[0]; + my $resurl=$bighash{'src_'.$id}; + my $mapurl=$bighash{'map_id_'.(split(/\./,$id))[0]}; + my $symb=&make_symb($id); + $r->content_type('text/html'); + &Apache::lonnet::logthis('http://'.$ENV{'HTTP_HOST'}.$resurl.'?symb='.$symb); + $r->header_out(Location => + 'http://'.$ENV{'HTTP_HOST'}.$resurl.'?symb='.$symb); + return REDIRECT; + } if ($#possibilities>0) { # ----------------------------------------------- Okay, really multiple choices $r->content_type('text/html'); $r->send_http_header; + my $bodytag= + &Apache::loncommon::bodytag('Pick Instance of Resource'); $r->print(<Choose Location - -

LON-CAPA

+$bodytag The resource you had been accessing appears more than once in this course, and LON-CAPA has insufficient session information to determine which instance of the resource you meant.

Please click on the instance of the resource you intended to access: -

-

- - - - +

+
 TitleTypePart of ...
+ ENDSTART map { + my $resurl=$bighash{'src_'.$_}; my $mapurl=$bighash{'map_id_'.(split(/\./,$_))[0]}; - $r->print(''); + my $symb=&make_symb($_); + $r->print(''); } @possibilities; - $r->print('
TitlePart of ...
'.$bighash{'title_'.$_}. - ''.$bighash{'type_'.$_}. - ''.$mapurl. - '
'. + &Apache::lonnet::gettitle($symb). + ''. + &Apache::lonnet::gettitle($mapurl).' '. + '
'); + $r->print(''); untie(%bighash); return OK; }