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}