13742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman/**
23742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman *
33742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman */
43742d9db8b6edb10627b0f89336cca5249f1d15aManuel Romanpackage javax.jmdns.impl.constants;
53742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman
63742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman/**
73742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * DNS result code.
83742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman *
93742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * @author Arthur van Hoff, Jeff Sonstein, Werner Randelshofer, Pierre Frisch, Rick Blair
103742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman */
113742d9db8b6edb10627b0f89336cca5249f1d15aManuel Romanpublic enum DNSResultCode {
123742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    /**
133742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * Token
143742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     */
153742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    Unknown("Unknown", 65535),
163742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    /**
173742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * No Error [RFC1035]
183742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     */
193742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    NoError("No Error", 0),
203742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    /**
213742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * Format Error [RFC1035]
223742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     */
233742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    FormErr("Format Error", 1),
243742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    /**
253742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * Server Failure [RFC1035]
263742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     */
273742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    ServFail("Server Failure", 2),
283742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    /**
293742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * Non-Existent Domain [RFC1035]
303742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     */
313742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    NXDomain("Non-Existent Domain", 3),
323742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    /**
333742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * Not Implemented [RFC1035]
343742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     */
353742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    NotImp("Not Implemented", 4),
363742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    /**
373742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * Query Refused [RFC1035]
383742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     */
393742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    Refused("Query Refused", 5),
403742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    /**
413742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * Name Exists when it should not [RFC2136]
423742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     */
433742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    YXDomain("Name Exists when it should not", 6),
443742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    /**
453742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * RR Set Exists when it should not [RFC2136]
463742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     */
473742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    YXRRSet("RR Set Exists when it should not", 7),
483742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    /**
493742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * RR Set that should exist does not [RFC2136]
503742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     */
513742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    NXRRSet("RR Set that should exist does not", 8),
523742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    /**
533742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * Server Not Authoritative for zone [RFC2136]]
543742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     */
553742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    NotAuth("Server Not Authoritative for zone", 9),
563742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    /**
573742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * Name not contained in zone [RFC2136]
583742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     */
593742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    NotZone("NotZone Name not contained in zone", 10),
603742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman
613742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    ;
623742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman
633742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    // 0 NoError No Error [RFC1035]
643742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    // 1 FormErr Format Error [RFC1035]
653742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    // 2 ServFail Server Failure [RFC1035]
663742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    // 3 NXDomain Non-Existent Domain [RFC1035]
673742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    // 4 NotImp Not Implemented [RFC1035]
683742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    // 5 Refused Query Refused [RFC1035]
693742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    // 6 YXDomain Name Exists when it should not [RFC2136]
703742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    // 7 YXRRSet RR Set Exists when it should not [RFC2136]
713742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    // 8 NXRRSet RR Set that should exist does not [RFC2136]
723742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    // 9 NotAuth Server Not Authoritative for zone [RFC2136]
733742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    // 10 NotZone Name not contained in zone [RFC2136]
743742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    // 11-15 Unassigned
753742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    // 16 BADVERS Bad OPT Version [RFC2671]
763742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    // 16 BADSIG TSIG Signature Failure [RFC2845]
773742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    // 17 BADKEY Key not recognized [RFC2845]
783742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    // 18 BADTIME Signature out of time window [RFC2845]
793742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    // 19 BADMODE Bad TKEY Mode [RFC2930]
803742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    // 20 BADNAME Duplicate key name [RFC2930]
813742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    // 21 BADALG Algorithm not supported [RFC2930]
823742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    // 22 BADTRUNC Bad Truncation [RFC4635]
833742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    // 23-3840 Unassigned
843742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    // 3841-4095 Reserved for Private Use [RFC5395]
853742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    // 4096-65534 Unassigned
863742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    // 65535 Reserved, can be allocated by Standards Action [RFC5395]
873742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman
883742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    /**
893742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * DNS Result Code types are encoded on the last 4 bits
903742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     */
913742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    final static int     RCode_MASK         = 0x0F;
923742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    /**
933742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * DNS Extended Result Code types are encoded on the first 8 bits
943742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     */
953742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    final static int     ExtendedRCode_MASK = 0xFF;
963742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman
973742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    private final String _externalName;
983742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman
993742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    private final int    _index;
1003742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman
1013742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    DNSResultCode(String name, int index) {
1023742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        _externalName = name;
1033742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        _index = index;
1043742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    }
1053742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman
1063742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    /**
1073742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * Return the string representation of this type
1083742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     *
1093742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * @return String
1103742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     */
1113742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    public String externalName() {
1123742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        return _externalName;
1133742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    }
1143742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman
1153742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    /**
1163742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * Return the numeric value of this type
1173742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     *
1183742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * @return String
1193742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     */
1203742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    public int indexValue() {
1213742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        return _index;
1223742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    }
1233742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman
1243742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    /**
1253742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * @param flags
1263742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * @return label
1273742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     */
1283742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    public static DNSResultCode resultCodeForFlags(int flags) {
1293742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        int maskedIndex = flags & RCode_MASK;
1303742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        for (DNSResultCode aCode : DNSResultCode.values()) {
1313742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman            if (aCode._index == maskedIndex) return aCode;
1323742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        }
1333742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        return Unknown;
1343742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    }
1353742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman
1363742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    public static DNSResultCode resultCodeForFlags(int flags, int extendedRCode) {
1373742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        int maskedIndex = ((extendedRCode >> 28) & ExtendedRCode_MASK) | (flags & RCode_MASK);
1383742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        for (DNSResultCode aCode : DNSResultCode.values()) {
1393742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman            if (aCode._index == maskedIndex) return aCode;
1403742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        }
1413742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        return Unknown;
1423742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    }
1433742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman
1443742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    @Override
1453742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    public String toString() {
1463742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        return this.name() + " index " + this.indexValue();
1473742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    }
1483742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman
1493742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman}
150