diff options
Diffstat (limited to 'src/javax/jmdns/impl/tasks/DNSTask.java')
-rw-r--r-- | src/javax/jmdns/impl/tasks/DNSTask.java | 223 |
1 files changed, 223 insertions, 0 deletions
diff --git a/src/javax/jmdns/impl/tasks/DNSTask.java b/src/javax/jmdns/impl/tasks/DNSTask.java new file mode 100644 index 0000000..f7affd5 --- /dev/null +++ b/src/javax/jmdns/impl/tasks/DNSTask.java @@ -0,0 +1,223 @@ +// Licensed under Apache License version 2.0 +package javax.jmdns.impl.tasks; + +import java.io.IOException; +import java.util.Timer; +import java.util.TimerTask; + +import javax.jmdns.impl.DNSIncoming; +import javax.jmdns.impl.DNSOutgoing; +import javax.jmdns.impl.DNSQuestion; +import javax.jmdns.impl.DNSRecord; +import javax.jmdns.impl.JmDNSImpl; +import javax.jmdns.impl.constants.DNSConstants; + +/** + * This is the root class for all task scheduled by the timer in JmDNS. + * + * @author Pierre Frisch + */ +public abstract class DNSTask extends TimerTask { + + /** + * + */ + private final JmDNSImpl _jmDNSImpl; + + /** + * @param jmDNSImpl + */ + protected DNSTask(JmDNSImpl jmDNSImpl) { + super(); + this._jmDNSImpl = jmDNSImpl; + } + + /** + * Return the DNS associated with this task. + * + * @return associated DNS + */ + public JmDNSImpl getDns() { + return _jmDNSImpl; + } + + /** + * Start this task. + * + * @param timer + * task timer. + */ + public abstract void start(Timer timer); + + /** + * Return this task name. + * + * @return task name + */ + public abstract String getName(); + + /* + * (non-Javadoc) + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + return this.getName(); + } + + /** + * Add a question to the message. + * + * @param out + * outgoing message + * @param rec + * DNS question + * @return outgoing message for the next question + * @exception IOException + */ + public DNSOutgoing addQuestion(DNSOutgoing out, DNSQuestion rec) throws IOException { + DNSOutgoing newOut = out; + try { + newOut.addQuestion(rec); + } catch (final IOException e) { + int flags = newOut.getFlags(); + boolean multicast = newOut.isMulticast(); + int maxUDPPayload = newOut.getMaxUDPPayload(); + int id = newOut.getId(); + + newOut.setFlags(flags | DNSConstants.FLAGS_TC); + newOut.setId(id); + this._jmDNSImpl.send(newOut); + + newOut = new DNSOutgoing(flags, multicast, maxUDPPayload); + newOut.addQuestion(rec); + } + return newOut; + } + + /** + * Add an answer if it is not suppressed. + * + * @param out + * outgoing message + * @param in + * incoming request + * @param rec + * DNS record answer + * @return outgoing message for the next answer + * @exception IOException + */ + public DNSOutgoing addAnswer(DNSOutgoing out, DNSIncoming in, DNSRecord rec) throws IOException { + DNSOutgoing newOut = out; + try { + newOut.addAnswer(in, rec); + } catch (final IOException e) { + int flags = newOut.getFlags(); + boolean multicast = newOut.isMulticast(); + int maxUDPPayload = newOut.getMaxUDPPayload(); + int id = newOut.getId(); + + newOut.setFlags(flags | DNSConstants.FLAGS_TC); + newOut.setId(id); + this._jmDNSImpl.send(newOut); + + newOut = new DNSOutgoing(flags, multicast, maxUDPPayload); + newOut.addAnswer(in, rec); + } + return newOut; + } + + /** + * Add an answer to the message. + * + * @param out + * outgoing message + * @param rec + * DNS record answer + * @param now + * @return outgoing message for the next answer + * @exception IOException + */ + public DNSOutgoing addAnswer(DNSOutgoing out, DNSRecord rec, long now) throws IOException { + DNSOutgoing newOut = out; + try { + newOut.addAnswer(rec, now); + } catch (final IOException e) { + int flags = newOut.getFlags(); + boolean multicast = newOut.isMulticast(); + int maxUDPPayload = newOut.getMaxUDPPayload(); + int id = newOut.getId(); + + newOut.setFlags(flags | DNSConstants.FLAGS_TC); + newOut.setId(id); + this._jmDNSImpl.send(newOut); + + newOut = new DNSOutgoing(flags, multicast, maxUDPPayload); + newOut.addAnswer(rec, now); + } + return newOut; + } + + /** + * Add an authoritative answer to the message. + * + * @param out + * outgoing message + * @param rec + * DNS record answer + * @return outgoing message for the next answer + * @exception IOException + */ + public DNSOutgoing addAuthoritativeAnswer(DNSOutgoing out, DNSRecord rec) throws IOException { + DNSOutgoing newOut = out; + try { + newOut.addAuthorativeAnswer(rec); + } catch (final IOException e) { + int flags = newOut.getFlags(); + boolean multicast = newOut.isMulticast(); + int maxUDPPayload = newOut.getMaxUDPPayload(); + int id = newOut.getId(); + + newOut.setFlags(flags | DNSConstants.FLAGS_TC); + newOut.setId(id); + this._jmDNSImpl.send(newOut); + + newOut = new DNSOutgoing(flags, multicast, maxUDPPayload); + newOut.addAuthorativeAnswer(rec); + } + return newOut; + } + + /** + * Add an additional answer to the record. Omit if there is no room. + * + * @param out + * outgoing message + * @param in + * incoming request + * @param rec + * DNS record answer + * @return outgoing message for the next answer + * @exception IOException + */ + public DNSOutgoing addAdditionalAnswer(DNSOutgoing out, DNSIncoming in, DNSRecord rec) throws IOException { + DNSOutgoing newOut = out; + try { + newOut.addAdditionalAnswer(in, rec); + } catch (final IOException e) { + int flags = newOut.getFlags(); + boolean multicast = newOut.isMulticast(); + int maxUDPPayload = newOut.getMaxUDPPayload(); + int id = newOut.getId(); + + newOut.setFlags(flags | DNSConstants.FLAGS_TC); + newOut.setId(id); + this._jmDNSImpl.send(newOut); + + newOut = new DNSOutgoing(flags, multicast, maxUDPPayload); + newOut.addAdditionalAnswer(in, rec); + } + return newOut; + } + +} |