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); } }