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 )