ServiceInfoResolver.java revision 3742d9db8b6edb10627b0f89336cca5249f1d15a
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.resolver;
6
7import java.io.IOException;
8
9import javax.jmdns.impl.DNSOutgoing;
10import javax.jmdns.impl.DNSQuestion;
11import javax.jmdns.impl.DNSRecord;
12import javax.jmdns.impl.JmDNSImpl;
13import javax.jmdns.impl.ServiceInfoImpl;
14import javax.jmdns.impl.constants.DNSRecordClass;
15import javax.jmdns.impl.constants.DNSRecordType;
16
17/**
18 * The ServiceInfoResolver queries up to three times consecutively for a service info, and then removes itself from the timer.
19 * <p/>
20 * The ServiceInfoResolver will run only if JmDNS is in state ANNOUNCED. REMIND: Prevent having multiple service resolvers for the same info in the timer queue.
21 */
22public class ServiceInfoResolver extends DNSResolverTask {
23
24    private final ServiceInfoImpl _info;
25
26    public ServiceInfoResolver(JmDNSImpl jmDNSImpl, ServiceInfoImpl info) {
27        super(jmDNSImpl);
28        this._info = info;
29        info.setDns(this.getDns());
30        this.getDns().addListener(info, DNSQuestion.newQuestion(info.getQualifiedName(), DNSRecordType.TYPE_ANY, DNSRecordClass.CLASS_IN, DNSRecordClass.NOT_UNIQUE));
31    }
32
33    /*
34     * (non-Javadoc)
35     * @see javax.jmdns.impl.tasks.DNSTask#getName()
36     */
37    @Override
38    public String getName() {
39        return "ServiceInfoResolver(" + (this.getDns() != null ? this.getDns().getName() : "") + ")";
40    }
41
42    /*
43     * (non-Javadoc)
44     * @see java.util.TimerTask#cancel()
45     */
46    @Override
47    public boolean cancel() {
48        // We should not forget to remove the listener
49        boolean result = super.cancel();
50        if (!_info.isPersistent()) {
51            this.getDns().removeListener(_info);
52        }
53        return result;
54    }
55
56    /*
57     * (non-Javadoc)
58     * @see javax.jmdns.impl.tasks.Resolver#addAnswers(javax.jmdns.impl.DNSOutgoing)
59     */
60    @Override
61    protected DNSOutgoing addAnswers(DNSOutgoing out) throws IOException {
62        DNSOutgoing newOut = out;
63        if (!_info.hasData()) {
64            long now = System.currentTimeMillis();
65            newOut = this.addAnswer(newOut, (DNSRecord) this.getDns().getCache().getDNSEntry(_info.getQualifiedName(), DNSRecordType.TYPE_SRV, DNSRecordClass.CLASS_IN), now);
66            newOut = this.addAnswer(newOut, (DNSRecord) this.getDns().getCache().getDNSEntry(_info.getQualifiedName(), DNSRecordType.TYPE_TXT, DNSRecordClass.CLASS_IN), now);
67            if (_info.getServer().length() > 0) {
68                newOut = this.addAnswer(newOut, (DNSRecord) this.getDns().getCache().getDNSEntry(_info.getServer(), DNSRecordType.TYPE_A, DNSRecordClass.CLASS_IN), now);
69                newOut = this.addAnswer(newOut, (DNSRecord) this.getDns().getCache().getDNSEntry(_info.getServer(), DNSRecordType.TYPE_AAAA, DNSRecordClass.CLASS_IN), now);
70            }
71        }
72        return newOut;
73    }
74
75    /*
76     * (non-Javadoc)
77     * @see javax.jmdns.impl.tasks.Resolver#addQuestions(javax.jmdns.impl.DNSOutgoing)
78     */
79    @Override
80    protected DNSOutgoing addQuestions(DNSOutgoing out) throws IOException {
81        DNSOutgoing newOut = out;
82        if (!_info.hasData()) {
83            newOut = this.addQuestion(newOut, DNSQuestion.newQuestion(_info.getQualifiedName(), DNSRecordType.TYPE_SRV, DNSRecordClass.CLASS_IN, DNSRecordClass.NOT_UNIQUE));
84            newOut = this.addQuestion(newOut, DNSQuestion.newQuestion(_info.getQualifiedName(), DNSRecordType.TYPE_TXT, DNSRecordClass.CLASS_IN, DNSRecordClass.NOT_UNIQUE));
85            if (_info.getServer().length() > 0) {
86                newOut = this.addQuestion(newOut, DNSQuestion.newQuestion(_info.getServer(), DNSRecordType.TYPE_A, DNSRecordClass.CLASS_IN, DNSRecordClass.NOT_UNIQUE));
87                newOut = this.addQuestion(newOut, DNSQuestion.newQuestion(_info.getServer(), DNSRecordType.TYPE_AAAA, DNSRecordClass.CLASS_IN, DNSRecordClass.NOT_UNIQUE));
88            }
89        }
90        return newOut;
91    }
92
93    /*
94     * (non-Javadoc)
95     * @see javax.jmdns.impl.tasks.Resolver#description()
96     */
97    @Override
98    protected String description() {
99        return "querying service info: " + (_info != null ? _info.getQualifiedName() : "null");
100    }
101
102}