GSM-SMS
view release on metacpan or search on metacpan
lib/GSM/SMS/NBS/Stack.pm view on Meta::CPAN
package GSM::SMS::NBS::Stack;
use GSM::SMS::PDU;
use Data::Dumper;
$VERSION = "0.161";
# $__NBSSTACK_PRINT++;
# Keep the packets alive for 1 day
$__TIME_TO_LIVE = 60*60*24;
# Constructor
sub new {
my $proto = shift;
my $class = ref($proto) || $proto;
my $self = {};
$self->{STACK} = {};
my %arg = @_;
$self->{TRANSPORT} = $arg{"-transport"};
bless($self, $class);
return $self;
}
# receive NBS/SMS messages
sub receive {
my ($self, $ref_oa, $ref_msg, $ref_timestamp, $ref_transport, $ref_port, $block, $ref_csca) =@_;
my ($stack) = $self->{STACK};
my $t = $self->{TRANSPORT};
$self->_prt( "entering receive" );
while ($self->_complete_message_on_stack($stack, $ref_oa, $ref_msg, $ref_timestamp, $ref_transport, $ref_port, $ref_csca)) {
$self->_prt( "CHECK\n" );
# look for new datagrams on the stack
foreach my $transporter ( $t->get_transports() ) {
$self->_prt( "x" );
$self->_prt( "T: " . $transporter->get_name() . "\n" );
my $pdu;
if (!$transporter->receive(\$pdu)) {
$self->_prt( "SOMETHING\n" );
$self->_place_message_on_stack($stack, $pdu, $transporter->get_name());
$self->_prt( "RCV: $pdu\n" );
}
}
# Do some garbage collection -> when a datagram is not complete after a certain time frame
# +/- 2h then delete this datagram from the stack! (Long living stack with 'dead' messages.
$self->_garbage_collect($stack);
select(undef, undef, undef, 0.25);
return -1 unless $block;
$self->_prt( "BLOCKING LOOP" );
}
return 0;
}
sub _complete_message_on_stack {
my ($self, $stack, $ref_oa, $ref_msg, $ref_timestamp, $ref_transport, $ref_port, $ref_csca) = @_;
my ($message, $complete, $msisdn, $timestamp, $transport, $port, $csca);
my ($oa_del, $dg_del);
$self->_prt( "IN ($stack)\n" );
foreach my $i (keys %$stack) {
my $oa = $stack->{$i};
( run in 2.396 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )