# The LearningOnline Network with CAPA
# Handler to resolve ambiguous file locations
#
# $Id: lonambiguous.pm,v 1.4 2001/11/29 19:23:48 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(
'<head><title>Unknown Error</title></head><body bgcolor="#FFFFFF"><h1>'.
'LON-CAPA</h1>Could not handle ambiguous resource reference.<p>'.$errmsg.
'</body></html>');
}
# ================================================================ 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_/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(<<ENDSTART);
<head><title>Choose Location</title></head>
<body bgcolor="#FFFFFF">
<h1>LON-CAPA</h1>
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.
<p>
Please click on the instance of the resource you intended to access:
<p>
<form action="/adm/ambiguous" method=post>
<input type=hidden name=orgurl value="$thisfn">
<input type=hidden name=selecturl value=1>
<table border=2>
<tr><th> </th><th>Title</th><th>Type</th><th>Part of ...</th></tr>
ENDSTART
map {
my $mapurl=$bighash{'map_id_'.(split(/\./,$_))[0]};
$r->print('<tr><td><input type=submit value=Select name="'.
$_.'"></td><td>'.$bighash{'title_'.$_}.
'</td><td>'.$bighash{'type_'.$_}.
'</td><td><a href="'.$mapurl.'">'.$mapurl.
'</a></td></tr>');
} @possibilities;
$r->print('</table></form></body></html>');
untie(%bighash);
return OK;
}
}
}
untie(%bighash);
}
# ------------------------------------ This handler should not have been called
&getlost($r,'Invalid call of handler');
return OK;
}
1;
__END__
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>