// Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org)

package org.xbill.DNS;

/**
 * Constants and functions relating to DNS rcodes (error values)
 *
 * @author Brian Wellington
 */

public final class Rcode {

    private static Mnemonic rcodes = new Mnemonic("DNS Rcode",
            Mnemonic.CASE_UPPER);

    private static Mnemonic tsigrcodes = new Mnemonic("TSIG rcode",
            Mnemonic.CASE_UPPER);

    /**
     * No error
     */
    public static final int NOERROR = 0;

    /**
     * Format error
     */
    public static final int FORMERR = 1;

    /**
     * Server failure
     */
    public static final int SERVFAIL = 2;

    /**
     * The name does not exist
     */
    public static final int NXDOMAIN = 3;

    /**
     * The operation requested is not implemented
     */
    public static final int NOTIMP = 4;

    /**
     * Deprecated synonym for NOTIMP.
     */
    public static final int NOTIMPL = 4;

    /**
     * The operation was refused by the server
     */
    public static final int REFUSED = 5;

    /**
     * The name exists
     */
    public static final int YXDOMAIN = 6;

    /**
     * The RRset (name, type) exists
     */
    public static final int YXRRSET = 7;

    /**
     * The RRset (name, type) does not exist
     */
    public static final int NXRRSET = 8;

    /**
     * The requestor is not authorized to perform this operation
     */
    public static final int NOTAUTH = 9;

    /**
     * The zone specified is not a zone
     */
    public static final int NOTZONE = 10;

/* EDNS extended rcodes */
    /**
     * Unsupported EDNS level
     */
    public static final int BADVERS = 16;

/* TSIG/TKEY only rcodes */
    /**
     * The signature is invalid (TSIG/TKEY extended error)
     */
    public static final int BADSIG = 16;

    /**
     * The key is invalid (TSIG/TKEY extended error)
     */
    public static final int BADKEY = 17;

    /**
     * The time is out of range (TSIG/TKEY extended error)
     */
    public static final int BADTIME = 18;

    /**
     * The mode is invalid (TKEY extended error)
     */
    public static final int BADMODE = 19;

    static {
        rcodes.setMaximum(0xFFF);
        rcodes.setPrefix("RESERVED");
        rcodes.setNumericAllowed(true);

        rcodes.add(NOERROR, "NOERROR");
        rcodes.add(FORMERR, "FORMERR");
        rcodes.add(SERVFAIL, "SERVFAIL");
        rcodes.add(NXDOMAIN, "NXDOMAIN");
        rcodes.add(NOTIMP, "NOTIMP");
        rcodes.addAlias(NOTIMP, "NOTIMPL");
        rcodes.add(REFUSED, "REFUSED");
        rcodes.add(YXDOMAIN, "YXDOMAIN");
        rcodes.add(YXRRSET, "YXRRSET");
        rcodes.add(NXRRSET, "NXRRSET");
        rcodes.add(NOTAUTH, "NOTAUTH");
        rcodes.add(NOTZONE, "NOTZONE");
        rcodes.add(BADVERS, "BADVERS");

        tsigrcodes.setMaximum(0xFFFF);
        tsigrcodes.setPrefix("RESERVED");
        tsigrcodes.setNumericAllowed(true);
        tsigrcodes.addAll(rcodes);

        tsigrcodes.add(BADSIG, "BADSIG");
        tsigrcodes.add(BADKEY, "BADKEY");
        tsigrcodes.add(BADTIME, "BADTIME");
        tsigrcodes.add(BADMODE, "BADMODE");
    }

    private Rcode() {
    }

    /**
     * Converts a numeric Rcode into a String
     */
    public static String
    string(int i) {
        return rcodes.getText(i);
    }

    /**
     * Converts a numeric TSIG extended Rcode into a String
     */
    public static String
    TSIGstring(int i) {
        return tsigrcodes.getText(i);
    }

    /**
     * Converts a String representation of an Rcode into its numeric value
     */
    public static int
    value(String s) {
        return rcodes.getValue(s);
    }

}
