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 Announcer sends an accumulated query of all announces, and advances the state of all serviceInfos, for which it has sent an announce. The Announcer also sends announcements and advances the state of JmDNS itself.
21 * <p/>
22 * When the announcer has run two times, it finishes.
23 */
24public class Announcer extends DNSStateTask {
25    static Logger logger = Logger.getLogger(Announcer.class.getName());
26
27    public Announcer(JmDNSImpl jmDNSImpl) {
28        super(jmDNSImpl, defaultTTL());
29
30        this.setTaskState(DNSState.ANNOUNCING_1);
31        this.associate(DNSState.ANNOUNCING_1);
32    }
33
34    /*
35     * (non-Javadoc)
36     * @see javax.jmdns.impl.tasks.DNSTask#getName()
37     */
38    @Override
39    public String getName() {
40        return "Announcer(" + (this.getDns() != null ? this.getDns().getName() : "") + ")";
41    }
42
43    /*
44     * (non-Javadoc)
45     * @see java.lang.Object#toString()
46     */
47    @Override
48    public String toString() {
49        return super.toString() + " state: " + this.getTaskState();
50    }
51
52    /*
53     * (non-Javadoc)
54     * @see javax.jmdns.impl.tasks.DNSTask#start(java.util.Timer)
55     */
56    @Override
57    public void start(Timer timer) {
58        if (!this.getDns().isCanceling() && !this.getDns().isCanceled()) {
59            timer.schedule(this, DNSConstants.ANNOUNCE_WAIT_INTERVAL, DNSConstants.ANNOUNCE_WAIT_INTERVAL);
60        }
61    }
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 "announcing";
77    }
78
79    /*
80     * (non-Javadoc)
81     * @see javax.jmdns.impl.tasks.state.DNSStateTask#checkRunCondition()
82     */
83    @Override
84    protected boolean checkRunCondition() {
85        return !this.getDns().isCanceling() && !this.getDns().isCanceled();
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().isAnnouncing()) {
140            this.cancel();
141
142            this.getDns().startRenewer();
143        }
144    }
145
146}