1// Copyright 2003-2005 Arthur van Hoff, Rick Blair 2// Licensed under Apache License version 2.0 3// Original license LGPL 4 5package javax.jmdns.impl.tasks.state; 6 7import java.io.IOException; 8import java.util.Timer; 9import java.util.logging.Logger; 10 11import javax.jmdns.impl.DNSOutgoing; 12import javax.jmdns.impl.DNSRecord; 13import javax.jmdns.impl.JmDNSImpl; 14import javax.jmdns.impl.ServiceInfoImpl; 15import javax.jmdns.impl.constants.DNSConstants; 16import javax.jmdns.impl.constants.DNSRecordClass; 17import javax.jmdns.impl.constants.DNSState; 18 19/** 20 * The Canceler sends two announces with TTL=0 for the specified services. 21 */ 22public class Canceler extends DNSStateTask { 23 static Logger logger = Logger.getLogger(Canceler.class.getName()); 24 25 public Canceler(JmDNSImpl jmDNSImpl) { 26 super(jmDNSImpl, 0); 27 28 this.setTaskState(DNSState.CANCELING_1); 29 this.associate(DNSState.CANCELING_1); 30 } 31 32 /* 33 * (non-Javadoc) 34 * @see javax.jmdns.impl.tasks.DNSTask#getName() 35 */ 36 @Override 37 public String getName() { 38 return "Canceler(" + (this.getDns() != null ? this.getDns().getName() : "") + ")"; 39 } 40 41 /* 42 * (non-Javadoc) 43 * @see java.lang.Object#toString() 44 */ 45 @Override 46 public String toString() { 47 return super.toString() + " state: " + this.getTaskState(); 48 } 49 50 /* 51 * (non-Javadoc) 52 * @see javax.jmdns.impl.tasks.DNSTask#start(java.util.Timer) 53 */ 54 @Override 55 public void start(Timer timer) { 56 timer.schedule(this, 0, DNSConstants.ANNOUNCE_WAIT_INTERVAL); 57 } 58 59 /* 60 * (non-Javadoc) 61 * @see java.util.TimerTask#cancel() 62 */ 63 @Override 64 public boolean cancel() { 65 this.removeAssociation(); 66 67 return super.cancel(); 68 } 69 70 /* 71 * (non-Javadoc) 72 * @see javax.jmdns.impl.tasks.state.DNSStateTask#getTaskDescription() 73 */ 74 @Override 75 public String getTaskDescription() { 76 return "canceling"; 77 } 78 79 /* 80 * (non-Javadoc) 81 * @see javax.jmdns.impl.tasks.state.DNSStateTask#checkRunCondition() 82 */ 83 @Override 84 protected boolean checkRunCondition() { 85 return true; 86 } 87 88 /* 89 * (non-Javadoc) 90 * @see javax.jmdns.impl.tasks.state.DNSStateTask#createOugoing() 91 */ 92 @Override 93 protected DNSOutgoing createOugoing() { 94 return new DNSOutgoing(DNSConstants.FLAGS_QR_RESPONSE | DNSConstants.FLAGS_AA); 95 } 96 97 /* 98 * (non-Javadoc) 99 * @see javax.jmdns.impl.tasks.state.DNSStateTask#buildOutgoingForDNS(javax.jmdns.impl.DNSOutgoing) 100 */ 101 @Override 102 protected DNSOutgoing buildOutgoingForDNS(DNSOutgoing out) throws IOException { 103 DNSOutgoing newOut = out; 104 for (DNSRecord answer : this.getDns().getLocalHost().answers(DNSRecordClass.UNIQUE, this.getTTL())) { 105 newOut = this.addAnswer(newOut, null, answer); 106 } 107 return newOut; 108 } 109 110 /* 111 * (non-Javadoc) 112 * @see javax.jmdns.impl.tasks.state.DNSStateTask#buildOutgoingForInfo(javax.jmdns.impl.ServiceInfoImpl, javax.jmdns.impl.DNSOutgoing) 113 */ 114 @Override 115 protected DNSOutgoing buildOutgoingForInfo(ServiceInfoImpl info, DNSOutgoing out) throws IOException { 116 DNSOutgoing newOut = out; 117 for (DNSRecord answer : info.answers(DNSRecordClass.UNIQUE, this.getTTL(), this.getDns().getLocalHost())) { 118 newOut = this.addAnswer(newOut, null, answer); 119 } 120 return newOut; 121 } 122 123 /* 124 * (non-Javadoc) 125 * @see javax.jmdns.impl.tasks.state.DNSStateTask#recoverTask(java.lang.Throwable) 126 */ 127 @Override 128 protected void recoverTask(Throwable e) { 129 this.getDns().recover(); 130 } 131 132 /* 133 * (non-Javadoc) 134 * @see javax.jmdns.impl.tasks.state.DNSStateTask#advanceTask() 135 */ 136 @Override 137 protected void advanceTask() { 138 this.setTaskState(this.getTaskState().advance()); 139 if (!this.getTaskState().isCanceling()) { 140 cancel(); 141 } 142 } 143}