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