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

package org.xbill.DNS;

import java.io.*;

import org.xbill.DNS.utils.*;

/**
 * NSAP Address Record.
 *
 * @author Brian Wellington
 */

public class NSAPRecord extends Record {

    private static final long serialVersionUID = -1037209403185658593L;

    private byte[] address;

    NSAPRecord() {
    }

    Record
    getObject() {
        return new NSAPRecord();
    }

    private static final byte[]
    checkAndConvertAddress(String address) {
        if (!address.substring(0, 2).equalsIgnoreCase("0x")) {
            return null;
        }
        ByteArrayOutputStream bytes = new ByteArrayOutputStream();
        boolean partial = false;
        int current = 0;
        for (int i = 2; i < address.length(); i++) {
            char c = address.charAt(i);
            if (c == '.') {
                continue;
            }
            int value = Character.digit(c, 16);
            if (value == -1) {
                return null;
            }
            if (partial) {
                current += value;
                bytes.write(current);
                partial = false;
            } else {
                current = value << 4;
                partial = true;
            }

        }
        if (partial) {
            return null;
        }
        return bytes.toByteArray();
    }

    /**
     * Creates an NSAP Record from the given data
     *
     * @param address The NSAP address.
     * @throws IllegalArgumentException The address is not a valid NSAP address.
     */
    public NSAPRecord(Name name, int dclass, long ttl, String address) {
        super(name, Type.NSAP, dclass, ttl);
        this.address = checkAndConvertAddress(address);
        if (this.address == null) {
            throw new IllegalArgumentException("invalid NSAP address " +
                    address);
        }
    }

    void
    rrFromWire(DNSInput in) throws IOException {
        address = in.readByteArray();
    }

    void
    rdataFromString(Tokenizer st, Name origin) throws IOException {
        String addr = st.getString();
        this.address = checkAndConvertAddress(addr);
        if (this.address == null)
            throw st.exception("invalid NSAP address " + addr);
    }

    /**
     * Returns the NSAP address.
     */
    public String
    getAddress() {
        return byteArrayToString(address, false);
    }

    void
    rrToWire(DNSOutput out, Compression c, boolean canonical) {
        out.writeByteArray(address);
    }

    String
    rrToString() {
        return "0x" + base16.toString(address);
    }

}
