--- rat/lonsequence.pm 2000/10/16 20:47:39 1.1 +++ rat/lonsequence.pm 2001/11/29 19:23:49 1.5 @@ -2,6 +2,30 @@ # # Sequence Handler # +# $Id: lonsequence.pm,v 1.5 2001/11/29 19:23:49 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/ +# # (Handler to resolve ambiguous file locations # # (TeX Content Handler @@ -12,11 +36,11 @@ # # 10/16 Gerd Kortemeyer -package Apache::lonambiguous; +package Apache::lonsequence; use strict; use Apache::lonnet; -use Apache::Constants qw(:common REDIRECT); +use Apache::Constants qw(:common :http REDIRECT); use GDBM_File; @@ -28,7 +52,7 @@ sub getlost { $r->send_http_header; $r->print( 'Unknown Error

'. - 'LON-CAPA

Could not handle ambiguous resource reference.

'.$errmsg. + 'LON-CAPACould not handle sequence resource reference.

'.$errmsg. ''); } @@ -43,25 +67,75 @@ sub handler { return OK; } + my %hash; my %bighash; -# ----------------------------------------------------------------- Tie db file + my $requrl=$r->uri; + +# ------------------------------------------------------------ Tie symb db file if ($ENV{'request.course.fn'}) { - my $envkey; + my $last; + if (tie(%hash,'GDBM_File',$ENV{'request.course.fn'}.'_symb.db', + &GDBM_READER,0640)) { + $last=$hash{'last_direction'}; + untie(%hash); + } + my $direction=''; + my $prevmap=''; + if ($last) { + ($prevmap,$direction)=(split(/\_\_\_/,$last)); + } +# ------------------------------------------------------------- Tie big db file if (tie(%bighash,'GDBM_File',$ENV{'request.course.fn'}.'.db', &GDBM_READER,0640)) { - 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); + my $disid=''; + my $whatend=''; + if ($direction eq 'back') { + $disid=$bighash{'map_finish_'.$requrl}; + $whatend='End'; + } else { + $disid=$bighash{'map_start_'.$requrl}; + $whatend='Beginning'; + } + my $disurl=''; + my $dismapid=''; + if ($disid) { + $disurl=$bighash{'src_'.$disid}; + $dismapid=(split(/\./,$disid))[1]; + } + my $symb=''; + my $sequencetitle=''; + unless($disurl) { + if ($symb=&Apache::lonnet::symbread()) { + my ($mapurl,$mapid)=split(/\_\_\_/,$symb); + $sequencetitle=$bighash{'title_'. + $bighash{'map_pc_/res/'.$mapurl}.'.'. + $mapid}; + } + } +# --------------------------------------- Untie hash, make sure to come by here + untie(%bighash); + if ($disurl) { +# -------------------------------------------------- Has first or last resource + &Apache::lonnet::symblist($requrl,$disurl => $dismapid, + 'last_known' => &Apache::lonnet::declutter($disurl)); + $r->content_type('text/html'); + $r->header_out(Location => 'http://'.$ENV{'HTTP_HOST'}.$disurl); + return REDIRECT; + } else { +# ---------- Does not have first or last resource, try to find out where we are + unless ($symb) { + $r->internal_redirect('/adm/ambiguous'); + } + $r->content_type('text/html'); + $r->send_http_header; + $r->print(< +

$whatend of

+

$sequencetitle

+ +ENDSYMB + return OK + } } else { &getlost($r,'Could not access course structure.'); return OK; @@ -72,108 +146,6 @@ sub handler { } 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;