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 Canceler sends two announces with TTL=0 for the specified services.
213742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman */
223742d9db8b6edb10627b0f89336cca5249f1d15aManuel Romanpublic class Canceler extends DNSStateTask {
233742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    static Logger logger = Logger.getLogger(Canceler.class.getName());
243742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman
253742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    public Canceler(JmDNSImpl jmDNSImpl) {
263742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        super(jmDNSImpl, 0);
273742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman
283742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        this.setTaskState(DNSState.CANCELING_1);
293742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        this.associate(DNSState.CANCELING_1);
303742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    }
313742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman
323742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    /*
333742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * (non-Javadoc)
343742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * @see javax.jmdns.impl.tasks.DNSTask#getName()
353742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     */
363742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    @Override
373742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    public String getName() {
383742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        return "Canceler(" + (this.getDns() != null ? this.getDns().getName() : "") + ")";
393742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    }
403742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman
413742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    /*
423742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * (non-Javadoc)
433742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * @see java.lang.Object#toString()
443742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     */
453742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    @Override
463742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    public String toString() {
473742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        return super.toString() + " state: " + this.getTaskState();
483742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    }
493742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman
503742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    /*
513742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * (non-Javadoc)
523742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * @see javax.jmdns.impl.tasks.DNSTask#start(java.util.Timer)
533742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     */
543742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    @Override
553742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    public void start(Timer timer) {
563742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        timer.schedule(this, 0, DNSConstants.ANNOUNCE_WAIT_INTERVAL);
573742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    }
583742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman
593742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    /*
603742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * (non-Javadoc)
613742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * @see java.util.TimerTask#cancel()
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 "canceling";
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 true;
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().isCanceling()) {
1403742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman            cancel();
1413742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        }
1423742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    }
1433742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman}