module Net
module DNS
class RR
#
# = Net::DNS::Classes
#
# This is an auxiliary class to handle Net::DNS::RR
# class field in a DNS packet.
#
class Classes
# Hash with the values of each RR class stored with the
# respective id number.
CLASSES = {
'IN' => 1, # RFC 1035
'CH' => 3, # RFC 1035
'HS' => 4, # RFC 1035
'NONE' => 254, # RFC 2136
'ANY' => 255, # RFC 1035
}
# The default value when class is nil in Resource Records
@@default = CLASSES["IN"]
# Creates a new object representing an RR class. Performs some
# checks on the argument validity too. Il +cls+ is +nil+, the
# default value is +ANY+ or the one set with Classes.default=
def initialize(cls)
case cls
when String
initialize_from_str(cls)
when Fixnum
initialize_from_num(cls)
when nil
initialize_from_num(@@default)
end
if @str.nil? || @num.nil?
raise ArgumentError, "Unable to create a `Classes' from `#{cls}'"
end
end
# Returns the class in number format
# (default for normal use)
#
# FIXME: inspect must return a String.
#
def inspect
@num
end
# Returns the class in string format,
# ex. "IN" or "CH" or such a string.
def to_s
@str.to_s
end
# Returns the class in numeric format,
# usable by the pack methods for data transfers.
def to_i
@num.to_i
end
# Be able to control the default class to assign when
# cls argument is +nil+. Default to +IN+
def self.default=(str)
if CLASSES[str]
@@default = CLASSES[str]
else
raise ArgumentError, "Unknown class `#{str}'"
end
end
# Returns whether cls is a valid RR class.
#
# Net::DNS::RR::Classes.valid?("IN")
# # => true
# Net::DNS::RR::Classes.valid?(1)
# # => true
# Net::DNS::RR::Classes.valid?("Q")
# # => false
# Net::DNS::RR::Classes.valid?(256)
# # => false
# Net::DNS::RR::Classes.valid?(Hash.new)
# # => ArgumentError
#
# FIXME: valid? should never raise.
#
# ==== Raises
# ArgumentError:: if cls isn't either a String or a Fixnum
#
def self.valid?(cls)
case cls
when String
CLASSES.has_key?(cls)
when Fixnum
CLASSES.invert.has_key?(cls)
else
raise ArgumentError, "Wrong cls class: #{cls.class}"
end
end
# Gives in output the keys from the +Classes+ hash
# in a format suited for regexps
def self.regexp
CLASSES.keys.sort.join("|")
end
private
# Initialize a new instance from a Class name.
def initialize_from_str(str)
key = str.to_s.upcase
@num, @str = CLASSES[key], key
end
# Initialize a new instance from the Class value.
def initialize_from_num(num)
key = num.to_i
@num, @str = key, CLASSES.invert[key]
end
end
end
end
end