package network.message;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import com.google.common.primitives.Bytes;
import com.google.common.primitives.Ints;
public class SignaturesMessage extends Message{
private static final int SIGNATURE_LENGTH = 128;
private static final int DATA_LENGTH = 4;
private List<byte[]> signatures;
public SignaturesMessage(List<byte[]> signatures)
{
super(SIGNATURES_TYPE);
this.signatures = signatures;
}
public List<byte[]> getSignatures()
{
return this.signatures;
}
public static SignaturesMessage parse(byte[] data) throws Exception
{
//READ LENGTH
byte[] lengthBytes = Arrays.copyOfRange(data, 0, DATA_LENGTH);
int length = Ints.fromByteArray(lengthBytes);
//CHECK IF DATA MATCHES LENGTH
if(data.length != DATA_LENGTH + (length * SIGNATURE_LENGTH))
{
throw new Exception("Data does not match length");
}
//CREATE HEADERS LIST
List<byte[]> headers = new ArrayList<byte[]>();
for(int i=0; i<length; i++)
{
//CALCULATE POSITION
int position = DATA_LENGTH + (i * SIGNATURE_LENGTH);
//READ HEADER
byte[] header = Arrays.copyOfRange(data, position, position + SIGNATURE_LENGTH);
//ADD TO LIST
headers.add(header);
}
return new SignaturesMessage(headers);
}
@Override
public byte[] toBytes()
{
byte[] data = new byte[0];
//WRITE LENGTH
int length = this.signatures.size();
byte[] lengthBytes = Ints.toByteArray(length);
lengthBytes = Bytes.ensureCapacity(lengthBytes, DATA_LENGTH, 0);
data = Bytes.concat(data, lengthBytes);
//WRITE SIGNATURES
for(byte[] header: this.signatures)
{
//WRITE SIGNATURE
data = Bytes.concat(data, header);
}
//ADD CHECKSUM
data = Bytes.concat(super.toBytes(), this.generateChecksum(data), data);
return data;
}
@Override
public int getDataLength()
{
return DATA_LENGTH + (this.signatures.size() * SIGNATURE_LENGTH);
}
}