anthill_smpp_ruby 0.5.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 (154) hide show
  1. data/MIT-LICENSE +21 -0
  2. data/README +30 -0
  3. data/anthill_smpp_ruby.gemspec +18 -0
  4. data/changelog +43 -0
  5. data/data/dumps/random_command.dump +1 -0
  6. data/data/dumps/smpp_alert_notification.dump +1 -0
  7. data/data/dumps/smpp_bind_receiver.dump +1 -0
  8. data/data/dumps/smpp_bind_receiver_resp.dump +1 -0
  9. data/data/dumps/smpp_bind_transceiver.dump +1 -0
  10. data/data/dumps/smpp_bind_transceiver_1.dump +2 -0
  11. data/data/dumps/smpp_bind_transceiver_resp.dump +1 -0
  12. data/data/dumps/smpp_bind_transmitter.dump +1 -0
  13. data/data/dumps/smpp_bind_transmitter_resp.dump +1 -0
  14. data/data/dumps/smpp_broadcast_sm.dump +1 -0
  15. data/data/dumps/smpp_broadcast_sm_resp.dump +1 -0
  16. data/data/dumps/smpp_cancel_broadcast_sm.dump +1 -0
  17. data/data/dumps/smpp_cancel_broadcast_sm_resp.dump +1 -0
  18. data/data/dumps/smpp_cancel_sm.dump +1 -0
  19. data/data/dumps/smpp_cancel_sm_resp.dump +1 -0
  20. data/data/dumps/smpp_data_sm.dump +1 -0
  21. data/data/dumps/smpp_data_sm_resp.dump +1 -0
  22. data/data/dumps/smpp_deliver_sm.dump +1 -0
  23. data/data/dumps/smpp_deliver_sm_resp.dump +1 -0
  24. data/data/dumps/smpp_enquire_link.dump +1 -0
  25. data/data/dumps/smpp_enquire_link_resp.dump +1 -0
  26. data/data/dumps/smpp_generic_nack.dump +1 -0
  27. data/data/dumps/smpp_outbind.dump +1 -0
  28. data/data/dumps/smpp_query_broadcast_sm.dump +1 -0
  29. data/data/dumps/smpp_query_broadcast_sm_resp.dump +1 -0
  30. data/data/dumps/smpp_query_broadcast_sm_resp_1.dump +1 -0
  31. data/data/dumps/smpp_query_sm.dump +1 -0
  32. data/data/dumps/smpp_query_sm_resp.dump +1 -0
  33. data/data/dumps/smpp_replace_sm.dump +1 -0
  34. data/data/dumps/smpp_replace_sm_resp.dump +1 -0
  35. data/data/dumps/smpp_submit_multi.dump +1 -0
  36. data/data/dumps/smpp_submit_multi_resp.dump +1 -0
  37. data/data/dumps/smpp_submit_sm.dump +1 -0
  38. data/data/dumps/smpp_submit_sm_resp.dump +1 -0
  39. data/data/dumps/smpp_unbind.dump +1 -0
  40. data/data/dumps/smpp_unbind_resp.dump +1 -0
  41. data/data/pdus/random_command.xml +35 -0
  42. data/data/pdus/smpp_alert_notification.xml +14 -0
  43. data/data/pdus/smpp_alert_notification_no_optional.xml +13 -0
  44. data/data/pdus/smpp_bind_receiver.xml +17 -0
  45. data/data/pdus/smpp_bind_receiver_resp.xml +12 -0
  46. data/data/pdus/smpp_bind_receiver_resp_no_optional.xml +11 -0
  47. data/data/pdus/smpp_bind_transceiver.xml +17 -0
  48. data/data/pdus/smpp_bind_transceiver_resp.xml +12 -0
  49. data/data/pdus/smpp_bind_transceiver_resp_no_optional.xml +11 -0
  50. data/data/pdus/smpp_bind_transmitter.xml +17 -0
  51. data/data/pdus/smpp_bind_transmitter_resp.xml +12 -0
  52. data/data/pdus/smpp_bind_transmitter_resp_no_optional.xml +11 -0
  53. data/data/pdus/smpp_broadcast_sm.xml +47 -0
  54. data/data/pdus/smpp_broadcast_sm_no_optional.xml +26 -0
  55. data/data/pdus/smpp_broadcast_sm_resp.xml +14 -0
  56. data/data/pdus/smpp_broadcast_sm_resp_no_optional.xml +8 -0
  57. data/data/pdus/smpp_cancel_broadcast_sm.xml +17 -0
  58. data/data/pdus/smpp_cancel_broadcast_sm_no_optional.xml +15 -0
  59. data/data/pdus/smpp_cancel_broadcast_sm_resp.xml +7 -0
  60. data/data/pdus/smpp_cancel_sm.xml +18 -0
  61. data/data/pdus/smpp_cancel_sm_resp.xml +10 -0
  62. data/data/pdus/smpp_commands.xsd +914 -0
  63. data/data/pdus/smpp_data_sm.xml +58 -0
  64. data/data/pdus/smpp_data_sm_no_optional.xml +17 -0
  65. data/data/pdus/smpp_data_sm_resp.xml +15 -0
  66. data/data/pdus/smpp_data_sm_resp_no_optional.xml +8 -0
  67. data/data/pdus/smpp_deliver_sm.xml +46 -0
  68. data/data/pdus/smpp_deliver_sm_no_optional.xml +25 -0
  69. data/data/pdus/smpp_deliver_sm_resp.xml +14 -0
  70. data/data/pdus/smpp_deliver_sm_resp_no_optional.xml +8 -0
  71. data/data/pdus/smpp_enquire_link.xml +10 -0
  72. data/data/pdus/smpp_enquire_link_resp.xml +10 -0
  73. data/data/pdus/smpp_generic_nack.xml +10 -0
  74. data/data/pdus/smpp_outbind.xml +12 -0
  75. data/data/pdus/smpp_query_broadcast_sm.xml +12 -0
  76. data/data/pdus/smpp_query_broadcast_sm_no_optional.xml +11 -0
  77. data/data/pdus/smpp_query_broadcast_sm_resp.xml +17 -0
  78. data/data/pdus/smpp_query_broadcast_sm_resp_no_optional.xml +15 -0
  79. data/data/pdus/smpp_query_sm.xml +11 -0
  80. data/data/pdus/smpp_query_sm_resp.xml +11 -0
  81. data/data/pdus/smpp_replace_sm.xml +18 -0
  82. data/data/pdus/smpp_replace_sm_no_optional.xml +17 -0
  83. data/data/pdus/smpp_replace_sm_resp.xml +7 -0
  84. data/data/pdus/smpp_submit_multi.xml +73 -0
  85. data/data/pdus/smpp_submit_multi_no_optional.xml +51 -0
  86. data/data/pdus/smpp_submit_multi_resp.xml +35 -0
  87. data/data/pdus/smpp_submit_sm.xml +57 -0
  88. data/data/pdus/smpp_submit_sm_no_optional.xml +28 -0
  89. data/data/pdus/smpp_submit_sm_resp.xml +8 -0
  90. data/data/pdus/smpp_unbind.xml +10 -0
  91. data/data/pdus/smpp_unbind_resp.xml +10 -0
  92. data/examples/dump_viewer.rb +298 -0
  93. data/examples/pdu_composer.rb +1331 -0
  94. data/knownbugs +24 -0
  95. data/lib/anthill_smpp_ruby.rb +83 -0
  96. data/lib/i_smpp_outputter.rb +425 -0
  97. data/lib/pdu/smpp_alert_notification.rb +132 -0
  98. data/lib/pdu/smpp_bind.rb +102 -0
  99. data/lib/pdu/smpp_bind_receiver.rb +29 -0
  100. data/lib/pdu/smpp_bind_receiver_resp.rb +30 -0
  101. data/lib/pdu/smpp_bind_resp.rb +100 -0
  102. data/lib/pdu/smpp_bind_transceiver.rb +29 -0
  103. data/lib/pdu/smpp_bind_transceiver_resp.rb +31 -0
  104. data/lib/pdu/smpp_bind_transmitter.rb +29 -0
  105. data/lib/pdu/smpp_bind_transmitter_resp.rb +30 -0
  106. data/lib/pdu/smpp_broadcast_sm.rb +566 -0
  107. data/lib/pdu/smpp_broadcast_sm_resp.rb +130 -0
  108. data/lib/pdu/smpp_cancel_broadcast_sm.rb +143 -0
  109. data/lib/pdu/smpp_cancel_broadcast_sm_resp.rb +60 -0
  110. data/lib/pdu/smpp_cancel_sm.rb +110 -0
  111. data/lib/pdu/smpp_cancel_sm_resp.rb +60 -0
  112. data/lib/pdu/smpp_data_sm.rb +679 -0
  113. data/lib/pdu/smpp_data_sm_resp.rb +148 -0
  114. data/lib/pdu/smpp_deliver_sm.rb +458 -0
  115. data/lib/pdu/smpp_deliver_sm_resp.rb +137 -0
  116. data/lib/pdu/smpp_enquire_link.rb +59 -0
  117. data/lib/pdu/smpp_enquire_link_resp.rb +61 -0
  118. data/lib/pdu/smpp_generic_nack.rb +61 -0
  119. data/lib/pdu/smpp_outbind.rb +71 -0
  120. data/lib/pdu/smpp_pdu.rb +90 -0
  121. data/lib/pdu/smpp_query_broadcast_sm.rb +120 -0
  122. data/lib/pdu/smpp_query_broadcast_sm_resp.rb +192 -0
  123. data/lib/pdu/smpp_query_sm.rb +92 -0
  124. data/lib/pdu/smpp_query_sm_resp.rb +92 -0
  125. data/lib/pdu/smpp_replace_sm.rb +172 -0
  126. data/lib/pdu/smpp_replace_sm_resp.rb +61 -0
  127. data/lib/pdu/smpp_resp.rb +40 -0
  128. data/lib/pdu/smpp_submit_multi.rb +517 -0
  129. data/lib/pdu/smpp_submit_multi_resp.rb +90 -0
  130. data/lib/pdu/smpp_submit_sm.rb +591 -0
  131. data/lib/pdu/smpp_submit_sm_resp.rb +72 -0
  132. data/lib/pdu/smpp_unbind.rb +60 -0
  133. data/lib/pdu/smpp_unbind_resp.rb +61 -0
  134. data/lib/smpp_constants.rb +917 -0
  135. data/lib/smpp_csv_outputter.rb +1601 -0
  136. data/lib/smpp_datatypes.rb +89 -0
  137. data/lib/smpp_decoder.rb +627 -0
  138. data/lib/smpp_encoder.rb +495 -0
  139. data/lib/smpp_hex_outputter.rb +36 -0
  140. data/lib/smpp_outputter_base.rb +315 -0
  141. data/lib/smpp_structures.rb +98 -0
  142. data/lib/smpp_txt_outputter.rb +1895 -0
  143. data/lib/smpp_validator.rb +373 -0
  144. data/lib/smpp_xml_outputter.rb +34 -0
  145. data/roadmap +18 -0
  146. data/setup.rb +1585 -0
  147. data/test/anthill_smpp_test.rb +29 -0
  148. data/test/smpp_codec_test.rb +30 -0
  149. data/test/smpp_datatypes_test.rb +69 -0
  150. data/test/smpp_outputter_test.rb +1261 -0
  151. data/test/smpp_parsing_test.rb +1758 -0
  152. data/test/smpp_rawdump_test.rb +2095 -0
  153. data/test/smpp_validator_test.rb +441 -0
  154. metadata +206 -0
@@ -0,0 +1,148 @@
1
+ #
2
+ # Copyright 2007 Majoron.com (developers@majoron.com)
3
+ # Original sources are available at www.majoron.com
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+ #
17
+
18
+
19
+ module Majoron
20
+ module AntHill
21
+ module SMPP
22
+ class SMPPDataSMResp < SMPPResp
23
+ # Constructor.
24
+ def initialize(command_status = ErrorCode::ESME_ROK, sequence_number = nil)
25
+ super(CommandId::CM_DATA_SM_RESP, command_status, sequence_number)
26
+
27
+ # Mandatory fields
28
+ @message_id = ""
29
+
30
+ # Optional fields
31
+ @delivery_failure_reason = nil
32
+ @network_error_code = nil
33
+ @additional_status_info_text = nil
34
+ @dpf_result = nil
35
+
36
+ # Optional fields length
37
+ @delivery_failure_reason_len = SMPPTLVLen::BYTE_LEN
38
+ @network_error_code_len = SMPPTLVLen::BYTE_LEN + SMPPTLVLen::WORD_LEN
39
+ @additional_status_info_text_len = SMPPTLVLen::ZERO_LEN
40
+ @dpf_result_len = SMPPTLVLen::BYTE_LEN
41
+ end
42
+ # Interface to encode SMPP packet
43
+ def encode_packet(encoder)
44
+ # Encode header and mandatory fields
45
+ encoder.encode_header(@header)
46
+ encoder.encode_message_id(@message_id)
47
+
48
+ # Encode optional fields
49
+ encoder.encode_delivery_failure_reason(@delivery_failure_reason,
50
+ @delivery_failure_reason_len) if !@delivery_failure_reason.nil?
51
+ encoder.encode_network_error_code(@network_error_code,
52
+ @network_error_code_len) if !@network_error_code.nil?
53
+ encoder.encode_additional_status_info_text(@additional_status_info_text,
54
+ @additional_status_info_text_len) if !@additional_status_info_text.nil?
55
+ encoder.encode_dpf_result(@dpf_result,
56
+ @dpf_result_len) if !@dpf_result.nil?
57
+
58
+ end
59
+
60
+ # Interface to decode SMPP packet
61
+ def decode_packet(decoder)
62
+ # Decode header and mandatory fields
63
+ @header = decoder.decode_header()
64
+ @message_id = decoder.decode_message_id(command_length())
65
+
66
+ # Decode optional fields
67
+ while decoder.has_tlvs()
68
+ case decoder.get_tlv_code()
69
+ when OptTags::TAG_DELIVERY_FAILURE_REASON
70
+ @delivery_failure_reason, @delivery_failure_reason_len =
71
+ decoder.decode_delivery_failure_reason(command_length())
72
+ when OptTags::TAG_NETWORK_ERROR_CODE
73
+ @network_error_code, @network_error_code_len =
74
+ decoder.decode_network_error_code(command_length())
75
+ when OptTags::TAG_ADDITIONAL_STATUS_INFO_TEXT
76
+ @additional_status_info_text, @additional_status_info_text_len =
77
+ decoder.decode_additional_status_info_text(command_length())
78
+ when OptTags::TAG_DPF_RESULT
79
+ @dpf_result, @dpf_result_len =
80
+ decoder.decode_dpf_result(command_length())
81
+ else
82
+ # Report about error
83
+ raise Errors::UNKNOWN_TAG_MSG + decoder.get_tlv_error()
84
+ end
85
+ end
86
+ end
87
+
88
+ # Interface to validate SMPP packet
89
+ def validate_packet(validator)
90
+ # Validate header and mandatory fields
91
+ validator.validate_header(@header)
92
+ validator.validate_message_id(@message_id)
93
+
94
+ # Validate optional fields
95
+ validator.validate_delivery_failure_reason(@delivery_failure_reason,
96
+ @delivery_failure_reason_len) if !@delivery_failure_reason.nil?
97
+ validator.validate_network_error_code(@network_error_code,
98
+ @network_error_code_len) if !@network_error_code.nil?
99
+ validator.validate_additional_status_info_text(@additional_status_info_text,
100
+ @additional_status_info_text_len) if !@additional_status_info_text.nil?
101
+ validator.validate_dpf_result(@dpf_result,
102
+ @dpf_result_len) if !@dpf_result.nil?
103
+ end
104
+
105
+ # Interface to output SMPP packet
106
+ def output_packet(outputter)
107
+ # Output header and mandatory fields
108
+ outputter.output_header(@header)
109
+ outputter.output_message_id(@message_id)
110
+
111
+ # Output optional fields
112
+ outputter.output_delivery_failure_reason(@delivery_failure_reason,
113
+ @delivery_failure_reason_len) if !@delivery_failure_reason.nil?
114
+ outputter.output_network_error_code(@network_error_code,
115
+ @network_error_code_len) if !@network_error_code.nil?
116
+ outputter.output_additional_status_info_text(@additional_status_info_text,
117
+ @additional_status_info_text_len) if !@additional_status_info_text.nil?
118
+ outputter.output_dpf_result(@dpf_result,
119
+ @dpf_result_len) if !@dpf_result.nil?
120
+ end
121
+
122
+ public
123
+ def additional_status_info_text=(additional_status_info_text)
124
+ @additional_status_info_text = additional_status_info_text
125
+ @additional_status_info_text_len = additional_status_info_text.size()
126
+ end
127
+
128
+
129
+ public
130
+ # Mandatory fields
131
+ attr_accessor :message_id
132
+
133
+ # Optional fields
134
+ attr_accessor :delivery_failure_reason
135
+ attr_accessor :network_error_code
136
+ attr_reader :additional_status_info_text
137
+ attr_accessor :dpf_result
138
+
139
+ # Optional fields length
140
+ attr_accessor :delivery_failure_reason_len
141
+ attr_accessor :network_error_code_len
142
+ attr_accessor :additional_status_info_text_len
143
+ attr_accessor :dpf_result_len
144
+
145
+ end
146
+ end
147
+ end
148
+ end
@@ -0,0 +1,458 @@
1
+ #
2
+ # Copyright 2007 Majoron.com (developers@majoron.com)
3
+ # Original sources are available at www.majoron.com
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+ #
17
+
18
+
19
+ module Majoron
20
+ module AntHill
21
+ module SMPP
22
+ class SMPPDeliverSM < SMPPPDU
23
+ def initialize(command_status = ErrorCode::ESME_ROK, sequence_number = nil)
24
+ super(CommandId::CM_DELIVER_SM, command_status, sequence_number)
25
+
26
+ # Mandatory fields
27
+ @service_type = ""
28
+ @source_addr_ton = 0
29
+ @source_addr_npi = 0
30
+ @source_addr = ""
31
+ @dest_addr_ton = 0
32
+ @dest_addr_npi = 0
33
+ @dest_addr = ""
34
+ @esm_class = 0
35
+ @protocol_id = 0
36
+ @priority_flag = 0
37
+ @schedule_delivery_time = ""
38
+ @validity_period = ""
39
+ @registered_delivery = 0
40
+ @replace_if_present_flag = 0
41
+ @data_coding = ""
42
+ @sm_default_msg_id = 0
43
+ @sm_length = 0
44
+ @short_message = ""
45
+
46
+
47
+ # Optional fields
48
+ @user_message_reference = nil
49
+ @source_port = nil
50
+ @destination_port = nil
51
+ @sar_msg_ref_num = nil
52
+ @sar_total_segments = nil
53
+ @sar_segment_seqnum = nil
54
+ @user_response_code = nil
55
+ @privacy_indicator = nil
56
+ @payload_type = nil
57
+ @message_payload = nil
58
+ @callback_num = nil
59
+ @source_subaddress = nil
60
+ @dest_subaddress = nil
61
+ @language_indicator = nil
62
+ @its_session_info = nil
63
+ @network_error_code = nil
64
+ @message_state = nil
65
+ @receipted_message_id = nil
66
+
67
+ # Optional fields len
68
+ @user_message_reference_len = SMPPTLVLen::WORD_LEN
69
+ @source_port_len = SMPPTLVLen::WORD_LEN
70
+ @destination_port_len = SMPPTLVLen::WORD_LEN
71
+ @sar_msg_ref_num_len = SMPPTLVLen::WORD_LEN
72
+ @sar_total_segments_len = SMPPTLVLen::BYTE_LEN
73
+ @sar_segment_seqnum_len = SMPPTLVLen::BYTE_LEN
74
+ @user_response_code_len = SMPPTLVLen::BYTE_LEN
75
+ @privacy_indicator_len = SMPPTLVLen::BYTE_LEN
76
+ @payload_type_len = SMPPTLVLen::BYTE_LEN
77
+ @message_payload_len = SMPPTLVLen::ZERO_LEN
78
+ @callback_num_len = SMPPTLVLen::ZERO_LEN
79
+ @source_subaddress_len = SMPPTLVLen::ZERO_LEN
80
+ @dest_subaddress_len = SMPPTLVLen::ZERO_LEN
81
+ @language_indicator_len = SMPPTLVLen::BYTE_LEN
82
+ @its_session_info_len = SMPPTLVLen::WORD_LEN
83
+ @network_error_code_len = SMPPTLVLen::BYTE_LEN + SMPPTLVLen::WORD_LEN
84
+ @message_state_len = SMPPTLVLen::BYTE_LEN
85
+ @receipted_message_id_len = SMPPTLVLen::ZERO_LEN
86
+ end
87
+ # Interface to encode SMPP packet
88
+ def encode_packet(encoder)
89
+ # Encode header and mandatory fields
90
+ encoder.encode_header(@header)
91
+ encoder.encode_service_type(@service_type)
92
+ encoder.encode_source_addr_ton(@source_addr_ton)
93
+ encoder.encode_source_addr_npi(@source_addr_npi)
94
+ encoder.encode_source_addr21(@source_addr)
95
+ encoder.encode_dest_addr_ton(@dest_addr_ton)
96
+ encoder.encode_dest_addr_npi(@dest_addr_npi)
97
+ encoder.encode_dest_addr21(@dest_addr)
98
+ encoder.encode_esm_class(@esm_class)
99
+ encoder.encode_protocol_id(@protocol_id)
100
+ encoder.encode_priority_flag(@priority_flag)
101
+ encoder.encode_schedule_delivery_time(@schedule_delivery_time)
102
+ encoder.encode_validity_period(@validity_period)
103
+ encoder.encode_registered_delivery(@registered_delivery)
104
+ encoder.encode_replace_if_present_flag(@replace_if_present_flag)
105
+ encoder.encode_data_coding(@data_coding)
106
+ encoder.encode_sm_default_msg_id(@sm_default_msg_id)
107
+ encoder.encode_sm_length(@sm_length)
108
+ encoder.encode_short_message(@short_message)
109
+
110
+
111
+ # Encode optional fields
112
+ encoder.encode_user_message_reference(@user_message_reference,
113
+ @user_message_reference_len) if !@user_message_reference.nil?
114
+ encoder.encode_source_port(@source_port,
115
+ @source_port_len) if !@source_port.nil?
116
+ encoder.encode_destination_port(@destination_port,
117
+ @destination_port_len) if !@destination_port.nil?
118
+ encoder.encode_sar_msg_ref_num(@sar_msg_ref_num,
119
+ @sar_msg_ref_num_len) if !@sar_msg_ref_num.nil?
120
+ encoder.encode_sar_total_segments(@sar_total_segments,
121
+ @sar_total_segments_len) if !@sar_total_segments.nil?
122
+ encoder.encode_sar_segment_seqnum(@sar_segment_seqnum,
123
+ @sar_segment_seqnum_len) if !@sar_segment_seqnum.nil?
124
+ encoder.encode_user_response_code(@user_response_code,
125
+ @user_response_code_len) if !@user_response_code.nil?
126
+ encoder.encode_privacy_indicator(@privacy_indicator,
127
+ @privacy_indicator_len) if !@privacy_indicator.nil?
128
+ encoder.encode_payload_type(@payload_type,
129
+ @payload_type_len) if !@payload_type.nil?
130
+ encoder.encode_message_payload(@message_payload,
131
+ @message_payload_len) if !@message_payload.nil?
132
+ encoder.encode_callback_num(@callback_num,
133
+ @callback_num_len) if !@callback_num.nil?
134
+ encoder.encode_source_subaddress(@source_subaddress,
135
+ @source_subaddress_len) if !@source_subaddress.nil?
136
+ encoder.encode_dest_subaddress(@dest_subaddress,
137
+ @dest_subaddress_len) if !@dest_subaddress.nil?
138
+ encoder.encode_language_indicator(@language_indicator,
139
+ @language_indicator_len) if !@language_indicator.nil?
140
+ encoder.encode_its_session_info(@its_session_info,
141
+ @its_session_info_len) if !@its_session_info.nil?
142
+ encoder.encode_network_error_code(@network_error_code,
143
+ @network_error_code_len) if !@network_error_code.nil?
144
+ encoder.encode_message_state_tlv(@message_state,
145
+ @message_state_len) if !@message_state.nil?
146
+ encoder.encode_receipted_message_id(@receipted_message_id,
147
+ @receipted_message_id_len) if !@receipted_message_id.nil?
148
+ end
149
+
150
+ # Interface to decode SMPP packet
151
+ def decode_packet(decoder)
152
+ # Decode header and mandatory fields
153
+ @header = decoder.decode_header()
154
+ @service_type = decoder.decode_service_type(command_length())
155
+ @source_addr_ton = decoder.decode_source_addr_ton(command_length())
156
+ @source_addr_npi = decoder.decode_source_addr_npi(command_length())
157
+ @source_addr = decoder.decode_source_addr21(command_length())
158
+ @dest_addr_ton = decoder.decode_dest_addr_ton(command_length())
159
+ @dest_addr_npi = decoder.decode_dest_addr_npi(command_length())
160
+ @dest_addr = decoder.decode_dest_addr21(command_length())
161
+ @esm_class = decoder.decode_esm_class(command_length())
162
+ @protocol_id = decoder.decode_protocol_id(command_length())
163
+ @priority_flag = decoder.decode_priority_flag(command_length())
164
+ @schedule_delivery_time = decoder.decode_schedule_delivery_time(command_length())
165
+ @validity_period = decoder.decode_validity_period(command_length())
166
+ @registered_delivery = decoder.decode_registered_delivery(command_length())
167
+ @replace_if_present_flag = decoder.decode_replace_if_present_flag(command_length())
168
+ @data_coding = decoder.decode_data_coding(command_length())
169
+ @sm_default_msg_id = decoder.decode_sm_default_msg_id(command_length())
170
+ @sm_length = decoder.decode_sm_length(command_length())
171
+ @short_message = decoder.decode_short_message(@sm_length, command_length())
172
+
173
+ # Decode optional fields
174
+ while decoder.has_tlvs()
175
+ case decoder.get_tlv_code()
176
+ when OptTags::TAG_USER_MESSAGE_REFERENCE
177
+ @user_message_reference, @user_message_reference_len =
178
+ decoder.decode_user_message_reference(command_length())
179
+ when OptTags::TAG_SOURCE_PORT
180
+ @source_port, @source_port_len =
181
+ decoder.decode_source_port(command_length())
182
+ when OptTags::TAG_DESTINATION_PORT
183
+ @destination_port, @destination_port_len =
184
+ decoder.decode_destination_port(command_length())
185
+ when OptTags::TAG_SAR_MSG_REF_NUM
186
+ @sar_msg_ref_num, @sar_msg_ref_num_len =
187
+ decoder.decode_sar_msg_ref_num(command_length())
188
+ when OptTags::TAG_SAR_TOTAL_SEGMENTS
189
+ @sar_total_segments, @sar_total_segments_len =
190
+ decoder.decode_sar_total_segments(command_length())
191
+ when OptTags::TAG_SAR_SEGMENT_SEQNUM
192
+ @sar_segment_seqnum, @sar_segment_seqnum_len =
193
+ decoder.decode_sar_segment_seqnum(command_length())
194
+ when OptTags::TAG_USER_RESPONSE_CODE
195
+ @user_response_code, @user_response_code_len =
196
+ decoder.decode_user_response_code(command_length())
197
+ when OptTags::TAG_PRIVACY_INDICATOR
198
+ @privacy_indicator, @privacy_indicator_len =
199
+ decoder.decode_privacy_indicator(command_length())
200
+ when OptTags::TAG_PAYLOAD_TYPE
201
+ @payload_type, @payload_type_len =
202
+ decoder.decode_payload_type(command_length())
203
+ when OptTags::TAG_MESSAGE_PAYLOAD
204
+ @message_payload, @message_payload_len =
205
+ decoder.decode_message_payload(command_length())
206
+ when OptTags::TAG_CALLBACK_NUM
207
+ @callback_num, @callback_num_len =
208
+ decoder.decode_callback_num(command_length())
209
+ when OptTags::TAG_SOURCE_SUBADDRESS
210
+ @source_subaddress, @source_subaddress_len =
211
+ decoder.decode_source_subaddress(command_length())
212
+ when OptTags::TAG_DEST_SUBADDRESS
213
+ @dest_subaddress, @dest_subaddress_len =
214
+ decoder.decode_dest_subaddress(command_length())
215
+ when OptTags::TAG_LANGUAGE_INDICATOR
216
+ @language_indicator, @language_indicator_len =
217
+ decoder.decode_language_indicator(command_length())
218
+ when OptTags::TAG_ITS_SESSION_INFO
219
+ @its_session_info, @its_session_info_len =
220
+ decoder.decode_its_session_info(command_length())
221
+ when OptTags::TAG_NETWORK_ERROR_CODE
222
+ @network_error_code, @network_error_code_len =
223
+ decoder.decode_network_error_code(command_length())
224
+ when OptTags::TAG_MESSAGE_STATE
225
+ @message_state, @message_state_len =
226
+ decoder.decode_message_state_tlv(command_length())
227
+ when OptTags::TAG_RECEIPTED_MESSAGE_ID
228
+ @receipted_message_id, @receipted_message_id_len =
229
+ decoder.decode_receipted_message_id(command_length())
230
+ else
231
+ # Report about error
232
+ raise Errors::UNKNOWN_TAG_MSG + decoder.get_tlv_error()
233
+ end
234
+ end
235
+ end
236
+
237
+ # Interface to validate SMPP packet
238
+ def validate_packet(validator)
239
+ # Validate header and mandatory fields
240
+ validator.validate_header(@header)
241
+ validator.validate_service_type(@service_type)
242
+ validator.validate_source_addr_ton(@source_addr_ton)
243
+ validator.validate_source_addr_npi(@source_addr_npi)
244
+ validator.validate_source_addr21(@source_addr)
245
+ validator.validate_dest_addr_ton(@dest_addr_ton)
246
+ validator.validate_dest_addr_npi(@dest_addr_npi)
247
+ validator.validate_dest_addr21(@dest_addr)
248
+ validator.validate_esm_class(@esm_class)
249
+ validator.validate_protocol_id(@protocol_id)
250
+ validator.validate_priority_flag(@priority_flag)
251
+ validator.validate_schedule_delivery_time(@schedule_delivery_time)
252
+ validator.validate_validity_period(@validity_period)
253
+ validator.validate_registered_delivery(@registered_delivery)
254
+ validator.validate_replace_if_present_flag(@replace_if_present_flag)
255
+ validator.validate_data_coding(@data_coding)
256
+ validator.validate_sm_default_msg_id(@sm_default_msg_id)
257
+ validator.validate_sm_length(@sm_length)
258
+ validator.validate_short_message(@short_message)
259
+
260
+
261
+ # Validate optional fields
262
+ validator.validate_user_message_reference(@user_message_reference,
263
+ @user_message_reference_len) if !@user_message_reference.nil?
264
+ validator.validate_source_port(@source_port,
265
+ @source_port_len) if !@source_port.nil?
266
+ validator.validate_destination_port(@destination_port,
267
+ @destination_port_len) if !@destination_port.nil?
268
+ validator.validate_sar_msg_ref_num(@sar_msg_ref_num,
269
+ @sar_msg_ref_num_len) if !@sar_msg_ref_num.nil?
270
+ validator.validate_sar_total_segments(@sar_total_segments,
271
+ @sar_total_segments_len) if !@sar_total_segments.nil?
272
+ validator.validate_sar_segment_seqnum(@sar_segment_seqnum,
273
+ @sar_segment_seqnum_len) if !@sar_segment_seqnum.nil?
274
+ validator.validate_user_response_code(@user_response_code,
275
+ @user_response_code_len) if !@user_response_code.nil?
276
+ validator.validate_privacy_indicator(@privacy_indicator,
277
+ @privacy_indicator_len) if !@privacy_indicator.nil?
278
+ validator.validate_payload_type(@payload_type,
279
+ @payload_type_len) if !@payload_type.nil?
280
+ validator.validate_message_payload(@message_payload,
281
+ @message_payload_len) if !@message_payload.nil?
282
+ validator.validate_callback_num(@callback_num,
283
+ @callback_num_len) if !@callback_num.nil?
284
+ validator.validate_source_subaddress(@source_subaddress,
285
+ @source_subaddress_len) if !@source_subaddress.nil?
286
+ validator.validate_dest_subaddress(@dest_subaddress,
287
+ @dest_subaddress_len) if !@dest_subaddress.nil?
288
+ validator.validate_language_indicator(@language_indicator,
289
+ @language_indicator_len) if !@language_indicator.nil?
290
+ validator.validate_its_session_info(@its_session_info,
291
+ @its_session_info_len) if !@its_session_info.nil?
292
+ validator.validate_network_error_code(@network_error_code,
293
+ @network_error_code_len) if !@network_error_code.nil?
294
+ validator.validate_message_state_tlv(@message_state,
295
+ @message_state_len) if !@message_state.nil?
296
+ validator.validate_receipted_message_id(@receipted_message_id,
297
+ @receipted_message_id_len) if !@receipted_message_id.nil?
298
+
299
+ # Validate complex rules
300
+ validator.validate_short_message_payload(@short_message,
301
+ @message_payload) if !@message_payload.nil?
302
+ end
303
+
304
+ # Interface to output SMPP packet
305
+ def output_packet(outputter)
306
+ # Output header and mandatory fields
307
+ outputter.output_header(@header)
308
+ outputter.output_service_type(@service_type)
309
+ outputter.output_source_addr_ton(@source_addr_ton)
310
+ outputter.output_source_addr_npi(@source_addr_npi)
311
+ outputter.output_source_addr21(@source_addr)
312
+ outputter.output_dest_addr_ton(@dest_addr_ton)
313
+ outputter.output_dest_addr_npi(@dest_addr_npi)
314
+ outputter.output_dest_addr21(@dest_addr)
315
+ outputter.output_esm_class(@esm_class)
316
+ outputter.output_protocol_id(@protocol_id)
317
+ outputter.output_priority_flag(@priority_flag)
318
+ outputter.output_schedule_delivery_time(@schedule_delivery_time)
319
+ outputter.output_validity_period(@validity_period)
320
+ outputter.output_registered_delivery(@registered_delivery)
321
+ outputter.output_replace_if_present_flag(@replace_if_present_flag)
322
+ outputter.output_data_coding(@data_coding)
323
+ outputter.output_sm_default_msg_id(@sm_default_msg_id)
324
+ outputter.output_sm_length(@sm_length)
325
+ outputter.output_short_message(@short_message)
326
+
327
+ # Output optional fields
328
+ outputter.output_user_message_reference(@user_message_reference,
329
+ @user_message_reference_len) if !@user_message_reference.nil?
330
+ outputter.output_source_port(@source_port,
331
+ @source_port_len) if !@source_port.nil?
332
+ outputter.output_destination_port(@destination_port,
333
+ @destination_port_len) if !@destination_port.nil?
334
+ outputter.output_sar_msg_ref_num(@sar_msg_ref_num,
335
+ @sar_msg_ref_num_len) if !@sar_msg_ref_num.nil?
336
+ outputter.output_sar_total_segments(@sar_total_segments,
337
+ @sar_total_segments_len) if !@sar_total_segments.nil?
338
+ outputter.output_sar_segment_seqnum(@sar_segment_seqnum,
339
+ @sar_segment_seqnum_len) if !@sar_segment_seqnum.nil?
340
+ outputter.output_user_response_code(@user_response_code,
341
+ @user_response_code_len) if !@user_response_code.nil?
342
+ outputter.output_privacy_indicator(@privacy_indicator,
343
+ @privacy_indicator_len) if !@privacy_indicator.nil?
344
+ outputter.output_payload_type(@payload_type,
345
+ @payload_type_len) if !@payload_type.nil?
346
+ outputter.output_message_payload(@message_payload,
347
+ @message_payload_len) if !@message_payload.nil?
348
+ outputter.output_callback_num(@callback_num,
349
+ @callback_num_len) if !@callback_num.nil?
350
+ outputter.output_source_subaddress(@source_subaddress,
351
+ @source_subaddress_len) if !@source_subaddress.nil?
352
+ outputter.output_dest_subaddress(@dest_subaddress,
353
+ @dest_subaddress_len) if !@dest_subaddress.nil?
354
+ outputter.output_language_indicator(@language_indicator,
355
+ @language_indicator_len) if !@language_indicator.nil?
356
+ outputter.output_its_session_info(@its_session_info,
357
+ @its_session_info_len) if !@its_session_info.nil?
358
+ outputter.output_network_error_code(@network_error_code,
359
+ @network_error_code_len) if !@network_error_code.nil?
360
+ outputter.output_message_state_tlv_opt(@message_state,
361
+ @message_state_len) if !@message_state.nil?
362
+ outputter.output_receipted_message_id(@receipted_message_id,
363
+ @receipted_message_id_len) if !@receipted_message_id.nil?
364
+ end
365
+
366
+ public
367
+ def message_payload=(message_payload)
368
+ @message_payload = message_payload
369
+ @message_payload_len = message_payload.size()
370
+ end
371
+
372
+ def callback_num=(callback_num)
373
+ @callback_num = callback_num
374
+ @callback_num_len = callback_num.size()
375
+ end
376
+
377
+ def source_subaddress=(source_subaddress)
378
+ @source_subaddress = source_subaddress
379
+ @source_subaddress_len = source_subaddress.size()
380
+ end
381
+
382
+ def dest_subaddress=(dest_subaddress)
383
+ @dest_subaddress = dest_subaddress
384
+ @dest_subaddress_len = dest_subaddress.size()
385
+ end
386
+
387
+ def receipted_message_id=(receipted_message_id)
388
+ @receipted_message_id = receipted_message_id
389
+ @receipted_message_id_len = receipted_message_id.size() + 1 # 1 = NULL terminator
390
+ end
391
+
392
+ public
393
+ # Mandatory fields
394
+ attr_accessor :service_type
395
+ attr_accessor :source_addr_ton
396
+ attr_accessor :source_addr_npi
397
+ attr_accessor :source_addr
398
+ attr_accessor :dest_addr_ton
399
+ attr_accessor :dest_addr_npi
400
+ attr_accessor :dest_addr
401
+ attr_accessor :esm_class
402
+ attr_accessor :protocol_id
403
+ attr_accessor :priority_flag
404
+ attr_accessor :schedule_delivery_time
405
+ attr_accessor :validity_period
406
+ attr_accessor :registered_delivery
407
+ attr_accessor :replace_if_present_flag
408
+ attr_accessor :data_coding
409
+ attr_accessor :sm_default_msg_id
410
+ attr_accessor :sm_length
411
+ attr_accessor :short_message
412
+
413
+
414
+ # Optional fields
415
+ attr_accessor :user_message_reference
416
+ attr_accessor :source_port
417
+ attr_accessor :destination_port
418
+ attr_accessor :sar_msg_ref_num
419
+ attr_accessor :sar_total_segments
420
+ attr_accessor :sar_segment_seqnum
421
+ attr_accessor :user_response_code
422
+ attr_accessor :privacy_indicator
423
+ attr_accessor :payload_type
424
+ attr_reader :message_payload
425
+ attr_reader :callback_num
426
+ attr_reader :source_subaddress
427
+ attr_reader :dest_subaddress
428
+ attr_accessor :language_indicator
429
+ attr_accessor :its_session_info
430
+ attr_accessor :network_error_code
431
+ attr_accessor :message_state
432
+ attr_reader :receipted_message_id
433
+
434
+
435
+ # Optional fields length
436
+ attr_accessor :user_message_reference_len
437
+ attr_accessor :source_port_len
438
+ attr_accessor :destination_port_len
439
+ attr_accessor :sar_msg_ref_num_len
440
+ attr_accessor :sar_total_segments_len
441
+ attr_accessor :sar_segment_seqnum_len
442
+ attr_accessor :user_response_code_len
443
+ attr_accessor :privacy_indicator_len
444
+ attr_accessor :payload_type_len
445
+ attr_accessor :message_payload_len
446
+ attr_accessor :callback_num_len
447
+ attr_accessor :source_subaddress_len
448
+ attr_accessor :dest_subaddress_len
449
+ attr_accessor :language_indicator_len
450
+ attr_accessor :its_session_info_len
451
+ attr_accessor :network_error_code_len
452
+ attr_accessor :message_state_len
453
+ attr_accessor :receipted_message_id_len
454
+
455
+ end
456
+ end
457
+ end
458
+ end