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}