--- googlecode.com/svn/trunk/Meteor/Subscriber.pm 2008/02/02 16:49:20 39 +++ googlecode.com/svn/trunk/Meteor/Subscriber.pm 2008/02/04 22:30:35 49 @@ -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) } @cons; + map { $_->ping() } @cons; } sub checkPersistentConnectionsForMaxTime { @@ -138,17 +137,15 @@ if($self->{'headerBuffer'}=~/GET\s+$::CONF{'SubscriberDynamicPageAddress'}\/([0-9a-z]+)\/([0-9a-z]+)\/(\S+)/i) { my $subscriberID=$1; - my $persist=0; $self->{'mode'}=$2; - 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")); - } - if ($self->{'mode'} eq "iframe") { - $self->{'HeaderTemplateNumber'}=1; - } else { - $self->{'HeaderTemplateNumber'}=2; + my $persist=$self->getConf('Persist'); + + my $maxTime=$self->getConf('MaxTime'); + if($maxTime>0) + { + $self->{'ConnectionTimeLimit'}=$self->{'ConnectionStart'}+$maxTime; } + my @channelData=split('/',$3); my $channels={}; my $channelName; @@ -178,7 +175,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 +205,8 @@ my $self=shift; my $channels=shift; my $persist=shift; + my $mode=shift || ''; + my $userAgent=shift || ''; foreach my $channelName (keys %{$channels}) { @@ -217,7 +216,7 @@ $self->{'channels'}->{$channelName}=$channel if($persist); - $channel->addSubscriber($self,$startIndex,$persist); + $channel->addSubscriber($self,$startIndex,$persist,$mode,$userAgent); } } @@ -241,16 +240,9 @@ my $self=shift; my $status=shift; - my $header=undef; - if(exists($self->{'HeaderTemplateNumber'})) - { - my $hn='HeaderTemplate'.$self->{'HeaderTemplateNumber'}; - - $header=$::CONF{$hn}; - } - $header=$::CONF{'HeaderTemplate'} unless(defined($header)); + my $header=$self->getConf('HeaderTemplate'); - $header=~s/~([^~]+)~/ + $header=~s/~([^~]*)~/ if(!defined($1) || $1 eq '') { '~'; @@ -267,6 +259,10 @@ { time; } + elsif($1 eq 'channelinfo') + { + Meteor::Channel->listChannelsUsingTemplate($self->getConf('ChannelInfoTemplate')); + } else { ''; @@ -276,20 +272,30 @@ $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=''; - $self->write($msg); + foreach my $message (@_) + { + $msgData.=$message->messageWithTemplate($msgTemplate); + $numMessages++; + } + + return if($numMessages<1); + + $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 +305,14 @@ { $self->close(1); } + +} + +sub ping { + my $self=shift; + my $msg=$self->getConf('PingMessage'); + + $self->write($msg); } sub closeChannel { @@ -308,11 +322,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 +336,7 @@ foreach my $channelName (keys %{$self->{'channels'}}) { my $channel=$self->{'channels'}->{$channelName}; - $channel->removeSubscriber($self); + $channel->removeSubscriber($self,'subscriberClose'); } delete($self->{'channels'}); @@ -337,7 +351,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 +373,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