diff options
Diffstat (limited to 'src/javax/jmdns/impl/tasks/state/Renewer.java')
-rw-r--r-- | src/javax/jmdns/impl/tasks/state/Renewer.java | 144 |
1 files changed, 144 insertions, 0 deletions
diff --git a/src/javax/jmdns/impl/tasks/state/Renewer.java b/src/javax/jmdns/impl/tasks/state/Renewer.java new file mode 100644 index 0000000..f79ee12 --- /dev/null +++ b/src/javax/jmdns/impl/tasks/state/Renewer.java @@ -0,0 +1,144 @@ +// 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(); + } + } +}
\ No newline at end of file |