// Copyright 1997 The Open Group Research Institute.  All rights reserved.

package krb5.lib;

import krb5.lib.asn1.*;
import java.util.Vector;
import java.net.UnknownHostException;

/**
 * Set of HostAddresses
 */
public class HostAddresses implements Cloneable {
    /**
	 * Array of HostAddress
	 * @see krb5.lib.HostAddress
	 */
	public HostAddress[] addresses;

	/**
	 * Class constructor specifying an array of HostAddress
	 *
	 * @param new_addresses is of type HostAddress[]
	 * @see krb5.lib.HostAddress
	 */
	public HostAddresses(HostAddress[] new_addresses) {
		addresses = new_addresses;
	}

	/**
	 * Class constructor
	 *
	 * @exception UnknownHostException an exception
	 * @see java.net.UnknownHostException
	 */
	public HostAddresses() throws UnknownHostException {
		addresses = new HostAddress[1];
		addresses[0] = new HostAddress();
	}

	/**
	 * Class constructor
	 *
	 * @param dummy is of type int
	 */
	private HostAddresses(int dummy) {
	}

	/**
	 * Clones a copy of the object
	 *
	 * @return Object is a result
	 * @see java.lang.Object
	 */
	public Object clone() {
		HostAddresses new_hostAddresses = new HostAddresses(0);
		if (addresses != null) {
			new_hostAddresses.addresses =
				new HostAddress[addresses.length];
			for (int i = 0; i < addresses.length; i++)
				new_hostAddresses.addresses[i] =
					(HostAddress)addresses[i].clone();
		}
		return new_hostAddresses;
	}

	/**
	 * Checks to see whether the given HostAddress is in the array
	 *
	 * @return boolean is a result
	 * @param addr is of type HostAddress
	 * @see krb5.lib.HostAddress
	 */
	public boolean inList(HostAddress addr) {
		if (addresses != null) {
			for (int i = 0; i < addresses.length; i++)
				if (addresses[i].equals(addr))
					return true;
		}
		return false;
	}

	/**
	 * Compares whether the 2 arrays are the same
	 *
	 * @return boolean is a result
	 * @param addrs is of type HostAddresses
	 * @see krb5.lib.HostAddresses	 
	 */
	public boolean equals(HostAddresses addrs) {
		if ((addresses == null && addrs.addresses != null) ||
			(addresses != null && addrs.addresses == null))
			return false;
		if (addresses != null && addrs.addresses != null) {
			if (addresses.length != addrs.addresses.length)
				return false;
			for (int i = 0; i < addresses.length; i++)
				if (!addresses[i].equals(addrs.addresses[i]))
					return false;
		}
		return true;
	}

	/**
	 * Class constructor specifying an encoding reference
	 *
	 * @param ref is of type EncodeRef
	 * @exception Asn1Exception an exception
	 * @see krb5.lib.asn1.EncodeRef
	 * @see krb5.lib.Asn1Exception
	 */
	public HostAddresses(EncodeRef ref) throws Asn1Exception {
		Vector tempAddresses = new Vector();
		EncodeRef subRef = decode.Sequence(ref);
		while (subRef.isMoreInSequence()) {
			tempAddresses.addElement(new HostAddress(subRef));
			subRef.next();
		}
		if (tempAddresses.size() > 0) {
			addresses = new HostAddress[tempAddresses.size()];
			tempAddresses.copyInto(addresses);
		}
	}

	/**
	 * Encodes the object in asn1
	 *
	 * @return byte[] is a result
	 * @exception Asn1Exception an exception
	 * @see krb5.lib.Asn1Exception
	 */
	public byte[] asn1Encode() throws Asn1Exception {
		byte[][] host_addresses = null;
		if (addresses != null && addresses.length > 0) {
			host_addresses = new byte[addresses.length][];
			for (int i = 0; i < addresses.length; i++)
				host_addresses[i] = addresses[i].asn1Encode();
		}
		return encode.Sequence(host_addresses);
	}

}
