:pserver:anonymous@intra.tektonica.com:/opt/cvs - gsmperl - Fri Dec 21 07:37 CET...
[gsmperl.git] / GSM / SMS / Transport / NovelSoft.pm
1 package GSM::SMS::Transport::NovelSoft;
2
3 #
4 # HTTP access to the NovelSoft (sms-wap.com) SMS center
5 #
6
7 use GSM::SMS::Transport::Transport;
8 @ISA = qw(GSM::SMS::Transport::Transport);
9
10 $VERSION = '0.1';
11
12 use HTTP::Request::Common qw(POST);
13 use LWP::UserAgent;
14 use URI::URL qw(url);
15 use GSM::SMS::PDU;
16 use GSM::SMS::Log;
17 use Data::Dumper;
18
19 # All the parameters I need to run
20 my @config_vars = qw( 
21         name
22         proxy
23         userid
24         password
25         originator
26         smsserver
27         backupsmsserver
28         match
29         spoolout
30                                         );
31
32 # constructor
33 sub new {
34         my $proto = shift;
35         my $class = ref($proto) || $proto;
36
37         my $self = {};
38         $self->{cfg} = shift;
39         
40         $self->{'__LOGGER__'} = GSM::SMS::Log->new( $self->{cfg}->{"log"} );
41         
42         bless($self, $class);
43         return $self;
44
45
46
47 # Send a (PDU encoded) message  
48 sub send        {
49         my ($self, $msisdn, $pdu) = @_;
50         my $logger = $self->{'__LOGGER__'};
51
52         $logger->logentry("send [$pdu]") if $logger;
53
54         $self->_add_to_spool( $msisdn, $pdu, $self->{cfg}->{"spoolout"} );
55         if ( $self->_transmit($pdu, $self->{cfg}->{"smsserver"}) ) {
56                 # trying backup
57                 if ( $self->_transmit($pdu, $self->{cfg}->{"backupsmsserver"}) ) {    
58                         $logger->logentry( "Error sending" ) if $logger;        
59                         return -1;
60                 }
61         }
62         $self->_remove_from_spool( $msisdn, $pdu, $self->{cfg}->{"spoolout"} );
63         return 0;
64 };
65
66 # Receive a PDU encoded message
67 #       $ is a ref to a PDU string
68 #       return
69 #       0 if PDU received
70 #       -1 if no message pending  
71 sub receive     {
72         my ($self, $pduref) = @_;
73
74         return -1;
75 };      
76  
77
78 # Close
79 sub close        {
80         my ($self) = @_;
81         my $logger = $self->{'__LOGGER__'};
82
83         $logger->logentry("NovelSoft Transport ended.") if $logger;
84 }
85
86 # A ping command .. just return an informative string on success
87 sub ping {
88         my ($self) = @_;
89
90         return "Pong.. NovelSoft  transport ok";
91 }
92
93
94 # give out the needed config paramters
95 sub get_config_parameters {
96         my ($self) = @_;
97
98         return @config_vars;
99 }
100
101 # Do we have a valid route for this msisdn
102 sub has_valid_route {
103         my ($self, $msisdn) = @_;
104
105         # print "in route\n";
106         # print Dumper $self->{cfg};
107         foreach my $route ( split /,/, $self->{cfg}->{"match"} ) {
108                 # print $route;
109                 return -1 if $msisdn =~ /$route/;
110         }
111         return 0;
112 }
113
114 #####################################################################
115 # transport specific
116 #####################################################################
117 sub _transmit {
118         my ($self, $pdustr, $server) = @_;
119
120         my $logger = $self->{'__LOGGER__'};
121
122         my $uid = $self->{cfg}->{"userid"};
123         my $pwd = $self->{cfg}->{"password"};
124         my $originator = $self->{cfg}->{"originator"};
125         my $proxy = $self->{cfg}->{"proxy"};
126         my $url = url( $server );
127         my $msg;
128         my $decoder = GSM::SMS::PDU->new();
129         my ($da, $pdutype, $dcs, $udh, $payload) = $decoder->SMSSubmit_decode($pdustr); 
130
131         $da=~s/^\+//;
132
133         if (length($udh) > 0) {
134                 $udh = '01' . sprintf("%02X", int(length($udh)/2)) . $udh;
135                 $msg="|$udh|$payload";
136         } else {
137                 $msg=$payload;
138         }
139
140         my $ua = LWP::UserAgent->new();
141         $ua->proxy( 'http', $proxy ) if ( $proxy ne "" );
142         my $req = POST "$server",
143                                 [ 
144                                 UID => $uid, 
145                                 PW => $pwd, 
146                                 N => $da, 
147                                 O => $originator,
148                                 M => $msg 
149                                 ];
150
151         $req->header( Host => $url->host );
152
153         my $res = $ua->request($req);
154
155         # print "#" x 80 . "\n";
156         # print $res->content;
157         # print "#" x 80 . "\n";
158
159         if ($res->is_success) {
160                 my $content = $res->content;
161                 $logger->logentry( "return: $content" ) if $logger;
162                 return 0 if ($content=~/01/);
163                 return -1;
164         } else {
165                 $logger->logentry( "error!" ) if $logger;
166                 $logger->logentry( $res->error_as_HTML ) if $logger;
167                 return -1;
168         }
169 }
170
171 sub _add_to_spool {
172         my ($self, $msisdn, $pdu, $dir) = @_;
173         local *F;
174         
175         my $filename = $self->_create_spoolname($msisdn, $pdu);
176         open F, ">".$dir."/".$filename;
177         print F $pdu;
178         CORE::close( F );
179 }
180
181
182 sub _remove_from_spool {
183         my ($self, $msisdn, $pdu, $dir) = @_;
184         
185         my $filename =  $self->_create_spoolname($msisdn, $pdu);
186         unlink( $dir."/".$filename );
187 }
188
189 sub _create_spoolname {
190         my ($self, $msisdn, $pdu) = @_;
191         
192         $msisdn =~ s/^\+//;
193         my $filename = $msisdn . "_" . $$ . time . substr($pdu,-32);
194         return $filename;
195 }
196
197 1;
198
199 =head1 NAME
200
201 GSM::SMS::Transport::NovelSoft
202
203 =head1 DESCRIPTION
204
205 Implements a ( send-only ) transport for the www.sms-wap.com http based sms center. This is a swiss company and they provide a very nice service. A pity that all, but one, GSM operator stopped roaming with Swiss. this way it is not possible anymore for us ( Belgium ) to use this service ... But they have still more then 1 hundred countries served! 
206
207 Also can do PDU messages and as such can be used to send NBS messages.
208
209 =head1 AUTHOR
210
211 Johan Van den Brande <johan@vandenbrande.com>
212
213