1 // Licensed under Apache License version 2.0 2 package javax.jmdns.impl.tasks; 3 4 import java.io.IOException; 5 import java.util.Timer; 6 import java.util.TimerTask; 7 8 import javax.jmdns.impl.DNSIncoming; 9 import javax.jmdns.impl.DNSOutgoing; 10 import javax.jmdns.impl.DNSQuestion; 11 import javax.jmdns.impl.DNSRecord; 12 import javax.jmdns.impl.JmDNSImpl; 13 import javax.jmdns.impl.constants.DNSConstants; 14 15 /** 16 * This is the root class for all task scheduled by the timer in JmDNS. 17 * 18 * @author Pierre Frisch 19 */ 20 public abstract class DNSTask extends TimerTask { 21 22 /** 23 * 24 */ 25 private final JmDNSImpl _jmDNSImpl; 26 27 /** 28 * @param jmDNSImpl 29 */ 30 protected DNSTask(JmDNSImpl jmDNSImpl) { 31 super(); 32 this._jmDNSImpl = jmDNSImpl; 33 } 34 35 /** 36 * Return the DNS associated with this task. 37 * 38 * @return associated DNS 39 */ 40 public JmDNSImpl getDns() { 41 return _jmDNSImpl; 42 } 43 44 /** 45 * Start this task. 46 * 47 * @param timer 48 * task timer. 49 */ 50 public abstract void start(Timer timer); 51 52 /** 53 * Return this task name. 54 * 55 * @return task name 56 */ 57 public abstract String getName(); 58 59 /* 60 * (non-Javadoc) 61 * @see java.lang.Object#toString() 62 */ 63 @Override 64 public String toString() { 65 return this.getName(); 66 } 67 68 /** 69 * Add a question to the message. 70 * 71 * @param out 72 * outgoing message 73 * @param rec 74 * DNS question 75 * @return outgoing message for the next question 76 * @exception IOException 77 */ 78 public DNSOutgoing addQuestion(DNSOutgoing out, DNSQuestion rec) throws IOException { 79 DNSOutgoing newOut = out; 80 try { 81 newOut.addQuestion(rec); 82 } catch (final IOException e) { 83 int flags = newOut.getFlags(); 84 boolean multicast = newOut.isMulticast(); 85 int maxUDPPayload = newOut.getMaxUDPPayload(); 86 int id = newOut.getId(); 87 88 newOut.setFlags(flags | DNSConstants.FLAGS_TC); 89 newOut.setId(id); 90 this._jmDNSImpl.send(newOut); 91 92 newOut = new DNSOutgoing(flags, multicast, maxUDPPayload); 93 newOut.addQuestion(rec); 94 } 95 return newOut; 96 } 97 98 /** 99 * Add an answer if it is not suppressed. 100 * 101 * @param out 102 * outgoing message 103 * @param in 104 * incoming request 105 * @param rec 106 * DNS record answer 107 * @return outgoing message for the next answer 108 * @exception IOException 109 */ 110 public DNSOutgoing addAnswer(DNSOutgoing out, DNSIncoming in, DNSRecord rec) throws IOException { 111 DNSOutgoing newOut = out; 112 try { 113 newOut.addAnswer(in, rec); 114 } catch (final IOException e) { 115 int flags = newOut.getFlags(); 116 boolean multicast = newOut.isMulticast(); 117 int maxUDPPayload = newOut.getMaxUDPPayload(); 118 int id = newOut.getId(); 119 120 newOut.setFlags(flags | DNSConstants.FLAGS_TC); 121 newOut.setId(id); 122 this._jmDNSImpl.send(newOut); 123 124 newOut = new DNSOutgoing(flags, multicast, maxUDPPayload); 125 newOut.addAnswer(in, rec); 126 } 127 return newOut; 128 } 129 130 /** 131 * Add an answer to the message. 132 * 133 * @param out 134 * outgoing message 135 * @param rec 136 * DNS record answer 137 * @param now 138 * @return outgoing message for the next answer 139 * @exception IOException 140 */ 141 public DNSOutgoing addAnswer(DNSOutgoing out, DNSRecord rec, long now) throws IOException { 142 DNSOutgoing newOut = out; 143 try { 144 newOut.addAnswer(rec, now); 145 } catch (final IOException e) { 146 int flags = newOut.getFlags(); 147 boolean multicast = newOut.isMulticast(); 148 int maxUDPPayload = newOut.getMaxUDPPayload(); 149 int id = newOut.getId(); 150 151 newOut.setFlags(flags | DNSConstants.FLAGS_TC); 152 newOut.setId(id); 153 this._jmDNSImpl.send(newOut); 154 155 newOut = new DNSOutgoing(flags, multicast, maxUDPPayload); 156 newOut.addAnswer(rec, now); 157 } 158 return newOut; 159 } 160 161 /** 162 * Add an authoritative answer to the message. 163 * 164 * @param out 165 * outgoing message 166 * @param rec 167 * DNS record answer 168 * @return outgoing message for the next answer 169 * @exception IOException 170 */ 171 public DNSOutgoing addAuthoritativeAnswer(DNSOutgoing out, DNSRecord rec) throws IOException { 172 DNSOutgoing newOut = out; 173 try { 174 newOut.addAuthorativeAnswer(rec); 175 } catch (final IOException e) { 176 int flags = newOut.getFlags(); 177 boolean multicast = newOut.isMulticast(); 178 int maxUDPPayload = newOut.getMaxUDPPayload(); 179 int id = newOut.getId(); 180 181 newOut.setFlags(flags | DNSConstants.FLAGS_TC); 182 newOut.setId(id); 183 this._jmDNSImpl.send(newOut); 184 185 newOut = new DNSOutgoing(flags, multicast, maxUDPPayload); 186 newOut.addAuthorativeAnswer(rec); 187 } 188 return newOut; 189 } 190 191 /** 192 * Add an additional answer to the record. Omit if there is no room. 193 * 194 * @param out 195 * outgoing message 196 * @param in 197 * incoming request 198 * @param rec 199 * DNS record answer 200 * @return outgoing message for the next answer 201 * @exception IOException 202 */ 203 public DNSOutgoing addAdditionalAnswer(DNSOutgoing out, DNSIncoming in, DNSRecord rec) throws IOException { 204 DNSOutgoing newOut = out; 205 try { 206 newOut.addAdditionalAnswer(in, rec); 207 } catch (final IOException e) { 208 int flags = newOut.getFlags(); 209 boolean multicast = newOut.isMulticast(); 210 int maxUDPPayload = newOut.getMaxUDPPayload(); 211 int id = newOut.getId(); 212 213 newOut.setFlags(flags | DNSConstants.FLAGS_TC); 214 newOut.setId(id); 215 this._jmDNSImpl.send(newOut); 216 217 newOut = new DNSOutgoing(flags, multicast, maxUDPPayload); 218 newOut.addAdditionalAnswer(in, rec); 219 } 220 return newOut; 221 } 222 223 } 224