--- rat/lonambiguous.pm 2000/10/12 02:14:01 1.1
+++ rat/lonambiguous.pm 2008/11/11 16:06:46 1.22
@@ -1,11 +1,66 @@
# The LearningOnline Network with CAPA
# Handler to resolve ambiguous file locations
#
-# (TeX Content Handler
+# $Id: lonambiguous.pm,v 1.22 2008/11/11 16:06:46 jms Exp $
#
-# 05/29/00,05/30,10/11 Gerd Kortemeyer)
+# Copyright Michigan State University Board of Trustees
#
-# 10/11 Gerd Kortemeyer
+# 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/
+#
+
+
+=head1 NAME
+
+Apache::lonambiguous
+
+=head1 SYNOPSIS
+
+Handler to resolve ambiguous file locations.
+
+This is part of the LearningOnline Network with CAPA project
+described at http://www.lon-capa.org.
+
+=head1 HANDLER SUBROUTINE
+
+make_symb()
+
+and
+
+handler()
+
+=head1 OTHER SUBROUTINES
+
+=over
+
+=item *
+
+cleanup()
+
+=item *
+
+getlost()
+
+=back
+
+=cut
package Apache::lonambiguous;
@@ -13,34 +68,85 @@ 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');
+ }
+ }
+ return OK;
+}
# ----------------------------------------------------------- Could not resolve
sub getlost {
- my $r=shift;
- $r->content_type('text/html');
+ my ($r,$errmsg)=@_;
+ $errmsg=&mt($errmsg);
+ &Apache::loncommon::content_type($r,'text/html');
$r->send_http_header;
- $r->print('
Unknown Error'.
- 'LON-CAPA
Could not handle ambiguous file reference.');
+ $r->print(&Apache::loncommon::start_page('Could not handle ambiguous resource reference').
+ $errmsg.
+ &Apache::loncommon::end_page());
}
# ================================================================ 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?
+
+ 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 => [$resurl,$resid]);
+ untie(%bighash);
+ $r->header_out(Location =>
+ &Apache::lonnet::absolute_url().$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);
+ unless (($thisfn=$env{'request.ambiguous'})&&($env{'request.course.fn'})) {
+ &getlost($r,'Could not find information on resource.');
return OK;
}
@@ -48,58 +154,100 @@ sub handler {
$thisfn=&Apache::lonnet::declutter($thisfn);
my %hash;
- my %bighash;
my $syval='';
- if (tie(%hash,'GDBM_File',$ENV{'request.course.fn'}.'_symb.db',
- &GDBM_READER,0640)) {
+ 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=~/\_$/) {
+ my ($page,undef,$res)=&Apache::lonnet::decode_symb($syval);
+ if ($res eq 'page') {
# ----------------------------------- Okay, this should have appeared on a page
- $syval=~s/\_\_\_$//;
- $r->content_type('text/html');
+ &Apache::loncommon::content_type($r,'text/html');
$r->header_out(Location =>
- 'http://'.$ENV{'HTTP_HOST'}.'/res/'.$syval);
+ &Apache::lonnet::absolute_url().
+ &Apache::lonnet::clutter($page));
return REDIRECT;
} else {
# There is not really a problem (???), but cannot go back without endless loop
- getlost($r);
+ &getlost($r,'The nature of the problem is unclear');
return OK;
}
}
-
+# ------------------------------------Encrypted requests go straight to navmaps
+ if ($env{'request.enc'}) {
+ &Apache::loncommon::content_type($r,'text/html');
+ $r->header_out(Location =>
+ &Apache::lonnet::absolute_url().'/adm/navmaps');
+ return REDIRECT;
+ }
# ------------------------------------------------ Would be standalone resource
- if (tie(%bighash,'GDBM_File',$ENV{'request.course.fn'}.'.db',
- &GDBM_READER,0640)) {
+ 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};
+ my $ids=$bighash{'ids_'.&Apache::lonnet::clutter($thisfn)};
if ($ids) {
# ------------------------------------------------------------------- Has ID(s)
my @possibilities=split(/\,/,$ids);
my $couldbe='';
- map {
- if (&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);
+ &Apache::loncommon::content_type($r,'text/html');
+ $r->header_out(Location =>
+ &Apache::lonnet::absolute_url().
+ $resurl.'?symb='.$symb);
+ return REDIRECT;
+ }
if ($#possibilities>0) {
# ----------------------------------------------- Okay, really multiple choices
- $r->content_type('text/html');
+ &Apache::loncommon::content_type($r,'text/html');
$r->send_http_header;
- $r->print(
- 'Choose Location'.
- 'LON-CAPA
Cool.');
+ my $start_page=
+ &Apache::loncommon::start_page('Pick Instance of Resource');
+ $r->print(<
+Please click on the instance of the resource you intended to access:
+
+
+Title | Part of ... |
+ENDSTART
+ map {
+ my $resurl=$bighash{'src_'.$_};
+ my $mapurl=$bighash{'map_id_'.(split(/\./,$_))[0]};
+ my $symb=&make_symb($_);
+ $r->print(''.
+ &Apache::lonnet::gettitle($symb).
+ ' | '.
+ &Apache::lonnet::gettitle($mapurl).' '.
+ ' |
');
+ } @possibilities;
+ $r->print('
'.&Apache::loncommon::end_page());
untie(%bighash);
return OK;
}
@@ -109,7 +257,7 @@ sub handler {
}
# ------------------------------------ This handler should not have been called
- getlost($r);
+ &getlost($r,'Invalid call of handler');
return OK;
}