--- googlecode.com/svn/trunk/Meteor/Subscriber.pm 2008/02/01 21:22:03 37 +++ googlecode.com/svn/trunk/Meteor/Subscriber.pm 2008/02/04 21:06:42 47 @@ -80,17 +80,16 @@ if(exists($PersistentConnections{$id})) { - $PersistentConnections{$id}->close(1); + $PersistentConnections{$id}->close(); } } sub pingPersistentConnections { my $class=shift; - my $msg=$::CONF{'PingMessage'}; my @cons=values %PersistentConnections; - map { $_->write($msg.chr(0)) } @cons; + map { $_->ping() } @cons; } sub checkPersistentConnectionsForMaxTime { @@ -138,8 +137,9 @@ if($self->{'headerBuffer'}=~/GET\s+$::CONF{'SubscriberDynamicPageAddress'}\/([0-9a-z]+)\/([0-9a-z]+)\/(\S+)/i) { my $subscriberID=$1; - my $persist=0; $self->{'mode'}=$2; + my $persist=$self->getConf('Persist'); + if ($self->{'mode'} eq "xhrinteractive" || $self->{'mode'} eq "iframe" || $self->{'mode'} eq "serversent" || $self->{'mode'} eq "longpoll") { $persist=1; $self->{'MaxMessageCount'}=1 unless(!($self->{'mode'} eq "longpoll")); @@ -149,6 +149,13 @@ } else { $self->{'HeaderTemplateNumber'}=2; } + + my $maxTime=$self->getConf('MaxTime'); + if($maxTime>0) + { + $self->{'ConnectionTimeLimit'}=$self->{'ConnectionStart'}+$maxTime; + } + my @channelData=split('/',$3); my $channels={}; my $channelName; @@ -178,7 +185,7 @@ if(scalar(keys %{$channels})) { $self->emitOKHeader(); - $self->setChannels($channels,$persist); + $self->setChannels($channels,$persist,$self->{'mode'},''); $self->close(1) unless($persist); return; } @@ -208,6 +215,8 @@ my $self=shift; my $channels=shift; my $persist=shift; + my $mode=shift || ''; + my $userAgent=shift || ''; foreach my $channelName (keys %{$channels}) { @@ -217,7 +226,7 @@ $self->{'channels'}->{$channelName}=$channel if($persist); - $channel->addSubscriber($self,$startIndex,$persist); + $channel->addSubscriber($self,$startIndex,$persist,$mode,$userAgent); } } @@ -246,11 +255,11 @@ { my $hn='HeaderTemplate'.$self->{'HeaderTemplateNumber'}; - $header=$::CONF{$hn}; + $header=$self->getConf($hn); } - $header=$::CONF{'HeaderTemplate'} unless(defined($header)); + $header=$self->getConf('HeaderTemplate') unless(defined($header)); - $header=~s/~([^~]+)~/ + $header=~s/~([^~]*)~/ if(!defined($1) || $1 eq '') { '~'; @@ -267,29 +276,43 @@ { time; } + elsif($1 eq 'channelinfo') + { + Meteor::Channel->listChannelsUsingTemplate($self->getConf('ChannelInfoTemplate')); + } else { ''; } /gex; - $self->write($header.chr(0)); + $self->write($header); } -sub sendMessage { +sub sendMessages { my $self=shift; - my $msg=shift; - my $numMsgInThisBatch=shift; - $numMsgInThisBatch=1 unless(defined($numMsgInThisBatch)); + my $numMessages=0; + my $msgTemplate=$self->getConf('Messagetemplate'); + my $msgData=''; + + foreach my $message (@_) + { + $msgData.=$message->messageWithTemplate($msgTemplate); + $numMessages++; + } + + return if($numMessages<1); - $self->write($msg.chr(0)); + $self->write($msgData); - $::Statistics->{'messages_served'}+=$numMsgInThisBatch; + $::Statistics->{'messages_served'}+=$numMessages; - my $msgCount=++$self->{'MessageCount'}; + my $msgCount=$self->{'MessageCount'}; + $msgCount+=$numMessages; + $self->{'MessageCount'}=$msgCount; - my $maxMsg=$::CONF{'MaxMessages'}; + my $maxMsg=$self->getConf('MaxMessages'); if(defined($maxMsg) && $maxMsg>0 && $msgCount>=$maxMsg) { $self->close(1); @@ -299,6 +322,14 @@ { $self->close(1); } + +} + +sub ping { + my $self=shift; + my $msg=$self->getConf('PingMessage'); + + $self->write($msg); } sub closeChannel { @@ -308,11 +339,11 @@ return unless(exists($self->{'channels'}->{$channelName})); my $channel=$self->{'channels'}->{$channelName}; - $channel->removeSubscriber($self); + $channel->removeSubscriber($self,'channelClose'); delete($self->{'channels'}->{$channelName}); - $self->close() if(scalar(keys %{$self->{'channels'}})==0); + $self->close(0,'channelsClosed') if(scalar(keys %{$self->{'channels'}})==0); } sub close { @@ -322,7 +353,7 @@ foreach my $channelName (keys %{$self->{'channels'}}) { my $channel=$self->{'channels'}->{$channelName}; - $channel->removeSubscriber($self); + $channel->removeSubscriber($self,'subscriberClose'); } delete($self->{'channels'}); @@ -337,7 +368,7 @@ # unless($noShutdownMsg || $self->{'remoteClosed'} || exists($self->{'headerBuffer'})) { - my $msg=$::CONF{'SubscriberShutdownMsg'}; + my $msg=$self->getConf('SubscriberShutdownMsg'); if(defined($msg) && $msg ne '') { $self->write($msg); @@ -359,5 +390,19 @@ $self->close(1) if(exists($self->{'ConnectionTimeLimit'}) && $self->{'ConnectionTimeLimit'}<$time); } +sub getConf { + my $self=shift; + my $key=shift; + + if(exists($self->{'mode'}) && $self->{'mode'} ne '') + { + my $k=$key.'.'.$self->{'mode'}; + + return $::CONF{$k} if(exists($::CONF{$k})); + } + + $::CONF{$key}; +} + 1; ############################################################################EOF \ No newline at end of file