13742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman/** 23742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * 33742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman */ 43742d9db8b6edb10627b0f89336cca5249f1d15aManuel Romanpackage javax.jmdns.impl.constants; 53742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 63742d9db8b6edb10627b0f89336cca5249f1d15aManuel Romanimport java.util.logging.Level; 73742d9db8b6edb10627b0f89336cca5249f1d15aManuel Romanimport java.util.logging.Logger; 83742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 93742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman/** 103742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * DNS Record Class 113742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * 123742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * @author Arthur van Hoff, Jeff Sonstein, Werner Randelshofer, Pierre Frisch, Rick Blair 133742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman */ 143742d9db8b6edb10627b0f89336cca5249f1d15aManuel Romanpublic enum DNSRecordClass { 153742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman /** 163742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * 173742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman */ 183742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman CLASS_UNKNOWN("?", 0), 193742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman /** 203742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * static final Internet 213742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman */ 223742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman CLASS_IN("in", 1), 233742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman /** 243742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * CSNET 253742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman */ 263742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman CLASS_CS("cs", 2), 273742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman /** 283742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * CHAOS 293742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman */ 303742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman CLASS_CH("ch", 3), 313742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman /** 323742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * Hesiod 333742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman */ 343742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman CLASS_HS("hs", 4), 353742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman /** 363742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * Used in DNS UPDATE [RFC 2136] 373742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman */ 383742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman CLASS_NONE("none", 254), 393742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman /** 403742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * Not a DNS class, but a DNS query class, meaning "all classes" 413742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman */ 423742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman CLASS_ANY("any", 255); 433742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 443742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman private static Logger logger = Logger.getLogger(DNSRecordClass.class.getName()); 453742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 463742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman /** 473742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * Multicast DNS uses the bottom 15 bits to identify the record class...<br/> 483742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * Except for pseudo records like OPT. 493742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman */ 503742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman public static final int CLASS_MASK = 0x7FFF; 513742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 523742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman /** 533742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * For answers the top bit indicates that all other cached records are now invalid.<br/> 543742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * For questions it indicates that we should send a unicast response. 553742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman */ 563742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman public static final int CLASS_UNIQUE = 0x8000; 573742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 583742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman /** 593742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * 603742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman */ 613742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman public static final boolean UNIQUE = true; 623742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 633742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman /** 643742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * 653742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman */ 663742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman public static final boolean NOT_UNIQUE = false; 673742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 683742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman private final String _externalName; 693742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 703742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman private final int _index; 713742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 723742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman DNSRecordClass(String name, int index) { 733742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman _externalName = name; 743742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman _index = index; 753742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman } 763742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 773742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman /** 783742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * Return the string representation of this type 793742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * 803742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * @return String 813742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman */ 823742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman public String externalName() { 833742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman return _externalName; 843742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman } 853742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 863742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman /** 873742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * Return the numeric value of this type 883742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * 893742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * @return String 903742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman */ 913742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman public int indexValue() { 923742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman return _index; 933742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman } 943742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 953742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman /** 963742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * Checks if the class is unique 973742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * 983742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * @param index 993742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * @return <code>true</code> is the class is unique, <code>false</code> otherwise. 1003742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman */ 1013742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman public boolean isUnique(int index) { 1023742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman return (this != CLASS_UNKNOWN) && ((index & CLASS_UNIQUE) != 0); 1033742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman } 1043742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 1053742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman /** 1063742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * @param name 1073742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * @return class for name 1083742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman */ 1093742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman public static DNSRecordClass classForName(String name) { 1103742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman if (name != null) { 1113742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman String aName = name.toLowerCase(); 1123742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman for (DNSRecordClass aClass : DNSRecordClass.values()) { 1133742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman if (aClass._externalName.equals(aName)) return aClass; 1143742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman } 1153742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman } 1163742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman logger.log(Level.WARNING, "Could not find record class for name: " + name); 1173742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman return CLASS_UNKNOWN; 1183742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman } 1193742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 1203742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman /** 1213742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * @param index 1223742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * @return class for name 1233742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman */ 1243742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman public static DNSRecordClass classForIndex(int index) { 1253742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman int maskedIndex = index & CLASS_MASK; 1263742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman for (DNSRecordClass aClass : DNSRecordClass.values()) { 1273742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman if (aClass._index == maskedIndex) return aClass; 1283742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman } 1293742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman logger.log(Level.WARNING, "Could not find record class for index: " + index); 1303742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman return CLASS_UNKNOWN; 1313742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman } 1323742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 1333742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman @Override 1343742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman public String toString() { 1353742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman return this.name() + " index " + this.indexValue(); 1363742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman } 1373742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 1383742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman} 139