class EventMachine::DNS::Socket

def self.open

def self.open
  EventMachine::open_datagram_socket('0.0.0.0', 0, self)
end

def deregister_request(id, req)

def deregister_request(id, req)
  @requests.delete(id)
  stop_timer if @requests.length == 0
end

def initialize

def initialize
  @nameserver = nil
end

def nameserver

def nameserver
  @nameserver || Resolver.nameserver
end

def nameserver=(ns)

def nameserver=(ns)
  @nameserver = ns
end

def post_init

def post_init
  @requests = {}
end

def receive_data(data)

response over to the requester
Decodes the packet, looks for the request and passes the
def receive_data(data)
  msg = nil
  begin
    msg = Resolv::DNS::Message.decode data
  rescue
  else
    req = @requests[msg.id]
    if req
      @requests.delete(msg.id)
      stop_timer if @requests.length == 0
      req.receive_answer(msg)
    end
  end
end

def register_request(id, req)

def register_request(id, req)
  if @requests.has_key?(id)
    raise RequestIdAlreadyUsed
  else
    @requests[id] = req
  end
  start_timer
end

def send_packet(pkt)

def send_packet(pkt)
  send_datagram(pkt, nameserver, 53)
end

def start_timer

def start_timer
  @timer ||= EM.add_periodic_timer(0.1, &method(:tick))
end

def stop_timer

def stop_timer
  EM.cancel_timer(@timer)
  @timer = nil
end

def tick

def tick
  @requests.each do |id,req|
    req.tick
  end
end

def unbind

def unbind
end