/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package skdsswing.transfer; import java.io.*; import java.io.ByteArrayInputStream; //import skdsswing.SDKSSwingFileExplorer; /** * THis Class creat the packet for transfer * in first step creat the telegramm [SOH 00 FF "Filename" NULL[128 - Filename.length] CRC CRC] * second step creat the telgramm [STX 0X !n DATA[1024] CRC CRC] * @author OOBD.org */ public class InitPacket { private short packetnumber; private boolean longPacket; private boolean isPacketInit; private boolean isEnd; private String fileName; private int fileLength; private byte[] packet; private byte[] data; private byte[] innerdata; private byte[] header; private byte[] crcfooter = new byte[2]; private long checksum = 0; private CRC16 crc = new CRC16(TransferSpecification.initValueZero); public void setFilelength(int size){ this.fileLength = size; } public void setFilename(String name){ this.fileName = name; } public short getPacketnumber() { return packetnumber; } public void setPacketnumber(short packetnumber) { this.packetnumber = packetnumber; } public boolean getIsLongPacket() { return longPacket; } public void setLongPacket(boolean longPacket) { this.longPacket = longPacket; } public boolean getIsPacketInit() { return isPacketInit; } public void setIsPacketInit(boolean isPacketInit) { this.isPacketInit = isPacketInit; } public boolean getIsEnd() { return isEnd; } public void setIsEnd(boolean isEnd) { this.isEnd = isEnd; } public byte[] getPacket() { return packet; } public void setPacket(byte[] packet) { this.packet = packet; } public byte[] getInnerdata() { return innerdata; } public void setInnerdata(byte[] innerdata) { this.innerdata = innerdata; } public byte[] getHeader() { return header; } public void setHeader(byte[] header) { this.header = header; } public void setData(byte[] data) { this.data = data; } public byte[] getData() { return data; } public InitPacket(){ header = new byte[3]; intForFirstUse(header); } public void createPacket() throws Exception{ if(getIsLongPacket()==true){ header[0] = TransferSpecification.STX; packet = new byte[1029]; innerdata = new byte[1024]; } else{ header[0] = TransferSpecification.SOH; packet = new byte[133]; innerdata = new byte[128]; } if(getIsPacketInit()==true){ if(packetnumber!=0){ throw new Exception("Packet number should beginn with 0"); } else if(fileName.length() > 1023){ throw new Exception("Filename too large"); } else{ header[1] =(byte)packetnumber; header[2] = (byte)(0xff - packetnumber); System.arraycopy(ConvertChartoByteArray(fileName.toCharArray()), 0, innerdata, 0, fileName.length()); System.arraycopy(ConvertChartoByteArray(Integer.toString(fileLength).toCharArray()), 0, innerdata, fileName.length()+1, Integer.toString(fileLength).toCharArray().length); System.arraycopy(innerdata, 0, packet, 3, innerdata.length); crc.update(innerdata); crc.update(0); crc.update(0); checksum = crc.getValue(); crcfooter[0] = (byte)((checksum&0xFF00)>>8); crcfooter[1] = (byte)(checksum&0xFF); System.arraycopy(header, 0, packet, 0, 3); System.arraycopy(crcfooter, 0, packet, packet.length-2, 2); for(int i = 0; i<packet.length;i++){ System.out.println(packet[i]); } } } else if(getIsEnd()){ if(getPacketnumber() !=0){ throw new Exception("end can only have packetnum 0"); } else{ System.arraycopy(data, 0, innerdata, 0, data.length); header[1]=(byte)packetnumber; header[2]=(byte)(0xff-packetnumber); crc.update(innerdata); crc.update(0); crc.update(0); checksum = crc.getValue(); crcfooter[0] = (byte)((checksum&0xFF00)>>8); crcfooter[1] = (byte)(checksum&0xFF); System.arraycopy(innerdata, 0, packet, 3, 128); System.arraycopy(header, 0, packet, 0, 3); System.arraycopy(crcfooter, 0, packet, packet.length-2, 2); } } else if(getPacketnumber() ==0){ throw new Exception("data can't be in packet one"); } else{ System.arraycopy(data, 0, innerdata, 0, data.length); header[1]=(byte)packetnumber; header[2]=(byte)(0xff-packetnumber); crc.update(innerdata); crc.update(0); crc.update(0); checksum = crc.getValue(); crcfooter[0] = (byte)((checksum&0xFF00)>>8); crcfooter[1] = (byte)(checksum&0xFF); System.arraycopy(innerdata, 0, packet, 3, 1024); System.arraycopy(header, 0, packet, 0, 3); System.arraycopy(crcfooter, 0, packet, packet.length-2, 2); } } private byte[] ConvertChartoByteArray(char[] input) { byte[] output = new byte[input.length]; for (int i = 0; i < output.length; i++) { output[i] = (byte)input[i]; } return output; } private void intForFirstUse(byte[] bytes){ for(int i=0;i<bytes.length;i++){ bytes[i] =0x00; } } }