132 |
my $startIndex=undef; |
my $startIndex=undef; |
133 |
my $backtrack=undef; |
my $backtrack=undef; |
134 |
my $persist=1; |
my $persist=1; |
135 |
|
my $anyPersist=0; |
136 |
my $subscriberID=undef; |
my $subscriberID=undef; |
137 |
|
my $channels={}; |
138 |
foreach my $formElement (@formData) |
foreach my $formElement (@formData) |
139 |
{ |
{ |
140 |
if($formElement=~/^channel=(.+)$/) |
if($formElement=~/^channel=(.+)$/) |
141 |
{ |
{ |
142 |
|
if(defined($channelName)) |
143 |
|
{ |
144 |
|
if(defined($startIndex) && defined($backtrack)) |
145 |
|
{ |
146 |
|
$self->emitHeader("404 Cannot use both 'restartfrom' and 'backtrack'"); |
147 |
|
$self->close(); |
148 |
|
|
149 |
|
return; |
150 |
|
} |
151 |
|
|
152 |
|
$startIndex=-$backtrack if(!defined($startIndex) && defined($backtrack)); |
153 |
|
$channels->{$channelName}->{'startIndex'}=$startIndex; |
154 |
|
$channels->{$channelName}->{'persist'}=$persist; |
155 |
|
$anyPersist|=$persist; |
156 |
|
|
157 |
|
$startIndex=undef; |
158 |
|
$backtrack=undef; |
159 |
|
$persist=1; |
160 |
|
} |
161 |
$channelName=$1; |
$channelName=$1; |
162 |
} |
} |
163 |
elsif($formElement=~/^restartfrom=(\d*)$/) |
elsif($formElement=~/^restartfrom=(\d*)$/) |
197 |
} |
} |
198 |
} |
} |
199 |
} |
} |
|
|
|
|
delete($self->{'headerBuffer'}); |
|
200 |
|
|
201 |
if(defined($startIndex) && defined($backtrack)) |
if(defined($channelName)) |
202 |
{ |
{ |
203 |
$self->emitHeader("404 Cannot use both 'restartfrom' and 'backtrack'"); |
if(defined($startIndex) && defined($backtrack)) |
204 |
$self->close(); |
{ |
205 |
|
$self->emitHeader("404 Cannot use both 'restartfrom' and 'backtrack'"); |
206 |
|
$self->close(); |
207 |
|
|
208 |
|
return; |
209 |
|
} |
210 |
|
|
211 |
return; |
$startIndex=-$backtrack if(!defined($startIndex) && defined($backtrack)); |
212 |
|
$channels->{$channelName}->{'startIndex'}=$startIndex; |
213 |
|
$channels->{$channelName}->{'persist'}=$persist; |
214 |
|
$anyPersist|=$persist; |
215 |
} |
} |
216 |
|
|
217 |
if(defined($subscriberID) && $persist) |
delete($self->{'headerBuffer'}); |
218 |
|
|
219 |
|
if(defined($subscriberID) && $anyPersist) |
220 |
{ |
{ |
221 |
$self->{'subscriberID'}=$subscriberID; |
$self->{'subscriberID'}=$subscriberID; |
222 |
$self->deleteSubscriberWithID($subscriberID); |
$self->deleteSubscriberWithID($subscriberID); |
223 |
$PersistentConnections{$subscriberID}=$self; |
$PersistentConnections{$subscriberID}=$self; |
224 |
} |
} |
225 |
|
|
226 |
if(defined($channelName)) |
if(scalar(keys %{$channels})) |
227 |
{ |
{ |
228 |
$self->emitOKHeader(); |
$self->emitOKHeader(); |
229 |
|
|
230 |
$startIndex=-$backtrack if(!defined($startIndex) && defined($backtrack)); |
$self->setChannels($channels); |
|
|
|
|
$self->setChannelName($channelName,$startIndex,$persist); |
|
231 |
|
|
232 |
$self->close(1) unless($persist); |
$self->close(1) unless($anyPersist); |
233 |
|
|
234 |
return; |
return; |
235 |
} |
} |
250 |
} |
} |
251 |
} |
} |
252 |
|
|
253 |
sub setChannelName { |
sub setChannels { |
254 |
my $self=shift; |
my $self=shift; |
255 |
my $channelName=shift; |
my $channels=shift; |
|
my $startIndex=shift; |
|
|
my $persist=shift; |
|
|
|
|
|
my $channel=Meteor::Channel->channelWithName($channelName); |
|
|
$self->{'channel'}=$channel if($persist); |
|
256 |
|
|
257 |
$channel->addSubscriber($self,$startIndex,$persist); |
foreach my $channelName (keys %{$channels}) |
258 |
|
{ |
259 |
|
my $persist=$channels->{$channelName}->{'persist'}; |
260 |
|
my $startIndex=$channels->{$channelName}->{'startIndex'}; |
261 |
|
|
262 |
|
my $channel=Meteor::Channel->channelWithName($channelName); |
263 |
|
|
264 |
|
$self->{'channels'}->{$channelName}=$channel if($persist); |
265 |
|
|
266 |
|
$channel->addSubscriber($self,$startIndex,$persist); |
267 |
|
} |
268 |
} |
} |
269 |
|
|
270 |
sub emitOKHeader { |
sub emitOKHeader { |
341 |
} |
} |
342 |
} |
} |
343 |
|
|
344 |
|
sub closeChannel { |
345 |
|
my $self=shift; |
346 |
|
my $channelName=shift; |
347 |
|
|
348 |
|
return unless(exists($self->{'channels'}->{$channelName})); |
349 |
|
|
350 |
|
my $channel=$self->{'channels'}->{$channelName}; |
351 |
|
$channel->removeSubscriber($self); |
352 |
|
|
353 |
|
delete($self->{'channels'}->{$channelName}); |
354 |
|
|
355 |
|
$self->close() if(scalar(keys %{$self->{'channels'}})==0); |
356 |
|
} |
357 |
|
|
358 |
sub close { |
sub close { |
359 |
my $self=shift; |
my $self=shift; |
360 |
my $noShutdownMsg=shift; |
my $noShutdownMsg=shift; |
361 |
|
|
362 |
$self->{'channel'}->removeSubscriber($self) if($self->{'channel'}); |
foreach my $channelName (keys %{$self->{'channels'}}) |
363 |
delete($self->{'channel'}); |
{ |
364 |
|
my $channel=$self->{'channels'}->{$channelName}; |
365 |
|
$channel->removeSubscriber($self); |
366 |
|
} |
367 |
|
delete($self->{'channels'}); |
368 |
|
|
369 |
if(exists($self->{'subscriberID'})) |
if(exists($self->{'subscriberID'})) |
370 |
{ |
{ |