blob: ad04e0107c02113f9433a464fd1e6420d9233e77 [file] [log] [blame]
Shuyi Chend7955ce2013-05-22 14:51:55 -07001// Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org)
2
3package org.xbill.DNS;
4
5import java.io.*;
6import java.util.*;
7
8/**
9 * Next name - this record contains the following name in an ordered list
10 * of names in the zone, and a set of types for which records exist for
11 * this name. The presence of this record in a response signifies a
12 * failed query for data in a DNSSEC-signed zone.
13 *
14 * @author Brian Wellington
15 */
16
17public class NXTRecord extends Record {
18
19private static final long serialVersionUID = -8851454400765507520L;
20
21private Name next;
22private BitSet bitmap;
23
24NXTRecord() {}
25
26Record
27getObject() {
28 return new NXTRecord();
29}
30
31/**
32 * Creates an NXT Record from the given data
33 * @param next The following name in an ordered list of the zone
34 * @param bitmap The set of type for which records exist at this name
35*/
36public
37NXTRecord(Name name, int dclass, long ttl, Name next, BitSet bitmap) {
38 super(name, Type.NXT, dclass, ttl);
39 this.next = checkName("next", next);
40 this.bitmap = bitmap;
41}
42
43void
44rrFromWire(DNSInput in) throws IOException {
45 next = new Name(in);
46 bitmap = new BitSet();
47 int bitmapLength = in.remaining();
48 for (int i = 0; i < bitmapLength; i++) {
49 int t = in.readU8();
50 for (int j = 0; j < 8; j++)
51 if ((t & (1 << (7 - j))) != 0)
52 bitmap.set(i * 8 + j);
53 }
54}
55
56void
57rdataFromString(Tokenizer st, Name origin) throws IOException {
58 next = st.getName(origin);
59 bitmap = new BitSet();
60 while (true) {
61 Tokenizer.Token t = st.get();
62 if (!t.isString())
63 break;
64 int typecode = Type.value(t.value, true);
65 if (typecode <= 0 || typecode > 128)
66 throw st.exception("Invalid type: " + t.value);
67 bitmap.set(typecode);
68 }
69 st.unget();
70}
71
72/** Converts rdata to a String */
73String
74rrToString() {
75 StringBuffer sb = new StringBuffer();
76 sb.append(next);
77 int length = bitmap.length();
78 for (short i = 0; i < length; i++)
79 if (bitmap.get(i)) {
80 sb.append(" ");
81 sb.append(Type.string(i));
82 }
83 return sb.toString();
84}
85
86/** Returns the next name */
87public Name
88getNext() {
89 return next;
90}
91
92/** Returns the set of types defined for this name */
93public BitSet
94getBitmap() {
95 return bitmap;
96}
97
98void
99rrToWire(DNSOutput out, Compression c, boolean canonical) {
100 next.toWire(out, null, canonical);
101 int length = bitmap.length();
102 for (int i = 0, t = 0; i < length; i++) {
103 t |= (bitmap.get(i) ? (1 << (7 - i % 8)) : 0);
104 if (i % 8 == 7 || i == length - 1) {
105 out.writeU8(t);
106 t = 0;
107 }
108 }
109}
110
111}