# Device::Gsm::Sms::Token - SMS PDU message parser token
# Copyright (C) 2002-2006 Cosimo Streppone, cosimo@cpan.org
#
# This program is free software; you can redistribute it and/or modify
# it only under the terms of Perl itself.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# Perl licensing terms for details.
#
# Commercial support is available. Write me if you are
# interested in new features or software support.
#
# $Id$
package Sms::Token;
use strict;
use integer;
use Carp 'croak';
# Token possible states
use constant ERROR => 0;
use constant ENCODED => 1;
use constant DECODED => 2;
#
# new token ( @data )
#
sub new {
my($proto, $name, $options ) = @_;
# my $class = ref $proto || $proto;
$options->{'data'} ||= [];
# Cannot load a token without its name
if( ! defined $name || $name eq '' ) {
return undef;
}
# Create basic structure for a token
my %token = (
# Name of token, see ->name()
__name => $name,
# Data that token contains
__data => $options->{'data'},
# Decoded? or error?
__state => '',
# This is used to access other tokens in the "message"
__messageTokens => $options->{'messageTokens'}
);
# Dynamically load required token module
eval { require "Device/Gsm/Sms/Token/$name.pm" };
if( $@ ) {
warn('cannot load Device::Gsm::Sms::Token::'.$name.' plug-in for decoding. Error: '.$@);
return undef;
}
# Try "static blessing" =:-o and see if it works
bless \%token, 'Sms::Token::'.$name;
}
#
# Get/set internal token data
#
sub data {
my $self = shift;
if( @_ ) {
if( ! defined $_[0] ) {
$self->{'__data'} = [];
} else {
$self->{'__data'} = [ @_ ];
}
}
$self->{'__data'};
}
# Must be implemented in real token
sub decode {
croak( 'decode() not implemented in token base class');
return 0;
}
# Must be implemented in real token
sub encode {
croak( 'encode() not implemented in token base class');
return 0;
}
sub get {
my($self, $info) = @_;
return undef unless $info;
return $self->{"_$info"};
}
# XXX This must be filled by the higher level object that
# treats the entire message in tokens
#
# [token]->messageTokens( [name] )
#
sub messageTokens {
# Usually this is a hash of token objects, accessible by key (token name)
my $self = shift;
my $name;
if( @_ ) {
$name = shift;
}
if( defined $name ) {
return $self->{'__messageTokens'}->{$name};
} else {
return $self->{'__messageTokens'};
}
}
sub name {
my $self = shift;
return $self->{'__name'};
}
sub set {
my($self, $info, $newval) = @_;
return undef unless $info;
$newval = undef unless defined $newval;
$self->{"_$info"} = $newval;
}
sub state {
my $self = shift;
return $self->{'__state'};
}
sub toString {
my $self = shift;
my $string;
if( ref $self->{'__data'} eq 'ARRAY' ) {
$string = join '', @{$self->{'__data'}};
}
return $string;
}
1;