package org.handwerkszeug.dns.record; import java.net.Inet6Address; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.Arrays; import java.util.List; import org.handwerkszeug.dns.NameCompressor; import org.handwerkszeug.dns.RRType; import org.handwerkszeug.dns.ResourceRecord; import org.handwerkszeug.util.AddressUtil; import org.handwerkszeug.util.CompareUtil; import io.netty.buffer.ByteBuf; /** * RFC3596 * * @author taichi */ public class AAAARecord extends AbstractRecord { /** * A 128 bit IPv6 address is encoded in the data portion of an AAAA resource * record in network byte order (high-order byte first). */ protected byte[] address; public AAAARecord() { super(RRType.AAAA); } public AAAARecord(AAAARecord from) { super(from); byte[] ary = from.address; if (ary != null) { this.address = Arrays.copyOf(ary, ary.length); } } @Override protected void parseRDATA(ByteBuf buffer) { byte[] newone = new byte[16]; buffer.readBytes(newone); this.address = newone; } @Override protected void writeRDATA(ByteBuf buffer, NameCompressor compressor) { buffer.writeBytes(this.address); } @Override protected ResourceRecord newInstance() { return new AAAARecord(this); } @Override public int compareTo(AAAARecord o) { if ((this != o) && (super.compareTo(o) == 0)) { return CompareUtil.compare(this.address, o.address); } return 0; } @Override public String toString() { StringBuilder stb = new StringBuilder(); stb.append(super.toString()); stb.append(' '); InetAddress ia = address(); if (ia == null) { stb.append("null"); } else { stb.append(ia.getHostAddress()); } return stb.toString(); } public InetAddress address() { try { return InetAddress.getByAddress(this.address); } catch (UnknownHostException e) { return null; } } @Override public void setRDATA(List list) { if (0 < list.size()) { String s = list.get(0); if (AddressUtil.v6Address.matcher(s) .matches()) { InetAddress addr = AddressUtil.getByName(s); this.address = addr.getAddress(); } } else { // TODO error message. throw new IllegalArgumentException(); } } public void address(Inet6Address v6address) { this.address = v6address.getAddress(); } }