hal/src/zutil/net/dns/DNSPacket.java
2016-04-18 17:41:55 +02:00

108 lines
3.7 KiB
Java
Executable file

package zutil.net.dns;
import zutil.parser.binary.BinaryStructInputStream;
import zutil.parser.binary.BinaryStructOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* This class is a general wrapper for a whole DNS packet.
*
* Created by Ziver on 2016-04-11.
*/
public class DNSPacket {
private DNSPacketHeader header;
private ArrayList<DNSPacketQuestion> questions;
private ArrayList<DNSPacketResource> answerRecords;
private ArrayList<DNSPacketResource> nameServers;
private ArrayList<DNSPacketResource> additionalRecords;
public DNSPacket(){
header = new DNSPacketHeader();
questions = new ArrayList<>();
answerRecords = new ArrayList<>();
nameServers = new ArrayList<>();
additionalRecords = new ArrayList<>();
}
public DNSPacketHeader getHeader(){
return header;
}
public List<DNSPacketQuestion> getQuestions(){
return Collections.unmodifiableList(questions);
}
public List<DNSPacketResource> getAnswerRecords(){
return Collections.unmodifiableList(answerRecords);
}
public List<DNSPacketResource> getNameServers(){
return Collections.unmodifiableList(nameServers);
}
public List<DNSPacketResource> getAdditionalRecords(){
return Collections.unmodifiableList(additionalRecords);
}
public void addQuestion(DNSPacketQuestion question){
questions.add(question);
header.countQuestion = questions.size();
}
public void addAnswerRecord(DNSPacketResource resource){
answerRecords.add(resource);
header.countAnswerRecord = answerRecords.size();
}
public void addNameServer(DNSPacketResource resource){
nameServers.add(resource);
header.countNameServer = nameServers.size();
}
public void addAdditionalRecord(DNSPacketResource resource){
additionalRecords.add(resource);
header.countAdditionalRecord = additionalRecords.size();
}
public static DNSPacket read(InputStream in) throws IOException {
BinaryStructInputStream structIn = new BinaryStructInputStream(in);
DNSPacket packet = new DNSPacket();
structIn.read(packet.header);
for (int i=0; i<packet.header.countQuestion; ++i) {
DNSPacketQuestion question = new DNSPacketQuestion();
structIn.read(question);
packet.questions.add(question);
}
readResource(structIn, packet.header.countAnswerRecord, packet.answerRecords);
readResource(structIn, packet.header.countNameServer, packet.nameServers);
readResource(structIn, packet.header.countAdditionalRecord, packet.additionalRecords);
return packet;
}
private static void readResource(BinaryStructInputStream structIn, int count, ArrayList<DNSPacketResource> list) throws IOException {
for (int i=0; i<count; ++i){
DNSPacketResource resource = new DNSPacketResource();
structIn.read(resource);
list.add(resource);
}
}
public void write(OutputStream out) throws IOException {
BinaryStructOutputStream structOut = new BinaryStructOutputStream(out);
structOut.write(header);
for (DNSPacketQuestion question : questions)
structOut.write(question);
for (DNSPacketResource answerRecord : answerRecords)
structOut.write(answerRecord);
for (DNSPacketResource nameServer : nameServers)
structOut.write(nameServer);
for (DNSPacketResource additionalRecord : additionalRecords)
structOut.write(additionalRecord);
}
}