public boolean cancel() { // Remove association from host name to this if (this.jmDNSImpl.getTask() == this) { this.jmDNSImpl.setTask(null); } // Remove associations from services to this synchronized (this.jmDNSImpl) { for (Iterator i = this.jmDNSImpl.getServices().values().iterator(); i.hasNext(); ) { ServiceInfoImpl info = (ServiceInfoImpl) i.next(); if (info.getTask() == this) { info.setTask(null); } } } return super.cancel(); }
public void run() { synchronized (this.jmDNSImpl.getIoLock()) { DNSOutgoing out = null; try { // send probes for JmDNS itself if (this.jmDNSImpl.getState() == taskState && this.jmDNSImpl.getTask() == this) { if (out == null) { out = new DNSOutgoing(DNSConstants.FLAGS_QR_QUERY); } out.addQuestion( new DNSQuestion( this.jmDNSImpl.getLocalHost().getName(), DNSConstants.TYPE_ANY, DNSConstants.CLASS_IN)); this.jmDNSImpl.getLocalHost().addAddressRecords(out, true); this.jmDNSImpl.advanceState(); } // send probes for services // Defensively copy the services into a local list, // to prevent race conditions with methods registerService // and unregisterService. List list; synchronized (this.jmDNSImpl) { list = new LinkedList(this.jmDNSImpl.getServices().values()); } for (Iterator i = list.iterator(); i.hasNext(); ) { ServiceInfoImpl info = (ServiceInfoImpl) i.next(); synchronized (info) { if (info.getState() == taskState && info.getTask() == this) { info.advanceState(); if (out == null) { out = new DNSOutgoing(DNSConstants.FLAGS_QR_QUERY); out.addQuestion( new DNSQuestion( info.getQualifiedName(), DNSConstants.TYPE_ANY, DNSConstants.CLASS_IN)); } // the "unique" flag should be not set here because these // answers haven't been proven unique yet // this means the record will not exactly match the // announcement record out.addAuthorativeAnswer( new DNSRecord.Service( info.getQualifiedName(), DNSConstants.TYPE_SRV, DNSConstants.CLASS_IN, DNSConstants.DNS_TTL, info.getPriority(), info.getWeight(), info.getPort(), this.jmDNSImpl.getLocalHost().getName())); } } } if (out != null) { this.jmDNSImpl.send(out); } else { // If we have nothing to send, another timer taskState ahead // of us has done the job for us. We can cancel. cancel(); return; } } catch (Throwable e) { this.jmDNSImpl.recover(); } taskState = taskState.advance(); if (!taskState.isProbing()) { cancel(); this.jmDNSImpl.startAnnouncer(); } } }