1d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen// Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org)
2d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
3d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpackage org.xbill.DNS;
4d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
5d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport java.io.*;
6d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport java.util.*;
7d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
8d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/**
9d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * A DNS message header
10d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @see Message
11d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *
12d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @author Brian Wellington
13d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */
14d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
15d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic class Header implements Cloneable {
16d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
17d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenprivate int id;
18d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenprivate int flags;
19d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenprivate int [] counts;
20d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
21d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenprivate static Random random = new Random();
22d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
23d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/** The length of a DNS Header in wire format. */
24d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic static final int LENGTH = 12;
25d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
26d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenprivate void
27d7955ce24d294fb2014c59d11fca184471056f44Shuyi Cheninit() {
28d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	counts = new int[4];
29d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	flags = 0;
30d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	id = -1;
31d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
32d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
33d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/**
34d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Create a new empty header.
35d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @param id The message id
36d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */
37d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic
38d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenHeader(int id) {
39d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	init();
40d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	setID(id);
41d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
42d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
43d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/**
44d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Create a new empty header with a random message id
45d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */
46d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic
47d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenHeader() {
48d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	init();
49d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
50d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
51d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/**
52d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Parses a Header from a stream containing DNS wire format.
53d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */
54d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenHeader(DNSInput in) throws IOException {
55d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	this(in.readU16());
56d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	flags = in.readU16();
57d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	for (int i = 0; i < counts.length; i++)
58d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		counts[i] = in.readU16();
59d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
60d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
61d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/**
62d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Creates a new Header from its DNS wire format representation
63d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @param b A byte array containing the DNS Header.
64d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */
65d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic
66d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenHeader(byte [] b) throws IOException {
67d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	this(new DNSInput(b));
68d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
69d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
70d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenvoid
71d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChentoWire(DNSOutput out) {
72d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	out.writeU16(getID());
73d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	out.writeU16(flags);
74d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	for (int i = 0; i < counts.length; i++)
75d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		out.writeU16(counts[i]);
76d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
77d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
78d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic byte []
79d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChentoWire() {
80d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	DNSOutput out = new DNSOutput();
81d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	toWire(out);
82d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	return out.toByteArray();
83d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
84d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
85d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenstatic private boolean
86d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenvalidFlag(int bit) {
87d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	return (bit >= 0 && bit <= 0xF && Flags.isFlag(bit));
88d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
89d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
90d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenstatic private void
91d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChencheckFlag(int bit) {
92d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	if (!validFlag(bit))
93d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		throw new IllegalArgumentException("invalid flag bit " + bit);
94d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
95d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
96d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/**
97d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Sets a flag to the supplied value
98d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @see Flags
99d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */
100d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic void
101d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChensetFlag(int bit) {
102d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	checkFlag(bit);
103d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	// bits are indexed from left to right
104d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	flags |= (1 << (15 - bit));
105d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
106d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
107d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/**
108d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Sets a flag to the supplied value
109d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @see Flags
110d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */
111d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic void
112d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenunsetFlag(int bit) {
113d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	checkFlag(bit);
114d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	// bits are indexed from left to right
115d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	flags &= ~(1 << (15 - bit));
116d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
117d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
118d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/**
119d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Retrieves a flag
120d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @see Flags
121d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */
122d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic boolean
123d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChengetFlag(int bit) {
124d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	checkFlag(bit);
125d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	// bits are indexed from left to right
126d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	return (flags & (1 << (15 - bit))) != 0;
127d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
128d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
129d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenboolean []
130d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChengetFlags() {
131d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	boolean [] array = new boolean[16];
132d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	for (int i = 0; i < array.length; i++)
133d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		if (validFlag(i))
134d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen			array[i] = getFlag(i);
135d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	return array;
136d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
137d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
138d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/**
139d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Retrieves the message ID
140d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */
141d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic int
142d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChengetID() {
143d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	if (id >= 0)
144d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		return id;
145d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	synchronized (this) {
146d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		if (id < 0)
147d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen			id = random.nextInt(0xffff);
148d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		return id;
149d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	}
150d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
151d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
152d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/**
153d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Sets the message ID
154d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */
155d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic void
156d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChensetID(int id) {
157d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	if (id < 0 || id > 0xffff)
158d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		throw new IllegalArgumentException("DNS message ID " + id +
159d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen						   " is out of range");
160d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	this.id = id;
161d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
162d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
163d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/**
164d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Sets the message's rcode
165d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @see Rcode
166d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */
167d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic void
168d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChensetRcode(int value) {
169d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	if (value < 0 || value > 0xF)
170d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		throw new IllegalArgumentException("DNS Rcode " + value +
171d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen						   " is out of range");
172d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	flags &= ~0xF;
173d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	flags |= value;
174d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
175d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
176d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/**
177d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Retrieves the mesasge's rcode
178d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @see Rcode
179d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */
180d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic int
181d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChengetRcode() {
182d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	return flags & 0xF;
183d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
184d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
185d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/**
186d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Sets the message's opcode
187d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @see Opcode
188d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */
189d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic void
190d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChensetOpcode(int value) {
191d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	if (value < 0 || value > 0xF)
192d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		throw new IllegalArgumentException("DNS Opcode " + value +
193d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen						   "is out of range");
194d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	flags &= 0x87FF;
195d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	flags |= (value << 11);
196d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
197d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
198d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/**
199d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Retrieves the mesasge's opcode
200d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @see Opcode
201d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */
202d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic int
203d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChengetOpcode() {
204d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	return (flags >> 11) & 0xF;
205d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
206d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
207d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenvoid
208d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChensetCount(int field, int value) {
209d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	if (value < 0 || value > 0xFFFF)
210d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		throw new IllegalArgumentException("DNS section count " +
211d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen						   value + " is out of range");
212d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	counts[field] = value;
213d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
214d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
215d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenvoid
216d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenincCount(int field) {
217d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	if (counts[field] == 0xFFFF)
218d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		throw new IllegalStateException("DNS section count cannot " +
219d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen						"be incremented");
220d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	counts[field]++;
221d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
222d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
223d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenvoid
224d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChendecCount(int field) {
225d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	if (counts[field] == 0)
226d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		throw new IllegalStateException("DNS section count cannot " +
227d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen						"be decremented");
228d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	counts[field]--;
229d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
230d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
231d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/**
232d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Retrieves the record count for the given section
233d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @see Section
234d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */
235d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic int
236d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChengetCount(int field) {
237d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	return counts[field];
238d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
239d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
240d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/** Converts the header's flags into a String */
241d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic String
242d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenprintFlags() {
243d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	StringBuffer sb = new StringBuffer();
244d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
245d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	for (int i = 0; i < 16; i++)
246d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		if (validFlag(i) && getFlag(i)) {
247d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen			sb.append(Flags.string(i));
248d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen			sb.append(" ");
249d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		}
250d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	return sb.toString();
251d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
252d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
253d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenString
254d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChentoStringWithRcode(int newrcode) {
255d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	StringBuffer sb = new StringBuffer();
256d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
257d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	sb.append(";; ->>HEADER<<- ");
258d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	sb.append("opcode: " + Opcode.string(getOpcode()));
259d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	sb.append(", status: " + Rcode.string(newrcode));
260d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	sb.append(", id: " + getID());
261d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	sb.append("\n");
262d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
263d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	sb.append(";; flags: " + printFlags());
264d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	sb.append("; ");
265d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	for (int i = 0; i < 4; i++)
266d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		sb.append(Section.string(i) + ": " + getCount(i) + " ");
267d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	return sb.toString();
268d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
269d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
270d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/** Converts the header into a String */
271d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic String
272d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChentoString() {
273d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	return toStringWithRcode(getRcode());
274d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
275d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
276d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/* Creates a new Header identical to the current one */
277d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic Object
278d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenclone() {
279d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	Header h = new Header();
280d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	h.id = id;
281d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	h.flags = flags;
282d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	System.arraycopy(counts, 0, h.counts, 0, counts.length);
283d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	return h;
284d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
285d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
286d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
287