#
# Copyright (C) 2006 SIPfoundry Inc.
# Licensed by SIPfoundry under the LGPL license.
# 
# Copyright (C) 2006 Pingtel Corp.
# Licensed to SIPfoundry under a Contributor Agreement.
#
##############################################################################

require 'resolv'
require 'sipx_ipsocket'

class SocketUtils
  
  # SocketUtils has only class methods, so don't allow instantiation.
  private_class_method :new

public
  
  def SocketUtils.getaddresses(address)
    if SipxIPSocket.valid_ipaddr?(address)
      return [address]
    end
    result_list = []    
    addr_list = []
    addr_list = Resolv::getaddresses(address)
    # If addr_list is empty try to resolve DNS SRV record
    if addr_list.length == 0
      Resolv::DNS.open {|dns| dns.getresources(address,
                                    Resolv::DNS::Resource::IN::SRV).collect {|r| addr_list << r.target.to_s}}
    end
    # For each entry in the address list try to resolve name recursively
    if addr_list.length != 0
      result = []
      addr_list.each do |addr|
        result = SocketUtils.getaddresses(addr)
        if result.length != 0
          # Record the resolved address if it's not an IP address
          if ! SipxIPSocket.valid_ipaddr?(address)
            if ! result_list.include?([address])
              result_list.concat([address])
            end
          end
          if ! result_list.include?([result])        
            result_list.concat(result)
          end
        end
      end
    end
    return result_list
  end
  
  def SocketUtils.strip_v4_port(addr)
    # Look for string with IPv4 format and a colon with a trailing number
    if /\A(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}):\d+\Z/ =~ addr
      return $1
    else
      return addr
    end
  end

end


syntax highlighted by Code2HTML, v. 0.9.1