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

package org.xbill.DNS;

/**
 * Constants and functions relating to DNS opcodes
 *
 * @author Brian Wellington
 */

public final class Opcode {

    /**
     * A standard query
     */
    public static final int QUERY = 0;

    /**
     * An inverse query (deprecated)
     */
    public static final int IQUERY = 1;

    /**
     * A server status request (not used)
     */
    public static final int STATUS = 2;

    /**
     * A message from a primary to a secondary server to initiate a zone transfer
     */
    public static final int NOTIFY = 4;

    /**
     * A dynamic update message
     */
    public static final int UPDATE = 5;

    private static Mnemonic opcodes = new Mnemonic("DNS Opcode",
            Mnemonic.CASE_UPPER);

    static {
        opcodes.setMaximum(0xF);
        opcodes.setPrefix("RESERVED");
        opcodes.setNumericAllowed(true);

        opcodes.add(QUERY, "QUERY");
        opcodes.add(IQUERY, "IQUERY");
        opcodes.add(STATUS, "STATUS");
        opcodes.add(NOTIFY, "NOTIFY");
        opcodes.add(UPDATE, "UPDATE");
    }

    private Opcode() {
    }

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

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

}
