rocket_sms 0.1.1

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 (76) hide show
  1. data/.gitignore +19 -0
  2. data/.rspec +2 -0
  3. data/Gemfile +4 -0
  4. data/LICENSE.txt +22 -0
  5. data/README.md +29 -0
  6. data/Rakefile +1 -0
  7. data/bin/scheduler_runner.rb +11 -0
  8. data/bin/transceiver_runner.rb +10 -0
  9. data/examples/gateway.rb +7 -0
  10. data/examples/gateway.yml +40 -0
  11. data/examples/test.rb +60 -0
  12. data/lib/rocket_sms.rb +111 -0
  13. data/lib/rocket_sms/did.rb +25 -0
  14. data/lib/rocket_sms/gateway.rb +123 -0
  15. data/lib/rocket_sms/lock.rb +0 -0
  16. data/lib/rocket_sms/message.rb +30 -0
  17. data/lib/rocket_sms/scheduler.rb +212 -0
  18. data/lib/rocket_sms/transceiver.rb +260 -0
  19. data/lib/rocket_sms/version.rb +3 -0
  20. data/rocket_sms.gemspec +34 -0
  21. data/spec/spec_helper.rb +17 -0
  22. data/vendor/ruby-smpp/CHANGELOG +52 -0
  23. data/vendor/ruby-smpp/CONTRIBUTORS.txt +11 -0
  24. data/vendor/ruby-smpp/Gemfile +8 -0
  25. data/vendor/ruby-smpp/LICENSE +20 -0
  26. data/vendor/ruby-smpp/README.rdoc +89 -0
  27. data/vendor/ruby-smpp/Rakefile +53 -0
  28. data/vendor/ruby-smpp/VERSION +1 -0
  29. data/vendor/ruby-smpp/config/environment.rb +2 -0
  30. data/vendor/ruby-smpp/examples/PDU1.example +26 -0
  31. data/vendor/ruby-smpp/examples/PDU2.example +26 -0
  32. data/vendor/ruby-smpp/examples/sample_gateway.rb +137 -0
  33. data/vendor/ruby-smpp/examples/sample_smsc.rb +102 -0
  34. data/vendor/ruby-smpp/lib/smpp.rb +25 -0
  35. data/vendor/ruby-smpp/lib/smpp/base.rb +308 -0
  36. data/vendor/ruby-smpp/lib/smpp/encoding/utf8_encoder.rb +37 -0
  37. data/vendor/ruby-smpp/lib/smpp/optional_parameter.rb +35 -0
  38. data/vendor/ruby-smpp/lib/smpp/pdu/base.rb +183 -0
  39. data/vendor/ruby-smpp/lib/smpp/pdu/bind_base.rb +25 -0
  40. data/vendor/ruby-smpp/lib/smpp/pdu/bind_receiver.rb +4 -0
  41. data/vendor/ruby-smpp/lib/smpp/pdu/bind_receiver_response.rb +4 -0
  42. data/vendor/ruby-smpp/lib/smpp/pdu/bind_resp_base.rb +17 -0
  43. data/vendor/ruby-smpp/lib/smpp/pdu/bind_transceiver.rb +4 -0
  44. data/vendor/ruby-smpp/lib/smpp/pdu/bind_transceiver_response.rb +4 -0
  45. data/vendor/ruby-smpp/lib/smpp/pdu/deliver_sm.rb +142 -0
  46. data/vendor/ruby-smpp/lib/smpp/pdu/deliver_sm_response.rb +12 -0
  47. data/vendor/ruby-smpp/lib/smpp/pdu/enquire_link.rb +11 -0
  48. data/vendor/ruby-smpp/lib/smpp/pdu/enquire_link_response.rb +11 -0
  49. data/vendor/ruby-smpp/lib/smpp/pdu/generic_nack.rb +20 -0
  50. data/vendor/ruby-smpp/lib/smpp/pdu/submit_multi.rb +68 -0
  51. data/vendor/ruby-smpp/lib/smpp/pdu/submit_multi_response.rb +49 -0
  52. data/vendor/ruby-smpp/lib/smpp/pdu/submit_sm.rb +91 -0
  53. data/vendor/ruby-smpp/lib/smpp/pdu/submit_sm_response.rb +31 -0
  54. data/vendor/ruby-smpp/lib/smpp/pdu/unbind.rb +11 -0
  55. data/vendor/ruby-smpp/lib/smpp/pdu/unbind_response.rb +12 -0
  56. data/vendor/ruby-smpp/lib/smpp/receiver.rb +27 -0
  57. data/vendor/ruby-smpp/lib/smpp/server.rb +223 -0
  58. data/vendor/ruby-smpp/lib/smpp/transceiver.rb +109 -0
  59. data/vendor/ruby-smpp/lib/sms.rb +9 -0
  60. data/vendor/ruby-smpp/ruby-smpp.gemspec +96 -0
  61. data/vendor/ruby-smpp/test/delegate.rb +28 -0
  62. data/vendor/ruby-smpp/test/encoding_test.rb +232 -0
  63. data/vendor/ruby-smpp/test/optional_parameter_test.rb +30 -0
  64. data/vendor/ruby-smpp/test/pdu_parsing_test.rb +111 -0
  65. data/vendor/ruby-smpp/test/receiver_test.rb +232 -0
  66. data/vendor/ruby-smpp/test/responsive_delegate.rb +53 -0
  67. data/vendor/ruby-smpp/test/server.rb +56 -0
  68. data/vendor/ruby-smpp/test/smpp_test.rb +239 -0
  69. data/vendor/ruby-smpp/test/submit_sm_test.rb +40 -0
  70. data/vendor/ruby-smpp/test/transceiver_test.rb +35 -0
  71. data/vendor/smscsim/License.txt +61 -0
  72. data/vendor/smscsim/smpp.jar +0 -0
  73. data/vendor/smscsim/smscsim.jar +0 -0
  74. data/vendor/smscsim/start.sh +3 -0
  75. data/vendor/smscsim/users.txt +46 -0
  76. metadata +299 -0
@@ -0,0 +1,109 @@
1
+ # The SMPP Transceiver maintains a bidirectional connection to an SMSC.
2
+ # Provide a config hash with connection options to get started.
3
+ # See the sample_gateway.rb for examples of config values.
4
+ # The transceiver accepts a delegate object that may implement
5
+ # the following (all optional) methods:
6
+ #
7
+ # mo_received(transceiver, pdu)
8
+ # delivery_report_received(transceiver, pdu)
9
+ # message_accepted(transceiver, mt_message_id, pdu)
10
+ # message_rejected(transceiver, mt_message_id, pdu)
11
+ # bound(transceiver)
12
+ # unbound(transceiver)
13
+
14
+ class Smpp::Transceiver < Smpp::Base
15
+
16
+ # Send an MT SMS message. Delegate will receive message_accepted callback when SMSC
17
+ # acknowledges, or the message_rejected callback upon error
18
+ def send_mt(message_id, source_addr, destination_addr, short_message, options={})
19
+ logger.debug "Sending MT: #{short_message}"
20
+ if @state == :bound
21
+ pdu = Pdu::SubmitSm.new(source_addr, destination_addr, short_message, options)
22
+ write_pdu pdu
23
+
24
+ # keep the message ID so we can associate the SMSC message ID with our message
25
+ # when the response arrives.
26
+ @ack_ids[pdu.sequence_number] = message_id
27
+ else
28
+ raise InvalidStateException, "Transceiver is unbound. Cannot send MT messages."
29
+ end
30
+ end
31
+
32
+ # Send a concatenated message with a body of > 160 characters as multiple messages.
33
+ def send_concat_mt(message_id, source_addr, destination_addr, message, options = {})
34
+ logger.debug "Sending concatenated MT: #{message}"
35
+ if @state == :bound
36
+ # Split the message into parts of 153 characters. (160 - 7 characters for UDH)
37
+ parts = []
38
+ while message.size > 0 do
39
+ parts << message.slice!(0..Smpp::Transceiver.get_message_part_size(options))
40
+ end
41
+
42
+ 0.upto(parts.size-1) do |i|
43
+ udh = sprintf("%c", 5) # UDH is 5 bytes.
44
+ udh << sprintf("%c%c", 0, 3) # This is a concatenated message
45
+
46
+ #TODO Figure out why this needs to be an int here, it's a string elsewhere
47
+ udh << sprintf("%c", message_id) # The ID for the entire concatenated message
48
+
49
+ udh << sprintf("%c", parts.size) # How many parts this message consists of
50
+ udh << sprintf("%c", i+1) # This is part i+1
51
+
52
+ options[:esm_class] = 64 # This message contains a UDH header.
53
+ options[:udh] = udh
54
+
55
+ pdu = Pdu::SubmitSm.new(source_addr, destination_addr, parts[i], options)
56
+ write_pdu pdu
57
+
58
+ # This is definately a bit hacky - multiple PDUs are being associated with a single
59
+ # message_id.
60
+ @ack_ids[pdu.sequence_number] = message_id
61
+ end
62
+ else
63
+ raise InvalidStateException, "Transceiver is unbound. Connot send MT messages."
64
+ end
65
+ end
66
+
67
+ # Send MT SMS message for multiple dest_address
68
+ # Author: Abhishek Parolkar (abhishek[at]parolkar.com)
69
+ # USAGE: $tx.send_multi_mt(123, "9100000000", ["9199000000000","91990000000001","9199000000002"], "Message here")
70
+ def send_multi_mt(message_id, source_addr, destination_addr_arr, short_message, options={})
71
+ logger.debug "Sending Multiple MT: #{short_message}"
72
+ if @state == :bound
73
+ pdu = Pdu::SubmitMulti.new(source_addr, destination_addr_arr, short_message, options)
74
+ write_pdu pdu
75
+
76
+ # keep the message ID so we can associate the SMSC message ID with our message
77
+ # when the response arrives.
78
+ @ack_ids[pdu.sequence_number] = message_id
79
+ else
80
+ raise InvalidStateException, "Transceiver is unbound. Cannot send MT messages."
81
+ end
82
+ end
83
+
84
+ # Send BindTransceiverResponse PDU.
85
+ def send_bind
86
+ raise IOError, 'Receiver already bound.' unless unbound?
87
+ pdu = Pdu::BindTransceiver.new(
88
+ @config[:system_id],
89
+ @config[:password],
90
+ @config[:system_type],
91
+ @config[:source_ton],
92
+ @config[:source_npi],
93
+ @config[:source_address_range])
94
+ write_pdu(pdu)
95
+ end
96
+
97
+ # Use data_coding to find out what message part size we can use
98
+ # http://en.wikipedia.org/wiki/SMS#Message_size
99
+ def self.get_message_part_size options
100
+ return 153 if options[:data_coding].nil?
101
+ return 153 if options[:data_coding] == 0
102
+ return 134 if options[:data_coding] == 3
103
+ return 134 if options[:data_coding] == 5
104
+ return 134 if options[:data_coding] == 6
105
+ return 134 if options[:data_coding] == 7
106
+ return 67 if options[:data_coding] == 8
107
+ return 153
108
+ end
109
+ end
@@ -0,0 +1,9 @@
1
+ # Basic SMS class for sample gateway
2
+
3
+ class Sms
4
+ attr_accessor :id, :from, :to, :body
5
+
6
+ def initialize(body)
7
+ self.body = body
8
+ end
9
+ end
@@ -0,0 +1,96 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{ruby-smpp}
8
+ s.version = "0.6.0"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Ray Krueger", "August Z. Flatby"]
12
+ s.date = %q{2011-10-14}
13
+ s.description = %q{Ruby implementation of the SMPP protocol, based on EventMachine. SMPP is a protocol that allows ordinary people outside the mobile network to exchange SMS messages directly with mobile operators.}
14
+ s.email = %q{raykrueger@gmail.com}
15
+ s.extra_rdoc_files = [
16
+ "CHANGELOG",
17
+ "CONTRIBUTORS.txt",
18
+ "README.rdoc"
19
+ ]
20
+ s.files = [
21
+ "CHANGELOG",
22
+ "CONTRIBUTORS.txt",
23
+ "Gemfile",
24
+ "Gemfile.lock",
25
+ "LICENSE",
26
+ "README.rdoc",
27
+ "Rakefile",
28
+ "VERSION",
29
+ "config/environment.rb",
30
+ "examples/PDU1.example",
31
+ "examples/PDU2.example",
32
+ "examples/sample_gateway.rb",
33
+ "examples/sample_smsc.rb",
34
+ "lib/smpp.rb",
35
+ "lib/smpp/base.rb",
36
+ "lib/smpp/encoding/utf8_encoder.rb",
37
+ "lib/smpp/optional_parameter.rb",
38
+ "lib/smpp/pdu/base.rb",
39
+ "lib/smpp/pdu/bind_base.rb",
40
+ "lib/smpp/pdu/bind_receiver.rb",
41
+ "lib/smpp/pdu/bind_receiver_response.rb",
42
+ "lib/smpp/pdu/bind_resp_base.rb",
43
+ "lib/smpp/pdu/bind_transceiver.rb",
44
+ "lib/smpp/pdu/bind_transceiver_response.rb",
45
+ "lib/smpp/pdu/deliver_sm.rb",
46
+ "lib/smpp/pdu/deliver_sm_response.rb",
47
+ "lib/smpp/pdu/enquire_link.rb",
48
+ "lib/smpp/pdu/enquire_link_response.rb",
49
+ "lib/smpp/pdu/generic_nack.rb",
50
+ "lib/smpp/pdu/submit_multi.rb",
51
+ "lib/smpp/pdu/submit_multi_response.rb",
52
+ "lib/smpp/pdu/submit_sm.rb",
53
+ "lib/smpp/pdu/submit_sm_response.rb",
54
+ "lib/smpp/pdu/unbind.rb",
55
+ "lib/smpp/pdu/unbind_response.rb",
56
+ "lib/smpp/receiver.rb",
57
+ "lib/smpp/server.rb",
58
+ "lib/smpp/transceiver.rb",
59
+ "lib/sms.rb",
60
+ "ruby-smpp.gemspec",
61
+ "test/delegate.rb",
62
+ "test/encoding_test.rb",
63
+ "test/optional_parameter_test.rb",
64
+ "test/pdu_parsing_test.rb",
65
+ "test/receiver_test.rb",
66
+ "test/responsive_delegate.rb",
67
+ "test/server.rb",
68
+ "test/smpp_test.rb",
69
+ "test/submit_sm_test.rb",
70
+ "test/transceiver_test.rb"
71
+ ]
72
+ s.homepage = %q{http://github.com/raykrueger/ruby-smpp}
73
+ s.require_paths = ["lib"]
74
+ s.rubyforge_project = %q{ruby-smpp}
75
+ s.rubygems_version = %q{1.4.2}
76
+ s.summary = %q{Ruby implementation of the SMPP protocol, based on EventMachine.}
77
+
78
+ if s.respond_to? :specification_version then
79
+ s.specification_version = 3
80
+
81
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
82
+ s.add_runtime_dependency(%q<eventmachine>)
83
+ s.add_development_dependency(%q<jeweler>, [">= 0"])
84
+ s.add_development_dependency(%q<rake>, [">= 0"])
85
+ else
86
+ s.add_dependency(%q<eventmachine>)
87
+ s.add_dependency(%q<jeweler>, [">= 0"])
88
+ s.add_dependency(%q<rake>, [">= 0"])
89
+ end
90
+ else
91
+ s.add_dependency(%q<eventmachine>)
92
+ s.add_dependency(%q<jeweler>, [">= 0"])
93
+ s.add_dependency(%q<rake>, [">= 0"])
94
+ end
95
+ end
96
+
@@ -0,0 +1,28 @@
1
+ # the delagate receives callbacks when interesting things happen on the connection
2
+ class Delegate
3
+
4
+ def mo_received(transceiver, pdu)
5
+ puts "** mo_received"
6
+ end
7
+
8
+ def delivery_report_received(transceiver, pdu)
9
+ puts "** delivery_report_received"
10
+ end
11
+
12
+ def message_accepted(transceiver, mt_message_id, pdu)
13
+ puts "** message_sent"
14
+ end
15
+
16
+ def message_rejected(transceiver, mt_message_id, pdu)
17
+ puts "** message_rejected"
18
+ end
19
+
20
+ def bound(transceiver)
21
+ puts "** bound"
22
+ end
23
+
24
+ def unbound(transceiver)
25
+ puts "** unbound"
26
+ EventMachine::stop_event_loop
27
+ end
28
+ end
@@ -0,0 +1,232 @@
1
+ # encoding: utf-8
2
+ require 'rubygems'
3
+ require 'test/unit'
4
+ require 'smpp/encoding/utf8_encoder'
5
+
6
+ require File.expand_path(File.dirname(__FILE__) + "../../lib/smpp")
7
+
8
+ class EncodingTest < Test::Unit::TestCase
9
+
10
+
11
+ def setup
12
+ ::Smpp::Pdu::DeliverSm.data_encoder = ::Smpp::Encoding::Utf8Encoder.new
13
+ end
14
+
15
+ def teardown
16
+ ::Smpp::Pdu::DeliverSm.data_encoder = nil
17
+ end
18
+
19
+ def test_should_decode_pound_sign_from_hp_roman_8_to_utf_8
20
+ raw_data = <<-EOF
21
+ 0000 003d 0000 0005 0000 0000 0000 0002
22
+ 0001 0134 3437 3830 3330 3239 3833 3700
23
+ 0101 3434 3738 3033 3032 3938 3337 0000
24
+ 0000 0000 0000 0000 2950 6C65 6173 6520
25
+ 6465 706F 7369 7420 BB35 2069 6E74 6F20
26
+ 6D79 2061 6363 6F75 6E74 2C20 4A6F 73C5
27
+ EOF
28
+
29
+ pdu = create_pdu(raw_data)
30
+ assert_equal Smpp::Pdu::DeliverSm, pdu.class
31
+ assert_equal 0, pdu.data_coding
32
+
33
+ expected = "Please deposit \302\2435 into my account, Jos\303\251"
34
+ assert_equal expected, pdu.short_message
35
+ end
36
+
37
+ def test_should_unescape_gsm_escaped_euro_symbol
38
+ raw_data = <<-EOF
39
+ 0000 003d 0000 0005 0000 0000 0000 0002
40
+ 0001 0134 3437 3830 3330 3239 3833 3700
41
+ 0101 3434 3738 3033 3032 3938 3337 0000
42
+ 0000 0000 0000 0000 1950 6c65 6173 6520
43
+ 6465 706f 7369 7420 8d65 3520 7468 616e
44
+ 6b73
45
+ EOF
46
+
47
+ pdu = create_pdu(raw_data)
48
+ assert_equal Smpp::Pdu::DeliverSm, pdu.class
49
+ assert_equal 0, pdu.data_coding
50
+
51
+ expected = "Please deposit \342\202\2545 thanks"
52
+ assert_equal expected, pdu.short_message
53
+ end
54
+
55
+ def test_should_unescape_gsm_escaped_left_curly_bracket_symbol
56
+ raw_data = <<-EOF
57
+ 0000 003d 0000 0005 0000 0000 0000 0002
58
+ 0001 0134 3437 3830 3330 3239 3833 3700
59
+ 0101 3434 3738 3033 3032 3938 3337 0000
60
+ 0000 0000 0000 0000 028d 28
61
+ EOF
62
+
63
+ pdu = create_pdu(raw_data)
64
+ assert_equal Smpp::Pdu::DeliverSm, pdu.class
65
+ assert_equal 0, pdu.data_coding
66
+
67
+ assert_equal "{", pdu.short_message
68
+ end
69
+
70
+ def test_should_unescape_gsm_escaped_right_curly_bracket_symbol
71
+ raw_data = <<-EOF
72
+ 0000 003d 0000 0005 0000 0000 0000 0002
73
+ 0001 0134 3437 3830 3330 3239 3833 3700
74
+ 0101 3434 3738 3033 3032 3938 3337 0000
75
+ 0000 0000 0000 0000 028d 29
76
+ EOF
77
+
78
+ pdu = create_pdu(raw_data)
79
+ assert_equal Smpp::Pdu::DeliverSm, pdu.class
80
+ assert_equal 0, pdu.data_coding
81
+
82
+ assert_equal "}", pdu.short_message
83
+ end
84
+
85
+ def test_should_unescape_gsm_escaped_tilde_symbol
86
+ raw_data = <<-EOF
87
+ 0000 003d 0000 0005 0000 0000 0000 0002
88
+ 0001 0134 3437 3830 3330 3239 3833 3700
89
+ 0101 3434 3738 3033 3032 3938 3337 0000
90
+ 0000 0000 0000 0000 028d 3d
91
+ EOF
92
+
93
+ pdu = create_pdu(raw_data)
94
+ assert_equal Smpp::Pdu::DeliverSm, pdu.class
95
+ assert_equal 0, pdu.data_coding
96
+
97
+ assert_equal "~", pdu.short_message
98
+ end
99
+
100
+ def test_should_unescape_gsm_escaped_left_square_bracket_symbol
101
+ raw_data = <<-EOF
102
+ 0000 003d 0000 0005 0000 0000 0000 0002
103
+ 0001 0134 3437 3830 3330 3239 3833 3700
104
+ 0101 3434 3738 3033 3032 3938 3337 0000
105
+ 0000 0000 0000 0000 028d 3c
106
+ EOF
107
+
108
+ pdu = create_pdu(raw_data)
109
+ assert_equal Smpp::Pdu::DeliverSm, pdu.class
110
+ assert_equal 0, pdu.data_coding
111
+
112
+ assert_equal "[", pdu.short_message
113
+ end
114
+
115
+ def test_should_unescape_gsm_escaped_right_square_bracket_symbol
116
+ raw_data = <<-EOF
117
+ 0000 003d 0000 0005 0000 0000 0000 0002
118
+ 0001 0134 3437 3830 3330 3239 3833 3700
119
+ 0101 3434 3738 3033 3032 3938 3337 0000
120
+ 0000 0000 0000 0000 028d 3e
121
+ EOF
122
+
123
+ pdu = create_pdu(raw_data)
124
+ assert_equal Smpp::Pdu::DeliverSm, pdu.class
125
+ assert_equal 0, pdu.data_coding
126
+
127
+ assert_equal "]", pdu.short_message
128
+ end
129
+
130
+ def test_should_unescape_gsm_escaped_backslash_symbol
131
+ raw_data = <<-EOF
132
+ 0000 003d 0000 0005 0000 0000 0000 0002
133
+ 0001 0134 3437 3830 3330 3239 3833 3700
134
+ 0101 3434 3738 3033 3032 3938 3337 0000
135
+ 0000 0000 0000 0000 028d 2f
136
+ EOF
137
+
138
+ pdu = create_pdu(raw_data)
139
+ assert_equal Smpp::Pdu::DeliverSm, pdu.class
140
+ assert_equal 0, pdu.data_coding
141
+
142
+ assert_equal "\\", pdu.short_message
143
+ end
144
+
145
+ def test_should_unescape_gsm_escaped_vertical_bar_symbol
146
+ raw_data = <<-EOF
147
+ 0000 003d 0000 0005 0000 0000 0000 0002
148
+ 0001 0134 3437 3830 3330 3239 3833 3700
149
+ 0101 3434 3738 3033 3032 3938 3337 0000
150
+ 0000 0000 0000 0000 028d b8
151
+ EOF
152
+
153
+ pdu = create_pdu(raw_data)
154
+ assert_equal Smpp::Pdu::DeliverSm, pdu.class
155
+ assert_equal 0, pdu.data_coding
156
+
157
+ assert_equal "|", pdu.short_message
158
+ end
159
+
160
+ def test_should_unescape_gsm_escaped_caret_or_circumflex_symbol
161
+ raw_data = <<-EOF
162
+ 0000 003d 0000 0005 0000 0000 0000 0002
163
+ 0001 0134 3437 3830 3330 3239 3833 3700
164
+ 0101 3434 3738 3033 3032 3938 3337 0000
165
+ 0000 0000 0000 0000 028d 86
166
+ EOF
167
+
168
+ pdu = create_pdu(raw_data)
169
+ assert_equal Smpp::Pdu::DeliverSm, pdu.class
170
+ assert_equal 0, pdu.data_coding
171
+
172
+ expected = "\313\206"
173
+ assert_equal expected, pdu.short_message
174
+ end
175
+
176
+ def test_should_unescape_gsm_escaped_characters_together
177
+ raw_data = <<-EOF
178
+ 0000 003d 0000 0005 0000 0000 0000 0002
179
+ 0001 0134 3437 3830 3330 3239 3833 3700
180
+ 0101 3434 3738 3033 3032 3938 3337 0000
181
+ 0000 0000 0000 0000 4054 6573 748d b869
182
+ 6e67 208d 8620 7374 6167 2f69 6e67 208d
183
+ 3d20 6575 726f 208d 6520 616e 6420 8d28
184
+ 6f74 688d 2f65 7220 8d3c 2063 6861 7261
185
+ 8d3e 6374 6572 738d 29
186
+ EOF
187
+
188
+ pdu = create_pdu(raw_data)
189
+ assert_equal Smpp::Pdu::DeliverSm, pdu.class
190
+ assert_equal 0, pdu.data_coding
191
+
192
+ expected = "Test|ing ˆ stag/ing ~ euro € and {oth\\er [ chara]cters}"
193
+ assert_equal expected, pdu.short_message
194
+ end
195
+
196
+ def test_should_convert_ucs_2_into_utf_8_where_data_coding_indicates_its_presence
197
+ raw_data = <<-EOF
198
+ 0000 003d 0000 0005 0000 0000 0000 0002
199
+ 0001 0134 3437 3830 3330 3239 3833 3700
200
+ 0101 3434 3738 3033 3032 3938 3337 0000
201
+ 0000 0000 0000 0800 0E00 db00 f100 ef00
202
+ e700 f800 6401 13
203
+ EOF
204
+
205
+ pdu = create_pdu(raw_data)
206
+ assert_equal Smpp::Pdu::DeliverSm, pdu.class
207
+ assert_equal 8, pdu.data_coding
208
+
209
+ expected = "\303\233\303\261\303\257\303\247\303\270d\304\223" # Ûñïçødē
210
+ assert_equal expected, pdu.short_message
211
+ end
212
+
213
+ def test_should_decode_pound_sign_from_hp_roman_8_to_utf_8_when_data_coding_set_to_1
214
+ raw_data = <<-EOF
215
+ 0000 0096 0000 0005 0000 0000 0000 1b10
216
+ 0005 004d 6f6e 6579 416c 6572 7400 0101
217
+ 3434 3737 3738 3030 3036 3133 0000 0000
218
+ 0000 0000 0100 5fbb 506f 756e 6473 bb20
219
+ EOF
220
+
221
+ pdu = create_pdu(raw_data)
222
+ assert_equal Smpp::Pdu::DeliverSm, pdu.class
223
+ assert_equal "£Pounds£ ", pdu.short_message
224
+ end
225
+
226
+ protected
227
+ def create_pdu(raw_data)
228
+ hex_data = [raw_data.chomp.gsub(" ","").gsub(/\n/,"")].pack("H*")
229
+ Smpp::Pdu::Base.create(hex_data)
230
+ end
231
+
232
+ end