anjlab-ruby-smpp 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. data/CHANGELOG +52 -0
  2. data/CONTRIBUTORS.txt +11 -0
  3. data/Gemfile +8 -0
  4. data/Gemfile.lock +18 -0
  5. data/LICENSE +20 -0
  6. data/README.rdoc +89 -0
  7. data/Rakefile +53 -0
  8. data/VERSION +1 -0
  9. data/config/environment.rb +2 -0
  10. data/examples/PDU1.example +26 -0
  11. data/examples/PDU2.example +26 -0
  12. data/examples/sample_gateway.rb +137 -0
  13. data/examples/sample_smsc.rb +102 -0
  14. data/lib/smpp.rb +25 -0
  15. data/lib/smpp/base.rb +308 -0
  16. data/lib/smpp/encoding/utf8_encoder.rb +37 -0
  17. data/lib/smpp/optional_parameter.rb +35 -0
  18. data/lib/smpp/pdu/base.rb +183 -0
  19. data/lib/smpp/pdu/bind_base.rb +25 -0
  20. data/lib/smpp/pdu/bind_receiver.rb +4 -0
  21. data/lib/smpp/pdu/bind_receiver_response.rb +4 -0
  22. data/lib/smpp/pdu/bind_resp_base.rb +17 -0
  23. data/lib/smpp/pdu/bind_transceiver.rb +4 -0
  24. data/lib/smpp/pdu/bind_transceiver_response.rb +4 -0
  25. data/lib/smpp/pdu/deliver_sm.rb +142 -0
  26. data/lib/smpp/pdu/deliver_sm_response.rb +12 -0
  27. data/lib/smpp/pdu/enquire_link.rb +11 -0
  28. data/lib/smpp/pdu/enquire_link_response.rb +11 -0
  29. data/lib/smpp/pdu/generic_nack.rb +20 -0
  30. data/lib/smpp/pdu/submit_multi.rb +68 -0
  31. data/lib/smpp/pdu/submit_multi_response.rb +49 -0
  32. data/lib/smpp/pdu/submit_sm.rb +91 -0
  33. data/lib/smpp/pdu/submit_sm_response.rb +31 -0
  34. data/lib/smpp/pdu/unbind.rb +11 -0
  35. data/lib/smpp/pdu/unbind_response.rb +12 -0
  36. data/lib/smpp/receiver.rb +27 -0
  37. data/lib/smpp/server.rb +223 -0
  38. data/lib/smpp/transceiver.rb +109 -0
  39. data/lib/sms.rb +9 -0
  40. data/ruby-smpp.gemspec +96 -0
  41. data/test/delegate.rb +28 -0
  42. data/test/encoding_test.rb +231 -0
  43. data/test/optional_parameter_test.rb +30 -0
  44. data/test/pdu_parsing_test.rb +111 -0
  45. data/test/receiver_test.rb +232 -0
  46. data/test/responsive_delegate.rb +53 -0
  47. data/test/server.rb +56 -0
  48. data/test/smpp_test.rb +239 -0
  49. data/test/submit_sm_test.rb +40 -0
  50. data/test/transceiver_test.rb +35 -0
  51. metadata +133 -0
data/test/smpp_test.rb ADDED
@@ -0,0 +1,239 @@
1
+ require 'rubygems'
2
+ require 'test/unit'
3
+ require 'smpp'
4
+ require 'server'
5
+ require 'delegate'
6
+ require 'responsive_delegate'
7
+
8
+ class Poller
9
+ def start
10
+
11
+ end
12
+ end
13
+
14
+
15
+ class SmppTest < Test::Unit::TestCase
16
+
17
+ def config
18
+ Server::config
19
+ end
20
+
21
+ def test_transceiver_should_bind_and_unbind_then_stop
22
+ EventMachine.run {
23
+ EventMachine.start_server "localhost", 9000, Server::Unbind
24
+ EventMachine.connect "localhost", 9000, Smpp::Transceiver, config, Delegate.new
25
+ }
26
+ # should not hang here: the server's response should have caused the client to terminate
27
+ end
28
+
29
+ def test_transceiver_api_should_respond_to_message_rejected
30
+ $tx = nil
31
+ delegate = ResponsiveDelegate.new
32
+ EventMachine.run {
33
+ EventMachine.start_server "localhost", 9000, Server::SubmitSmResponseWithErrorStatus
34
+ $tx = EventMachine.connect "localhost", 9000, Smpp::Transceiver, config, delegate
35
+ }
36
+ assert_equal(delegate.event_counter[:message_rejected], 1)
37
+ end
38
+
39
+ def test_bind_transceiver
40
+ pdu1 = Smpp::Pdu::BindTransceiver.new(
41
+ config[:system_id],
42
+ config[:password],
43
+ config[:system_type],
44
+ config[:source_ton],
45
+ config[:source_npi],
46
+ config[:source_address_range]
47
+ )
48
+
49
+ pdu2 = Smpp::Pdu::Base.create(pdu1.data)
50
+
51
+ assert_instance_of(Smpp::Pdu::BindTransceiver, pdu2)
52
+ assert_equal(pdu1.system_id, pdu2.system_id)
53
+ assert_equal(pdu1.password, pdu2.password)
54
+ assert_equal(pdu1.system_type, pdu2.system_type)
55
+ assert_equal(pdu1.addr_ton, pdu2.addr_ton)
56
+ assert_equal(pdu1.addr_npi, pdu2.addr_npi)
57
+ assert_equal(pdu1.address_range, pdu2.address_range)
58
+ assert_equal(pdu1.sequence_number, pdu2.sequence_number)
59
+ assert_equal(pdu1.command_status, pdu2.command_status)
60
+ end
61
+
62
+ def test_bind_transceiver_response
63
+ pdu1 = Smpp::Pdu::BindTransceiverResponse.new(nil, Smpp::Pdu::Base::ESME_ROK, config[:system_id])
64
+ pdu2 = Smpp::Pdu::Base.create(pdu1.data)
65
+ assert_instance_of(Smpp::Pdu::BindTransceiverResponse, pdu2)
66
+ assert_equal(pdu1.system_id, pdu2.system_id)
67
+ assert_equal(pdu1.sequence_number, pdu2.sequence_number)
68
+ assert_equal(pdu1.command_status, pdu2.command_status)
69
+ end
70
+
71
+ def test_deliver_sm
72
+ pdu1 = Smpp::Pdu::DeliverSm.new( '11111', '1111111111', "This is a test" )
73
+ pdu2 = Smpp::Pdu::Base.create(pdu1.data)
74
+ assert_instance_of(Smpp::Pdu::DeliverSm, pdu2)
75
+ assert_equal(pdu1.udh, pdu2.udh)
76
+ assert_equal(pdu1.short_message, pdu2.short_message)
77
+ assert_equal(pdu1.service_type, pdu2.service_type)
78
+ assert_equal(pdu1.source_addr_ton, pdu2.source_addr_ton)
79
+ assert_equal(pdu1.source_addr_npi, pdu2.source_addr_npi)
80
+ assert_equal(pdu1.source_addr, pdu2.source_addr)
81
+ assert_equal(pdu1.dest_addr_ton, pdu2.dest_addr_ton)
82
+ assert_equal(pdu1.dest_addr_npi, pdu2.dest_addr_npi)
83
+ assert_equal(pdu1.destination_addr, pdu2.destination_addr)
84
+ assert_equal(pdu1.esm_class, pdu2.esm_class)
85
+ assert_equal(pdu1.protocol_id, pdu2.protocol_id)
86
+ assert_equal(pdu1.priority_flag, pdu2.priority_flag)
87
+ assert_equal(pdu1.schedule_delivery_time, pdu2.schedule_delivery_time)
88
+ assert_equal(pdu1.validity_period, pdu2.validity_period)
89
+ assert_equal(pdu1.registered_delivery, pdu2.registered_delivery)
90
+ assert_equal(pdu1.replace_if_present_flag, pdu2.replace_if_present_flag)
91
+ assert_equal(pdu1.data_coding, pdu2.data_coding)
92
+ assert_equal(pdu1.sm_default_msg_id, pdu2.sm_default_msg_id)
93
+ assert_equal(pdu1.sm_length, pdu2.sm_length)
94
+ assert_equal(pdu1.stat, pdu2.stat)
95
+ assert_equal(pdu1.msg_reference, pdu2.msg_reference)
96
+ assert_equal(pdu1.sequence_number, pdu2.sequence_number)
97
+ assert_equal(pdu1.command_status, pdu2.command_status)
98
+ end
99
+
100
+ def test_submit_sm
101
+ pdu1 = Smpp::Pdu::SubmitSm.new( '11111', '1111111111', "This is a test" )
102
+ pdu2 = Smpp::Pdu::Base.create(pdu1.data)
103
+ assert_instance_of(Smpp::Pdu::SubmitSm, pdu2)
104
+ assert_equal(pdu1.udh, pdu2.udh)
105
+ assert_equal(pdu1.short_message, pdu2.short_message)
106
+ assert_equal(pdu1.service_type, pdu2.service_type)
107
+ assert_equal(pdu1.source_addr_ton, pdu2.source_addr_ton)
108
+ assert_equal(pdu1.source_addr_npi, pdu2.source_addr_npi)
109
+ assert_equal(pdu1.source_addr, pdu2.source_addr)
110
+ assert_equal(pdu1.dest_addr_ton, pdu2.dest_addr_ton)
111
+ assert_equal(pdu1.dest_addr_npi, pdu2.dest_addr_npi)
112
+ assert_equal(pdu1.destination_addr, pdu2.destination_addr)
113
+ assert_equal(pdu1.esm_class, pdu2.esm_class)
114
+ assert_equal(pdu1.protocol_id, pdu2.protocol_id)
115
+ assert_equal(pdu1.priority_flag, pdu2.priority_flag)
116
+ assert_equal(pdu1.schedule_delivery_time, pdu2.schedule_delivery_time)
117
+ assert_equal(pdu1.validity_period, pdu2.validity_period)
118
+ assert_equal(pdu1.registered_delivery, pdu2.registered_delivery)
119
+ assert_equal(pdu1.replace_if_present_flag, pdu2.replace_if_present_flag)
120
+ assert_equal(pdu1.data_coding, pdu2.data_coding)
121
+ assert_equal(pdu1.sm_default_msg_id, pdu2.sm_default_msg_id)
122
+ assert_equal(pdu1.sm_length, pdu2.sm_length)
123
+ assert_equal(pdu1.sequence_number, pdu2.sequence_number)
124
+ assert_equal(pdu1.command_status, pdu2.command_status)
125
+ end
126
+
127
+ def test_submit_sm_receiving_invalid_status
128
+ pdu1 = Smpp::Pdu::SubmitSm.new( '11111', '1111111111', "This is a test" )
129
+ pdu2 = Smpp::Pdu::Base.create(pdu1.data)
130
+ end
131
+
132
+ def test_deliver_sm_response
133
+ pdu1 = Smpp::Pdu::DeliverSmResponse.new( nil )
134
+ pdu2 = Smpp::Pdu::Base.create(pdu1.data)
135
+ assert_instance_of(Smpp::Pdu::DeliverSmResponse, pdu2)
136
+ assert_equal(pdu1.sequence_number, pdu2.sequence_number)
137
+ assert_equal(pdu1.command_status, pdu2.command_status)
138
+ end
139
+
140
+ def test_submit_sm_response
141
+ pdu1 = Smpp::Pdu::SubmitSmResponse.new( nil, Smpp::Pdu::Base::ESME_ROK, 3 )
142
+ pdu2 = Smpp::Pdu::Base.create(pdu1.data)
143
+ assert_instance_of(Smpp::Pdu::SubmitSmResponse, pdu2)
144
+ assert_equal(pdu1.sequence_number, pdu2.sequence_number)
145
+ assert_equal(pdu1.command_status, pdu2.command_status)
146
+ end
147
+
148
+ def test_enquire_link
149
+ pdu1 = Smpp::Pdu::EnquireLink.new( )
150
+ pdu2 = Smpp::Pdu::Base.create(pdu1.data)
151
+ assert_instance_of(Smpp::Pdu::EnquireLink, pdu2)
152
+ assert_equal(pdu1.sequence_number, pdu2.sequence_number)
153
+ assert_equal(pdu1.command_status, pdu2.command_status)
154
+ end
155
+
156
+ def test_enquire_link_resp
157
+ pdu1 = Smpp::Pdu::EnquireLinkResponse.new( )
158
+ pdu2 = Smpp::Pdu::Base.create(pdu1.data)
159
+ assert_instance_of(Smpp::Pdu::EnquireLinkResponse, pdu2)
160
+ assert_equal(pdu1.sequence_number, pdu2.sequence_number)
161
+ assert_equal(pdu1.command_status, pdu2.command_status)
162
+ end
163
+
164
+ def test_generic_nack
165
+ pdu1 = Smpp::Pdu::GenericNack.new(nil, Smpp::Pdu::Base::ESME_RTHROTTLED )
166
+ pdu2 = Smpp::Pdu::Base.create(pdu1.data)
167
+ assert_instance_of(Smpp::Pdu::GenericNack, pdu2)
168
+ assert_equal(pdu1.sequence_number, pdu2.sequence_number)
169
+ assert_equal(pdu1.command_status, pdu2.command_status)
170
+ end
171
+
172
+ def test_unbind
173
+ pdu1 = Smpp::Pdu::Unbind.new()
174
+ pdu2 = Smpp::Pdu::Base.create(pdu1.data)
175
+ assert_instance_of(Smpp::Pdu::Unbind, pdu2)
176
+ assert_equal(pdu1.sequence_number, pdu2.sequence_number)
177
+ assert_equal(pdu1.command_status, pdu2.command_status)
178
+ end
179
+
180
+ def test_unbind_response
181
+ pdu1 = Smpp::Pdu::UnbindResponse.new(nil, Smpp::Pdu::Base::ESME_ROK)
182
+ pdu2 = Smpp::Pdu::Base.create(pdu1.data)
183
+ assert_instance_of(Smpp::Pdu::UnbindResponse, pdu2)
184
+ assert_equal(pdu1.sequence_number, pdu2.sequence_number)
185
+ assert_equal(pdu1.command_status, pdu2.command_status)
186
+ end
187
+
188
+ #TODO: This test is known to fail since this portion of the library is incomplete.
189
+ def _todo_test_submit_multi
190
+ pdu1 = Smpp::Pdu::SubmitMulti.new( '11111', ['1111111111','1111111112','1111111113'], "This is a test" )
191
+ pdu2 = Smpp::Pdu::Base.create(pdu1.data)
192
+ assert_instance_of(Smpp::Pdu::SubmitMulti, pdu2)
193
+ assert_equal(pdu1.udh, pdu2.udh)
194
+ assert_equal(pdu1.short_message, pdu2.short_message)
195
+ assert_equal(pdu1.service_type, pdu2.service_type)
196
+ assert_equal(pdu1.source_addr_ton, pdu2.source_addr_ton)
197
+ assert_equal(pdu1.source_addr_npi, pdu2.source_addr_npi)
198
+ assert_equal(pdu1.source_addr, pdu2.source_addr)
199
+ assert_equal(pdu1.dest_addr_ton, pdu2.dest_addr_ton)
200
+ assert_equal(pdu1.dest_addr_npi, pdu2.dest_addr_npi)
201
+ assert_equal(pdu1.destination_addr_array, pdu2.destination_addr_array)
202
+ assert_equal(pdu1.esm_class, pdu2.esm_class)
203
+ assert_equal(pdu1.protocol_id, pdu2.protocol_id)
204
+ assert_equal(pdu1.priority_flag, pdu2.priority_flag)
205
+ assert_equal(pdu1.schedule_delivery_time, pdu2.schedule_delivery_time)
206
+ assert_equal(pdu1.validity_period, pdu2.validity_period)
207
+ assert_equal(pdu1.registered_delivery, pdu2.registered_delivery)
208
+ assert_equal(pdu1.replace_if_present_flag, pdu2.replace_if_present_flag)
209
+ assert_equal(pdu1.data_coding, pdu2.data_coding)
210
+ assert_equal(pdu1.sm_default_msg_id, pdu2.sm_default_msg_id)
211
+ assert_equal(pdu1.sm_length, pdu2.sm_length)
212
+ assert_equal(pdu1.sequence_number, pdu2.sequence_number)
213
+ assert_equal(pdu1.command_status, pdu2.command_status)
214
+ end
215
+
216
+ def _test_submit_multi_response
217
+ smes = [
218
+ Smpp::Pdu::SubmitMultiResponse::UnsuccessfulSme.new(1,1,'1111111111', Smpp::Pdu::Base::ESME_RINVDSTADR),
219
+ Smpp::Pdu::SubmitMultiResponse::UnsuccessfulSme.new(1,1,'1111111112', Smpp::Pdu::Base::ESME_RINVDSTADR),
220
+ Smpp::Pdu::SubmitMultiResponse::UnsuccessfulSme.new(1,1,'1111111113', Smpp::Pdu::Base::ESME_RINVDSTADR),
221
+ ]
222
+ pdu1 = Smpp::Pdu::SubmitMultiResponse.new( nil, Smpp::Pdu::Base::ESME_ROK, '3', smes )
223
+ pdu2 = Smpp::Pdu::Base.create(pdu1.data)
224
+
225
+ assert_instance_of(Smpp::Pdu::SubmitMultiResponse, pdu2)
226
+ assert_equal(pdu1.unsuccess_smes, pdu2.unsuccess_smes)
227
+ assert_equal(pdu1.sequence_number, pdu2.sequence_number)
228
+ assert_equal(pdu1.command_status, pdu2.command_status)
229
+ end
230
+
231
+ def test_should_parse_ref_and_stat_from_deliver_sm
232
+ direct = Smpp::Pdu::DeliverSm.new( '1', '2', "419318028472222#id:11f8f46639bd4f7a209016e1a181e3ae sub:001 dlvrd:001 submit date:0902191702 done date:0902191702 stat:DELIVRD err:000 Text:TVILLING: Sl? ut h?'!11f8f46639bd4f7a209016e1a181e3ae", :esm_class => 4)
233
+ parsed = Smpp::Pdu::Base.create(direct.data)
234
+ assert_equal("DELIVRD", parsed.stat)
235
+ assert_equal("11f8f46639bd4f7a209016e1a181e3ae", parsed.msg_reference)
236
+ end
237
+
238
+
239
+ end
@@ -0,0 +1,40 @@
1
+ require 'rubygems'
2
+ require 'test/unit'
3
+ require 'smpp'
4
+
5
+ class SubmitSmTest < Test::Unit::TestCase
6
+
7
+ def test_this_is_not_a_real_test
8
+ value = [383 >> 8, 383 & 0xff]
9
+ optionals = {0x2150 => Smpp::OptionalParameter.new(0x2150, value.pack('cc'))}
10
+ pdu = Smpp::Pdu::SubmitSm.new('12345', '54321', "Ba Ba Boosh", {:optional_parameters => optionals})
11
+ Smpp::Base.hex_debug(pdu.data)
12
+ puts "PDU DATA", pdu.data.inspect
13
+
14
+ end
15
+
16
+ def test_fixnum_optional_parameter
17
+ value = [383 >> 8, 383 & 0xff]
18
+ optionals = {0x2150 => Smpp::OptionalParameter.new(0x2150, value.pack('cc'))}
19
+
20
+ pdu = Smpp::Pdu::SubmitSm.new('12345', '54321', "Ba Ba Boosh", {:optional_parameters => optionals})
21
+ pdu_from_wire = Smpp::Pdu::Base.create(pdu.data)
22
+
23
+ assert optional = pdu_from_wire.optional_parameters[0x2150]
24
+
25
+ optional_value = optional[:value].unpack('n')[0]
26
+ assert_equal 383, optional_value
27
+ end
28
+
29
+ def test_string_optional_parameter
30
+ optionals = {0x2150 => Smpp::OptionalParameter.new(0x2150, "boosh")}
31
+
32
+ pdu = Smpp::Pdu::SubmitSm.new('12345', '54321', "Ba Ba Boosh", {:optional_parameters => optionals})
33
+ pdu_from_wire = Smpp::Pdu::Base.create(pdu.data)
34
+
35
+ assert optional = pdu_from_wire.optional_parameters[0x2150]
36
+
37
+ optional_value = optional[:value].unpack("A*")[0]
38
+ assert_equal 'boosh', optional_value
39
+ end
40
+ end
@@ -0,0 +1,35 @@
1
+ require "rubygems"
2
+ require "test/unit"
3
+ require File.expand_path(File.dirname(__FILE__) + "../../lib/smpp")
4
+
5
+ class TransceiverTest < Test::Unit::TestCase
6
+ def test_get_message_part_size_8
7
+ options = {:data_coding => 8}
8
+ assert_equal(67, Smpp::Transceiver.get_message_part_size(options))
9
+ end
10
+ def test_get_message_part_size_0_and_1
11
+ options = {:data_coding => 0}
12
+ assert_equal(153, Smpp::Transceiver.get_message_part_size(options))
13
+ options = {:data_coding => 1}
14
+ assert_equal(153, Smpp::Transceiver.get_message_part_size(options))
15
+ end
16
+ def test_get_message_part_size_nil
17
+ options = {}
18
+ assert_equal(153, Smpp::Transceiver.get_message_part_size(options))
19
+ end
20
+ def test_get_message_part_size_other
21
+ options = {:data_coding => 3}
22
+ assert_equal(134, Smpp::Transceiver.get_message_part_size(options))
23
+ options = {:data_coding => 5}
24
+ assert_equal(134, Smpp::Transceiver.get_message_part_size(options))
25
+ options = {:data_coding => 6}
26
+ assert_equal(134, Smpp::Transceiver.get_message_part_size(options))
27
+ options = {:data_coding => 7}
28
+ assert_equal(134, Smpp::Transceiver.get_message_part_size(options))
29
+ end
30
+ def test_get_message_part_size_non_existant_data_coding
31
+ options = {:data_coding => 666}
32
+ assert_equal(153, Smpp::Transceiver.get_message_part_size(options))
33
+ end
34
+ end
35
+
metadata ADDED
@@ -0,0 +1,133 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: anjlab-ruby-smpp
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.6.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Ray Krueger
9
+ - August Z. Flatby
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain: []
13
+ date: 2011-10-14 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: eventmachine
17
+ requirement: &70199001242340 !ruby/object:Gem::Requirement
18
+ none: false
19
+ requirements:
20
+ - - ! '>='
21
+ - !ruby/object:Gem::Version
22
+ version: 0.10.0
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: *70199001242340
26
+ - !ruby/object:Gem::Dependency
27
+ name: jeweler
28
+ requirement: &70199001240440 !ruby/object:Gem::Requirement
29
+ none: false
30
+ requirements:
31
+ - - ! '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: *70199001240440
37
+ - !ruby/object:Gem::Dependency
38
+ name: rake
39
+ requirement: &70199001238800 !ruby/object:Gem::Requirement
40
+ none: false
41
+ requirements:
42
+ - - ! '>='
43
+ - !ruby/object:Gem::Version
44
+ version: '0'
45
+ type: :development
46
+ prerelease: false
47
+ version_requirements: *70199001238800
48
+ description: Ruby implementation of the SMPP protocol, based on EventMachine. SMPP
49
+ is a protocol that allows ordinary people outside the mobile network to exchange
50
+ SMS messages directly with mobile operators.
51
+ email: raykrueger@gmail.com
52
+ executables: []
53
+ extensions: []
54
+ extra_rdoc_files:
55
+ - CHANGELOG
56
+ - CONTRIBUTORS.txt
57
+ - README.rdoc
58
+ files:
59
+ - CHANGELOG
60
+ - CONTRIBUTORS.txt
61
+ - Gemfile
62
+ - Gemfile.lock
63
+ - LICENSE
64
+ - README.rdoc
65
+ - Rakefile
66
+ - VERSION
67
+ - config/environment.rb
68
+ - examples/PDU1.example
69
+ - examples/PDU2.example
70
+ - examples/sample_gateway.rb
71
+ - examples/sample_smsc.rb
72
+ - lib/smpp.rb
73
+ - lib/smpp/base.rb
74
+ - lib/smpp/encoding/utf8_encoder.rb
75
+ - lib/smpp/optional_parameter.rb
76
+ - lib/smpp/pdu/base.rb
77
+ - lib/smpp/pdu/bind_base.rb
78
+ - lib/smpp/pdu/bind_receiver.rb
79
+ - lib/smpp/pdu/bind_receiver_response.rb
80
+ - lib/smpp/pdu/bind_resp_base.rb
81
+ - lib/smpp/pdu/bind_transceiver.rb
82
+ - lib/smpp/pdu/bind_transceiver_response.rb
83
+ - lib/smpp/pdu/deliver_sm.rb
84
+ - lib/smpp/pdu/deliver_sm_response.rb
85
+ - lib/smpp/pdu/enquire_link.rb
86
+ - lib/smpp/pdu/enquire_link_response.rb
87
+ - lib/smpp/pdu/generic_nack.rb
88
+ - lib/smpp/pdu/submit_multi.rb
89
+ - lib/smpp/pdu/submit_multi_response.rb
90
+ - lib/smpp/pdu/submit_sm.rb
91
+ - lib/smpp/pdu/submit_sm_response.rb
92
+ - lib/smpp/pdu/unbind.rb
93
+ - lib/smpp/pdu/unbind_response.rb
94
+ - lib/smpp/receiver.rb
95
+ - lib/smpp/server.rb
96
+ - lib/smpp/transceiver.rb
97
+ - lib/sms.rb
98
+ - ruby-smpp.gemspec
99
+ - test/delegate.rb
100
+ - test/encoding_test.rb
101
+ - test/optional_parameter_test.rb
102
+ - test/pdu_parsing_test.rb
103
+ - test/receiver_test.rb
104
+ - test/responsive_delegate.rb
105
+ - test/server.rb
106
+ - test/smpp_test.rb
107
+ - test/submit_sm_test.rb
108
+ - test/transceiver_test.rb
109
+ homepage: http://github.com/raykrueger/ruby-smpp
110
+ licenses: []
111
+ post_install_message:
112
+ rdoc_options: []
113
+ require_paths:
114
+ - lib
115
+ required_ruby_version: !ruby/object:Gem::Requirement
116
+ none: false
117
+ requirements:
118
+ - - ! '>='
119
+ - !ruby/object:Gem::Version
120
+ version: '0'
121
+ required_rubygems_version: !ruby/object:Gem::Requirement
122
+ none: false
123
+ requirements:
124
+ - - ! '>='
125
+ - !ruby/object:Gem::Version
126
+ version: '0'
127
+ requirements: []
128
+ rubyforge_project: ruby-smpp
129
+ rubygems_version: 1.8.17
130
+ signing_key:
131
+ specification_version: 3
132
+ summary: Ruby implementation of the SMPP protocol, based on EventMachine.
133
+ test_files: []