/[meteor]/googlecode.com/svn/trunk/Meteor/Controller.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/Controller.pm

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

revision 9 by andrew.betts, Fri Dec 8 16:52:58 2006 UTC revision 25 by knops.gerd, Sun May 20 19:40:53 2007 UTC
# Line 1  Line 1 
1  #!/usr/bin/perl -w  #!/usr/bin/perl -w
2  ###############################################################################  ###############################################################################
3  #   Meteor  #   Meteor
4  #   An HTTP server for the 2.0 web  #   An HTTP server for the 2.0 web
5  #   Copyright (c) 2006 contributing authors  #   Copyright (c) 2006 contributing authors
6  #  #
7  #   Subscriber.pm  #   Subscriber.pm
8  #  #
9  #       Description:  #       Description:
10  #       A Meteor Controller  #       A Meteor Controller
11  #  #
12  ###############################################################################  ###############################################################################
13  #  #
14  #   This program is free software; you can redistribute it and/or modify it  #   This program is free software; you can redistribute it and/or modify it
15  #   under the terms of the GNU General Public License as published by the Free  #   under the terms of the GNU General Public License as published by the Free
16  #   Software Foundation; either version 2 of the License, or (at your option)  #   Software Foundation; either version 2 of the License, or (at your option)
17  #   any later version.  #   any later version.
18  #  #
19  #   This program is distributed in the hope that it will be useful, but WITHOUT  #   This program is distributed in the hope that it will be useful, but WITHOUT
20  #   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or  #   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
21  #   FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for  #   FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
22  #   more details.  #   more details.
23  #  #
24  #   You should have received a copy of the GNU General Public License along  #   You should have received a copy of the GNU General Public License along
25  #   with this program; if not, write to the Free Software Foundation, Inc.,  #   with this program; if not, write to the Free Software Foundation, Inc.,
26  #   59 Temple Place, Suite 330, Boston, MA 02111-1307 USA  #   59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
27  #  #
28  #   For more information visit www.meteorserver.org  #   For more information visit www.meteorserver.org
29  #  #
30  ###############################################################################  ###############################################################################
31    
32  package Meteor::Controller;  package Meteor::Controller;
33  ###############################################################################  ###############################################################################
34  # Configuration  # Configuration
35  ###############################################################################  ###############################################################################
36                    
37          use strict;          use strict;
38                    
39          use Meteor::Connection;          use Meteor::Connection;
40          use Meteor::Channel;          use Meteor::Channel;
41                    use Meteor::Subscriber;
42          @Meteor::Controller::ISA=qw(Meteor::Connection);          
43            @Meteor::Controller::ISA=qw(Meteor::Connection);
44  ###############################################################################  
45  # Instance methods  ###############################################################################
46  ###############################################################################  # Factory methods
47  sub processLine {  ###############################################################################
48          my $self=shift;  sub newFromServer {
49          my $line=shift;          my $class=shift;
50                    
51          # ADDMESSAGE channel1 Message text          my $self=$class->SUPER::newFromServer(shift);
52          # < OK          
53          # ADDMESSAGE          $::Statistics->{'current_controllers'}++;
54          # < ERR Invalid command syntax          $::Statistics->{'controller_connections_accepted'}++;
55          # COUNTSUBSCRIBERS channel1          
56          # < OK 344          $self;
57            }
58          unless($line=~s/^(ADDMESSAGE|COUNTSUBSCRIBERS|LISTCHANNELS|QUIT)//)  
59          {  ###############################################################################
60                  $self->write("ERR Invalid command syntax$::CRLF");  # Instance methods
61                    ###############################################################################
62                  return;  sub processLine {
63          }          my $self=shift;
64                    my $line=shift;
65          my $cmd=$1;          
66                    # ADDMESSAGE channel1 Message text
67          if($cmd eq 'ADDMESSAGE')          # < OK
68          {          # ADDMESSAGE
69                  unless($line=~s/^\s+(\S+)\s//)          # < ERR Invalid command syntax
70                  {          # COUNTSUBSCRIBERS channel1
71                          $self->write("ERR Invalid command syntax$::CRLF");          # < OK 344
72            
73                          return;          unless($line=~s/^(ADDMESSAGE|COUNTSUBSCRIBERS|LISTCHANNELS|SHOWSTATS|QUIT)//)
74                  }          {
75                                    $self->write("ERR Invalid command syntax$::CRLF");
76                  my $channelName=$1;                  
77                  my $channel=Meteor::Channel->channelWithName($channelName);                  return;
78                  $channel->addMessage($line);          }
79                  $self->write("OK$::CRLF");          
80          }          my $cmd=$1;
81          elsif($cmd eq 'COUNTSUBSCRIBERS')          
82          {          if($cmd eq 'ADDMESSAGE')
83                  unless($line=~s/^\s+(\S+)$//)          {
84                  {                  unless($line=~s/^\s+(\S+)\s//)
85                          $self->write("ERR Invalid command syntax$::CRLF");                  {
86                            $self->write("ERR Invalid command syntax$::CRLF");
87                          return;                          
88                  }                          return;
89                                    }
90                  my $channelName=$1;                  
91                  my $numSubscribers=0;                  my $channelName=$1;
92                  my $channel=Meteor::Channel->channelWithName($channelName,1);                  my $channel=Meteor::Channel->channelWithName($channelName);
93                  $numSubscribers=$channel->subscriberCount() if($channel);                  $channel->addMessage($line);
94                                    $self->write("OK$::CRLF");
95                  $self->write("OK $numSubscribers$::CRLF");          }
96          }          elsif($cmd eq 'COUNTSUBSCRIBERS')
97          elsif($cmd eq 'LISTCHANNELS')          {
98          {                  unless($line=~s/^\s+(\S+)$//)
99                  unless($line eq '')                  {
100                  {                          $self->write("ERR Invalid command syntax$::CRLF");
101                          $self->write("ERR Invalid command syntax$::CRLF");                          
102                            return;
103                          return;                  }
104                  }                  
105                                    my $channelName=$1;
106                  my $txt="OK$::CRLF".Meteor::Channel->listChannels()."--EOT--$::CRLF";                  my $numSubscribers=0;
107                                    my $channel=Meteor::Channel->channelWithName($channelName,1);
108                  $self->write($txt);                  $numSubscribers=$channel->subscriberCount() if($channel);
109          }                  
110          elsif($cmd eq 'QUIT')                  $self->write("OK $numSubscribers$::CRLF");
111          {          }
112                  unless($line eq '')          elsif($cmd eq 'LISTCHANNELS')
113                  {          {
114                          $self->write("ERR Invalid command syntax$::CRLF");                  unless($line eq '')
115                    {
116                          return;                          $self->write("ERR Invalid command syntax$::CRLF");
117                  }                          
118                                            return;
119                  $self->write("OK$::CRLF");                  }
120                  $self->close(1);                  
121          }                  my $txt="OK$::CRLF".Meteor::Channel->listChannels()."--EOT--$::CRLF";
122          else                  
123          {                  $self->write($txt);
124                  # Should never get here          }
125                  die("Unknown command '$cmd'");          elsif($cmd eq 'SHOWSTATS')
126          }          {
127  }                  # uptime
128                    my $uptime=time-$::STARTUP_TIME;
129  sub close {                  my $txt="uptime: $uptime$::CRLF";
130          my $self=shift;                  
131          my $noShutdownMsg=shift;                  # channel_count
132                            my $numChannels=Meteor::Channel->numChannels();
133          unless($noShutdownMsg || $self->{'remoteClosed'})                  $txt.="channel_count: $numChannels$::CRLF";
134          {                  
135                  my $msg=$::CONF{'ControllerShutdownMsg'};                  foreach my $key (keys %{$::Statistics})
136                  if(defined($msg) && $msg ne '')                  {
137                  {                          $txt.=$key.': '.$::Statistics->{$key}.$::CRLF;
138                          $self->write($msg);                  }
139                  }                  
140          }                  $self->write($txt);
141                    }
142          $self->SUPER::close();          elsif($cmd eq 'QUIT')
143  }          {
144                    unless($line eq '')
145  1;                  {
146                            $self->write("ERR Invalid command syntax$::CRLF");
147                            
148                            return;
149                    }
150                    
151                    $self->write("OK$::CRLF");
152                    $self->close(1);
153            }
154            else
155            {
156                    # Should never get here
157                    die("Unknown command '$cmd'");
158            }
159    }
160    
161    sub close {
162            my $self=shift;
163            my $noShutdownMsg=shift;
164            
165            unless($noShutdownMsg || $self->{'remoteClosed'})
166            {
167                    my $msg=$::CONF{'ControllerShutdownMsg'};
168                    if(defined($msg) && $msg ne '')
169                    {
170                            $self->write($msg);
171                    }
172            }
173            
174            $::Statistics->{'current_controllers'}--;
175            
176            $self->SUPER::close();
177    }
178    
179    1;
180  ############################################################################EOF  ############################################################################EOF

Legend:
Removed from v.9  
changed lines
  Added in v.25

  ViewVC Help
Powered by ViewVC 1.1.26