// Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; import java.io.*; import java.util.*; /** * Next name - this record contains the following name in an ordered list * of names in the zone, and a set of types for which records exist for * this name. The presence of this record in a response signifies a * failed query for data in a DNSSEC-signed zone. * * @author Brian Wellington */ public class NXTRecord extends Record { private static final long serialVersionUID = -8851454400765507520L; private Name next; private BitSet bitmap; NXTRecord() {} Record getObject() { return new NXTRecord(); } /** * Creates an NXT Record from the given data * @param next The following name in an ordered list of the zone * @param bitmap The set of type for which records exist at this name */ public NXTRecord(Name name, int dclass, long ttl, Name next, BitSet bitmap) { super(name, Type.NXT, dclass, ttl); this.next = checkName("next", next); this.bitmap = bitmap; } void rrFromWire(DNSInput in) throws IOException { next = new Name(in); bitmap = new BitSet(); int bitmapLength = in.remaining(); for (int i = 0; i < bitmapLength; i++) { int t = in.readU8(); for (int j = 0; j < 8; j++) if ((t & (1 << (7 - j))) != 0) bitmap.set(i * 8 + j); } } void rdataFromString(Tokenizer st, Name origin) throws IOException { next = st.getName(origin); bitmap = new BitSet(); while (true) { Tokenizer.Token t = st.get(); if (!t.isString()) break; int typecode = Type.value(t.value, true); if (typecode <= 0 || typecode > 128) throw st.exception("Invalid type: " + t.value); bitmap.set(typecode); } st.unget(); } /** Converts rdata to a String */ String rrToString() { StringBuffer sb = new StringBuffer(); sb.append(next); int length = bitmap.length(); for (short i = 0; i < length; i++) if (bitmap.get(i)) { sb.append(" "); sb.append(Type.string(i)); } return sb.toString(); } /** Returns the next name */ public Name getNext() { return next; } /** Returns the set of types defined for this name */ public BitSet getBitmap() { return bitmap; } void rrToWire(DNSOutput out, Compression c, boolean canonical) { next.toWire(out, null, canonical); int length = bitmap.length(); for (int i = 0, t = 0; i < length; i++) { t |= (bitmap.get(i) ? (1 << (7 - i % 8)) : 0); if (i % 8 == 7 || i == length - 1) { out.writeU8(t); t = 0; } } } }