You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
78 lines
2.7 KiB
78 lines
2.7 KiB
package seng302.Networking.MessageEncoders;
|
|
|
|
import java.nio.ByteBuffer;
|
|
import java.nio.ByteOrder;
|
|
import java.util.Arrays;
|
|
|
|
/**
|
|
* Encodes a XML file into a message of AC35 format
|
|
*/
|
|
public class XMLMessageEncoder {
|
|
private byte messageVersionNumber;
|
|
private short ackNumber;
|
|
private long timeStamp;
|
|
private byte xmlMsgSubType;
|
|
private short sequenceNumber;
|
|
private short xmlMsgLength;
|
|
private String xmlMessage;
|
|
|
|
public XMLMessageEncoder(byte messageVersionNumber, short ackNumber, long timeStamp, byte xmlMsgSubType, short sequenceNumber, short xmlMsgLenght, String xmlMessage) {
|
|
this.messageVersionNumber = messageVersionNumber;
|
|
this.ackNumber = ackNumber;
|
|
this.timeStamp = timeStamp;
|
|
this.xmlMsgSubType = xmlMsgSubType;
|
|
this.sequenceNumber = sequenceNumber;
|
|
this.xmlMsgLength = xmlMsgLenght;
|
|
this.xmlMessage = xmlMessage;
|
|
}
|
|
|
|
public byte[] encode() {
|
|
byte[] messageBytes = xmlMessage.getBytes();
|
|
if (messageBytes.length > this.xmlMsgLength) {
|
|
//System.err.println("Xml message is to big");
|
|
return null;
|
|
}
|
|
ByteBuffer tempOutputByteBuffer = ByteBuffer.allocate(14 + messageBytes.length);
|
|
|
|
//ackNumber converted to bytes
|
|
byte[] ackNumberBytes = new byte[2];
|
|
ackNumberBytes[0] = (byte) (ackNumber & 0xff);
|
|
ackNumberBytes[1] = (byte) ((ackNumber >> 8) & 0xff);
|
|
|
|
//sequenceNumber converted to bytes
|
|
byte[] sequenceNumberBytes = new byte[2];
|
|
sequenceNumberBytes[0] = (byte) (sequenceNumber & 0xff);
|
|
sequenceNumberBytes[1] = (byte) ((sequenceNumber >> 8) & 0xff);
|
|
|
|
//xmlMsgLength converted to bytes
|
|
byte[] xmlMsgLengthBytes = new byte[2];
|
|
xmlMsgLengthBytes[0] = (byte) (xmlMsgLength & 0xff);
|
|
xmlMsgLengthBytes[1] = (byte) ((xmlMsgLength >> 8) & 0xff);
|
|
|
|
|
|
tempOutputByteBuffer.put(messageVersionNumber);
|
|
tempOutputByteBuffer.put(ackNumberBytes);
|
|
tempOutputByteBuffer.put(longToSixBytes(timeStamp));
|
|
tempOutputByteBuffer.put(xmlMsgSubType);
|
|
tempOutputByteBuffer.put(sequenceNumberBytes);
|
|
tempOutputByteBuffer.put(xmlMsgLengthBytes);
|
|
tempOutputByteBuffer.put(messageBytes);
|
|
|
|
return tempOutputByteBuffer.array();
|
|
}
|
|
|
|
private byte[] longToSixBytes(long x) {
|
|
ByteBuffer buffer = ByteBuffer.allocate(Long.BYTES);
|
|
buffer.putLong(x);
|
|
|
|
// System.out.println("====encode====");
|
|
// for (byte i:buffer.array()
|
|
// ) {
|
|
// System.out.println(i);
|
|
// }
|
|
// System.out.println("====encode====");
|
|
|
|
return Arrays.copyOfRange(buffer.array(), 2, 8);
|
|
}
|
|
}
|