--- loncom/lonnet/perl/lonnet.pm	2000/12/02 12:41:48	1.75
+++ loncom/lonnet/perl/lonnet.pm	2000/12/12 23:43:05	1.79
@@ -45,7 +45,8 @@
 # EXT(name)          : value of a variable
 # symblist(map,hash) : Updates symbolic storage links
 # symbread([filename]) : returns the data handle (filename optional)
-# rndseed()          : returns a random seed  
+# rndseed()          : returns a random seed 
+# receipt()          : returns a receipt to be given out to users 
 # getfile(filename)  : returns the contents of filename, or a -1 if it can't
 #                      be found, replicates and subscribes to the file
 # filelocation(dir,file) : returns a farily clean absolute reference to file 
@@ -80,7 +81,7 @@
 # 10/06,10/09,10/10,10/11,10/14,10/20,10/23,10/25,10/26,10/27,10/28,10/29, 
 # 10/30,10/31,
 # 11/2,11/14,11/15,11/16,11/20,11/21,11/22,11/25,11/27,
-# 12/02 Gerd Kortemeyer
+# 12/02,12/12 Gerd Kortemeyer
 
 package Apache::lonnet;
 
@@ -383,7 +384,7 @@ sub idget {
           $idlist=~tr/A-Z/a-z/; 
 	  my $reply=&reply("idget:$udom:".$idlist,$tryserver);
           my @answer=();
-          if ($reply ne 'con_lost') {
+          if (($reply ne 'con_lost') && ($reply!~/^error\:/)) {
 	      @answer=split(/\&/,$reply);
           }                    ;
           my $i;
@@ -1425,26 +1426,14 @@ sub EXT {
         my $reply=&reply('get:'.
               $ENV{'course.'.$ENV{'request.course.id'}.$section.'.domain'}.':'.
               $ENV{'course.'.$ENV{'request.course.id'}.$section.'.num'}.
-              ':resourcedata:'.
- escape($seclevelr).':'.escape($seclevelm).':'.escape($seclevel).':'.
- escape($courselevelr).':'.escape($courselevelm).':'.escape($courselevel),
+	      ':resourcedata:'.
+   &escape($seclevelr).'&'.&escape($seclevelm).'&'.&escape($seclevel).'&'.
+   &escape($courselevelr).'&'.&escape($courselevelm).'&'.&escape($courselevel),
 		   $ENV{'course.'.$ENV{'request.course.id'}.$section.'.home'});
       if ($reply!~/^error\:/) {
-        map {
-           my ($name,$value)=split(/\=/,$_);
-           $resourcedata{unescape($name)}=unescape($value);  
-        } split(/\&/,$reply);
-
-       if ($resourcedata{$seclevelr}) { return $resourcedata{$seclevelr}; }
-       if ($resourcedata{$seclevelm}) { return $resourcedata{$seclevelm}; }  
-       if ($resourcedata{$seclevel}) { return $resourcedata{$seclevel}; }
-
-       if ($resourcedata{$courselevelr}) { 
-          return $resourcedata{$courselevelr}; }
-       if ($resourcedata{$courselevelm}) { 
-          return $resourcedata{$courselevelm}; }
-       if ($resourcedata{$courselevel}) { return $resourcedata{$courselevel}; }
-
+	  map {
+	      if ($_) { return &unescape($_); }
+          } split(/\&/,$reply);
       }
 
 # ------------------------------------------------------ third, check map parms
@@ -1460,8 +1449,12 @@ sub EXT {
      
 # --------------------------------------------- last, look in resource metadata
 
+      $spacequalifierrest=~s/\./\_/;
       my $metadata=&metadata($ENV{'request.filename'},$spacequalifierrest);
       if ($metadata) { return $metadata; }
+      $metadata=&metadata($ENV{'request.filename'},
+                                         'parameter_'.$spacequalifierrest);
+      if ($metadata) { return $metadata; }
 
 # ---------------------------------------------------- Any other user namespace
     } elsif ($realm eq 'environment') {
@@ -1480,6 +1473,7 @@ sub EXT {
 
 sub metadata {
     my ($uri,$what)=@_;
+
     $uri=&declutter($uri);
     my $filename=$uri;
     $uri=~s/\.meta$//;
@@ -1506,7 +1500,11 @@ sub metadata {
               map {
 		  $metacache{$uri.':'.$unikey.'.'.$_}=$token->[2]->{$_};
               } @{$token->[3]};
-              $metacache{$uri.':'.$unikey}=$parser->get_text('/'.$entry);
+              unless (
+                 $metacache{$uri.':'.$unikey}=$parser->get_text('/'.$entry)
+		      ) { $metacache{$uri.':'.$unikey}=
+			      $metacache{$uri.':'.$unikey.'.default'};
+		      }
           }
        }
     }
@@ -1632,6 +1630,27 @@ sub rndseed {
                .$symbchck);
 }
 
+sub ireceipt {
+    my ($funame,$fudom,$fucourseid,$fusymb)=@_;
+    my $cuname=unpack("%32C*",$funame);
+    my $cudom=unpack("%32C*",$fudom);
+    my $cucourseid=unpack("%32C*",$fucourseid);
+    my $cusymb=unpack("%32C*",$fusymb);
+    my $cunique=unpack("%32C*",$perlvar{'lonReceipt'});
+    return unpack("%32C*",$perlvar{'lonHostID'}).'-'.
+           ($cunique%$cuname+
+            $cunique%$cudom+
+            $cusymb%$cuname+
+            $cusymb%$cudom+
+            $cucourseid%$cuname+
+            $cucourseid%$cudom);
+}
+
+sub receipt {
+    return &ireceipt($ENV{'user.name'},$ENV{'user.domain'},
+                     $ENV{'request.course.id'},&symbread());
+}
+  
 # ------------------------------------------------------------ Serves up a file
 # returns either the contents of the file or a -1
 sub getfile {