// 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; } }