package org.handwerkszeug.dns.record; import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; import java.util.List; import org.handwerkszeug.dns.NameCompressor; import org.handwerkszeug.dns.RRType; import org.handwerkszeug.dns.ResourceRecord; import org.handwerkszeug.util.CompareUtil; import io.netty.buffer.ByteBuf; /** * 3.3.14. TXT RDATA format * * @author taichi */ public class TXTRecord extends AbstractRecord { protected List strings; public TXTRecord() { super(RRType.TXT); } public TXTRecord(TXTRecord from) { super(from); if (from.strings != null) { List newone = new ArrayList(from.strings.size()); for (byte[] b : from.strings) { newone.add(Arrays.copyOf(b, b.length)); } } } @Override protected void parseRDATA(ByteBuf buffer) { this.strings = new ArrayList(); ByteBuf part = buffer.readSlice(rdlength()); while (part.isReadable()) { this.strings.add(readString(part)); } } @Override protected void writeRDATA(ByteBuf buffer, NameCompressor compressor) { for (byte[] ary : this.strings) { writeString(buffer, ary); } } @Override protected ResourceRecord newInstance() { return new TXTRecord(this); } @Override public int compareTo(TXTRecord o) { if (this == o) { return 0; } int result = super.compareTo(o); if (result != 0) { return result; } int mySize = this.strings.size(); int yrSize = o.strings.size(); int min = Math.min(mySize, yrSize); for (int i = 0; i < min; i++) { result = CompareUtil.compare(this.strings.get(i), o.strings.get(i)); if (result != 0) { return result; } } return mySize - yrSize; } @Override public String toString() { StringBuilder stb = new StringBuilder(); for (Iterator i = this.strings.iterator(); i.hasNext(); ) { stb.append(toQuoteString(i.next())); if (i.hasNext()) { stb.append(' '); } } return stb.toString(); } @Override public void setRDATA(List list) { for (String s : list) { this.strings.add(s.getBytes()); } } public String txt() { return this.toString(); } }