13742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman// Copyright 2003-2005 Arthur van Hoff, Rick Blair
23742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman// Licensed under Apache License version 2.0
33742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman// Original license LGPL
43742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman
53742d9db8b6edb10627b0f89336cca5249f1d15aManuel Romanpackage javax.jmdns.impl.tasks.state;
63742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman
73742d9db8b6edb10627b0f89336cca5249f1d15aManuel Romanimport java.io.IOException;
83742d9db8b6edb10627b0f89336cca5249f1d15aManuel Romanimport java.util.Timer;
93742d9db8b6edb10627b0f89336cca5249f1d15aManuel Romanimport java.util.logging.Logger;
103742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman
113742d9db8b6edb10627b0f89336cca5249f1d15aManuel Romanimport javax.jmdns.impl.DNSOutgoing;
123742d9db8b6edb10627b0f89336cca5249f1d15aManuel Romanimport javax.jmdns.impl.DNSRecord;
133742d9db8b6edb10627b0f89336cca5249f1d15aManuel Romanimport javax.jmdns.impl.JmDNSImpl;
143742d9db8b6edb10627b0f89336cca5249f1d15aManuel Romanimport javax.jmdns.impl.ServiceInfoImpl;
153742d9db8b6edb10627b0f89336cca5249f1d15aManuel Romanimport javax.jmdns.impl.constants.DNSConstants;
163742d9db8b6edb10627b0f89336cca5249f1d15aManuel Romanimport javax.jmdns.impl.constants.DNSRecordClass;
173742d9db8b6edb10627b0f89336cca5249f1d15aManuel Romanimport javax.jmdns.impl.constants.DNSState;
183742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman
193742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman/**
203742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * 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.
213742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * <p/>
223742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * When the announcer has run two times, it finishes.
233742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman */
243742d9db8b6edb10627b0f89336cca5249f1d15aManuel Romanpublic class Announcer extends DNSStateTask {
253742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    static Logger logger = Logger.getLogger(Announcer.class.getName());
263742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman
273742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    public Announcer(JmDNSImpl jmDNSImpl) {
283742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        super(jmDNSImpl, defaultTTL());
293742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman
303742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        this.setTaskState(DNSState.ANNOUNCING_1);
313742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        this.associate(DNSState.ANNOUNCING_1);
323742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    }
333742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman
343742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    /*
353742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * (non-Javadoc)
363742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * @see javax.jmdns.impl.tasks.DNSTask#getName()
373742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     */
383742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    @Override
393742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    public String getName() {
403742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        return "Announcer(" + (this.getDns() != null ? this.getDns().getName() : "") + ")";
413742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    }
423742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman
433742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    /*
443742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * (non-Javadoc)
453742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * @see java.lang.Object#toString()
463742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     */
473742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    @Override
483742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    public String toString() {
493742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        return super.toString() + " state: " + this.getTaskState();
503742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    }
513742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman
523742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    /*
533742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * (non-Javadoc)
543742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * @see javax.jmdns.impl.tasks.DNSTask#start(java.util.Timer)
553742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     */
563742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    @Override
573742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    public void start(Timer timer) {
583742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        if (!this.getDns().isCanceling() && !this.getDns().isCanceled()) {
593742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman            timer.schedule(this, DNSConstants.ANNOUNCE_WAIT_INTERVAL, DNSConstants.ANNOUNCE_WAIT_INTERVAL);
603742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        }
613742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    }
623742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman
633742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    @Override
643742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    public boolean cancel() {
653742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        this.removeAssociation();
663742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman
673742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        return super.cancel();
683742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    }
693742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman
703742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    /*
713742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * (non-Javadoc)
723742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * @see javax.jmdns.impl.tasks.state.DNSStateTask#getTaskDescription()
733742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     */
743742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    @Override
753742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    public String getTaskDescription() {
763742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        return "announcing";
773742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    }
783742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman
793742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    /*
803742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * (non-Javadoc)
813742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * @see javax.jmdns.impl.tasks.state.DNSStateTask#checkRunCondition()
823742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     */
833742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    @Override
843742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    protected boolean checkRunCondition() {
853742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        return !this.getDns().isCanceling() && !this.getDns().isCanceled();
863742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    }
873742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman
883742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    /*
893742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * (non-Javadoc)
903742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * @see javax.jmdns.impl.tasks.state.DNSStateTask#createOugoing()
913742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     */
923742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    @Override
933742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    protected DNSOutgoing createOugoing() {
943742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        return new DNSOutgoing(DNSConstants.FLAGS_QR_RESPONSE | DNSConstants.FLAGS_AA);
953742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    }
963742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman
973742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    /*
983742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * (non-Javadoc)
993742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * @see javax.jmdns.impl.tasks.state.DNSStateTask#buildOutgoingForDNS(javax.jmdns.impl.DNSOutgoing)
1003742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     */
1013742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    @Override
1023742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    protected DNSOutgoing buildOutgoingForDNS(DNSOutgoing out) throws IOException {
1033742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        DNSOutgoing newOut = out;
1043742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        for (DNSRecord answer : this.getDns().getLocalHost().answers(DNSRecordClass.UNIQUE, this.getTTL())) {
1053742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman            newOut = this.addAnswer(newOut, null, answer);
1063742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        }
1073742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        return newOut;
1083742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    }
1093742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman
1103742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    /*
1113742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * (non-Javadoc)
1123742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * @see javax.jmdns.impl.tasks.state.DNSStateTask#buildOutgoingForInfo(javax.jmdns.impl.ServiceInfoImpl, javax.jmdns.impl.DNSOutgoing)
1133742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     */
1143742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    @Override
1153742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    protected DNSOutgoing buildOutgoingForInfo(ServiceInfoImpl info, DNSOutgoing out) throws IOException {
1163742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        DNSOutgoing newOut = out;
1173742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        for (DNSRecord answer : info.answers(DNSRecordClass.UNIQUE, this.getTTL(), this.getDns().getLocalHost())) {
1183742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman            newOut = this.addAnswer(newOut, null, answer);
1193742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        }
1203742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        return newOut;
1213742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    }
1223742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman
1233742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    /*
1243742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * (non-Javadoc)
1253742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * @see javax.jmdns.impl.tasks.state.DNSStateTask#recoverTask(java.lang.Throwable)
1263742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     */
1273742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    @Override
1283742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    protected void recoverTask(Throwable e) {
1293742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        this.getDns().recover();
1303742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    }
1313742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman
1323742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    /*
1333742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * (non-Javadoc)
1343742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * @see javax.jmdns.impl.tasks.state.DNSStateTask#advanceTask()
1353742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     */
1363742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    @Override
1373742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    protected void advanceTask() {
1383742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        this.setTaskState(this.getTaskState().advance());
1393742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        if (!this.getTaskState().isAnnouncing()) {
1403742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman            this.cancel();
1413742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman
1423742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman            this.getDns().startRenewer();
1433742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        }
1443742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    }
1453742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman
1463742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman}