Diff for /rat/lonuserstate.pm between versions 1.139 and 1.147

version 1.139, 2011/08/04 10:57:26 version 1.147, 2013/08/16 01:41:05
Line 59  my $retfurl; # first URL Line 59  my $retfurl; # first URL
 my %randompick; # randomly picked resources  my %randompick; # randomly picked resources
 my %randompickseed; # optional seed for randomly picking resources  my %randompickseed; # optional seed for randomly picking resources
 my %randomorder; # maps to order contents randomly  my %randomorder; # maps to order contents randomly
   my %randomizationcode; # code used to grade folder for bubblesheet exam 
 my %encurl; # URLs in this folder are supposed to be encrypted  my %encurl; # URLs in this folder are supposed to be encrypted
 my %hiddenurl; # this URL (or complete folder) is supposed to be hidden  my %hiddenurl; # this URL (or complete folder) is supposed to be hidden
   
Line 131  sub processversionfile { Line 132  sub processversionfile {
   
 # --------------------------------------------------------- Loads from disk  # --------------------------------------------------------- Loads from disk
   
   
   #
   #  Loads a map file.
   #  Note that this may implicitly recurse via parse_resource if one of the resources
   #  is itself composed.
   #
   # Parameters:
   #    uri         - URI of the map file.
   #    parent_rid  - Resource id in the map of the parent resource (0.0 for the top level map)
   #    courseid    - Course id for the course for which the map is being loaded
   #
 sub loadmap {   sub loadmap { 
     my ($uri,$parent_rid)=@_;      my ($uri,$parent_rid,$courseid)=@_;
   
     # Is the map already included?      # Is the map already included?
   
Line 172  sub loadmap { Line 184  sub loadmap {
     # We can only nest sequences or pages.  Anything else is an illegal nest.      # We can only nest sequences or pages.  Anything else is an illegal nest.
   
     unless (($fn=~/\.sequence$/) || $ispage) {       unless (($fn=~/\.sequence$/) || $ispage) { 
  $errtext.=&mt("<br />Invalid map: <tt>[_1]</tt>",$fn);   $errtext.='<br />'.&mt('Invalid map: [_1]',"<tt>$fn</tt>");
  return;    return; 
     }      }
   
Line 181  sub loadmap { Line 193  sub loadmap {
     my $instr=&Apache::lonnet::getfile($fn);      my $instr=&Apache::lonnet::getfile($fn);
   
     if ($instr eq -1) {      if ($instr eq -1) {
         $errtext.=&mt('<br />Map not loaded: The file <tt>[_1]</tt> does not exist.',$fn);          $errtext.= '<br />'
                     .&mt('Map not loaded: The file [_1] does not exist.',
                          "<tt>$fn</tt>");
  return;   return;
     }      }
   
Line 225  sub loadmap { Line 239  sub loadmap {
     # This is handled in the next chunk of code.      # This is handled in the next chunk of code.
   
     my @map_ids;      my @map_ids;
       my $codechecked;
     while (my $token = $parser->get_token) {      while (my $token = $parser->get_token) {
  next if ($token->[0] ne 'S');   next if ($token->[0] ne 'S');
   
  # Resource   # Resource
   
  if ($token->[1] eq 'resource') {   if ($token->[1] eq 'resource') {
     my $resource_id = &parse_resource($token,$lpc,$ispage,$uri);      my $resource_id = &parse_resource($token,$lpc,$ispage,$uri,$courseid);
     if (defined $resource_id) {      if (defined $resource_id) {
  push(@map_ids, $resource_id);    push(@map_ids, $resource_id);
                   unless ($codechecked) {
                       my $startsymb =
                          &Apache::lonnet::encode_symb($hash{'map_id_'.$lpc},$resource_id,
                                                       $hash{'src_'."$lpc.$resource_id"});
                       my $code = 
                           &Apache::lonnet::EXT('resource.0.examcode',$startsymb,undef,undef,
                                                undef,undef,$courseid);
                       if ($code) {
                           $randomizationcode{$parent_rid} = $code;
                       }
                       $codechecked = 1; 
                   }
     }      }
   
        # Link         # Link
Line 249  sub loadmap { Line 276  sub loadmap {
     &parse_condition($token,$lpc);      &parse_condition($token,$lpc);
  }   }
     }      }
       undef($codechecked);
   
   
     # Handle randomization and random selection      # Handle randomization and random selection
Line 278  sub loadmap { Line 306  sub loadmap {
     # TODO: Here for sure we need to pass along the username/domain      # TODO: Here for sure we need to pass along the username/domain
     # so that we can impersonate users in lonprintout e.g.      # so that we can impersonate users in lonprintout e.g.
   
               my $setcode;
               if (defined($randomizationcode{$parent_rid})) {
                   if ($env{'form.CODE'} eq '') {
                       $env{'form.CODE'} = $randomizationcode{$parent_rid};
                       $setcode = 1;
                   }
               }
   
     my $rndseed=&Apache::lonnet::rndseed($seed);      my $rndseed=&Apache::lonnet::rndseed($seed);
     &Apache::lonnet::setup_random_from_rndseed($rndseed);      &Apache::lonnet::setup_random_from_rndseed($rndseed);
     @map_ids=&math::Random::random_permutation(@map_ids); # randomorder.  
               if ($setcode) {
                   undef($env{'form.CODE'});
                   undef($setcode);
               }
   
       # Take the set of map ids we have decoded and permute them to a
       # random order based on the seed set above. All of this is
       # processing the randomorder parameter if it is set, not
       # randompick.
   
       @map_ids=&Math::Random::random_permutation(@map_ids); 
  }   }
   
   
Line 289  sub loadmap { Line 336  sub loadmap {
  $hash{'map_start_'.$uri} = $from_rid;   $hash{'map_start_'.$uri} = $from_rid;
  $hash{'type_'.$from_rid}='start';   $hash{'type_'.$from_rid}='start';
   
  # Create links to reflect this random ordering.   # Create links to reflect the random re-ordering done above.
  # BUG?  If there are conditions, this invalidates them?  Then again   # In the code to process the map XML, we did not process links or conditions
  # with randompick there's no gaurentee the resources required for the   # if randomorder was set.  This means that for an instructor to choose
  # conditinos to work will be selected into the map.  
  # so randompick is inconsistent with a map that has conditions?  
   
  while (my $to = shift(@map_ids)) {   while (my $to = shift(@map_ids)) {
     &make_link(++$linkpc,$lpc,$to,$from);      &make_link(++$linkpc,$lpc,$to,$from);
Line 310  sub loadmap { Line 355  sub loadmap {
     $parser = HTML::TokeParser->new(\$instr);      $parser = HTML::TokeParser->new(\$instr);
     $parser->attr_encoded(1);      $parser->attr_encoded(1);
   
     # last parse out the mapalias params so as to ignore anything      # last parse out the mapalias params.  Thes provide mnemonic
     # refering to non-existant resources      # tags to resources that can be used in conditions
   
     while (my $token = $parser->get_token) {      while (my $token = $parser->get_token) {
  next if ($token->[0] ne 'S');   next if ($token->[0] ne 'S');
Line 337  sub loadmap { Line 382  sub loadmap {
 #    $lpc     - Map nesting level (?)  #    $lpc     - Map nesting level (?)
 #    $ispage  - True if this resource is encapsulated in a .page (assembled resourcde).  #    $ispage  - True if this resource is encapsulated in a .page (assembled resourcde).
 #    $uri     - URI of the enclosing resource.  #    $uri     - URI of the enclosing resource.
   #    $courseid - Course id of the course containing the resource being parsed. 
 # Returns:  # Returns:
 #   Value of the id attribute of the tag.  #   Value of the id attribute of the tag.
 #  #
Line 357  sub loadmap { Line 403  sub loadmap {
   
   
 sub parse_resource {  sub parse_resource {
     my ($token,$lpc,$ispage,$uri) = @_;      my ($token,$lpc,$ispage,$uri,$courseid) = @_;
           
     # I refuse to countenance code like this that has       # I refuse to countenance code like this that has 
     # such a dirty side effect (and forcing this sub to be called within a loop).      # such a dirty side effect (and forcing this sub to be called within a loop).
Line 496  sub parse_resource { Line 542  sub parse_resource {
     if (($turi=~/\.sequence$/) ||      if (($turi=~/\.sequence$/) ||
  ($turi=~/\.page$/)) {   ($turi=~/\.page$/)) {
  $hash{'is_map_'.$rid}=1;   $hash{'is_map_'.$rid}=1;
  &loadmap($turi,$rid);   &loadmap($turi,$rid,$courseid);
     }       } 
     return $token->[2]->{'id'};      return $token->[2]->{'id'};
 }  }
Line 721  sub parse_param { Line 767  sub parse_param {
  }   }
     }      }
 }  }
   #
   #  Parse mapalias parameters.
   #  these are tags of the form:
   #  <param to="nn" 
   #         value="some-alias-for-resourceid-nn" 
   #         name="parameter_0_mapalias" 
   #         type="string" />
   #  A map alias is a textual name for a resource:
   #    - The to  attribute identifies the resource (this gets level qualified below)
   #    - The value attributes provides the alias string.
   #    - name must be of the regexp form: /^parameter_(0_)*mapalias$/
   #    - e.g. the string 'parameter_' followed by 0 or more "0_" strings
   #      terminating with the string 'mapalias'.
   #      Examples:
   #         'parameter_mapalias', 'parameter_0_mapalias', parameter_0_0_mapalias'
   #  Invalid to ids are silently ignored.
   #
   #  Parameters:
   #     token - The token array fromthe HMTML::TokeParser
   #     lpc   - The current map level counter.
   #
 sub parse_mapalias_param {  sub parse_mapalias_param {
     my ($token,$lpc) = @_;      my ($token,$lpc) = @_;
   
       # Fully qualify the to value and ignore the alias if there is no
       # corresponding resource.
   
     my $referid=$lpc.'.'.$token->[2]->{'to'};      my $referid=$lpc.'.'.$token->[2]->{'to'};
     return if (!exists($hash{'src_'.$referid}));      return if (!exists($hash{'src_'.$referid}));
   
       # If this is a valid mapalias parameter, 
       # Append the target id to the count_mapalias element for that
       # alias so that we can detect doubly defined aliases
       # e.g.:
       #  <param to="1" value="george" name="parameter_0_mapalias" type="string" />
       #  <param to="2" value="george" name="parameter_0_mapalias" type="string" />
       #
       #  The example above is trivial but the case that's important has to do with
       #  constructing a map that includes a nested map where the nested map may have
       #  aliases that conflict with aliases established in the enclosing map.
       #
       # ...and create/update the hash mapalias entry to actually store the alias.
       #
   
     if ($token->[2]->{'name'}=~/^parameter_(0_)*mapalias$/) {      if ($token->[2]->{'name'}=~/^parameter_(0_)*mapalias$/) {
  &count_mapalias($token->[2]->{'value'},$referid);   &count_mapalias($token->[2]->{'value'},$referid);
  $hash{'mapalias_'.$token->[2]->{'value'}}=$referid;   $hash{'mapalias_'.$token->[2]->{'value'}}=$referid;
Line 735  sub parse_mapalias_param { Line 819  sub parse_mapalias_param {
   
 # --------------------------------------------------------- Simplify expression  # --------------------------------------------------------- Simplify expression
   
   
   #
   #  Someone should really comment this to describe what it does to what and why.
   #
 sub simplify {  sub simplify {
     my $expression=shift;      my $expression=shift;
 # (0&1) = 1  # (0&1) = 1
Line 744  sub simplify { Line 832  sub simplify {
 # 8&8=8  # 8&8=8
     $expression=~s/([^_\.\d])([_\.\d]+)\&\2([^_\.\d])/$1$2$3/g;      $expression=~s/([^_\.\d])([_\.\d]+)\&\2([^_\.\d])/$1$2$3/g;
 # 8|8=8  # 8|8=8
     $expression=~s/([^_\.\d])([_\.\d]+)\|\2([^_\.\d])/$1$2$3/g;      $expression=~s/([^_\.\d])([_\.\d]+)(?:\|\2)+([^_\.\d])/$1$2$3/g;
 # (5&3)&4=5&3&4  # (5&3)&4=5&3&4
     $expression=~s/\(([_\.\d]+)((?:\&[_\.\d]+)+)\)\&([_\.\d]+[^_\.\d])/$1$2\&$3/g;      $expression=~s/\(([_\.\d]+)((?:\&[_\.\d]+)+)\)\&([_\.\d]+[^_\.\d])/$1$2\&$3/g;
 # (((5&3)|(4&6)))=((5&3)|(4&6))  # (((5&3)|(4&6)))=((5&3)|(4&6))
Line 758  sub simplify { Line 846  sub simplify {
   
 # -------------------------------------------------------- Build condition hash  # -------------------------------------------------------- Build condition hash
   
   #
   #  Traces a route recursively through the map after it has been loaded
   #  (I believe this really visits each resourcde that is reachable fromt he
   #  start top node.
   #
   #  - Marks hidden resources as hidden.
   #  - Marks which resource URL's must be encrypted.
   #  - Figures out (if necessary) the first resource in the map.
   #  - Further builds the chunks of the big hash that define how 
   #    conditions work
   #
   #  Note that the tracing strategy won't visit resources that are not linked to
   #  anything or islands in the map (groups of resources that form a path but are not
   #  linked in to the path that can be traced from the start resource...but that's ok
   #  because by definition, those resources are not reachable by users of the course.
   #
   # Parameters:
   #   sofar    - _URI of the prior entry or 0 if this is the top.
   #   rid      - URI of the resource to visit.
   #   beenhere - list of resources (each resource enclosed by &'s) that have
   #              already been visited.
   #   encflag  - If true the resource that resulted in a recursive call to us
   #              has an encoded URL (which means contained resources should too). 
   #   hdnflag  - If true,the resource that resulted in a recursive call to us
   #              was hidden (which means contained resources should be hidden too).
   # Returns
   #    new value indicating how far the map has been traversed (the sofar).
   #
 sub traceroute {  sub traceroute {
     my ($sofar,$rid,$beenhere,$encflag,$hdnflag)=@_;      my ($sofar,$rid,$beenhere,$encflag,$hdnflag)=@_;
     my $newsofar=$sofar=simplify($sofar);      my $newsofar=$sofar=simplify($sofar);
   
     unless ($beenhere=~/\&\Q$rid\E\&/) {      unless ($beenhere=~/\&\Q$rid\E\&/) {
  $beenhere.=$rid.'&';     $beenhere.=$rid.'&';  
  my ($mapid,$resid)=split(/\./,$rid);   my ($mapid,$resid)=split(/\./,$rid);
Line 776  sub traceroute { Line 893  sub traceroute {
   
  my $encrypt=&Apache::lonnet::EXT('resource.0.encrypturl',$symb);   my $encrypt=&Apache::lonnet::EXT('resource.0.encrypturl',$symb);
  if ($encflag || lc($encrypt) eq 'yes') { $encurl{$rid}=1; }   if ($encflag || lc($encrypt) eq 'yes') { $encurl{$rid}=1; }
   
  if (($retfrid eq '') && ($hash{'src_'.$rid})   if (($retfrid eq '') && ($hash{'src_'.$rid})
     && ($hash{'src_'.$rid}!~/\.sequence$/)) {      && ($hash{'src_'.$rid}!~/\.sequence$/)) {
     $retfrid=$rid;      $retfrid=$rid;
  }   }
   
  if (defined($hash{'conditions_'.$rid})) {   if (defined($hash{'conditions_'.$rid})) {
     $hash{'conditions_'.$rid}=simplify(      $hash{'conditions_'.$rid}=simplify(
            '('.$hash{'conditions_'.$rid}.')|('.$sofar.')');             '('.$hash{'conditions_'.$rid}.')|('.$sofar.')');
Line 789  sub traceroute { Line 908  sub traceroute {
   
  # if the expression is just the 0th condition keep it   # if the expression is just the 0th condition keep it
  # otherwise leave a pointer to this condition expression   # otherwise leave a pointer to this condition expression
   
  $newsofar = ($sofar eq '0') ? $sofar : '_'.$rid;   $newsofar = ($sofar eq '0') ? $sofar : '_'.$rid;
   
    # Recurse if the resource is a map:
   
  if (defined($hash{'is_map_'.$rid})) {   if (defined($hash{'is_map_'.$rid})) {
     if (defined($hash{'map_start_'.$hash{'src_'.$rid}})) {      if (defined($hash{'map_start_'.$hash{'src_'.$rid}})) {
  $sofar=$newsofar=   $sofar=$newsofar=
Line 801  sub traceroute { Line 923  sub traceroute {
  $hdnflag || $hiddenurl{$rid});   $hdnflag || $hiddenurl{$rid});
     }      }
  }   }
   
    # Processes  links to this resource:
    #  - verify the existence of any conditionals on the link to here.
    #  - Recurse to any resources linked to us.
    #
  if (defined($hash{'to_'.$rid})) {   if (defined($hash{'to_'.$rid})) {
     foreach my $id (split(/\,/,$hash{'to_'.$rid})) {      foreach my $id (split(/\,/,$hash{'to_'.$rid})) {
  my $further=$sofar;   my $further=$sofar;
    #
    # If there's a condition associated with this link be sure
    # it's been defined else that's an error:
    #
                 if ($hash{'undercond_'.$id}) {                  if ($hash{'undercond_'.$id}) {
     if (defined($hash{'condid_'.$hash{'undercond_'.$id}})) {      if (defined($hash{'condid_'.$hash{'undercond_'.$id}})) {
  $further=simplify('('.'_'.$rid.')&('.   $further=simplify('('.'_'.$rid.')&('.
   $hash{'condid_'.$hash{'undercond_'.$id}}.')');    $hash{'condid_'.$hash{'undercond_'.$id}}.')');
     } else {      } else {
  $errtext.=&mt('<br />Undefined condition ID: [_1]',$hash{'undercond_'.$id});   $errtext.= '<br />'.
                                      &mt('Undefined condition ID: [_1]',
                                          $hash{'undercond_'.$id});
     }      }
                 }                  }
    #  Recurse to resoruces that have to's to us.
                 $newsofar=&traceroute($further,$hash{'goesto_'.$id},$beenhere,                  $newsofar=&traceroute($further,$hash{'goesto_'.$id},$beenhere,
       $encflag,$hdnflag);        $encflag,$hdnflag);
     }      }
Line 822  sub traceroute { Line 956  sub traceroute {
   
 # ------------------------------ Cascading conditions, quick access, parameters  # ------------------------------ Cascading conditions, quick access, parameters
   
   #
   #  Seems a rather strangely named sub given what the comment above says it does.
   
   
 sub accinit {  sub accinit {
     my ($uri,$short,$fn)=@_;      my ($uri,$short,$fn)=@_;
     my %acchash=();      my %acchash=();
     my %captured=();      my %captured=();
     my $condcounter=0;      my $condcounter=0;
     $acchash{'acc.cond.'.$short.'.0'}=0;      $acchash{'acc.cond.'.$short.'.0'}=0;
   
       # This loop is only interested in conditions and 
       # parameters in the big hash:
   
     foreach my $key (keys(%hash)) {      foreach my $key (keys(%hash)) {
   
    # conditions:
   
  if ($key=~/^conditions/) {   if ($key=~/^conditions/) {
     my $expr=$hash{$key};      my $expr=$hash{$key};
   
     # try to find and factor out common sub-expressions      # try to find and factor out common sub-expressions
       # Any subexpression that is found is simplified, removed from
       # the original condition expression and the simplified sub-expression
       # substituted back in to the epxression..I'm not actually convinced this
       # factors anything out...but instead maybe simplifies common factors(?)
   
     foreach my $sub ($expr=~m/(\(\([_\.\d]+(?:\&[_\.\d]+)+\)(?:\|\([_\.\d]+(?:\&[_\.\d]+)+\))+\))/g) {      foreach my $sub ($expr=~m/(\(\([_\.\d]+(?:\&[_\.\d]+)+\)(?:\|\([_\.\d]+(?:\&[_\.\d]+)+\))+\))/g) {
  my $orig=$sub;   my $orig=$sub;
   
Line 845  sub accinit { Line 996  sub accinit {
  $expr=~s/\Q$orig\E/$sub/;   $expr=~s/\Q$orig\E/$sub/;
     }      }
     $hash{$key}=$expr;      $hash{$key}=$expr;
   
              # If not yet seen, record in acchash and that we've seen it.
   
     unless (defined($captured{$expr})) {      unless (defined($captured{$expr})) {
  $condcounter++;   $condcounter++;
  $captured{$expr}=$condcounter;   $captured{$expr}=$condcounter;
  $acchash{'acc.cond.'.$short.'.'.$condcounter}=$expr;   $acchash{'acc.cond.'.$short.'.'.$condcounter}=$expr;
     }       } 
           # Parameters:
   
  } elsif ($key=~/^param_(\d+)\.(\d+)/) {   } elsif ($key=~/^param_(\d+)\.(\d+)/) {
     my $prefix=&Apache::lonnet::encode_symb($hash{'map_id_'.$1},$2,      my $prefix=&Apache::lonnet::encode_symb($hash{'map_id_'.$1},$2,
     $hash{'src_'.$1.'.'.$2});      $hash{'src_'.$1.'.'.$2});
Line 863  sub accinit { Line 1019  sub accinit {
     }      }
  }   }
     }      }
       # This loop only processes id entries in the big hash.
   
     foreach my $key (keys(%hash)) {      foreach my $key (keys(%hash)) {
  if ($key=~/^ids/) {   if ($key=~/^ids/) {
     foreach my $resid (split(/\,/,$hash{$key})) {      foreach my $resid (split(/\,/,$hash{$key})) {
Line 927  sub hiddenurls { Line 1085  sub hiddenurls {
 # -------------------------------- randomly eliminate the ones that should stay  # -------------------------------- randomly eliminate the ones that should stay
  my (undef,$id)=split(/\./,$rid);   my (undef,$id)=split(/\./,$rid);
         if ($randompickseed{$rid}) { $id=$randompickseed{$rid}; }          if ($randompickseed{$rid}) { $id=$randompickseed{$rid}; }
           my $setcode;
           if (defined($randomizationcode{$rid})) {
               if ($env{'form.CODE'} eq '') {
                   $env{'form.CODE'} = $randomizationcode{$rid};
                   $setcode = 1;
               }
           }
  my $rndseed=&Apache::lonnet::rndseed($id); # use id instead of symb   my $rndseed=&Apache::lonnet::rndseed($id); # use id instead of symb
           if ($setcode) {
               undef($env{'form.CODE'});
               undef($setcode);
           }
  &Apache::lonnet::setup_random_from_rndseed($rndseed);   &Apache::lonnet::setup_random_from_rndseed($rndseed);
  my @whichids=&Math::Random::random_permuted_index($#currentrids+1);   my @whichids=&Math::Random::random_permuted_index($#currentrids+1);
         for (my $i=1;$i<=$rndpick;$i++) { $currentrids[$whichids[$i]]=''; }          for (my $i=1;$i<=$rndpick;$i++) { $currentrids[$whichids[$i]]=''; }
Line 983  sub readmap { Line 1152  sub readmap {
  #    # 
  # Most likely a permissions problem on the lockfile or its directory.   # Most likely a permissions problem on the lockfile or its directory.
  #   #
         $errtext.='<br />'.&mt('Map not loaded - Lock file could not be opened when reading map:').' <tt>'.$fn.'</tt>.';  
         $retfurl = '';          $retfurl = '';
         return ($retfurl,$errtext);          return ($retfurl,'<br />'.&mt('Map not loaded - Lock file could not be opened when reading map:').' <tt>'.$fn.'</tt>.');
     }      }
     my $lock=0;      my $lock=0;
     my $gotstate=0;      my $gotstate=0;
Line 1001  sub readmap { Line 1169  sub readmap {
     undef %hiddenurl;      undef %hiddenurl;
     undef %encurl;      undef %encurl;
     $retfrid='';      $retfrid='';
       $errtext='';
     my ($untiedhash,$untiedparmhash,$tiedhash,$tiedparmhash); # More state flags.      my ($untiedhash,$untiedparmhash,$tiedhash,$tiedparmhash); # More state flags.
   
     # if we got the lock, regenerate course regnerate empty files and tie them.      # if we got the lock, regenerate course regnerate empty files and tie them.
Line 1095  sub readmap { Line 1264  sub readmap {
     #      #
             &Apache::lonnet::appenv({"request.course.id"  => $short,              &Apache::lonnet::appenv({"request.course.id"  => $short,
                "request.course.fn"  => $fn,                 "request.course.fn"  => $fn,
              "request.course.uri" => $uri});               "request.course.uri" => $uri,
                                                        "request.course.tied" => time});
                               
             $untiedhash = untie(%hash);              $untiedhash = untie(%hash);
             $untiedparmhash = untie(%parmhash);              $untiedparmhash = untie(%parmhash);
                             $gotstate = 1;                              $gotstate = 1;
Line 1140  sub readmap { Line 1311  sub readmap {
         undef %randompick;          undef %randompick;
         undef %hiddenurl;          undef %hiddenurl;
         undef %encurl;          undef %encurl;
           $errtext='';
         $retfrid='';          $retfrid='';
  #   #
  # Once more through the routine of tying and loading and so on.   # Once more through the routine of tying and loading and so on.
Line 1226  sub build_tmp_hashes { Line 1398  sub build_tmp_hashes {
     $pc=0;      $pc=0;
     &clear_mapalias_count();      &clear_mapalias_count();
     &processversionfile(%cenv);      &processversionfile(%cenv);
   
       # URI Of the map file.
   
     my $furi=&Apache::lonnet::clutter($uri);      my $furi=&Apache::lonnet::clutter($uri);
     #      #
     #  the map staring points.      #  the map staring points.
Line 1234  sub build_tmp_hashes { Line 1409  sub build_tmp_hashes {
     $hash{'title_0.0'}=&Apache::lonnet::metadata($uri,'title');      $hash{'title_0.0'}=&Apache::lonnet::metadata($uri,'title');
     $hash{'ids_'.$furi}='0.0';      $hash{'ids_'.$furi}='0.0';
     $hash{'is_map_0.0'}=1;      $hash{'is_map_0.0'}=1;
     &loadmap($uri,'0.0');  
       # Load the map.. note that loadmap may implicitly recurse if the map contains 
       # sub-maps.
   
   
       &loadmap($uri,'0.0',$short);
   
       #  The code below only executes if there is a starting point for the map>
       #  Q/BUG??? If there is no start resource for the map should that be an error?
       #
   
     if (defined($hash{'map_start_'.$uri})) {      if (defined($hash{'map_start_'.$uri})) {
         &Apache::lonnet::appenv({"request.course.id"  => $short,          &Apache::lonnet::appenv({"request.course.id"  => $short,
                                  "request.course.fn"  => $fn,                                   "request.course.fn"  => $fn,
                                  "request.course.uri" => $uri});                                   "request.course.uri" => $uri,
                                    "request.course.tied" => time});
         $env{'request.course.id'}=$short;          $env{'request.course.id'}=$short;
         &traceroute('0',$hash{'map_start_'.$uri},'&');          &traceroute('0',$hash{'map_start_'.$uri},'&');
         &accinit($uri,$short,$fn);          &accinit($uri,$short,$fn);
Line 1289  sub unlink_tmpfiles { Line 1475  sub unlink_tmpfiles {
     my ($fn) = @_;      my ($fn) = @_;
     my $file_dir = dirname($fn);      my $file_dir = dirname($fn);
   
     if ($fn eq LONCAPA::tempdir()) {      if ("$file_dir/" eq LONCAPA::tempdir()) {
         my @files = qw (.db _symb.db .state _parms.db);          my @files = qw (.db _symb.db .state _parms.db);
         foreach my $file (@files) {          foreach my $file (@files) {
             if (-e $fn.$file) {              if (-e $fn.$file) {
Line 1366  sub evalstate { Line 1552  sub evalstate {
      $count++;       $count++;
  }   }
  my ($mapid) = split(/\./,$id);   my ($mapid) = split(/\./,$id);
                          &mt('Resource "[_1]" <br /> in Map "[_2]"',                           &mt('Resource [_1][_2]in Map [_3]',
      $hash{'title_'.$id},       $hash{'title_'.$id},'<br />',
      $hash{'title_'.$hash{'ids_'.$hash{'map_id_'.$mapid}}});       $hash{'title_'.$hash{'ids_'.$hash{'map_id_'.$mapid}}});
      } (@{ $mapalias_cache{$mapalias} }));       } (@{ $mapalias_cache{$mapalias} }));
     next if ($count < 2);      next if ($count < 2);

Removed from v.1.139  
changed lines
  Added in v.1.147


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