package org.torrent.internal.protocol.message; import java.io.UnsupportedEncodingException; import java.nio.ByteBuffer; import java.util.Arrays; import org.torrent.internal.data.Hash; import org.torrent.internal.util.Validator; public class HandShakeA implements BittorrentMessage { private static final ByteBuffer PROTOCOL; static { try { byte[] data = "BitTorrent protocol".getBytes("ISO-8859-1"); PROTOCOL = ByteBuffer.allocate(data.length); PROTOCOL.put(data); PROTOCOL.flip(); } catch (UnsupportedEncodingException e) { throw new RuntimeException(e); } } private final Hash infoHash; private final byte[] reserved; public HandShakeA(Hash infoHash) { this(infoHash, new byte[8]); } public HandShakeA(Hash infoHash, byte[] reserved) { Validator.notNull(infoHash, "Info hash is null!"); Validator.notNull(reserved, "Reserved bytes are null!"); Validator.isTrue(infoHash.getType() == Hash.Type.SHA1, "Wrong hash type: " + infoHash.getType()); Validator.isTrue(reserved.length == 8, "Wrong size of reserved bytes!"); this.infoHash = infoHash; this.reserved = Arrays.copyOf(reserved, reserved.length); } public Hash getInfoHash() { return infoHash; } @Override public void accept(BTMessageVisitor visitor) { visitor.visitHandShakeA(this); } public byte[] getReserved() { return Arrays.copyOf(reserved, reserved.length); } @Override public String toString() { return "HandShakeA: InfoHash = " + infoHash + ", reserved bytes = " + Arrays.toString(reserved); } public static ByteBuffer getPROTOCOL() { return PROTOCOL.asReadOnlyBuffer(); } }