Diff for /rat/lonpageflip.pm between versions 1.5 and 1.37

version 1.5, 2000/10/11 18:31:00 version 1.37, 2003/03/08 01:39:29
Line 2 Line 2
 #  #
 # Page flip handler  # Page flip handler
 #  #
   # $Id$
   #
   # 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/
   #
 # (Page Handler  # (Page Handler
 #  #
 # (TeX Content Handler  # (TeX Content Handler
Line 10 Line 34
 # 08/30,08/31,09/06,09/14,09/15,09/16,09/19,09/20,09/21,09/23,  # 08/30,08/31,09/06,09/14,09/15,09/16,09/19,09/20,09/21,09/23,
 # 10/02 Gerd Kortemeyer)  # 10/02 Gerd Kortemeyer)
 #  #
 # 10/03,10/05,10/06,10/07,10/09,10/10,10/11 Gerd Kortemeyer  # 10/03,10/05,10/06,10/07,10/09,10/10,10/11,10/16,10/17,
   # 11/14,11/16,
   # 10/01/01,05/01,05/28,07/05 Gerd Kortemeyer
   
 package Apache::lonpageflip;  package Apache::lonpageflip;
   
Line 24  use GDBM_File; Line 50  use GDBM_File;
       
 my %hash;  my %hash;
   
   sub cleanup {
       if (tied(%hash)){
    &Apache::lonnet::logthis('Cleanup pageflip: hash');
           unless (untie(%hash)) {
       &Apache::lonnet::logthis('Failed cleanup pageflip: hash');
           }
       }
   }
   
 sub addrid {  sub addrid {
     my ($current,$new,$condid)=@_;      my ($current,$new,$condid)=@_;
     unless ($condid) { $condid=0; }      unless ($condid) { $condid=0; }
     if (&Apache::lonnet::allowed('bre',$hash{'src_'.$new})) {  
  if ($current) {   if ($current) {
     $current.=','.$new;      $current.=','.$new;
         } else {          } else {
             $current=''.$new;              $current=''.$new;
         }          }
     }  
     return $current;      return $current;
 }  }
   
 # ================================================================ Main Handler  sub fullmove {
       my ($rid,$mapurl,$direction)=@_;
 sub handler {      if (tie(%hash,'GDBM_File',$ENV{'request.course.fn'}.'.db',
    my $r=shift;                          &GDBM_READER(),0640)) {
    ($rid,$mapurl)=&move($rid,$mapurl,$direction);
 # ------------------------------------------- Set document type for header only          untie(%hash);
       }
       return($rid,$mapurl);
   }
   
   if ($r->header_only) {  sub move {
      $r->content_type('text/html');      my ($rid,$mapurl,$direction)=@_;
      $r->send_http_header;      my $startoutrid=$rid;
      return OK;  
   }  
   
   my %cachehash=();       my $next='';
   my $multichoice=0;  
   my %multichoicehash=();  
   my $redirecturl='';  
   my $next='';  
   my @possibilities=();  
   
   if (($ENV{'form.postdata'})&&($ENV{'request.course.fn'})) {  
       $ENV{'form.postdata'}=~/(\w+)\:(.*)/;  
       my $direction=$1;  
       my $currenturl=$2;  
       $currenturl=~s/^http\:\/\///;  
       $currenturl=~s/^[^\/]+//;  
 # ------------------------------------------- Do we have any idea where we are?  
       my $position;  
       if ($position=Apache::lonnet::symbread($currenturl)) {  
 # ------------------------------------------------------------------------- Yes  
   my ($mapurl,$mapnum,$thisurl)=split(/\_\_\_/,$position);  
           $cachehash{$thisurl}=$mapnum;  
 # ============================================================ Tie the big hash  
           if (tie(%hash,'GDBM_File',$ENV{'request.course.fn'}.'.db',  
                         &GDBM_READER,0640)) {  
               my $rid=$hash{'map_pc_/res/'.$mapurl}.'.'.$mapnum;  
               my $next='';  
               my $mincond=1;                my $mincond=1;
               my $posnext='';                my $posnext='';
               if ($direction eq 'forward') {                if ($direction eq 'forward') {
 # --------------------------------------------------------------------- Forward  # --------------------------------------------------------------------- Forward
                     while ($hash{'type_'.$rid} eq 'finish') {
                $rid=$hash{'ids_'.$hash{'map_id_'.(split(/\./,$rid))[0]}};
                     }
                   map {                    map {
                       my $thiscond=                        my $thiscond=
       &Apache::lonnet::directcondval($hash{'condid_'.$hash{'undercond_'.$_}});        &Apache::lonnet::directcondval($hash{'condid_'.$hash{'undercond_'.$_}});
Line 97  sub handler { Line 114  sub handler {
                                 $hash{'condid_'.$hash{'undercond_'.$linkid}});                                  $hash{'condid_'.$hash{'undercond_'.$linkid}});
                       }                        }
                   } split(/\,/,$posnext);                    } split(/\,/,$posnext);
                     if ($hash{'is_map_'.$next}) {
   # This jumps to the beginning of a new map (going down level)
                         if (
         $hash{'map_type_'.$hash{'map_pc_'.$hash{'src_'.$next}}} eq 'sequence') {
     $mapurl=$hash{'src_'.$next};
     $next=$hash{'map_start_'.$hash{'src_'.$next}};
                        }
                     } elsif 
                       ((split(/\./,$startoutrid))[0]!=(split(/\./,$next))[0]) {
   # This comes up from a map (coming up one level);
         $mapurl=$hash{'map_id_'.(split(/\./,$next))[0]};
                     }
               } elsif ($direction eq 'back') {                } elsif ($direction eq 'back') {
 # ------------------------------------------------------------------- Backwards  # ------------------------------------------------------------------- Backwards
                    while ($hash{'type_'.$rid} eq 'start') {
                $rid=$hash{'ids_'.$hash{'map_id_'.(split(/\./,$rid))[0]}};
    }
                   map {                    map {
                       my $thiscond=                        my $thiscond=
       &Apache::lonnet::directcondval($hash{'condid_'.$hash{'undercond_'.$_}});        &Apache::lonnet::directcondval($hash{'condid_'.$hash{'undercond_'.$_}});
Line 118  sub handler { Line 150  sub handler {
                                 $hash{'condid_'.$hash{'undercond_'.$linkid}});                                  $hash{'condid_'.$hash{'undercond_'.$linkid}});
                       }                        }
                   } split(/\,/,$posnext);                    } split(/\,/,$posnext);
        } elsif ($direction eq 'up') {                    if ($hash{'is_map_'.$next}) {
 # -------------------------------------------------------------------------- Up  # This jumps to the end of a new map (going down one level)
               } elsif ($direction eq 'down') {                        if (
 # ------------------------------------------------------------------------ Down        $hash{'map_type_'.$hash{'map_pc_'.$hash{'src_'.$next}}} eq 'sequence') {
     $mapurl=$hash{'src_'.$next};
     $next=$hash{'map_finish_'.$hash{'src_'.$next}};
                        }
                     } elsif 
                       ((split(/\./,$startoutrid))[0]!=(split(/\./,$next))[0]) {
   # This comes back up from a map (going up one level);
         $mapurl=$hash{'map_id_'.(split(/\./,$next))[0]};
                     }
         }
                 return ($next,$mapurl);
   }
   
   # ================================================================ Main Handler
   
   sub handler {
      my $r=shift;
   
   # ------------------------------------------- Set document type for header only
   
     if ($r->header_only) {
        $r->content_type('text/html');
        $r->send_http_header;
        return OK;
     }
   
     my %cachehash=(); 
     my $multichoice=0;
     my %multichoicehash=();
     my $redirecturl='';
     my $next='';
     my @possibilities=();
      &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['postdata']);
     if (($ENV{'form.postdata'})&&($ENV{'request.course.fn'})) {
         $ENV{'form.postdata'}=~/(\w+)\:(.*)/;
         my $direction=$1;
         my $currenturl=$2;
         if ($direction eq 'return') {
   # -------------------------------------------------------- Return to last known
            my $last;
            if (tie(%hash,'GDBM_File',$ENV{'request.course.fn'}.'_symb.db',
                       &GDBM_READER(),0640)) {
        $last=$hash{'last_known'};
                untie(%hash);
            }
            my $newloc;
            if (($last) && (tie(%hash,'GDBM_File',$ENV{'request.course.fn'}.'.db',
                           &GDBM_READER(),0640))) {
               my ($murl,$fn)=split(/\_\_\_/,$last);
               my $id;
               ($murl,$id,$fn)=split(/\_\_\_/,&Apache::lonnet::symbread($fn));
       $newloc=$hash{'src_'.
                   $hash{'map_pc_'.&Apache::lonnet::clutter($murl)}.'.'.$id};
               unless ($newloc) { $newloc='/adm/noidea.html'; }
               untie %hash;
            } else {
       $newloc='/adm/noidea.html';
            }  
    $r->content_type('text/html');
            $r->header_out(Location => 
    'http://'.$ENV{'HTTP_HOST'}.$newloc);
                                  
            return REDIRECT;
         }
         $currenturl=~s/^http\:\/\///;
         $currenturl=~s/^[^\/]+//;
   #
   # Is the current URL on the map? If not, start with last known URL
   #
         unless (&Apache::lonnet::is_on_map($currenturl)) {
    my $last;
            if (tie(%hash,'GDBM_File',$ENV{'request.course.fn'}.'_symb.db',
                       &GDBM_READER(),0640)) {
        $last=$hash{'last_known'};
                untie(%hash);
            }
            if ($last) {
        $currenturl=&Apache::lonnet::clutter((split(/\_\_\_/,$last))[1]);
    } else {
        $r->content_type('text/html');
                $r->header_out(Location => 
                                  'http://'.$ENV{'HTTP_HOST'}.'/adm/noidea.html');
                return REDIRECT;
            }
         }
   # ------------------------------------------- Do we have any idea where we are?
         my $position;
         if ($position=Apache::lonnet::symbread($currenturl)) {
   # ------------------------------------------------------------------------- Yes
     my ($startoutmap,$mapnum,$thisurl)=split(/\_\_\_/,$position);
             $cachehash{$startoutmap}{$thisurl}=$mapnum;
             $cachehash{$startoutmap}{'last_known'}=
                                          &Apache::lonnet::declutter($currenturl);
   
   # ============================================================ Tie the big hash
             if (tie(%hash,'GDBM_File',$ENV{'request.course.fn'}.'.db',
                           &GDBM_READER(),0640)) {
                 my $rid=$hash{'map_pc_'.&Apache::lonnet::clutter($startoutmap)}.
                         '.'.$mapnum;
   
   # ------------------------------------------------- Move forward, backward, etc
                 my $endupmap;
                 ($next,$endupmap)=&move($rid,$startoutmap,$direction);
   # -------------------------------------- Do we have one and only one empty URL?
                 my $safecount=0;
                 while (($next) && ($next!~/\,/) && 
                        ((!$hash{'src_'.$next}) || ($hash{'randomout_'.$next}))
                        && ($safecount<10000)) {
                     ($next,$endupmap)=&move($next,$endupmap,$direction);
                     $safecount++;
               }                }
   # We are now at at least one non-empty URL
 # ----------------------------------------------------- Check out possibilities  # ----------------------------------------------------- Check out possibilities
               if ($next) {                if ($next) {
                   @possibilities=split(/\,/,$next);                    @possibilities=split(/\,/,$next);
                   if ($#possibilities==0) {                    if ($#possibilities==0) {
 # ---------------------------------------------- Only one possibility, redirect  # ---------------------------------------------- Only one possibility, redirect
               $redirecturl=$hash{'src_'.$next};                $redirecturl=$hash{'src_'.$next};
                       $cachehash{&Apache::lonnet::declutter($redirecturl)}                        $cachehash{$endupmap}
                                   {&Apache::lonnet::declutter($redirecturl)}
                                  =(split(/\./,$next))[1];                                   =(split(/\./,$next))[1];
                   } else {                    } else {
 # ------------------------ There are multiple possibilities for a next resource  # ------------------------ There are multiple possibilities for a next resource
Line 137  sub handler { Line 280  sub handler {
                       map {                        map {
   $multichoicehash{'src_'.$_}=$hash{'src_'.$_};    $multichoicehash{'src_'.$_}=$hash{'src_'.$_};
                           $multichoicehash{'title_'.$_}=$hash{'title_'.$_};                            $multichoicehash{'title_'.$_}=$hash{'title_'.$_};
                             $multichoicehash{'type_'.$_}=$hash{'type_'.$_};
                             (my $first, my $second) = $_ =~ /(\d+).(\d+)/;
                             my $symbSrc = Apache::lonnet::declutter($hash{'src_'.$_});
                             $multichoicehash{'symb_'.$_} = 
                                 Apache::lonnet::declutter($hash{'map_id_'.$first}.'___'.
                                                           $second.'___'.$symbSrc);
                                                            
                             my ($choicemap,$choiceres)=split(/\./,$_);
                           $cachehash                            $cachehash
                             {&Apache::lonnet::declutter(   {&Apache::lonnet::declutter($hash{'src_'.$choicemap})}
                            {&Apache::lonnet::declutter(
       $multichoicehash        $multichoicehash
                                                          {'src_'.$_}                                                           {'src_'.$_}
                                                        )}                                                         )}
                                  =(split(/\./,$_))[1];                                   =$choiceres;
                       } @possibilities;                        } @possibilities;
                   }                    }
       } else {        } else {
Line 152  sub handler { Line 304  sub handler {
 # ----------------- The program must come past this point to untie the big hash  # ----------------- The program must come past this point to untie the big hash
       untie(%hash);        untie(%hash);
 # --------------------------------------------------------- Store position info  # --------------------------------------------------------- Store position info
               $cachehash{'last_direction'}=$direction;                $cachehash{$startoutmap}{'last_direction'}=$direction;
               &Apache::lonnet::symblist($mapurl,%cachehash);                foreach my $thismap (keys %cachehash) {
                    &Apache::lonnet::symblist($thismap,%{$cachehash{$thismap}});
         }
 # ============================================== Do not return before this line  # ============================================== Do not return before this line
               if ($redirecturl) {                if ($redirecturl) {
 # ----------------------------------------------------- There is a URL to go to  # ----------------------------------------------------- There is a URL to go to
   # ------------------------------------------------- Check for critical messages
     if ((time-$ENV{'user.criticalcheck.time'})>300) {
                        my @what=&Apache::lonnet::dump
                                     ('critical',$ENV{'user.domain'},
                                                 $ENV{'user.name'});
                        if ($what[0]) {
                   if (($what[0] ne 'con_lost') && 
                               ($what[0]!~/^error\:/)) {
                      $redirecturl='/adm/email?critical=display';
                           }
                        }
                        &Apache::lonnet::appenv('user.criticalcheck.time'=>time);
     }
   
   $r->content_type('text/html');    $r->content_type('text/html');
                   $r->header_out(Location =>                     $r->header_out(Location => 
                                 'http://'.$ENV{'HTTP_HOST'}.$redirecturl);                                  'http://'.$ENV{'HTTP_HOST'}.$redirecturl);
                   return REDIRECT;                    return REDIRECT;
       } else {        } else {
 # --------------------------------------------------------- There was a problem  # --------------------------------------------------------- There was a problem
               }                    $r->content_type('text/html');
                     $r->send_http_header;
                     if ($#possibilities>0) {
         my $bodytag=
                                &Apache::loncommon::bodytag('Multiple Resources');
                        $r->print(<<ENDSTART);
   <head><title>Choose Next Location</title></head>
   $bodytag
   <h3>There are several possibilities of where to go next</h3>
   <p>
   Please click on the the resource you intend to access:
   <p>
   <table border=2>
   <tr><th>Title</th><th>Type</th></tr>
   ENDSTART
                        foreach (@possibilities) {
                           $r->print(
                                 '<tr><td><a href="'.
                                 $multichoicehash{'src_'.$_}.'?symb=' .
                                     Apache::lonnet::escape($multichoicehash{'symb_'.$_}).'">'.
                                 $multichoicehash{'title_'.$_}.
                                 '</a></td><td>'.$multichoicehash{'type_'.$_}.
         '</td></tr>');
                        }
                        $r->print('</table></body></html>');
        return OK;
                     } else {
         my $bodytag=&Apache::loncommon::bodytag('No Resource');
                        $r->print(<<ENDNONE);
   <head><title>No Resource</title></head>
   $bodytag
   <h3>Next resource could not be identified.</h3>
   <p>You probably are at the <b>beginning</b> or the <b>end</b> of the 
   course.</p>
   <ul>
   <li><a href="/adm/flip?postdata=return:">Go Back</a></li>
   <li><a href="/adm/navmaps">Navigate Course Content</a></li>
   </ul>
   </body>
   </html>
   ENDNONE
                        return OK;
            }
        }
   } else {    } else {
 # ------------------------------------------------- Problem, could not tie hash  # ------------------------------------------------- Problem, could not tie hash
               $ENV{'user.error.msg'}="/adm/flip:bre:0:1:Course Data Missing";                $ENV{'user.error.msg'}="/adm/flip:bre:0:1:Course Data Missing";
Line 171  sub handler { Line 382  sub handler {
           }            }
       } else {        } else {
 # ---------------------------------------- No, could not determine where we are  # ---------------------------------------- No, could not determine where we are
            $r->internal_redirect('/adm/ambiguous');
       }        }
   } else {    } else {
 # -------------------------- Class was not initialized or page fliped strangely  # -------------------------- Class was not initialized or page fliped strangely

Removed from v.1.5  
changed lines
  Added in v.1.37


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