Class: PduSms::PDUType

Inherits:
Object
  • Object
show all
Defined in:
lib/pdu_sms/pdu_type.rb

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(type, rp: REPLY_PATH_0, udhi: USER_DATA_HEADER_INCLUDED_0, mti: MESSAGE_TYPE_INDICATOR_01, vpf: false, srr: false, sri: false, rd: false, mms: false) ⇒ PDUType

Returns a new instance of PDUType.

Raises:

  • (ArgumentError)


4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# File 'lib/pdu_sms/pdu_type.rb', line 4

def initialize(type, rp: REPLY_PATH_0, udhi: USER_DATA_HEADER_INCLUDED_0, mti: MESSAGE_TYPE_INDICATOR_01, vpf: false, srr: false, sri: false, rd: false, mms: false)
  raise ArgumentError, 'The "rp" is incorrect' unless (REPLY_PATH_0..REPLY_PATH_1).include?(rp)
  raise ArgumentError, 'The "udhi" is incorrect' unless (USER_DATA_HEADER_INCLUDED_0..USER_DATA_HEADER_INCLUDED_1).include?(udhi)
  raise ArgumentError, 'The "mti" is incorrect' unless (MESSAGE_TYPE_INDICATOR_00..MESSAGE_TYPE_INDICATOR_11).include?(mti)
  if mti == MESSAGE_TYPE_INDICATOR_01
    raise ArgumentError, 'The "srr" is incorrect' unless (STATUS_REPORT_REQUEST_0..STATUS_REPORT_REQUEST_1).include?(srr)
    raise ArgumentError, 'The "vpf" is incorrect' unless (VALIDITY_PERIOD_FORMAT_00..VALIDITY_PERIOD_FORMAT_11).include?(vpf)
    raise ArgumentError, 'The "rd" is incorrect' unless (REJECT_DUPLICATES_0..REJECT_DUPLICATES_1).include?(rd)
  elsif mti == MESSAGE_TYPE_INDICATOR_00
    raise ArgumentError, 'The "sri" is incorrect' unless (STATUS_REPORT_INDICATION_0..STATUS_REPORT_INDICATION_1).include?(sri)
    raise ArgumentError, 'The "mms" is incorrect' unless (MORE_MESSAGES_TO_SEND_0..MORE_MESSAGES_TO_SEND_1).include?(mms)
  end
  @rp = rp
  @udhi = udhi
  @srr = srr
  @vpf = vpf
  @rd = rd
  @mti = mti
  @mms = mms
  @sri = sri
end

Class Method Details

.cut_off_pdu(pdu, part = :all, type = :ms) ⇒ Object

tail current

Raises:

  • (TypeError)


70
71
72
73
74
75
76
77
78
79
80
# File 'lib/pdu_sms/pdu_type.rb', line 70

def PDUType.cut_off_pdu(pdu, part=:all, type=:ms) # tail current
  part_pdu = ServiceCenterAddress.cut_off_pdu(pdu, :tail)
  raise TypeError.new('Слишком короткая строка') if part_pdu.length < 2
  current = part_pdu[0..1]
  tail = part_pdu[2..-1]
  case part
    when :current then current
    when :tail then tail
    else [current,tail]
  end
end

.decode(pdu_str) ⇒ Object



36
37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/pdu_sms/pdu_type.rb', line 36

def PDUType.decode(pdu_str)
  pdu = '%08b' % PDUType.cut_off_pdu(pdu_str, :current, :ms)
  mti = pdu[6..7].to_i(2)
  if mti == MESSAGE_TYPE_INDICATOR_00
    PDUType.decode_sc(pdu_str)
  elsif mti == MESSAGE_TYPE_INDICATOR_01
    PDUType.decode_ms(pdu_str)
  elsif mti == MESSAGE_TYPE_INDICATOR_10
    raise PacketDataUnitError, 'oops SMS-SUBMIT not supported by this version of the library'
  else
    raise PacketDataUnitError, 'format error'
  end
end

.decode_ms(pdu_str) ⇒ Object

Raises:

  • (ArgumentError)


54
55
56
57
58
# File 'lib/pdu_sms/pdu_type.rb', line 54

def PDUType.decode_ms(pdu_str)
  pdu = '%08b' % PDUType.cut_off_pdu(pdu_str, :current, :ms).to_i(16)
  raise ArgumentError, 'wrong format "PDU" package' if pdu[6..7].to_i(2) != MESSAGE_TYPE_INDICATOR_01
  new(:decode_ms, rp:pdu[0].to_i(2), udhi:pdu[1].to_i(2), srr:pdu[2].to_i(2), vpf:pdu[3..4].to_i(2), rd:pdu[5].to_i(2), mti:MESSAGE_TYPE_INDICATOR_01).freeze
end

.decode_sc(pdu_str) ⇒ Object

Raises:

  • (ArgumentError)


64
65
66
67
68
# File 'lib/pdu_sms/pdu_type.rb', line 64

def PDUType.decode_sc(pdu_str)
  pdu = '%08b' % PDUType.cut_off_pdu(pdu_str, :current, :sc).to_i(16)
  raise ArgumentError, 'wrong format "PDU" package' if pdu[6..7].to_i(2) != MESSAGE_TYPE_INDICATOR_00
  new(:decode_ms, rp:pdu[0].to_i(2), udhi:pdu[1].to_i(2), sri:pdu[2].to_i(2), mms:pdu[5].to_i(2), mti:MESSAGE_TYPE_INDICATOR_00).freeze
end

.encode(rp: REPLY_PATH_0, udhi: USER_DATA_HEADER_INCLUDED_0, srr: STATUS_REPORT_REQUEST_0, vpf: VALIDITY_PERIOD_FORMAT_00, rd: REJECT_DUPLICATES_0, mti: MESSAGE_TYPE_INDICATOR_01, sri: STATUS_REPORT_INDICATION_0, mms: MORE_MESSAGES_TO_SEND_0) ⇒ Object



26
27
28
29
30
31
32
33
34
# File 'lib/pdu_sms/pdu_type.rb', line 26

def PDUType.encode(rp: REPLY_PATH_0, udhi: USER_DATA_HEADER_INCLUDED_0, srr: STATUS_REPORT_REQUEST_0, vpf: VALIDITY_PERIOD_FORMAT_00, rd: REJECT_DUPLICATES_0, mti: MESSAGE_TYPE_INDICATOR_01, sri: STATUS_REPORT_INDICATION_0, mms:MORE_MESSAGES_TO_SEND_0)
  if mti == MESSAGE_TYPE_INDICATOR_01
    PDUType.encode_ms(rp:rp,udhi:udhi, srr:srr, vpf:vpf, rd:rd)
  elsif mti == MESSAGE_TYPE_INDICATOR_00
    PDUType.encode_sc(rp:rp, udhi:udhi, sri:sri, mms:mms)
  elsif mti == MESSAGE_TYPE_INDICATOR_10
    raise PacketDataUnitError, 'oops SMS-SUBMIT not supported by this version of the library'
  end
end

.encode_ms(rp: REPLY_PATH_0, udhi: USER_DATA_HEADER_INCLUDED_0, srr: STATUS_REPORT_REQUEST_0, vpf: VALIDITY_PERIOD_FORMAT_00, rd: REJECT_DUPLICATES_0) ⇒ Object



50
51
52
# File 'lib/pdu_sms/pdu_type.rb', line 50

def PDUType.encode_ms(rp: REPLY_PATH_0, udhi: USER_DATA_HEADER_INCLUDED_0, srr: STATUS_REPORT_REQUEST_0, vpf: VALIDITY_PERIOD_FORMAT_00, rd: REJECT_DUPLICATES_0)
  new(:encode_ms, rp:rp, udhi:udhi, srr:srr, vpf:vpf, rd:rd, mti:MESSAGE_TYPE_INDICATOR_01).freeze
end

.encode_sc(rp: REPLY_PATH_0, udhi: USER_DATA_HEADER_INCLUDED_0, sri: STATUS_REPORT_INDICATION_0, mms: MORE_MESSAGES_TO_SEND_0) ⇒ Object



60
61
62
# File 'lib/pdu_sms/pdu_type.rb', line 60

def PDUType.encode_sc(rp: REPLY_PATH_0, udhi: USER_DATA_HEADER_INCLUDED_0, sri: STATUS_REPORT_INDICATION_0, mms:MORE_MESSAGES_TO_SEND_0)
  new(:encode_ms, rp:rp, udhi:udhi, sri:sri, mms:mms, mti:MESSAGE_TYPE_INDICATOR_00).freeze
end

Instance Method Details

#get_hexObject



170
171
172
173
174
175
176
# File 'lib/pdu_sms/pdu_type.rb', line 170

def get_hex
  if message_type_indicator_out?
    '%02X' % [('' << get_reply_path << get_user_data_header_included << get_status_report_request << get_validity_period_format << get_reject_duplicates << get_message_type_indicator).to_i(2)]
  elsif message_type_indicator_in?
    '%02X' % [('' << get_reply_path << get_user_data_header_included << get_status_report_indication << '00' << get_more_messages_to_send << get_message_type_indicator).to_i(2)]
  end
end

#get_message_type_indicatorObject



158
159
160
# File 'lib/pdu_sms/pdu_type.rb', line 158

def get_message_type_indicator
  '%02b' % @mti
end

#get_more_messages_to_sendObject



166
167
168
# File 'lib/pdu_sms/pdu_type.rb', line 166

def get_more_messages_to_send
  '%b' % @mms
end

#get_reject_duplicatesObject



154
155
156
# File 'lib/pdu_sms/pdu_type.rb', line 154

def get_reject_duplicates
  '%b' % @rd
end

#get_reply_pathObject



138
139
140
# File 'lib/pdu_sms/pdu_type.rb', line 138

def get_reply_path
  '%b' % @rp
end

#get_status_report_indicationObject



162
163
164
# File 'lib/pdu_sms/pdu_type.rb', line 162

def get_status_report_indication
  '%b' % @sri
end

#get_status_report_requestObject



146
147
148
# File 'lib/pdu_sms/pdu_type.rb', line 146

def get_status_report_request
  '%b' % @srr
end

#get_user_data_header_includedObject



142
143
144
# File 'lib/pdu_sms/pdu_type.rb', line 142

def get_user_data_header_included
  '%b' % @udhi
end

#get_validity_period_formatObject



150
151
152
# File 'lib/pdu_sms/pdu_type.rb', line 150

def get_validity_period_format
  '%02b' % @vpf
end

#message_type_indicator_in?Boolean

Returns:

  • (Boolean)


114
115
116
# File 'lib/pdu_sms/pdu_type.rb', line 114

def message_type_indicator_in?
  @mti == MESSAGE_TYPE_INDICATOR_00
end

#message_type_indicator_out?Boolean

Returns:

  • (Boolean)


118
119
120
# File 'lib/pdu_sms/pdu_type.rb', line 118

def message_type_indicator_out?
  @mti == MESSAGE_TYPE_INDICATOR_01
end

#message_type_indicator_report?Boolean

Returns:

  • (Boolean)


122
123
124
# File 'lib/pdu_sms/pdu_type.rb', line 122

def message_type_indicator_report?
  @mti == MESSAGE_TYPE_INDICATOR_10
end

#message_type_indicator_reserve?Boolean

Returns:

  • (Boolean)


126
127
128
# File 'lib/pdu_sms/pdu_type.rb', line 126

def message_type_indicator_reserve?
  @mti == MESSAGE_TYPE_INDICATOR_11
end

#more_messages_to_send?Boolean

Returns:

  • (Boolean)


130
131
132
# File 'lib/pdu_sms/pdu_type.rb', line 130

def more_messages_to_send?
  @mms == MORE_MESSAGES_TO_SEND_1
end

#reject_duplicates?Boolean

Returns:

  • (Boolean)


110
111
112
# File 'lib/pdu_sms/pdu_type.rb', line 110

def reject_duplicates?
  @rd == REJECT_DUPLICATES_1
end

#reply_path?Boolean

Returns:

  • (Boolean)


82
83
84
# File 'lib/pdu_sms/pdu_type.rb', line 82

def reply_path?
  @rp == REPLY_PATH_1
end

#status_report_indication?Boolean

Returns:

  • (Boolean)


134
135
136
# File 'lib/pdu_sms/pdu_type.rb', line 134

def status_report_indication?
  @sri == STATUS_REPORT_INDICATION_1
end

#status_report_request?Boolean

Returns:

  • (Boolean)


90
91
92
# File 'lib/pdu_sms/pdu_type.rb', line 90

def status_report_request?
  @srr == STATUS_REPORT_REQUEST_1
end

#user_data_header_included?Boolean

Returns:

  • (Boolean)


86
87
88
# File 'lib/pdu_sms/pdu_type.rb', line 86

def user_data_header_included?
  @udhi == USER_DATA_HEADER_INCLUDED_1
end

#validity_period_format_absolute?Boolean

Returns:

  • (Boolean)


106
107
108
# File 'lib/pdu_sms/pdu_type.rb', line 106

def validity_period_format_absolute?
  @vpf == VALIDITY_PERIOD_FORMAT_11
end

#validity_period_format_off?Boolean

Returns:

  • (Boolean)


94
95
96
# File 'lib/pdu_sms/pdu_type.rb', line 94

def validity_period_format_off?
  @vpf == VALIDITY_PERIOD_FORMAT_00
end

#validity_period_format_relative?Boolean

Returns:

  • (Boolean)


102
103
104
# File 'lib/pdu_sms/pdu_type.rb', line 102

def validity_period_format_relative?
  @vpf == VALIDITY_PERIOD_FORMAT_10
end

#validity_period_format_reserve?Boolean

Returns:

  • (Boolean)


98
99
100
# File 'lib/pdu_sms/pdu_type.rb', line 98

def validity_period_format_reserve?
  @vpf == VALIDITY_PERIOD_FORMAT_01
end