| // Copyright 2003-2005 Arthur van Hoff, Rick Blair |
| // Licensed under Apache License version 2.0 |
| // Original license LGPL |
| |
| package javax.jmdns.impl.tasks.state; |
| |
| import java.io.IOException; |
| import java.util.Timer; |
| import java.util.logging.Logger; |
| |
| import javax.jmdns.impl.DNSOutgoing; |
| import javax.jmdns.impl.DNSRecord; |
| import javax.jmdns.impl.JmDNSImpl; |
| import javax.jmdns.impl.ServiceInfoImpl; |
| import javax.jmdns.impl.constants.DNSConstants; |
| import javax.jmdns.impl.constants.DNSRecordClass; |
| import javax.jmdns.impl.constants.DNSState; |
| |
| /** |
| * The Renewer is there to send renewal announcement when the record expire for ours infos. |
| */ |
| public class Renewer extends DNSStateTask { |
| static Logger logger = Logger.getLogger(Renewer.class.getName()); |
| |
| public Renewer(JmDNSImpl jmDNSImpl) { |
| super(jmDNSImpl, defaultTTL()); |
| |
| this.setTaskState(DNSState.ANNOUNCED); |
| this.associate(DNSState.ANNOUNCED); |
| } |
| |
| /* |
| * (non-Javadoc) |
| * @see javax.jmdns.impl.tasks.DNSTask#getName() |
| */ |
| @Override |
| public String getName() { |
| return "Renewer(" + (this.getDns() != null ? this.getDns().getName() : "") + ")"; |
| } |
| |
| /* |
| * (non-Javadoc) |
| * @see java.lang.Object#toString() |
| */ |
| @Override |
| public String toString() { |
| return super.toString() + " state: " + this.getTaskState(); |
| } |
| |
| /* |
| * (non-Javadoc) |
| * @see javax.jmdns.impl.tasks.DNSTask#start(java.util.Timer) |
| */ |
| @Override |
| public void start(Timer timer) { |
| if (!this.getDns().isCanceling() && !this.getDns().isCanceled()) { |
| // BEGIN android-changed |
| // Schedule the renewer based on this task's TTL, not the default TTL |
| timer.schedule(this, getTTL() * 500, getTTL() * 500); |
| // END android-changed |
| } |
| } |
| |
| @Override |
| public boolean cancel() { |
| this.removeAssociation(); |
| |
| return super.cancel(); |
| } |
| |
| /* |
| * (non-Javadoc) |
| * @see javax.jmdns.impl.tasks.state.DNSStateTask#getTaskDescription() |
| */ |
| @Override |
| public String getTaskDescription() { |
| return "renewing"; |
| } |
| |
| /* |
| * (non-Javadoc) |
| * @see javax.jmdns.impl.tasks.state.DNSStateTask#checkRunCondition() |
| */ |
| @Override |
| protected boolean checkRunCondition() { |
| return !this.getDns().isCanceling() && !this.getDns().isCanceled(); |
| } |
| |
| /* |
| * (non-Javadoc) |
| * @see javax.jmdns.impl.tasks.state.DNSStateTask#createOugoing() |
| */ |
| @Override |
| protected DNSOutgoing createOugoing() { |
| return new DNSOutgoing(DNSConstants.FLAGS_QR_RESPONSE | DNSConstants.FLAGS_AA); |
| } |
| |
| /* |
| * (non-Javadoc) |
| * @see javax.jmdns.impl.tasks.state.DNSStateTask#buildOutgoingForDNS(javax.jmdns.impl.DNSOutgoing) |
| */ |
| @Override |
| protected DNSOutgoing buildOutgoingForDNS(DNSOutgoing out) throws IOException { |
| DNSOutgoing newOut = out; |
| for (DNSRecord answer : this.getDns().getLocalHost().answers(DNSRecordClass.UNIQUE, this.getTTL())) { |
| newOut = this.addAnswer(newOut, null, answer); |
| } |
| return newOut; |
| } |
| |
| /* |
| * (non-Javadoc) |
| * @see javax.jmdns.impl.tasks.state.DNSStateTask#buildOutgoingForInfo(javax.jmdns.impl.ServiceInfoImpl, javax.jmdns.impl.DNSOutgoing) |
| */ |
| @Override |
| protected DNSOutgoing buildOutgoingForInfo(ServiceInfoImpl info, DNSOutgoing out) throws IOException { |
| DNSOutgoing newOut = out; |
| for (DNSRecord answer : info.answers(DNSRecordClass.UNIQUE, this.getTTL(), this.getDns().getLocalHost())) { |
| newOut = this.addAnswer(newOut, null, answer); |
| } |
| return newOut; |
| } |
| |
| /* |
| * (non-Javadoc) |
| * @see javax.jmdns.impl.tasks.state.DNSStateTask#recoverTask(java.lang.Throwable) |
| */ |
| @Override |
| protected void recoverTask(Throwable e) { |
| this.getDns().recover(); |
| } |
| |
| /* |
| * (non-Javadoc) |
| * @see javax.jmdns.impl.tasks.state.DNSStateTask#advanceTask() |
| */ |
| @Override |
| protected void advanceTask() { |
| this.setTaskState(this.getTaskState().advance()); |
| if (!this.getTaskState().isAnnounced()) { |
| cancel(); |
| } |
| } |
| } |