--- loncom/LondConnection.pm 2006/01/26 21:34:25 1.38 +++ loncom/LondConnection.pm 2006/01/27 20:37:12 1.39 @@ -1,7 +1,7 @@ # This module defines and implements a class that represents # a connection to a lond daemon. # -# $Id: LondConnection.pm,v 1.38 2006/01/26 21:34:25 albertel Exp $ +# $Id: LondConnection.pm,v 1.39 2006/01/27 20:37:12 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -213,14 +213,13 @@ host the remote lond is on. This host is =cut sub new { - - my ($class, $Hostname, $Port) = @_; + my ($class, $DnsName, $Port) = @_; if (!$ConfigRead) { ReadConfig(); $ConfigRead = 1; } - &Debug(4,$class."::new( ".$Hostname.",".$Port.")\n"); + &Debug(4,$class."::new( ".$DnsName.",".$Port.")\n"); # The host must map to an entry in the hosts table: # We connect to the dns host that corresponds to that @@ -228,12 +227,12 @@ sub new { # negotion. In the objec these become the Host and # LoncapaHim fields of the object respectively. # - if (!exists $hostshash{$Hostname}) { - &Debug(8, "No Such host $Hostname"); + if (!exists $hostshash{$DnsName}) { + &Debug(8, "No Such host $DnsName"); return undef; # No such host!!! } - my @ConfigLine = @{$hostshash{$Hostname}}; - my $DnsName = $ConfigLine[3]; # 4'th item is dns of host. + my @ConfigLine = @{$hostshash{$DnsName}}; + my $Hostname = $ConfigLine[0]; # 0'th item is the msu id of host. Debug(5, "Connecting to ".$DnsName); # if it is me use loopback for connection if ($DnsName eq $LocalDns) { $DnsName="127.0.0.1"; } @@ -246,6 +245,7 @@ sub new { AuthenticationMode => "", TransactionRequest => "", TransactionReply => "", + NextRequest => "", InformReadable => 0, InformWritable => 0, TimeoutCallback => undef, @@ -562,11 +562,23 @@ sub Readable { $answer = $self->Decrypt($answer); $self->{TransactionReply} = "$answer\n"; } - + # if we have a NextRequest do it immeadiately + if ($self->{NextRequest}) { + $self->{TransactionRequest} = $self->{NextRequest}; + undef( $self->{NextRequest} ); + $self->{TransactionReply} = ""; + $self->{InformWritable} = 1; + $self->{InformReadable} = 0; + $self->{Timeoutable} = 1; + $self->{TimeoutRemaining} = $self->{TimeoutValue}; + $self->Transition("SendingRequest"); + return 0; + } else { # finish the transaction - $self->ToIdle(); - return 0; + $self->ToIdle(); + return 0; + } } elsif ($self->{State} eq "Disconnected") { # No connection. return -1; } else { # Internal error: Invalid state. @@ -718,14 +730,25 @@ sub InitiateTransaction { return -1; # Error indicator. } # if the transaction is to be encrypted encrypt the data: + (my $sethost, my $server,$data)=split(/:/,$data,3); if($data =~ /^encrypt\:/) { $data = $self->Encrypt($data); } # Setup the trasaction - - $self->{TransactionRequest} = $data; + # currently no version of lond supports inlining the sethost + if ($self->PeerVersion() <= 10000000) { + if ($server ne $self->{LoncapaHim}) { + $self->{NextRequest} = $data; + $self->{TransactionRequest} = "$sethost:$server\n"; + $self->{LoncapaHim} = $server; + } else { + $self->{TransactionRequest} = $data; + } + } else { + $self->{TransactionRequest} = "$sethost:$server:$data"; + } $self->{TransactionReply} = ""; $self->{InformWritable} = 1; $self->{InformReadable} = 0; @@ -1217,7 +1240,7 @@ sub read_hosts { { my @list = @items; # probably not needed but I'm unsure of # about the scope of item so... - $HostsTab{$list[0]} = \@list; + $HostsTab{$list[3]} = \@list; } } } @@ -1234,7 +1257,7 @@ sub read_hosts { # sub PeerVersion { my $self = shift; - + my ($version) = ($self->{LondVersion} =~ /Revision 1\.(\d+)/); return $self->{LondVersion}; }