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