1 // Copyright (c) 2004 Brian Wellington (bwelling@xbill.org)
2
3 package org.xbill.DNS;
4
5 import java.io.*;
6 import org.xbill.DNS.utils.*;
7
8 /**
9 * NSAP Address Record.
10 *
11 * @author Brian Wellington
12 */
13
14 public class NSAPRecord extends Record {
15
16 private static final long serialVersionUID = -1037209403185658593L;
17
18 private byte [] address;
19
NSAPRecord()20 NSAPRecord() {}
21
22 Record
getObject()23 getObject() {
24 return new NSAPRecord();
25 }
26
27 private static final byte []
checkAndConvertAddress(String address)28 checkAndConvertAddress(String address) {
29 if (!address.substring(0, 2).equalsIgnoreCase("0x")) {
30 return null;
31 }
32 ByteArrayOutputStream bytes = new ByteArrayOutputStream();
33 boolean partial = false;
34 int current = 0;
35 for (int i = 2; i < address.length(); i++) {
36 char c = address.charAt(i);
37 if (c == '.') {
38 continue;
39 }
40 int value = Character.digit(c, 16);
41 if (value == -1) {
42 return null;
43 }
44 if (partial) {
45 current += value;
46 bytes.write(current);
47 partial = false;
48 } else {
49 current = value << 4;
50 partial = true;
51 }
52
53 }
54 if (partial) {
55 return null;
56 }
57 return bytes.toByteArray();
58 }
59
60 /**
61 * Creates an NSAP Record from the given data
62 * @param address The NSAP address.
63 * @throws IllegalArgumentException The address is not a valid NSAP address.
64 */
65 public
NSAPRecord(Name name, int dclass, long ttl, String address)66 NSAPRecord(Name name, int dclass, long ttl, String address) {
67 super(name, Type.NSAP, dclass, ttl);
68 this.address = checkAndConvertAddress(address);
69 if (this.address == null) {
70 throw new IllegalArgumentException("invalid NSAP address " +
71 address);
72 }
73 }
74
75 void
rrFromWire(DNSInput in)76 rrFromWire(DNSInput in) throws IOException {
77 address = in.readByteArray();
78 }
79
80 void
rdataFromString(Tokenizer st, Name origin)81 rdataFromString(Tokenizer st, Name origin) throws IOException {
82 String addr = st.getString();
83 this.address = checkAndConvertAddress(addr);
84 if (this.address == null)
85 throw st.exception("invalid NSAP address " + addr);
86 }
87
88 /**
89 * Returns the NSAP address.
90 */
91 public String
getAddress()92 getAddress() {
93 return byteArrayToString(address, false);
94 }
95
96 void
rrToWire(DNSOutput out, Compression c, boolean canonical)97 rrToWire(DNSOutput out, Compression c, boolean canonical) {
98 out.writeByteArray(address);
99 }
100
101 String
rrToString()102 rrToString() {
103 return "0x" + base16.toString(address);
104 }
105
106 }
107