# The LearningOnline Network with CAPA # Handler to resolve ambiguous file locations # # $Id: lonambiguous.pm,v 1.6 2002/09/14 18:57:59 www Exp $ # # Copyright Michigan State University Board of Trustees # # This file is part of the LearningOnline Network with CAPA (LON-CAPA). # # LON-CAPA is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # LON-CAPA is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with LON-CAPA; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # /home/httpd/html/adm/gpl.txt # # http://www.lon-capa.org/ # # (TeX Content Handler # # 05/29/00,05/30,10/11 Gerd Kortemeyer) # # 10/11,10/12,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; } # ---------------------------------------------------------- Is this selecting? my %bighash; if ($ENV{'form.selecturl'}) { my $envkey; if (tie(%bighash,'GDBM_File',$ENV{'request.course.fn'}.'.db', &GDBM_READER(),0640)) { foreach $envkey (keys %ENV) { if ($envkey=~/^form\.(\d+)\.(\d+)$/) { # ---------------------------------------------------- Update symb and redirect my $mapid=$1; my $resid=$2; my $resurl=$bighash{'src_'.$mapid.'.'.$resid}; &Apache::lonnet::symblist($bighash{'map_id_'.$mapid}, $resurl => $resid); untie(%bighash); $r->header_out(Location => 'http://'.$ENV{'HTTP_HOST'}.$resurl); return REDIRECT; } } untie(%bighash); } else { &getlost($r,'Could not access course structure.'); return OK; } } # ---------------------------------------------------------- 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_'.&clutter($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__