$search
00001 // Copyright 2003-2005 Arthur van Hoff, Rick Blair 00002 // Licensed under Apache License version 2.0 00003 // Original license LGPL 00004 00005 package javax.jmdns.impl; 00006 00007 import java.net.InetAddress; 00008 import java.util.Set; 00009 import java.util.logging.Level; 00010 import java.util.logging.Logger; 00011 00012 import javax.jmdns.ServiceInfo; 00013 import javax.jmdns.ServiceInfo.Fields; 00014 import javax.jmdns.impl.JmDNSImpl.ServiceTypeEntry; 00015 import javax.jmdns.impl.constants.DNSConstants; 00016 import javax.jmdns.impl.constants.DNSRecordClass; 00017 import javax.jmdns.impl.constants.DNSRecordType; 00018 00024 public class DNSQuestion extends DNSEntry { 00025 private static Logger logger = Logger.getLogger(DNSQuestion.class.getName()); 00026 00030 private static class DNS4Address extends DNSQuestion { 00031 DNS4Address(String name, DNSRecordType type, DNSRecordClass recordClass, boolean unique) { 00032 super(name, type, recordClass, unique); 00033 } 00034 00035 @Override 00036 public void addAnswers(JmDNSImpl jmDNSImpl, Set<DNSRecord> answers) { 00037 DNSRecord answer = jmDNSImpl.getLocalHost().getDNSAddressRecord(this.getRecordType(), DNSRecordClass.UNIQUE, DNSConstants.DNS_TTL); 00038 if (answer != null) { 00039 answers.add(answer); 00040 } 00041 } 00042 00043 @Override 00044 public boolean iAmTheOnlyOne(JmDNSImpl jmDNSImpl) { 00045 String name = this.getName().toLowerCase(); 00046 return jmDNSImpl.getLocalHost().getName().equals(name) || jmDNSImpl.getServices().keySet().contains(name); 00047 } 00048 00049 } 00050 00054 private static class DNS6Address extends DNSQuestion { 00055 DNS6Address(String name, DNSRecordType type, DNSRecordClass recordClass, boolean unique) { 00056 super(name, type, recordClass, unique); 00057 } 00058 00059 @Override 00060 public void addAnswers(JmDNSImpl jmDNSImpl, Set<DNSRecord> answers) { 00061 DNSRecord answer = jmDNSImpl.getLocalHost().getDNSAddressRecord(this.getRecordType(), DNSRecordClass.UNIQUE, DNSConstants.DNS_TTL); 00062 if (answer != null) { 00063 answers.add(answer); 00064 } 00065 } 00066 00067 @Override 00068 public boolean iAmTheOnlyOne(JmDNSImpl jmDNSImpl) { 00069 String name = this.getName().toLowerCase(); 00070 return jmDNSImpl.getLocalHost().getName().equals(name) || jmDNSImpl.getServices().keySet().contains(name); 00071 } 00072 00073 } 00074 00078 private static class HostInformation extends DNSQuestion { 00079 HostInformation(String name, DNSRecordType type, DNSRecordClass recordClass, boolean unique) { 00080 super(name, type, recordClass, unique); 00081 } 00082 } 00083 00087 private static class Pointer extends DNSQuestion { 00088 Pointer(String name, DNSRecordType type, DNSRecordClass recordClass, boolean unique) { 00089 super(name, type, recordClass, unique); 00090 } 00091 00092 @Override 00093 public void addAnswers(JmDNSImpl jmDNSImpl, Set<DNSRecord> answers) { 00094 // find matching services 00095 for (ServiceInfo serviceInfo : jmDNSImpl.getServices().values()) { 00096 this.addAnswersForServiceInfo(jmDNSImpl, answers, (ServiceInfoImpl) serviceInfo); 00097 } 00098 if (this.isServicesDiscoveryMetaQuery()) { 00099 for (String serviceType : jmDNSImpl.getServiceTypes().keySet()) { 00100 ServiceTypeEntry typeEntry = jmDNSImpl.getServiceTypes().get(serviceType); 00101 answers.add(new DNSRecord.Pointer("_services._dns-sd._udp.local.", DNSRecordClass.CLASS_IN, DNSRecordClass.NOT_UNIQUE, DNSConstants.DNS_TTL, typeEntry.getType())); 00102 } 00103 } else if (this.isReverseLookup()) { 00104 String ipValue = this.getQualifiedNameMap().get(Fields.Instance); 00105 if ((ipValue != null) && (ipValue.length() > 0)) { 00106 InetAddress address = jmDNSImpl.getLocalHost().getInetAddress(); 00107 String hostIPAddress = (address != null ? address.getHostAddress() : ""); 00108 if (ipValue.equalsIgnoreCase(hostIPAddress)) { 00109 if (this.isV4ReverseLookup()) { 00110 answers.add(jmDNSImpl.getLocalHost().getDNSReverseAddressRecord(DNSRecordType.TYPE_A, DNSRecordClass.NOT_UNIQUE, DNSConstants.DNS_TTL)); 00111 } 00112 if (this.isV6ReverseLookup()) { 00113 answers.add(jmDNSImpl.getLocalHost().getDNSReverseAddressRecord(DNSRecordType.TYPE_AAAA, DNSRecordClass.NOT_UNIQUE, DNSConstants.DNS_TTL)); 00114 } 00115 } 00116 } 00117 } else if (this.isDomainDiscoveryQuery()) { 00118 // FIXME [PJYF Nov 16 2010] We do not currently support domain discovery 00119 } 00120 } 00121 00122 } 00123 00127 private static class Service extends DNSQuestion { 00128 Service(String name, DNSRecordType type, DNSRecordClass recordClass, boolean unique) { 00129 super(name, type, recordClass, unique); 00130 } 00131 00132 @Override 00133 public void addAnswers(JmDNSImpl jmDNSImpl, Set<DNSRecord> answers) { 00134 String loname = this.getName().toLowerCase(); 00135 if (jmDNSImpl.getLocalHost().getName().equalsIgnoreCase(loname)) { 00136 // type = DNSConstants.TYPE_A; 00137 answers.addAll(jmDNSImpl.getLocalHost().answers(this.isUnique(), DNSConstants.DNS_TTL)); 00138 return; 00139 } 00140 // Service type request 00141 if (jmDNSImpl.getServiceTypes().containsKey(loname)) { 00142 DNSQuestion question = new Pointer(this.getName(), DNSRecordType.TYPE_PTR, this.getRecordClass(), this.isUnique()); 00143 question.addAnswers(jmDNSImpl, answers); 00144 return; 00145 } 00146 00147 this.addAnswersForServiceInfo(jmDNSImpl, answers, (ServiceInfoImpl) jmDNSImpl.getServices().get(loname)); 00148 } 00149 00150 @Override 00151 public boolean iAmTheOnlyOne(JmDNSImpl jmDNSImpl) { 00152 String name = this.getName().toLowerCase(); 00153 return jmDNSImpl.getLocalHost().getName().equals(name) || jmDNSImpl.getServices().keySet().contains(name); 00154 } 00155 00156 } 00157 00161 private static class Text extends DNSQuestion { 00162 Text(String name, DNSRecordType type, DNSRecordClass recordClass, boolean unique) { 00163 super(name, type, recordClass, unique); 00164 } 00165 00166 @Override 00167 public void addAnswers(JmDNSImpl jmDNSImpl, Set<DNSRecord> answers) { 00168 this.addAnswersForServiceInfo(jmDNSImpl, answers, (ServiceInfoImpl) jmDNSImpl.getServices().get(this.getName().toLowerCase())); 00169 } 00170 00171 @Override 00172 public boolean iAmTheOnlyOne(JmDNSImpl jmDNSImpl) { 00173 String name = this.getName().toLowerCase(); 00174 return jmDNSImpl.getLocalHost().getName().equals(name) || jmDNSImpl.getServices().keySet().contains(name); 00175 } 00176 00177 } 00178 00182 private static class AllRecords extends DNSQuestion { 00183 AllRecords(String name, DNSRecordType type, DNSRecordClass recordClass, boolean unique) { 00184 super(name, type, recordClass, unique); 00185 } 00186 00187 @Override 00188 public boolean isSameType(DNSEntry entry) { 00189 // We match all non null entry 00190 return (entry != null); 00191 } 00192 00193 @Override 00194 public void addAnswers(JmDNSImpl jmDNSImpl, Set<DNSRecord> answers) { 00195 String loname = this.getName().toLowerCase(); 00196 if (jmDNSImpl.getLocalHost().getName().equalsIgnoreCase(loname)) { 00197 // type = DNSConstants.TYPE_A; 00198 answers.addAll(jmDNSImpl.getLocalHost().answers(this.isUnique(), DNSConstants.DNS_TTL)); 00199 return; 00200 } 00201 // Service type request 00202 if (jmDNSImpl.getServiceTypes().containsKey(loname)) { 00203 DNSQuestion question = new Pointer(this.getName(), DNSRecordType.TYPE_PTR, this.getRecordClass(), this.isUnique()); 00204 question.addAnswers(jmDNSImpl, answers); 00205 return; 00206 } 00207 00208 this.addAnswersForServiceInfo(jmDNSImpl, answers, (ServiceInfoImpl) jmDNSImpl.getServices().get(loname)); 00209 } 00210 00211 @Override 00212 public boolean iAmTheOnlyOne(JmDNSImpl jmDNSImpl) { 00213 String name = this.getName().toLowerCase(); 00214 return jmDNSImpl.getLocalHost().getName().equals(name) || jmDNSImpl.getServices().keySet().contains(name); 00215 } 00216 00217 } 00218 00219 DNSQuestion(String name, DNSRecordType type, DNSRecordClass recordClass, boolean unique) { 00220 super(name, type, recordClass, unique); 00221 } 00222 00236 public static DNSQuestion newQuestion(String name, DNSRecordType type, DNSRecordClass recordClass, boolean unique) { 00237 switch (type) { 00238 case TYPE_A: 00239 return new DNS4Address(name, type, recordClass, unique); 00240 case TYPE_A6: 00241 return new DNS6Address(name, type, recordClass, unique); 00242 case TYPE_AAAA: 00243 return new DNS6Address(name, type, recordClass, unique); 00244 case TYPE_ANY: 00245 return new AllRecords(name, type, recordClass, unique); 00246 case TYPE_HINFO: 00247 return new HostInformation(name, type, recordClass, unique); 00248 case TYPE_PTR: 00249 return new Pointer(name, type, recordClass, unique); 00250 case TYPE_SRV: 00251 return new Service(name, type, recordClass, unique); 00252 case TYPE_TXT: 00253 return new Text(name, type, recordClass, unique); 00254 default: 00255 return new DNSQuestion(name, type, recordClass, unique); 00256 } 00257 } 00258 00262 boolean answeredBy(DNSEntry rec) { 00263 return this.isSameRecordClass(rec) && this.isSameType(rec) && this.getName().equals(rec.getName()); 00264 } 00265 00274 public void addAnswers(JmDNSImpl jmDNSImpl, Set<DNSRecord> answers) { 00275 // By default we do nothing 00276 } 00277 00278 protected void addAnswersForServiceInfo(JmDNSImpl jmDNSImpl, Set<DNSRecord> answers, ServiceInfoImpl info) { 00279 if ((info != null) && info.isAnnounced()) { 00280 if (this.getName().equalsIgnoreCase(info.getQualifiedName()) || this.getName().equalsIgnoreCase(info.getType())) { 00281 answers.addAll(jmDNSImpl.getLocalHost().answers(DNSRecordClass.UNIQUE, DNSConstants.DNS_TTL)); 00282 answers.addAll(info.answers(DNSRecordClass.UNIQUE, DNSConstants.DNS_TTL, jmDNSImpl.getLocalHost())); 00283 } 00284 if (logger.isLoggable(Level.FINER)) { 00285 logger.finer(jmDNSImpl.getName() + " DNSQuestion(" + this.getName() + ").addAnswersForServiceInfo(): info: " + info + "\n" + answers); 00286 } 00287 } 00288 } 00289 00290 /* 00291 * (non-Javadoc) 00292 * @see javax.jmdns.impl.DNSEntry#isStale(long) 00293 */ 00294 @Override 00295 public boolean isStale(long now) { 00296 return false; 00297 } 00298 00299 /* 00300 * (non-Javadoc) 00301 * @see javax.jmdns.impl.DNSEntry#isExpired(long) 00302 */ 00303 @Override 00304 public boolean isExpired(long now) { 00305 return false; 00306 } 00307 00315 public boolean iAmTheOnlyOne(JmDNSImpl jmDNSImpl) { 00316 return false; 00317 } 00318 00319 /* 00320 * (non-Javadoc) 00321 * @see javax.jmdns.impl.DNSEntry#toString(java.lang.StringBuilder) 00322 */ 00323 @Override 00324 public void toString(StringBuilder aLog) { 00325 // do nothing 00326 } 00327 00328 }