File:  [LON-CAPA] / rat / lonsequence.pm
Revision 1.4: download - view: text, annotated - select for diffs
Tue Oct 17 17:06:15 2000 UTC (24 years ago) by www
Branches: MAIN
CVS tags: stable_2001_fall, HEAD
Fixed bug in "last known" resource

# 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::lonsequence;

use strict;
use Apache::lonnet;
use Apache::Constants qw(:common :http 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 sequence 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;
   }

   my %hash;
   my %bighash;
   my $requrl=$r->uri;

# ------------------------------------------------------------ Tie symb 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);
       }
       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)) {
	   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(<<ENDSYMB);
<html><body bgcolor="#FFFFFF">
<h2>$whatend of</h2>
<h1>$sequencetitle</h1>
</body></html>
ENDSYMB
               return OK
           }
       } 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;
}

1;
__END__








FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>