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 Renewer is there to send renewal announcement when the record expire for ours infos. 213742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman */ 223742d9db8b6edb10627b0f89336cca5249f1d15aManuel Romanpublic class Renewer extends DNSStateTask { 233742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman static Logger logger = Logger.getLogger(Renewer.class.getName()); 243742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 253742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman public Renewer(JmDNSImpl jmDNSImpl) { 263742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman super(jmDNSImpl, defaultTTL()); 273742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 283742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman this.setTaskState(DNSState.ANNOUNCED); 293742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman this.associate(DNSState.ANNOUNCED); 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 "Renewer(" + (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 if (!this.getDns().isCanceling() && !this.getDns().isCanceled()) { 57b99c4f55163e9c4ac6b123f0e8383b9b9072073bJason Simmons // BEGIN android-changed 58b99c4f55163e9c4ac6b123f0e8383b9b9072073bJason Simmons // Schedule the renewer based on this task's TTL, not the default TTL 59b99c4f55163e9c4ac6b123f0e8383b9b9072073bJason Simmons timer.schedule(this, getTTL() * 500, getTTL() * 500); 60b99c4f55163e9c4ac6b123f0e8383b9b9072073bJason Simmons // END android-changed 613742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman } 623742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman } 633742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 643742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman @Override 653742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman public boolean cancel() { 663742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman this.removeAssociation(); 673742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 683742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman return super.cancel(); 693742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman } 703742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 713742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman /* 723742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * (non-Javadoc) 733742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * @see javax.jmdns.impl.tasks.state.DNSStateTask#getTaskDescription() 743742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman */ 753742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman @Override 763742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman public String getTaskDescription() { 773742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman return "renewing"; 783742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman } 793742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 803742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman /* 813742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * (non-Javadoc) 823742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * @see javax.jmdns.impl.tasks.state.DNSStateTask#checkRunCondition() 833742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman */ 843742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman @Override 853742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman protected boolean checkRunCondition() { 863742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman return !this.getDns().isCanceling() && !this.getDns().isCanceled(); 873742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman } 883742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 893742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman /* 903742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * (non-Javadoc) 913742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * @see javax.jmdns.impl.tasks.state.DNSStateTask#createOugoing() 923742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman */ 933742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman @Override 943742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman protected DNSOutgoing createOugoing() { 953742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman return new DNSOutgoing(DNSConstants.FLAGS_QR_RESPONSE | DNSConstants.FLAGS_AA); 963742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman } 973742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 983742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman /* 993742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * (non-Javadoc) 1003742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * @see javax.jmdns.impl.tasks.state.DNSStateTask#buildOutgoingForDNS(javax.jmdns.impl.DNSOutgoing) 1013742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman */ 1023742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman @Override 1033742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman protected DNSOutgoing buildOutgoingForDNS(DNSOutgoing out) throws IOException { 1043742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman DNSOutgoing newOut = out; 1053742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman for (DNSRecord answer : this.getDns().getLocalHost().answers(DNSRecordClass.UNIQUE, this.getTTL())) { 1063742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman newOut = this.addAnswer(newOut, null, answer); 1073742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman } 1083742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman return newOut; 1093742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman } 1103742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 1113742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman /* 1123742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * (non-Javadoc) 1133742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * @see javax.jmdns.impl.tasks.state.DNSStateTask#buildOutgoingForInfo(javax.jmdns.impl.ServiceInfoImpl, javax.jmdns.impl.DNSOutgoing) 1143742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman */ 1153742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman @Override 1163742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman protected DNSOutgoing buildOutgoingForInfo(ServiceInfoImpl info, DNSOutgoing out) throws IOException { 1173742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman DNSOutgoing newOut = out; 1183742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman for (DNSRecord answer : info.answers(DNSRecordClass.UNIQUE, this.getTTL(), this.getDns().getLocalHost())) { 1193742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman newOut = this.addAnswer(newOut, null, answer); 1203742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman } 1213742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman return newOut; 1223742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman } 1233742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 1243742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman /* 1253742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * (non-Javadoc) 1263742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * @see javax.jmdns.impl.tasks.state.DNSStateTask#recoverTask(java.lang.Throwable) 1273742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman */ 1283742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman @Override 1293742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman protected void recoverTask(Throwable e) { 1303742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman this.getDns().recover(); 1313742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman } 1323742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 1333742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman /* 1343742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * (non-Javadoc) 1353742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * @see javax.jmdns.impl.tasks.state.DNSStateTask#advanceTask() 1363742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman */ 1373742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman @Override 1383742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman protected void advanceTask() { 1393742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman this.setTaskState(this.getTaskState().advance()); 1403742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman if (!this.getTaskState().isAnnounced()) { 1413742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman cancel(); 1423742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman } 1433742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman } 1443742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman}