13742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman// Licensed under Apache License version 2.0
23742d9db8b6edb10627b0f89336cca5249f1d15aManuel Romanpackage javax.jmdns.impl.tasks;
33742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman
43742d9db8b6edb10627b0f89336cca5249f1d15aManuel Romanimport java.io.IOException;
53742d9db8b6edb10627b0f89336cca5249f1d15aManuel Romanimport java.util.Timer;
63742d9db8b6edb10627b0f89336cca5249f1d15aManuel Romanimport java.util.TimerTask;
73742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman
83742d9db8b6edb10627b0f89336cca5249f1d15aManuel Romanimport javax.jmdns.impl.DNSIncoming;
93742d9db8b6edb10627b0f89336cca5249f1d15aManuel Romanimport javax.jmdns.impl.DNSOutgoing;
103742d9db8b6edb10627b0f89336cca5249f1d15aManuel Romanimport javax.jmdns.impl.DNSQuestion;
113742d9db8b6edb10627b0f89336cca5249f1d15aManuel Romanimport javax.jmdns.impl.DNSRecord;
123742d9db8b6edb10627b0f89336cca5249f1d15aManuel Romanimport javax.jmdns.impl.JmDNSImpl;
133742d9db8b6edb10627b0f89336cca5249f1d15aManuel Romanimport javax.jmdns.impl.constants.DNSConstants;
143742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman
153742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman/**
163742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * This is the root class for all task scheduled by the timer in JmDNS.
173742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman *
183742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * @author Pierre Frisch
193742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman */
203742d9db8b6edb10627b0f89336cca5249f1d15aManuel Romanpublic abstract class DNSTask extends TimerTask {
213742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman
223742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    /**
233742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     *
243742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     */
253742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    private final JmDNSImpl _jmDNSImpl;
263742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman
273742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    /**
283742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * @param jmDNSImpl
293742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     */
303742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    protected DNSTask(JmDNSImpl jmDNSImpl) {
313742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        super();
323742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        this._jmDNSImpl = jmDNSImpl;
333742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    }
343742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman
353742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    /**
363742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * Return the DNS associated with this task.
373742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     *
383742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * @return associated DNS
393742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     */
403742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    public JmDNSImpl getDns() {
413742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        return _jmDNSImpl;
423742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    }
433742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman
443742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    /**
453742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * Start this task.
463742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     *
473742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * @param timer
483742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     *            task timer.
493742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     */
503742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    public abstract void start(Timer timer);
513742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman
523742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    /**
533742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * Return this task name.
543742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     *
553742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * @return task name
563742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     */
573742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    public abstract String getName();
583742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman
593742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    /*
603742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * (non-Javadoc)
613742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * @see java.lang.Object#toString()
623742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     */
633742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    @Override
643742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    public String toString() {
653742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        return this.getName();
663742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    }
673742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman
683742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    /**
693742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * Add a question to the message.
703742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     *
713742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * @param out
723742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     *            outgoing message
733742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * @param rec
743742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     *            DNS question
753742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * @return outgoing message for the next question
763742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * @exception IOException
773742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     */
783742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    public DNSOutgoing addQuestion(DNSOutgoing out, DNSQuestion rec) throws IOException {
793742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        DNSOutgoing newOut = out;
803742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        try {
813742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman            newOut.addQuestion(rec);
823742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        } catch (final IOException e) {
833742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman            int flags = newOut.getFlags();
843742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman            boolean multicast = newOut.isMulticast();
853742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman            int maxUDPPayload = newOut.getMaxUDPPayload();
863742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman            int id = newOut.getId();
873742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman
883742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman            newOut.setFlags(flags | DNSConstants.FLAGS_TC);
893742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman            newOut.setId(id);
903742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman            this._jmDNSImpl.send(newOut);
913742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman
923742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman            newOut = new DNSOutgoing(flags, multicast, maxUDPPayload);
933742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman            newOut.addQuestion(rec);
943742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        }
953742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        return newOut;
963742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    }
973742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman
983742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    /**
993742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * Add an answer if it is not suppressed.
1003742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     *
1013742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * @param out
1023742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     *            outgoing message
1033742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * @param in
1043742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     *            incoming request
1053742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * @param rec
1063742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     *            DNS record answer
1073742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * @return outgoing message for the next answer
1083742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * @exception IOException
1093742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     */
1103742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    public DNSOutgoing addAnswer(DNSOutgoing out, DNSIncoming in, DNSRecord rec) throws IOException {
1113742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        DNSOutgoing newOut = out;
1123742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        try {
1133742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman            newOut.addAnswer(in, rec);
1143742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        } catch (final IOException e) {
1153742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman            int flags = newOut.getFlags();
1163742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman            boolean multicast = newOut.isMulticast();
1173742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman            int maxUDPPayload = newOut.getMaxUDPPayload();
1183742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman            int id = newOut.getId();
1193742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman
1203742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman            newOut.setFlags(flags | DNSConstants.FLAGS_TC);
1213742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman            newOut.setId(id);
1223742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman            this._jmDNSImpl.send(newOut);
1233742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman
1243742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman            newOut = new DNSOutgoing(flags, multicast, maxUDPPayload);
1253742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman            newOut.addAnswer(in, rec);
1263742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        }
1273742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        return newOut;
1283742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    }
1293742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman
1303742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    /**
1313742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * Add an answer to the message.
1323742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     *
1333742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * @param out
1343742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     *            outgoing message
1353742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * @param rec
1363742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     *            DNS record answer
1373742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * @param now
1383742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * @return outgoing message for the next answer
1393742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * @exception IOException
1403742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     */
1413742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    public DNSOutgoing addAnswer(DNSOutgoing out, DNSRecord rec, long now) throws IOException {
1423742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        DNSOutgoing newOut = out;
1433742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        try {
1443742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman            newOut.addAnswer(rec, now);
1453742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        } catch (final IOException e) {
1463742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman            int flags = newOut.getFlags();
1473742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman            boolean multicast = newOut.isMulticast();
1483742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman            int maxUDPPayload = newOut.getMaxUDPPayload();
1493742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman            int id = newOut.getId();
1503742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman
1513742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman            newOut.setFlags(flags | DNSConstants.FLAGS_TC);
1523742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman            newOut.setId(id);
1533742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman            this._jmDNSImpl.send(newOut);
1543742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman
1553742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman            newOut = new DNSOutgoing(flags, multicast, maxUDPPayload);
1563742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman            newOut.addAnswer(rec, now);
1573742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        }
1583742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        return newOut;
1593742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    }
1603742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman
1613742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    /**
1623742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * Add an authoritative answer to the message.
1633742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     *
1643742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * @param out
1653742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     *            outgoing message
1663742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * @param rec
1673742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     *            DNS record answer
1683742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * @return outgoing message for the next answer
1693742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * @exception IOException
1703742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     */
1713742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    public DNSOutgoing addAuthoritativeAnswer(DNSOutgoing out, DNSRecord rec) throws IOException {
1723742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        DNSOutgoing newOut = out;
1733742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        try {
1743742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman            newOut.addAuthorativeAnswer(rec);
1753742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        } catch (final IOException e) {
1763742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman            int flags = newOut.getFlags();
1773742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman            boolean multicast = newOut.isMulticast();
1783742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman            int maxUDPPayload = newOut.getMaxUDPPayload();
1793742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman            int id = newOut.getId();
1803742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman
1813742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman            newOut.setFlags(flags | DNSConstants.FLAGS_TC);
1823742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman            newOut.setId(id);
1833742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman            this._jmDNSImpl.send(newOut);
1843742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman
1853742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman            newOut = new DNSOutgoing(flags, multicast, maxUDPPayload);
1863742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman            newOut.addAuthorativeAnswer(rec);
1873742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        }
1883742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        return newOut;
1893742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    }
1903742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman
1913742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    /**
1923742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * Add an additional answer to the record. Omit if there is no room.
1933742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     *
1943742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * @param out
1953742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     *            outgoing message
1963742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * @param in
1973742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     *            incoming request
1983742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * @param rec
1993742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     *            DNS record answer
2003742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * @return outgoing message for the next answer
2013742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * @exception IOException
2023742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     */
2033742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    public DNSOutgoing addAdditionalAnswer(DNSOutgoing out, DNSIncoming in, DNSRecord rec) throws IOException {
2043742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        DNSOutgoing newOut = out;
2053742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        try {
2063742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman            newOut.addAdditionalAnswer(in, rec);
2073742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        } catch (final IOException e) {
2083742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman            int flags = newOut.getFlags();
2093742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman            boolean multicast = newOut.isMulticast();
2103742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman            int maxUDPPayload = newOut.getMaxUDPPayload();
2113742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman            int id = newOut.getId();
2123742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman
2133742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman            newOut.setFlags(flags | DNSConstants.FLAGS_TC);
2143742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman            newOut.setId(id);
2153742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman            this._jmDNSImpl.send(newOut);
2163742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman
2173742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman            newOut = new DNSOutgoing(flags, multicast, maxUDPPayload);
2183742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman            newOut.addAdditionalAnswer(in, rec);
2193742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        }
2203742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        return newOut;
2213742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    }
2223742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman
2233742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman}
224