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.ServiceInfo;
10import javax.jmdns.impl.DNSOutgoing;
11import javax.jmdns.impl.DNSQuestion;
12import javax.jmdns.impl.DNSRecord;
13import javax.jmdns.impl.JmDNSImpl;
14import javax.jmdns.impl.constants.DNSConstants;
15import javax.jmdns.impl.constants.DNSRecordClass;
16import javax.jmdns.impl.constants.DNSRecordType;
17
18/**
19 * The ServiceResolver queries three times consecutively for services of a given type, and then removes itself from the timer.
20 * <p/>
21 * The ServiceResolver will run only if JmDNS is in state ANNOUNCED. REMIND: Prevent having multiple service resolvers for the same type in the timer queue.
22 */
23public class ServiceResolver extends DNSResolverTask {
24
25    private final String _type;
26
27    public ServiceResolver(JmDNSImpl jmDNSImpl, String type) {
28        super(jmDNSImpl);
29        this._type = type;
30    }
31
32    /*
33     * (non-Javadoc)
34     * @see javax.jmdns.impl.tasks.DNSTask#getName()
35     */
36    @Override
37    public String getName() {
38        return "ServiceResolver(" + (this.getDns() != null ? this.getDns().getName() : "") + ")";
39    }
40
41    /*
42     * (non-Javadoc)
43     * @see javax.jmdns.impl.tasks.Resolver#addAnswers(javax.jmdns.impl.DNSOutgoing)
44     */
45    @Override
46    protected DNSOutgoing addAnswers(DNSOutgoing out) throws IOException {
47        DNSOutgoing newOut = out;
48        long now = System.currentTimeMillis();
49        for (ServiceInfo info : this.getDns().getServices().values()) {
50            newOut = this.addAnswer(newOut, new DNSRecord.Pointer(info.getType(), DNSRecordClass.CLASS_IN, DNSRecordClass.NOT_UNIQUE, DNSConstants.DNS_TTL, info.getQualifiedName()), now);
51            // newOut = this.addAnswer(newOut, new DNSRecord.Service(info.getQualifiedName(), DNSRecordClass.CLASS_IN, DNSRecordClass.NOT_UNIQUE, DNSConstants.DNS_TTL, info.getPriority(), info.getWeight(), info.getPort(),
52            // this.getDns().getLocalHost().getName()), now);
53        }
54        return newOut;
55    }
56
57    /*
58     * (non-Javadoc)
59     * @see javax.jmdns.impl.tasks.Resolver#addQuestions(javax.jmdns.impl.DNSOutgoing)
60     */
61    @Override
62    protected DNSOutgoing addQuestions(DNSOutgoing out) throws IOException {
63        DNSOutgoing newOut = out;
64        newOut = this.addQuestion(newOut, DNSQuestion.newQuestion(_type, DNSRecordType.TYPE_PTR, DNSRecordClass.CLASS_IN, DNSRecordClass.NOT_UNIQUE));
65        // newOut = this.addQuestion(newOut, DNSQuestion.newQuestion(_type, DNSRecordType.TYPE_SRV, DNSRecordClass.CLASS_IN, DNSRecordClass.NOT_UNIQUE));
66        return newOut;
67    }
68
69    /*
70     * (non-Javadoc)
71     * @see javax.jmdns.impl.tasks.Resolver#description()
72     */
73    @Override
74    protected String description() {
75        return "querying service";
76    }
77}