/[meteor]/googlecode.com/svn/trunk/Meteor/Subscriber.pm
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Diff of /googlecode.com/svn/trunk/Meteor/Subscriber.pm

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 39 by andrew.betts, Sat Feb 2 16:49:20 2008 UTC revision 49 by knops.gerd, Mon Feb 4 22:30:35 2008 UTC
# Line 80  sub deleteSubscriberWithID { Line 80  sub deleteSubscriberWithID {
80                    
81          if(exists($PersistentConnections{$id}))          if(exists($PersistentConnections{$id}))
82          {          {
83                  $PersistentConnections{$id}->close(1);                  $PersistentConnections{$id}->close();
84          }          }
85  }  }
86    
87  sub pingPersistentConnections {  sub pingPersistentConnections {
88          my $class=shift;          my $class=shift;
89                    
         my $msg=$::CONF{'PingMessage'};  
90          my @cons=values %PersistentConnections;          my @cons=values %PersistentConnections;
91                    
92          map { $_->write($msg) } @cons;          map { $_->ping() } @cons;
93  }  }
94    
95  sub checkPersistentConnectionsForMaxTime {  sub checkPersistentConnectionsForMaxTime {
# Line 138  sub processLine { Line 137  sub processLine {
137                  if($self->{'headerBuffer'}=~/GET\s+$::CONF{'SubscriberDynamicPageAddress'}\/([0-9a-z]+)\/([0-9a-z]+)\/(\S+)/i)                  if($self->{'headerBuffer'}=~/GET\s+$::CONF{'SubscriberDynamicPageAddress'}\/([0-9a-z]+)\/([0-9a-z]+)\/(\S+)/i)
138                  {                  {
139                          my $subscriberID=$1;                          my $subscriberID=$1;
                         my $persist=0;  
140                          $self->{'mode'}=$2;                          $self->{'mode'}=$2;
141                          if ($self->{'mode'} eq "xhrinteractive" || $self->{'mode'} eq "iframe" || $self->{'mode'} eq "serversent" || $self->{'mode'} eq "longpoll") {                          my $persist=$self->getConf('Persist');
142                                  $persist=1;                          
143                                  $self->{'MaxMessageCount'}=1 unless(!($self->{'mode'} eq "longpoll"));                          my $maxTime=$self->getConf('MaxTime');
144                          }                          if($maxTime>0)
145                          if ($self->{'mode'} eq "iframe") {                          {
146                                  $self->{'HeaderTemplateNumber'}=1;                                  $self->{'ConnectionTimeLimit'}=$self->{'ConnectionStart'}+$maxTime;
                         } else {  
                                 $self->{'HeaderTemplateNumber'}=2;  
147                          }                          }
148                            
149                          my @channelData=split('/',$3);                          my @channelData=split('/',$3);
150                          my $channels={};                          my $channels={};
151                          my $channelName;                          my $channelName;
# Line 178  sub processLine { Line 175  sub processLine {
175                          if(scalar(keys %{$channels}))                          if(scalar(keys %{$channels}))
176                          {                          {
177                                  $self->emitOKHeader();                                  $self->emitOKHeader();
178                                  $self->setChannels($channels,$persist);                                  $self->setChannels($channels,$persist,$self->{'mode'},'');
179                                  $self->close(1) unless($persist);                                  $self->close(1) unless($persist);
180                                  return;                                  return;
181                          }                          }
# Line 208  sub setChannels { Line 205  sub setChannels {
205          my $self=shift;          my $self=shift;
206          my $channels=shift;          my $channels=shift;
207          my $persist=shift;          my $persist=shift;
208            my $mode=shift || '';
209            my $userAgent=shift || '';
210                    
211          foreach my $channelName (keys %{$channels})          foreach my $channelName (keys %{$channels})
212          {          {
# Line 217  sub setChannels { Line 216  sub setChannels {
216                                    
217                  $self->{'channels'}->{$channelName}=$channel if($persist);                  $self->{'channels'}->{$channelName}=$channel if($persist);
218                                    
219                  $channel->addSubscriber($self,$startIndex,$persist);                  $channel->addSubscriber($self,$startIndex,$persist,$mode,$userAgent);
220          }          }
221  }  }
222    
# Line 241  sub emitHeader { Line 240  sub emitHeader {
240          my $self=shift;          my $self=shift;
241          my $status=shift;          my $status=shift;
242                    
243          my $header=undef;          my $header=$self->getConf('HeaderTemplate');
         if(exists($self->{'HeaderTemplateNumber'}))  
         {  
                 my $hn='HeaderTemplate'.$self->{'HeaderTemplateNumber'};  
                   
                 $header=$::CONF{$hn};  
         }  
         $header=$::CONF{'HeaderTemplate'} unless(defined($header));  
244                    
245          $header=~s/~([^~]+)~/          $header=~s/~([^~]*)~/
246                  if(!defined($1) || $1 eq '')                  if(!defined($1) || $1 eq '')
247                  {                  {
248                          '~';                          '~';
# Line 267  sub emitHeader { Line 259  sub emitHeader {
259                  {                  {
260                          time;                          time;
261                  }                  }
262                    elsif($1 eq 'channelinfo')
263                    {
264                            Meteor::Channel->listChannelsUsingTemplate($self->getConf('ChannelInfoTemplate'));
265                    }
266                  else                  else
267                  {                  {
268                          '';                          '';
# Line 276  sub emitHeader { Line 272  sub emitHeader {
272          $self->write($header);          $self->write($header);
273  }  }
274    
275  sub sendMessage {  sub sendMessages {
276          my $self=shift;          my $self=shift;
         my $msg=shift;  
         my $numMsgInThisBatch=shift;  
277                    
278          $numMsgInThisBatch=1 unless(defined($numMsgInThisBatch));          my $numMessages=0;
279            my $msgTemplate=$self->getConf('Messagetemplate');
280            my $msgData='';
281                    
282          $self->write($msg);          foreach my $message (@_)
283            {
284                    $msgData.=$message->messageWithTemplate($msgTemplate);
285                    $numMessages++;
286            }
287            
288            return if($numMessages<1);
289            
290            $self->write($msgData);
291                    
292          $::Statistics->{'messages_served'}+=$numMsgInThisBatch;          $::Statistics->{'messages_served'}+=$numMessages;
293                    
294          my $msgCount=++$self->{'MessageCount'};          my $msgCount=$self->{'MessageCount'};
295            $msgCount+=$numMessages;
296            $self->{'MessageCount'}=$msgCount;
297                    
298          my $maxMsg=$::CONF{'MaxMessages'};          my $maxMsg=$self->getConf('MaxMessages');
299          if(defined($maxMsg) && $maxMsg>0 && $msgCount>=$maxMsg)          if(defined($maxMsg) && $maxMsg>0 && $msgCount>=$maxMsg)
300          {          {
301                  $self->close(1);                  $self->close(1);
# Line 299  sub sendMessage { Line 305  sub sendMessage {
305          {          {
306                  $self->close(1);                  $self->close(1);
307          }          }
308            
309    }
310    
311    sub ping {
312            my $self=shift;
313            my $msg=$self->getConf('PingMessage');
314            
315            $self->write($msg);
316  }  }
317    
318  sub closeChannel {  sub closeChannel {
# Line 308  sub closeChannel { Line 322  sub closeChannel {
322          return unless(exists($self->{'channels'}->{$channelName}));          return unless(exists($self->{'channels'}->{$channelName}));
323                    
324          my $channel=$self->{'channels'}->{$channelName};          my $channel=$self->{'channels'}->{$channelName};
325          $channel->removeSubscriber($self);          $channel->removeSubscriber($self,'channelClose');
326                    
327          delete($self->{'channels'}->{$channelName});          delete($self->{'channels'}->{$channelName});
328                    
329          $self->close() if(scalar(keys %{$self->{'channels'}})==0);          $self->close(0,'channelsClosed') if(scalar(keys %{$self->{'channels'}})==0);
330  }  }
331    
332  sub close {  sub close {
# Line 322  sub close { Line 336  sub close {
336          foreach my $channelName (keys %{$self->{'channels'}})          foreach my $channelName (keys %{$self->{'channels'}})
337          {          {
338                  my $channel=$self->{'channels'}->{$channelName};                  my $channel=$self->{'channels'}->{$channelName};
339                  $channel->removeSubscriber($self);                  $channel->removeSubscriber($self,'subscriberClose');
340          }          }
341          delete($self->{'channels'});          delete($self->{'channels'});
342                    
# Line 337  sub close { Line 351  sub close {
351          #          #
352          unless($noShutdownMsg || $self->{'remoteClosed'} || exists($self->{'headerBuffer'}))          unless($noShutdownMsg || $self->{'remoteClosed'} || exists($self->{'headerBuffer'}))
353          {          {
354                  my $msg=$::CONF{'SubscriberShutdownMsg'};                  my $msg=$self->getConf('SubscriberShutdownMsg');
355                  if(defined($msg) && $msg ne '')                  if(defined($msg) && $msg ne '')
356                  {                  {
357                          $self->write($msg);                          $self->write($msg);
# Line 359  sub checkForMaxTime { Line 373  sub checkForMaxTime {
373          $self->close(1) if(exists($self->{'ConnectionTimeLimit'}) && $self->{'ConnectionTimeLimit'}<$time);          $self->close(1) if(exists($self->{'ConnectionTimeLimit'}) && $self->{'ConnectionTimeLimit'}<$time);
374  }  }
375    
376    sub getConf {
377            my $self=shift;
378            my $key=shift;
379            
380            if(exists($self->{'mode'}) && $self->{'mode'} ne '')
381            {
382                    my $k=$key.'.'.$self->{'mode'};
383                    
384                    return $::CONF{$k} if(exists($::CONF{$k}));
385            }
386            
387            $::CONF{$key};
388    }
389    
390  1;  1;
391  ############################################################################EOF  ############################################################################EOF

Legend:
Removed from v.39  
changed lines
  Added in v.49

  ViewVC Help
Powered by ViewVC 1.1.26