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}