if (type == DNSConstants.TYPE_ANY || type == DNSConstants.TYPE_SRV)
{ // I ama not sure of why there is a special case here [PJYF Oct 15 2004]
if (this.jmDNSImpl.getLocalHost().getName().equalsIgnoreCase(q.getName()))
{
// type = DNSConstants.TYPE_A;
DNSRecord answer = this.jmDNSImpl.getLocalHost().getDNS4AddressRecord();
if (answer != null)
{
answers.add(answer);
}
answer = this.jmDNSImpl.getLocalHost().getDNS6AddressRecord();
if (answer != null)
{
answers.add(answer);
}
type = DNSConstants.TYPE_IGNORE;
}
else
{
if (this.jmDNSImpl.getServiceTypes().containsKey(q.getName().toLowerCase()))
{
type = DNSConstants.TYPE_PTR;
}
}
}
switch (type)
{
case DNSConstants.TYPE_A:
{
// Answer a query for a domain name
//out = addAnswer( in, addr, port, out, host );
DNSRecord answer = this.jmDNSImpl.getLocalHost().getDNS4AddressRecord();
if (answer != null)
{
answers.add(answer);
}
break;
}
case DNSConstants.TYPE_AAAA:
{
// Answer a query for a domain name
DNSRecord answer = this.jmDNSImpl.getLocalHost().getDNS6AddressRecord();
if (answer != null)
{
answers.add(answer);
}
break;
}
case DNSConstants.TYPE_PTR:
{
// Answer a query for services of a given type
// find matching services
for (Iterator serviceIterator = this.jmDNSImpl.getServices().values().iterator(); serviceIterator.hasNext();)
{
ServiceInfoImpl info = (ServiceInfoImpl) serviceIterator.next();
if (info.getState() == DNSState.ANNOUNCED)
{
if (q.getName().equalsIgnoreCase(info.getType()))
{
DNSRecord answer = this.jmDNSImpl.getLocalHost().getDNS4AddressRecord();
if (answer != null)
{
answers.add(answer);
}
answer = this.jmDNSImpl.getLocalHost().getDNS6AddressRecord();
if (answer != null)
{
answers.add(answer);
}
answers.add(new DNSRecord.Pointer(info.getType(), DNSConstants.TYPE_PTR, DNSConstants.CLASS_IN, DNSConstants.DNS_TTL, info.getQualifiedName()));
answers.add(new DNSRecord.Service(info.getQualifiedName(), DNSConstants.TYPE_SRV, DNSConstants.CLASS_IN | DNSConstants.CLASS_UNIQUE, DNSConstants.DNS_TTL,
info.getPriority(), info.getWeight(), info.getPort(), this.jmDNSImpl.getLocalHost().getName()));
answers.add(new DNSRecord.Text(info.getQualifiedName(), DNSConstants.TYPE_TXT, DNSConstants.CLASS_IN | DNSConstants.CLASS_UNIQUE, DNSConstants.DNS_TTL,
info.getText()));
}
}
}
if (q.getName().equalsIgnoreCase("_services" + DNSConstants.DNS_META_QUERY + "local."))
{
for (Iterator serviceTypeIterator = this.jmDNSImpl.getServiceTypes().values().iterator(); serviceTypeIterator.hasNext();)
{
answers.add(new DNSRecord.Pointer("_services" + DNSConstants.DNS_META_QUERY + "local.", DNSConstants.TYPE_PTR, DNSConstants.CLASS_IN, DNSConstants.DNS_TTL, (String) serviceTypeIterator.next()));
}
}
break;
}
case DNSConstants.TYPE_SRV:
case DNSConstants.TYPE_ANY:
case DNSConstants.TYPE_TXT:
{
ServiceInfoImpl info = (ServiceInfoImpl) this.jmDNSImpl.getServices().get(q.getName().toLowerCase());
if (info != null && info.getState() == DNSState.ANNOUNCED)
{
DNSRecord answer = this.jmDNSImpl.getLocalHost().getDNS4AddressRecord();
if (answer != null)
{
answers.add(answer);
}
answer = this.jmDNSImpl.getLocalHost().getDNS6AddressRecord();
if (answer != null)
{
answers.add(answer);
}
answers.add(new DNSRecord.Pointer(info.getType(), DNSConstants.TYPE_PTR, DNSConstants.CLASS_IN, DNSConstants.DNS_TTL, info.getQualifiedName()));
answers.add(new DNSRecord.Service(info.getQualifiedName(), DNSConstants.TYPE_SRV, DNSConstants.CLASS_IN | DNSConstants.CLASS_UNIQUE, DNSConstants.DNS_TTL,
info.getPriority(), info.getWeight(), info.getPort(), this.jmDNSImpl.getLocalHost().getName()));
answers.add(new DNSRecord.Text(info.getQualifiedName(), DNSConstants.TYPE_TXT, DNSConstants.CLASS_IN | DNSConstants.CLASS_UNIQUE, DNSConstants.DNS_TTL, info.getText()));
}
break;
}
default :
{
//System.out.println("JmDNSResponder.unhandled query:"+q);
break;
}
}
}
}
// remove known answers, if the ttl is at least half of
// the correct value. (See Draft Cheshire chapter 7.1.).
for (Iterator i = in.getAnswers().iterator(); i.hasNext();)
{
DNSRecord knownAnswer = (DNSRecord) i.next();
if (knownAnswer.getTtl() > DNSConstants.DNS_TTL / 2 && answers.remove(knownAnswer))
{
// logger.log(Level.FINER, "JmDNS Responder Known Answer Removed");
}
}