133 |
my $backtrack=undef; |
my $backtrack=undef; |
134 |
my $persist=1; |
my $persist=1; |
135 |
my $subscriberID=undef; |
my $subscriberID=undef; |
136 |
|
my $channels={}; |
137 |
foreach my $formElement (@formData) |
foreach my $formElement (@formData) |
138 |
{ |
{ |
139 |
if($formElement=~/^channel=(.+)$/) |
if($formElement=~/^channel=(.+)$/) |
140 |
{ |
{ |
141 |
|
if(defined($channelName)) |
142 |
|
{ |
143 |
|
if(defined($startIndex) && defined($backtrack)) |
144 |
|
{ |
145 |
|
$self->emitHeader("404 Cannot use both 'restartfrom' and 'backtrack'"); |
146 |
|
$self->close(); |
147 |
|
|
148 |
|
return; |
149 |
|
} |
150 |
|
|
151 |
|
$startIndex=-$backtrack if(!defined($startIndex) && defined($backtrack)); |
152 |
|
$channels->{$channelName}->{'startIndex'}=$startIndex; |
153 |
|
|
154 |
|
$startIndex=undef; |
155 |
|
$backtrack=undef; |
156 |
|
} |
157 |
$channelName=$1; |
$channelName=$1; |
158 |
} |
} |
159 |
elsif($formElement=~/^restartfrom=(\d*)$/) |
elsif($formElement=~/^restartfrom=(\d*)$/) |
193 |
} |
} |
194 |
} |
} |
195 |
} |
} |
|
|
|
|
delete($self->{'headerBuffer'}); |
|
196 |
|
|
197 |
if(defined($startIndex) && defined($backtrack)) |
if(defined($channelName)) |
198 |
{ |
{ |
199 |
$self->emitHeader("404 Cannot use both 'restartfrom' and 'backtrack'"); |
if(defined($startIndex) && defined($backtrack)) |
200 |
$self->close(); |
{ |
201 |
|
$self->emitHeader("404 Cannot use both 'restartfrom' and 'backtrack'"); |
202 |
|
$self->close(); |
203 |
|
|
204 |
|
return; |
205 |
|
} |
206 |
|
|
207 |
return; |
$startIndex=-$backtrack if(!defined($startIndex) && defined($backtrack)); |
208 |
|
$channels->{$channelName}->{'startIndex'}=$startIndex; |
209 |
} |
} |
210 |
|
|
211 |
|
delete($self->{'headerBuffer'}); |
212 |
|
|
213 |
if(defined($subscriberID) && $persist) |
if(defined($subscriberID) && $persist) |
214 |
{ |
{ |
215 |
$self->{'subscriberID'}=$subscriberID; |
$self->{'subscriberID'}=$subscriberID; |
217 |
$PersistentConnections{$subscriberID}=$self; |
$PersistentConnections{$subscriberID}=$self; |
218 |
} |
} |
219 |
|
|
220 |
if(defined($channelName)) |
if(scalar(keys %{$channels})) |
221 |
{ |
{ |
222 |
$self->emitOKHeader(); |
$self->emitOKHeader(); |
223 |
|
|
224 |
$startIndex=-$backtrack if(!defined($startIndex) && defined($backtrack)); |
$self->setChannels($channels,$persist); |
|
|
|
|
$self->setChannelName($channelName,$startIndex,$persist); |
|
225 |
|
|
226 |
$self->close(1) unless($persist); |
$self->close(1) unless($persist); |
227 |
|
|
244 |
} |
} |
245 |
} |
} |
246 |
|
|
247 |
sub setChannelName { |
sub setChannels { |
248 |
my $self=shift; |
my $self=shift; |
249 |
my $channelName=shift; |
my $channels=shift; |
|
my $startIndex=shift; |
|
250 |
my $persist=shift; |
my $persist=shift; |
251 |
|
|
252 |
my $channel=Meteor::Channel->channelWithName($channelName); |
foreach my $channelName (keys %{$channels}) |
253 |
$self->{'channel'}=$channel if($persist); |
{ |
254 |
|
my $startIndex=$channels->{$channelName}->{'startIndex'}; |
255 |
$channel->addSubscriber($self,$startIndex,$persist); |
|
256 |
|
my $channel=Meteor::Channel->channelWithName($channelName); |
257 |
|
|
258 |
|
$self->{'channels'}->{$channelName}=$channel if($persist); |
259 |
|
|
260 |
|
$channel->addSubscriber($self,$startIndex,$persist); |
261 |
|
} |
262 |
} |
} |
263 |
|
|
264 |
sub emitOKHeader { |
sub emitOKHeader { |
335 |
} |
} |
336 |
} |
} |
337 |
|
|
338 |
|
sub closeChannel { |
339 |
|
my $self=shift; |
340 |
|
my $channelName=shift; |
341 |
|
|
342 |
|
return unless(exists($self->{'channels'}->{$channelName})); |
343 |
|
|
344 |
|
my $channel=$self->{'channels'}->{$channelName}; |
345 |
|
$channel->removeSubscriber($self); |
346 |
|
|
347 |
|
delete($self->{'channels'}->{$channelName}); |
348 |
|
|
349 |
|
$self->close() if(scalar(keys %{$self->{'channels'}})==0); |
350 |
|
} |
351 |
|
|
352 |
sub close { |
sub close { |
353 |
my $self=shift; |
my $self=shift; |
354 |
my $noShutdownMsg=shift; |
my $noShutdownMsg=shift; |
355 |
|
|
356 |
$self->{'channel'}->removeSubscriber($self) if($self->{'channel'}); |
foreach my $channelName (keys %{$self->{'channels'}}) |
357 |
delete($self->{'channel'}); |
{ |
358 |
|
my $channel=$self->{'channels'}->{$channelName}; |
359 |
|
$channel->removeSubscriber($self); |
360 |
|
} |
361 |
|
delete($self->{'channels'}); |
362 |
|
|
363 |
if(exists($self->{'subscriberID'})) |
if(exists($self->{'subscriberID'})) |
364 |
{ |
{ |