View Javadoc

1   // Copyright 2003-2005 Arthur van Hoff, Rick Blair
2   // Licensed under Apache License version 2.0
3   // Original license LGPL
4   
5   package javax.jmdns.impl.tasks.state;
6   
7   import java.io.IOException;
8   import java.util.Timer;
9   import java.util.logging.Logger;
10  
11  import javax.jmdns.impl.DNSOutgoing;
12  import javax.jmdns.impl.DNSRecord;
13  import javax.jmdns.impl.JmDNSImpl;
14  import javax.jmdns.impl.ServiceInfoImpl;
15  import javax.jmdns.impl.constants.DNSConstants;
16  import javax.jmdns.impl.constants.DNSRecordClass;
17  import javax.jmdns.impl.constants.DNSState;
18  
19  /**
20   * The Canceler sends two announces with TTL=0 for the specified services.
21   */
22  public 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 }