class PduSms::UserData

Public Class Methods

cut_off_pdu(pdu, part=:all, type=:ms) click to toggle source
# File lib/pdu_sms/user_data.rb, line 114
def UserData.cut_off_pdu(pdu, part=:all, type=:ms) # tail current
  part_pdu = UserDataLength.cut_off_pdu(pdu, :tail, type)
  pdu_type = PDUType.decode(pdu)
  raise ArgumentError, 'The "pdu_str" is incorrect' if part_pdu.length < 2
  if pdu_type.user_data_header_included?
    current = part_pdu[0..(part_pdu[0..1].to_i(16) * 2 + 1)]
    tail = part_pdu[(part_pdu[0..1].to_i(16) * 2 + 2)..-1]
  else
    current = ''
    tail = part_pdu[0..-1]
  end
  case part
    when :current then current
    when :tail then tail
    else [current,tail]
  end
end
decode_ms(pdu_str) click to toggle source
# File lib/pdu_sms/user_data.rb, line 46
def UserData.decode_ms(pdu_str)
  header, message = UserData.cut_off_pdu(pdu_str, :all, :ms)
  dcs = DataCodingScheme.decode_ms(pdu_str)
  if dcs.alphabet_7bit?
    coding = dcs.get_alphabet.to_i(2)
    if header.empty?
      message = Helpers.decode_7bit(message)
    else
      message = Helpers.decode_7bit_fill_bits(message, header[0..1])
    end
  elsif dcs.alphabet_8bit?
    coding = dcs.get_alphabet.to_i(2)
    message = Helpers.decode_8bit(message)
  elsif dcs.alphabet_16bit?
    coding = dcs.get_alphabet.to_i(2)
    message = Helpers.decode_ucs2(message)
  else
    raise ArgumentError, 'The "pdu_str" is incorrect'
  end
  if header.empty?
    new(message, coding).freeze
  else
    if header[0..1].to_i(16) == UDHL_SIZE_6
      new(message, coding, udhl: header[0..1].to_i(16), iei: header[2..3].to_i(16), iedl: header[4..5].to_i(16), ied1: header[6..9], ied2: header[10..11].to_i(16), ied3: header[12..13].to_i(16)).freeze
    elsif header[0..1].to_i(16) == UDHL_SIZE_5
      new(message, coding, udhl: header[0..1].to_i(16), iei: header[2..3].to_i(16), iedl: header[4..5].to_i(16), ied1: header[6..7], ied2: header[8..9].to_i(16), ied3: header[10..11].to_i(16)).freeze
    else
      new(message, coding).freeze
    end
  end
end
decode_sc(pdu_str) click to toggle source
# File lib/pdu_sms/user_data.rb, line 82
def UserData.decode_sc(pdu_str)
  header, message = UserData.cut_off_pdu(pdu_str, :all, :sc)
  dcs = DataCodingScheme.decode_sc(pdu_str)
  if dcs.alphabet_7bit?
    coding = dcs.get_alphabet.to_i(2)
    if header.empty?
      message = Helpers.decode_7bit(message)
    else
      message = Helpers.decode_7bit_fill_bits(message, header[0..1])
    end
  elsif dcs.alphabet_8bit?
    coding = dcs.get_alphabet.to_i(2)
    message = Helpers.decode_8bit(message)
  elsif dcs.alphabet_16bit?
    coding = dcs.get_alphabet.to_i(2)
    message = Helpers.decode_ucs2(message)
  else
    raise ArgumentError, 'The "pdu_str" is incorrect'
  end
  if header.empty?
    new(message, coding).freeze
  else
    if header[0..1].to_i(16) == UDHL_SIZE_6
      new(message, coding, udhl: header[0..1].to_i(16), iei: header[2..3].to_i(16), iedl: header[4..5].to_i(16), ied1: header[6..9], ied2: header[10..11].to_i(16), ied3: header[12..13].to_i(16)).freeze
    elsif header[0..1].to_i(16) == UDHL_SIZE_5
      new(message, coding, udhl: header[0..1].to_i(16), iei: header[2..3].to_i(16), iedl: header[4..5].to_i(16), ied1: header[6..7], ied2: header[8..9].to_i(16), ied3: header[10..11].to_i(16)).freeze
    else
      new(message, coding).freeze
    end
  end
end
encode_ms(message, coding=:auto) click to toggle source
# File lib/pdu_sms/user_data.rb, line 15
def UserData.encode_ms(message, coding=:auto)
  message_array = [message]
  coding = Helpers.is_7bit?(message) ? ALPHABET_7BIT : ALPHABET_16BIT if coding == :auto
  if coding == ALPHABET_7BIT
    if message.length > 160
      message_array = message.scan(/.{1,152}/)
      ied1 = '%04X' % rand(65535)
    end
  elsif coding == ALPHABET_8BIT
    if message.length > 140
      message_array = message.scan(/.{1,133}/)
      ied1 = '%04X' % rand(65535)
    end
  elsif coding == ALPHABET_16BIT
    if message.length > 70
      message_array = message.scan(/.{1,67}/)
      ied1 = '%02X' % rand(255)
    end
  else
    raise ArgumentError, 'The "coding" is incorrect'
  end

  message_array.collect.each_with_index do |mess, current_message|
    if message_array.length > 1
      new(mess, coding, ied1:ied1, ied2:message_array.length, ied3:current_message+1).freeze
    else
      new(mess, coding).freeze
    end
  end
end
encode_sc(message, coding=:auto) click to toggle source
# File lib/pdu_sms/user_data.rb, line 78
def UserData.encode_sc(message, coding=:auto)
  UserData.encode_ms(message, coding)
end
new(message, coding, ied1: false, ied2: false, ied3: false, udhl: false, iei: false, iedl: false) click to toggle source
# File lib/pdu_sms/user_data.rb, line 4
def initialize(message, coding, ied1: false, ied2: false, ied3: false, udhl: false, iei: false, iedl: false)
  @coding = _check_coding coding
  @ied1 = _check_ied1 ied1
  @ied2 = _check_ied2 ied2
  @ied3 = _check_ied3 ied3
  @udhl = udhl ? udhl : _check_udhl(ied1)
  @iei = iei ? iei : _check_iei(ied1)
  @iedl = iedl ? iedl : _check_iedl(ied1)
  @message = _check_message message, coding, ied1
end

Public Instance Methods

get_coding() click to toggle source
# File lib/pdu_sms/user_data.rb, line 136
def get_coding
  @coding
end
get_hex() click to toggle source
# File lib/pdu_sms/user_data.rb, line 182
def get_hex
  if @coding == ALPHABET_7BIT
    message = Helpers.encode_7bit_fill_bits(@message, get_udhl)
  elsif @coding == ALPHABET_8BIT
    message = Helpers.encode_8bit(@message)
  else
    message = Helpers.encode_ucs2(@message)
  end
  '%s%s%s%s%s%s%s' % [get_udhl, get_iei, get_iedl, get_ied1, get_ied2, get_ied3, message]
end
get_ied1() click to toggle source
# File lib/pdu_sms/user_data.rb, line 152
def get_ied1
  return '' unless @ied1
  @ied1
end
get_ied2() click to toggle source
# File lib/pdu_sms/user_data.rb, line 157
def get_ied2
  return '' unless @ied2
  '%02X' % @ied2
end
get_ied3() click to toggle source
# File lib/pdu_sms/user_data.rb, line 162
def get_ied3
  return '' unless @ied3
  '%02X' % @ied3
end
get_iedl() click to toggle source
# File lib/pdu_sms/user_data.rb, line 177
def get_iedl
  return '' unless @iedl
  '%02X' % @iedl
end
get_iei() click to toggle source
# File lib/pdu_sms/user_data.rb, line 172
def get_iei
  return '' unless @iei
  '%02X' % @iei
end
get_message() click to toggle source
# File lib/pdu_sms/user_data.rb, line 132
def get_message
  @message
end
get_udh() click to toggle source
# File lib/pdu_sms/user_data.rb, line 144
def get_udh
  if is_udh?
    USER_DATA_HEADER_INCLUDED_1
  else
    USER_DATA_HEADER_INCLUDED_0
  end
end
get_udhl() click to toggle source
# File lib/pdu_sms/user_data.rb, line 167
def get_udhl
  return '' unless @udhl
  '%02X' % @udhl
end
is_udh?() click to toggle source
# File lib/pdu_sms/user_data.rb, line 140
def is_udh?
  @ied1 ? true : false
end

Private Instance Methods

_check_coding(coding) click to toggle source
# File lib/pdu_sms/user_data.rb, line 210
def _check_coding(coding)
  raise ArgumentError, 'Unknown encoding' unless (ALPHABET_7BIT..ALPHABET_16BIT).include?(coding)
  coding
end
_check_ied1(ied1) click to toggle source
# File lib/pdu_sms/user_data.rb, line 215
def _check_ied1(ied1)
  return false unless ied1
  raise ArgumentError, 'The message is too long'  unless (0..65535).include?(ied1.to_i(16))
  ied1
end
_check_ied2(ied2) click to toggle source
# File lib/pdu_sms/user_data.rb, line 221
def _check_ied2(ied2)
  raise ArgumentError, 'The "coding" is incorrect' unless ied2 == false or (0..255).include?(ied2)
  ied2
end
_check_ied3(ied3) click to toggle source
# File lib/pdu_sms/user_data.rb, line 226
def _check_ied3(ied3)
  raise ArgumentError, 'The "coding" is incorrect' unless ied3 == false or (0..255).include?(ied3)
  ied3
end
_check_iedl(ied1) click to toggle source
# File lib/pdu_sms/user_data.rb, line 253
def _check_iedl(ied1)
  return false unless ied1
  if ied1.length == 2
    0x03
  elsif ied1.length == 4
    0x04
  else
    false
  end
end
_check_iei(ied1) click to toggle source
# File lib/pdu_sms/user_data.rb, line 242
def _check_iei(ied1)
  return false unless ied1
  if ied1.length == 2
    0x00
  elsif ied1.length == 4
    0x08
  else
    false
  end
end
_check_message(message, coding, ied1=false) click to toggle source
# File lib/pdu_sms/user_data.rb, line 195
def _check_message(message, coding, ied1=false)
  raise ArgumentError, 'The "coding" is incorrect' unless message.class == String and message.encoding.to_s == 'UTF-8'
  case coding
    when ALPHABET_7BIT
      raise ArgumentError, 'The message is too long' if (ied1 and ied1.length == 2 and message.length > 153) or (ied1 and ied1.length == 4 and message.length > 152) or message.length > 160
    when ALPHABET_8BIT
      raise ArgumentError, 'The message is too long' if (ied1 and message.length > 133) or message.length > 140
    when ALPHABET_16BIT
      raise ArgumentError, 'The message is too long' if (ied1 and message.length > 67) or message.length > 70
    else
      raise ArgumentError, 'Unknown encoding'
  end
  message
end
_check_udhl(ied1) click to toggle source
# File lib/pdu_sms/user_data.rb, line 231
def _check_udhl(ied1)
  return false unless ied1
  if ied1.length == 2
    UDHL_SIZE_5
  elsif ied1.length == 4
    UDHL_SIZE_6
  else
    false
  end
end