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

package org.xbill.DNS;

import java.io.*;
import org.xbill.DNS.utils.*;

/**
 * A6 Record - maps a domain name to an IPv6 address (experimental)
 *
 * @author Brian Wellington
 */

public class A6Record extends Record {

private int prefixBits;
private Inet6Address suffix;
private Name prefix;

A6Record() {}

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

/**
 * Creates an A6 Record from the given data
 * @param prefixBits The number of bits in the address prefix
 * @param suffix The address suffix
 * @param prefix The name of the prefix
 */
public
A6Record(Name name, int dclass, long ttl, int prefixBits,
	 Inet6Address suffix, Name prefix)
{
	super(name, Type.A6, dclass, ttl);
	this.prefixBits = checkU8("prefixBits", prefixBits);
	this.suffix = suffix;
	if (prefix != null)
		this.prefix = checkName("prefix", prefix);
}

void
rrFromWire(DNSInput in) throws IOException {
	prefixBits = in.readU8();
	int suffixbits = 128 - prefixBits;
	int suffixbytes = (suffixbits + 7) / 8;
	suffix = new Inet6Address(128 - prefixBits,
				  in.readByteArray(suffixbytes));
	if (prefixBits > 0)
		prefix = new Name(in);
}

void
rdataFromString(Tokenizer st, Name origin) throws IOException {
	prefixBits = st.getUInt8();
	try {
		suffix = new Inet6Address(st.getString());
	}
	catch (TextParseException e) {
		throw st.exception(e.getMessage());
	}
	if (prefixBits > 0)
		prefix = st.getName(origin);
}

/** Converts rdata to a String */
String
rrToString() {
	StringBuffer sb = new StringBuffer();
	sb.append(prefixBits);
	sb.append(" ");
	sb.append(suffix);
	if (prefix != null) {
		sb.append(" ");
		sb.append(prefix);
	}
	return sb.toString();
}

/** Returns the number of bits in the prefix */
public int
getPrefixBits() {
	return prefixBits;
}

/** Returns the address suffix */
public Inet6Address
getSuffix() {
	return suffix;
}

/** Returns the address prefix */
public Name
getPrefix() {
	return prefix;
}

void
rrToWire(DNSOutput out, Compression c, boolean canonical) {
	out.writeU8(prefixBits);
	int suffixbits = 128 - prefixBits;
	int suffixbytes = (suffixbits + 7) / 8;
	byte [] data = suffix.toBytes();
	out.writeByteArray(data, 16 - suffixbytes, suffixbytes);
	if (prefix != null)
		prefix.toWire(out, null, canonical);
}

}

@@ -1047,16 +1047,42 @@
 7) / 8;%0A
+%09if (prefixBits %3C 128) %7B%0A%09
 %09suffix 
@@ -1122,16 +1122,17 @@
 ts,%0A%09%09%09%09
+%09
   in.rea
@@ -1157,16 +1157,19 @@
 ytes));%0A
+%09%7D%0A
 %09if (pre
@@ -1311,15 +1311,128 @@
 ();%0A
+%09if (prefixBits %3E 128) %7B%0A%09%09throw st.exception(%22prefix bits must be %5B0..128%5D%22);%0A%09%7D else if (prefixBits %3C 128) %7B%0A%09
 %09try %7B%0A
+%09
 %09%09su
@@ -1472,19 +1472,21 @@
 ing());%0A
+%09
 %09%7D%0A
+%09
 %09catch (
@@ -1507,24 +1507,25 @@
 tion e) %7B%0A%09%09
+%09
 throw st.exc
@@ -1544,24 +1544,28 @@
 Message());%0A
+%09%09%7D%0A
 %09%7D%0A%09if (pref
@@ -1729,16 +1729,40 @@
 xBits);%0A
+%09if (suffix != null) %7B%0A%09
 %09sb.appe
@@ -1770,16 +1770,17 @@
 d(%22 %22);%0A
+%09
 %09sb.appe
@@ -1791,16 +1791,19 @@
 uffix);%0A
+%09%7D%0A
 %09if (pre
@@ -2242,16 +2242,40 @@
 xBits);%0A
+%09if (suffix != null) %7B%0A%09
 %09int suf
@@ -2294,32 +2294,33 @@
 8 - prefixBits;%0A
+%09
 %09int suffixbytes
@@ -2344,16 +2344,17 @@
 7) / 8;%0A
+%09
 %09byte %5B%5D
@@ -2379,16 +2379,17 @@
 ytes();%0A
+%09
 %09out.wri
@@ -2434,24 +2434,27 @@
 ffixbytes);%0A
+%09%7D%0A
 %09if (prefix 

Fix the prefixBits == 128 case.