--- loncom/xml/lonxml.pm	2005/11/10 21:28:21	1.387
+++ loncom/xml/lonxml.pm	2006/01/13 10:33:25	1.395
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # XML Parser Module 
 #
-# $Id: lonxml.pm,v 1.387 2005/11/10 21:28:21 albertel Exp $
+# $Id: lonxml.pm,v 1.395 2006/01/13 10:33:25 albertel Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -52,6 +52,7 @@ use Math::Random();
 use Opcode();
 use POSIX qw(strftime);
 use Time::HiRes qw( gettimeofday tv_interval );
+use Symbol();
 
 sub register {
   my ($space,@taglist) = @_;
@@ -272,13 +273,7 @@ sub printtokenheader {
         $tcrsid=$courseid;
     }
 
-    my %reply=&Apache::lonnet::get('environment',
-              ['firstname','middlename','lastname','generation'],
-              $tudom,$tuname);
-    my $plainname=$reply{'firstname'}.' '. 
-                  $reply{'middlename'}.' '.
-                  $reply{'lastname'}.' '.
-		  $reply{'generation'};
+    my $plainname=&Apache::loncommon::plainname($tuname,$tudom);
 
     if ($target eq 'web') {
         my %idhash=&Apache::lonnet::idrget($tudom,($tuname));
@@ -369,13 +364,16 @@ sub xmlparse {
  &initdepth();
  &init_alarm();
  my $finaloutput = &inner_xmlparse($target,\@stack,\@parstack,\@pars,
-				   $safeeval,\%style_for_target);
+				   $safeeval,\%style_for_target,1);
 
  if ($env{'request.uri'}) {
     &writeallows($env{'request.uri'});
  }
  &do_registered_ssi();
  if ($Apache::lonxml::counter_changed) { &store_counter() }
+
+ &clean_safespace($safeeval);
+
  if ($env{'form.return_only_error_and_warning_counts'}) {
      return "$errorcount:$warningcount";
  }
@@ -413,11 +411,12 @@ sub latex_special_symbols {
 }
 
 sub inner_xmlparse {
-  my ($target,$stack,$parstack,$pars,$safeeval,$style_for_target)=@_;
+  my ($target,$stack,$parstack,$pars,$safeeval,$style_for_target,$start)=@_;
   my $finaloutput = '';
   my $result;
   my $token;
   my $dontpop=0;
+  my $startredirection = $Apache::lonxml::redirection;
   while ( $#$pars > -1 ) {
     while ($token = $$pars['-1']->get_token) {
       if (($token->[0] eq 'T') || ($token->[0] eq 'C') ) {
@@ -527,11 +526,10 @@ sub inner_xmlparse {
   #   $finaloutput.=&endredirection;
   # }
 
-  if ($target eq 'grade') { &endredirection(); }
-  if ( $Apache::lonxml::redirection ) {
-      &error("Unclean exit of parser, text still being redirected. This is likely due to there being missing end tags.");
-      while ($Apache::lonxml::redirection) {
-	  $finaloutput.=&endredirection();
+  if ( $start && $target eq 'grade') { &endredirection(); }
+  if ( $Apache::lonxml::redirection > $startredirection) {
+      while ($Apache::lonxml::redirection > $startredirection) {
+	  $finaloutput .= &endredirection();
       }
   }
   if (($ENV{'QUERY_STRING'}) && ($target eq 'web')) {
@@ -801,6 +799,34 @@ sub init_safespace {
   &initialize_rndseed($safeeval);
 }
 
+sub clean_safespace {
+    my ($safeeval) = @_;
+    delete_package_recurse($safeeval->{Root});
+}
+
+sub delete_package_recurse {
+     my ($package) = @_;
+     my @subp;
+     {
+	 no strict 'refs';
+	 while (my ($key,$val) = each(%{*{"$package\::"}})) {
+	     if (!defined($val)) { next; }
+	     local (*ENTRY) = $val;
+	     if (defined *ENTRY{HASH} && $key =~ /::$/ &&
+		 $key ne "main::" && $key ne "<none>::")
+	     {
+		 my ($p) = $package ne "main" ? "$package\::" : "";
+		 ($p .= $key) =~ s/::$//;
+		 push(@subp,$p);
+	     }
+	 }
+     }
+     foreach my $p (@subp) {
+	 delete_package_recurse($p);
+     }
+     Symbol::delete_package($package);
+}
+
 sub initialize_rndseed {
     my ($safeeval)=@_;
     my $rndseed;
@@ -967,7 +993,10 @@ sub increment_counter {
 }
 
 sub init_counter {
-    if (defined($env{'form.counter'})) {
+    if ($env{'request.state'} eq 'construct') {
+	$Apache::lonxml::counter=1;
+	$Apache::lonxml::counter_changed=1;
+    } elsif (defined($env{'form.counter'})) {
 	$Apache::lonxml::counter=$env{'form.counter'};
 	$Apache::lonxml::counter_changed=0;
     } else {
@@ -1408,7 +1437,7 @@ ENDNOTFOUND
 	    undef($Apache::lonhomework::parsing_a_task);
 	    &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
 						    ['rawmode']);
-	    if ($env{'rawmode'}) { $result = $filecontents; }
+	    if ($env{'form.rawmode'}) { $result = $filecontents; }
 	}
     }
     
@@ -1456,7 +1485,12 @@ sub debug {
     if ($Apache::lonxml::debug eq "1") {
 	$|=1;
 	my $request=$Apache::lonxml::request;
-	if (!$request) { $request=Apache->request; }
+	if (!$request) {
+	    eval { $request=Apache->request; };
+	}
+	if (!$request) {
+	    eval { $request=Apache2::RequestUtil->request; };
+	}
 	$request->print('<font size="-2"><pre>DEBUG:'.&HTML::Entities::encode($_[0],'<>&"')."</pre></font>\n");
 	#&Apache::lonnet::logthis($_[0]);
     }