File:  [LON-CAPA] / rat / lonuserstate.pm
Revision 1.1: download - view: text, annotated - select for diffs
Tue Jul 18 17:32:32 2000 UTC (23 years, 8 months ago) by www
Branches: MAIN
CVS tags: HEAD
Translates XML course maps into binary format for browsing
Work in progress, not functional yet.

# The LearningOnline Network with CAPA
# Construct and maintain state and binary representation of course for user
#
# (Server for RAT Maps
#
# (Edit Handler for RAT Maps
# (TeX Content Handler
#
# 05/29/00,05/30 Gerd Kortemeyer)
# 7/1 Gerd Kortemeyer)
# 7/1,7/3,7/4,7/7,7/8,7/10 Gerd Kortemeyer)
#
# 7/15,7/17,7/18 Gerd Kortemeyer

package Apache::lonuserstate;

use strict;
use Apache::Constants qw(:common :http);
use Apache::File;
use HTML::TokeParser;
use Apache::lonnet();
use GDBM_File;

# ---------------------------------------------------- Globals for this package

my $pc;      # Package counter
my %hash;    # The big tied hash
my @cond;    # Array with all of the conditions
my $errtext; # variable with all errors

# --------------------------------------------------------- Loads map from disk

sub loadmap { 
    my $uri=shift;
    if ($hash{'map_pc_'.$uri}) { return OK; }

    $pc++;
    my $lpc=$pc;
    $hash{'map_pc_'.$uri}=$lpc;
    $hash{'map_id_'.$lpc}=$uri;

    my $fn='/home/httpd/html'.$uri;

    unless (($fn=~/\.course$/) ||
            ($fn=~/\.sequence$/) ||
            ($fn=~/\.page$/)) { 
       $errtext.="Invalid map: $fn\n";
       return OK; 
    }

    unless (-e $fn) {
	my $returned=Apache::lonnet::repcopy($fn);
        unless ($returned eq OK) {
           $errtext.="Could not import: $fn - ";
           if ($returned eq HTTP_SERVICE_UNAVAILABLE) {
	      $errtext.="Server unavailable\n";
           }
           if ($returned eq HTTP_NOT_FOUND) {
	      $errtext.="File not found\n";
           }
           if ($returned eq FORBIDDEN) {
	      $errtext.="Access forbidden\n";
           }
           return OK;
       }
    }

    if (-e $fn) {
        my @content;
        {
	    my $fh=Apache::File->new($fn);
            @content=<$fh>;
        }
        my $instr=join('',@content);
        my $parser = HTML::TokeParser->new(\$instr);
        my $token;

        my $linkpc=0;

        $fn=~/\.(\w+)$/;

        $hash{'map_type_'.$lpc}=$1;

        while ($token = $parser->get_token) {
	    if ($token->[0] eq 'S') {
                if ($token->[1] eq 'resource') {
# -------------------------------------------------------------------- Resource

                    my $rid=$lpc.'.'.$token->[2]->{'id'};

                    $hash{'kind_'.$rid}='res';
                    $hash{'title_'.$rid}=$token->[2]->{'title'};
                    my $turi=$token->[2]->{'src'};
                    $hash{'src_'.$rid}=$turi;

                    if (defined($hash{'ids_'.$turi})) {
                        $hash{'ids_'.$turi}.=','.$rid;
                    } else {
                        $hash{'ids_'.$turi}=''.$rid;
                    }

                    if ($token->[2]->{'src'}=~/\/\//) {
                        $hash{'ext_'.$rid}='true:';
                    } else {
                        $hash{'ext_'.$rid}='false:';
                    }
                    if ($token->[2]->{'type'}) {
			$hash{'type_'.$rid}=$token->[2]->{'type'};
                    }  else {
                        $hash{'type_'.$rid}='normal';
                    }

                    if (($turi=~/\.course$/) ||
                        ($turi=~/\.sequence$/) ||
                        ($turi=~/\.page$/)) {
                        &loadmap($turi);
                    } 
                    
                } elsif ($token->[1] eq 'condition') {
# ------------------------------------------------------------------- Condition

                    my $rid=$lpc.'.'.$token->[2]->{'id'};

                    $hash{'kind_'.$rid}='cond';
                    $hash{'value_'.$rid}=$token->[2]->{'value'};
                    if ($token->[2]->{'type'}) {
			$hash{'type_'.$rid}=$token->[2]->{'type'};
                    }  else {
                        $hash{'type_'.$rid}='normal';
                    }

                } elsif ($token->[1] eq 'link') {
# ----------------------------------------------------------------------- Links

                    $linkpc++;
                    my $linkid=$lpc.'.'.$linkpc;

                    my $goesto=$lpc.'.'.$token->[2]->{'to'};
                    my $comesfrom=$lpc.'.'.$token->[2]->{'from'};
                    my $undercond=0;

                    if ($token->[2]->{'condition'}) {
			$undercond=$lpc.'.'.$token->[2]->{'condition'};
                    }

                    $hash{'goesto_'.$linkid}=$goesto;
                    $hash{'comesfrom_'.$linkid}=$comesfrom;
                    $hash{'undercond_'.$linkid}=$undercond;

                    if (defined($hash{'to_'.$comesfrom})) {
                        $hash{'to_'.$comesfrom}.=','.$linkid;
                    } else {
                        $hash{'to_'.$comesfrom}=''.$linkid;
                    }
                    if (defined($hash{'from_'.$goesto})) {
                        $hash{'from_'.$goesto}.=','.$linkid;
                    } else {
                        $hash{'from_'.$goesto}=''.$linkid;
                    }
                } 

            }
        }

    } else {
        $errtext.='Map not loaded: The file does not exist. ';
    }
}


# ---------------------------------------------------- Read map and all submaps

sub readmap {
   my $uri=shift;
   @cond=();
   %hash=();
   $errtext='';
   $pc=0;
   loadmap($uri);
}

sub handler {
    my $r = shift;
    $r->content_type('text/html');
    $r->send_http_header;
    return OK if $r->header_only;
    readmap('/res/msu/korte/foo.course');
    $r->print("<html><body>\n");
    my $hashkey;
    foreach $hashkey (keys %hash) {
	$r->print("$hashkey: $hash{$hashkey}<br>\n");
    }
    $r->print("<h1>$errtext</h1></body></html>\n");
    return OK;
}

    
 
1;
__END__








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