# The LearningOnline Network with CAPA # # Sequence Handler # # (Handler to resolve ambiguous file locations # # (TeX Content Handler # # 05/29/00,05/30,10/11 Gerd Kortemeyer) # # 10/11,10/12 Gerd Kortemeyer) # # 10/16 Gerd Kortemeyer package Apache::lonambiguous; use strict; use Apache::lonnet; use Apache::Constants qw(:common REDIRECT); use GDBM_File; # ----------------------------------------------------------- Could not resolve sub getlost { my ($r,$errmsg)=@_; $r->content_type('text/html'); $r->send_http_header; $r->print( 'Unknown Error

'. 'LON-CAPA

Could not handle ambiguous resource reference.

'.$errmsg. ''); } # ================================================================ Main Handler sub handler { my $r=shift; if ($r->header_only) { $r->content_type('text/html'); $r->send_http_header; return OK; } my %hash; my %bighash; my $requrl=$r->uri; # ----------------------------------------------------------------- Tie db file if ($ENV{'request.course.fn'}) { my $last; if (tie(%hash,'GDBM_File',$ENV{'request.course.fn'}.'_symb.db', &GDBM_READER,0640)) { $last=$hash{'last_direction'}; untie(%hash); } if (tie(%bighash,'GDBM_File',$ENV{'request.course.fn'}.'.db', &GDBM_READER,0640)) { my $direction=''; my $prevmap=''; if ($last) { ($prevmap,$direction)=(split(/\_\_\_/,$last)); } # ===== Stuff goes here foreach $envkey (keys %ENV) { if ($envkey=~/^form\.(\d+)\.(\d+)$/) { my $mapid=$1; my $resid=$2; my $resurl=$bighash{'src_'.$mapid.'.'.$resid}; &Apache::lonnet::symblist($bighash{'map_id_'.$mapid}, $resurl => $resid); $r->header_out(Location => 'http://'.$ENV{'HTTP_HOST'}.$resurl); return REDIRECT; } } untie(%bighash); } else { &getlost($r,'Could not access course structure.'); return OK; } } else { $ENV{'user.error.msg'}="$requrl:bre:0:0:Course not initialized"; return HTTP_NOT_ACCEPTABLE; } return OK; # ================================================================= TRASH BELOW # ---------------------------------------------------------- Do we have a case? my $thisfn; unless (($thisfn=$ENV{'request.ambiguous'})&&($ENV{'request.course.fn'})) { &getlost($r,'Could not find information on resource.'); return OK; } # ---------------------------------- Should this file have been part of a page? $thisfn=&Apache::lonnet::declutter($thisfn); my %hash; my $syval=''; if (tie(%hash,'GDBM_File',$ENV{'request.course.fn'}.'_symb.db', &GDBM_READER,0640)) { $syval=$hash{$thisfn}; untie(%hash); } # ---------------------------------------------------------- There was an entry if ($syval) { if ($syval=~/\_$/) { # ----------------------------------- Okay, this should have appeared on a page $syval=~s/\_\_\_$//; $r->content_type('text/html'); $r->header_out(Location => 'http://'.$ENV{'HTTP_HOST'}.'/res/'.$syval); return REDIRECT; } else { # There is not really a problem (???), but cannot go back without endless loop &getlost($r,'The nature of the problem is unclear'); return OK; } } # ------------------------------------------------ Would be standalone resource if (tie(%bighash,'GDBM_File',$ENV{'request.course.fn'}.'.db', &GDBM_READER,0640)) { # ---------------------------------------------- Get ID(s) for current resource my $ids=$bighash{'ids_/res/'.$thisfn}; if ($ids) { # ------------------------------------------------------------------- Has ID(s) my @possibilities=split(/\,/,$ids); my $couldbe=''; map { if (&Apache::lonnet::allowed('bre',$bighash{'src_'.$_})) { if ($couldbe) { $couldbe.=','.$_; } else { $couldbe=$_; } } } @possibilities; if ($couldbe) { @possibilities=split(/\,/,$couldbe); if ($#possibilities>0) { # ----------------------------------------------- Okay, really multiple choices $r->content_type('text/html'); $r->send_http_header; $r->print(<Choose Location

LON-CAPA

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:

ENDSTART map { my $mapurl=$bighash{'map_id_'.(split(/\./,$_))[0]}; $r->print(''); } @possibilities; $r->print('
 TitleTypePart of ...
'.$bighash{'title_'.$_}. ''.$bighash{'type_'.$_}. ''.$mapurl. '
'); untie(%bighash); return OK; } } } untie(%bighash); } # ------------------------------------ This handler should not have been called &getlost($r,'Invalid call of handler'); return OK; } 1; __END__