summaryrefslogtreecommitdiff
path: root/src/javax/jmdns/impl/DNSMessage.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/javax/jmdns/impl/DNSMessage.java')
-rw-r--r--src/javax/jmdns/impl/DNSMessage.java307
1 files changed, 307 insertions, 0 deletions
diff --git a/src/javax/jmdns/impl/DNSMessage.java b/src/javax/jmdns/impl/DNSMessage.java
new file mode 100644
index 0000000..6537705
--- /dev/null
+++ b/src/javax/jmdns/impl/DNSMessage.java
@@ -0,0 +1,307 @@
+/**
+ *
+ */
+package javax.jmdns.impl;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.LinkedList;
+import java.util.List;
+
+import javax.jmdns.impl.constants.DNSConstants;
+
+/**
+ * DNSMessage define a DNS message either incoming or outgoing.
+ *
+ * @author Werner Randelshofer, Rick Blair, Pierre Frisch
+ */
+public abstract class DNSMessage {
+
+ /**
+ *
+ */
+ public static final boolean MULTICAST = true;
+
+ /**
+ *
+ */
+ public static final boolean UNICAST = false;
+
+ // protected DatagramPacket _packet;
+ // protected int _off;
+ // protected int _len;
+ // protected byte[] _data;
+
+ private int _id;
+
+ boolean _multicast;
+
+ private int _flags;
+
+ protected final List<DNSQuestion> _questions;
+
+ protected final List<DNSRecord> _answers;
+
+ protected final List<DNSRecord> _authoritativeAnswers;
+
+ protected final List<DNSRecord> _additionals;
+
+ /**
+ * @param flags
+ * @param id
+ * @param multicast
+ */
+ protected DNSMessage(int flags, int id, boolean multicast) {
+ super();
+ _flags = flags;
+ _id = id;
+ _multicast = multicast;
+ _questions = Collections.synchronizedList(new LinkedList<DNSQuestion>());
+ _answers = Collections.synchronizedList(new LinkedList<DNSRecord>());
+ _authoritativeAnswers = Collections.synchronizedList(new LinkedList<DNSRecord>());
+ _additionals = Collections.synchronizedList(new LinkedList<DNSRecord>());
+ }
+
+ // public DatagramPacket getPacket() {
+ // return _packet;
+ // }
+ //
+ // public int getOffset() {
+ // return _off;
+ // }
+ //
+ // public int getLength() {
+ // return _len;
+ // }
+ //
+ // public byte[] getData() {
+ // if ( _data == null ) _data = new byte[DNSConstants.MAX_MSG_TYPICAL];
+ // return _data;
+ // }
+
+ /**
+ * @return message id
+ */
+ public int getId() {
+ return (_multicast ? 0 : _id);
+ }
+
+ /**
+ * @param id
+ * the id to set
+ */
+ public void setId(int id) {
+ this._id = id;
+ }
+
+ /**
+ * @return message flags
+ */
+ public int getFlags() {
+ return _flags;
+ }
+
+ /**
+ * @param flags
+ * the flags to set
+ */
+ public void setFlags(int flags) {
+ this._flags = flags;
+ }
+
+ /**
+ * @return true if multicast
+ */
+ public boolean isMulticast() {
+ return _multicast;
+ }
+
+ /**
+ * @return list of questions
+ */
+ public Collection<? extends DNSQuestion> getQuestions() {
+ return _questions;
+ }
+
+ /**
+ * @return number of questions in the message
+ */
+ public int getNumberOfQuestions() {
+ return this.getQuestions().size();
+ }
+
+ public Collection<? extends DNSRecord> getAllAnswers() {
+ List<DNSRecord> aList = new ArrayList<DNSRecord>(_answers.size() + _authoritativeAnswers.size() + _additionals.size());
+ aList.addAll(_answers);
+ aList.addAll(_authoritativeAnswers);
+ aList.addAll(_additionals);
+ return aList;
+ }
+
+ /**
+ * @return list of answers
+ */
+ public Collection<? extends DNSRecord> getAnswers() {
+ return _answers;
+ }
+
+ /**
+ * @return number of answers in the message
+ */
+ public int getNumberOfAnswers() {
+ return this.getAnswers().size();
+ }
+
+ /**
+ * @return list of authorities
+ */
+ public Collection<? extends DNSRecord> getAuthorities() {
+ return _authoritativeAnswers;
+ }
+
+ /**
+ * @return number of authorities in the message
+ */
+ public int getNumberOfAuthorities() {
+ return this.getAuthorities().size();
+ }
+
+ /**
+ * @return list of additional answers
+ */
+ public Collection<? extends DNSRecord> getAdditionals() {
+ return _additionals;
+ }
+
+ /**
+ * @return number of additional in the message
+ */
+ public int getNumberOfAdditionals() {
+ return this.getAdditionals().size();
+ }
+
+ /**
+ * Check if the message is truncated.
+ *
+ * @return true if the message was truncated
+ */
+ public boolean isTruncated() {
+ return (_flags & DNSConstants.FLAGS_TC) != 0;
+ }
+
+ /**
+ * Check if the message is a query.
+ *
+ * @return true is the message is a query
+ */
+ public boolean isQuery() {
+ return (_flags & DNSConstants.FLAGS_QR_MASK) == DNSConstants.FLAGS_QR_QUERY;
+ }
+
+ /**
+ * Check if the message is a response.
+ *
+ * @return true is the message is a response
+ */
+ public boolean isResponse() {
+ return (_flags & DNSConstants.FLAGS_QR_MASK) == DNSConstants.FLAGS_QR_RESPONSE;
+ }
+
+ /**
+ * Check if the message is empty
+ *
+ * @return true is the message is empty
+ */
+ public boolean isEmpty() {
+ return (this.getNumberOfQuestions() + this.getNumberOfAnswers() + this.getNumberOfAuthorities() + this.getNumberOfAdditionals()) == 0;
+ }
+
+ /**
+ * Debugging.
+ */
+ String print() {
+ StringBuffer buf = new StringBuffer(200);
+ buf.append(this.toString());
+ buf.append("\n");
+ for (DNSQuestion question : _questions) {
+ buf.append("\tquestion: ");
+ buf.append(question);
+ buf.append("\n");
+ }
+ for (DNSRecord answer : _answers) {
+ buf.append("\tanswer: ");
+ buf.append(answer);
+ buf.append("\n");
+ }
+ for (DNSRecord answer : _authoritativeAnswers) {
+ buf.append("\tauthoritative: ");
+ buf.append(answer);
+ buf.append("\n");
+ }
+ for (DNSRecord answer : _additionals) {
+ buf.append("\tadditional: ");
+ buf.append(answer);
+ buf.append("\n");
+ }
+ return buf.toString();
+ }
+
+ /**
+ * Debugging.
+ *
+ * @param data
+ * @return data dump
+ */
+ protected String print(byte[] data) {
+ StringBuilder buf = new StringBuilder(4000);
+ for (int off = 0, len = data.length; off < len; off += 32) {
+ int n = Math.min(32, len - off);
+ if (off < 0x10) {
+ buf.append(' ');
+ }
+ if (off < 0x100) {
+ buf.append(' ');
+ }
+ if (off < 0x1000) {
+ buf.append(' ');
+ }
+ buf.append(Integer.toHexString(off));
+ buf.append(':');
+ int index = 0;
+ for (index = 0; index < n; index++) {
+ if ((index % 8) == 0) {
+ buf.append(' ');
+ }
+ buf.append(Integer.toHexString((data[off + index] & 0xF0) >> 4));
+ buf.append(Integer.toHexString((data[off + index] & 0x0F) >> 0));
+ }
+ // for incomplete lines
+ if (index < 32) {
+ for (int i = index; i < 32; i++) {
+ if ((i % 8) == 0) {
+ buf.append(' ');
+ }
+ buf.append(" ");
+ }
+ }
+ buf.append(" ");
+ for (index = 0; index < n; index++) {
+ if ((index % 8) == 0) {
+ buf.append(' ');
+ }
+ int ch = data[off + index] & 0xFF;
+ buf.append(((ch > ' ') && (ch < 127)) ? (char) ch : '.');
+ }
+ buf.append("\n");
+
+ // limit message size
+ if (off + 32 >= 2048) {
+ buf.append("....\n");
+ break;
+ }
+ }
+ return buf.toString();
+ }
+
+}