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

package org.xbill.DNS;

import java.io.*;

/**
 * ISDN - identifies the ISDN number and subaddress associated with a name.
 *
 * @author Brian Wellington
 */

public class ISDNRecord extends Record {

    private static final long serialVersionUID = -8730801385178968798L;

    private byte[] address;
    private byte[] subAddress;

    ISDNRecord() {
    }

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

    /**
     * Creates an ISDN Record from the given data
     *
     * @param address    The ISDN number associated with the domain.
     * @param subAddress The subaddress, if any.
     * @throws IllegalArgumentException One of the strings is invalid.
     */
    public ISDNRecord(Name name, int dclass, long ttl, String address, String subAddress) {
        super(name, Type.ISDN, dclass, ttl);
        try {
            this.address = byteArrayFromString(address);
            if (subAddress != null)
                this.subAddress = byteArrayFromString(subAddress);
        } catch (TextParseException e) {
            throw new IllegalArgumentException(e.getMessage());
        }
    }

    void
    rrFromWire(DNSInput in) throws IOException {
        address = in.readCountedString();
        if (in.remaining() > 0)
            subAddress = in.readCountedString();
    }

    void
    rdataFromString(Tokenizer st, Name origin) throws IOException {
        try {
            address = byteArrayFromString(st.getString());
            Tokenizer.Token t = st.get();
            if (t.isString()) {
                subAddress = byteArrayFromString(t.value);
            } else {
                st.unget();
            }
        } catch (TextParseException e) {
            throw st.exception(e.getMessage());
        }
    }

    /**
     * Returns the ISDN number associated with the domain.
     */
    public String
    getAddress() {
        return byteArrayToString(address, false);
    }

    /**
     * Returns the ISDN subaddress, or null if there is none.
     */
    public String
    getSubAddress() {
        if (subAddress == null)
            return null;
        return byteArrayToString(subAddress, false);
    }

    void
    rrToWire(DNSOutput out, Compression c, boolean canonical) {
        out.writeCountedString(address);
        if (subAddress != null)
            out.writeCountedString(subAddress);
    }

    String
    rrToString() {
        StringBuffer sb = new StringBuffer();
        sb.append(byteArrayToString(address, true));
        if (subAddress != null) {
            sb.append(" ");
            sb.append(byteArrayToString(subAddress, true));
        }
        return sb.toString();
    }

}
