package org.torrent.internal.peer.connection;
import java.beans.IndexedPropertyChangeEvent;
import java.beans.PropertyChangeEvent;
import org.torrent.internal.protocol.message.BitField;
import org.torrent.internal.protocol.message.BittorrentMessage;
import org.torrent.internal.protocol.message.Have;
import org.torrent.internal.transfer.event.BitfieldListener;
import org.torrent.internal.util.Bits;
import org.torrent.internal.util.Validator;
public class AbstractBitfieldHolder implements BitfieldHolder {
private Bits bitfield;
private final BitfieldListener callback;
public AbstractBitfieldHolder(Bits bitfield, BitfieldListener callback) {
Validator.notNull(bitfield, "Initial bitfield is null!");
this.bitfield = bitfield;
this.callback = callback;
}
private void updateIndex(int index, boolean value) {
boolean old = bitfield.get(index);
bitfield.set(index, value);
if (callback != null) {
callback.bitFieldBitChanged(new IndexedPropertyChangeEvent(this,
"bitfield", old, value, index));
}
}
private void updateBitfield(Bits bits) {
Bits old = bitfield;
bitfield = new Bits(bits);
bitfield.setSize(old.size());
if (callback != null) {
callback.bitFieldChanged(new PropertyChangeEvent(this, "bitfield",
old, bitfield));
}
}
protected void handleMessage(BittorrentMessage message) {
if (message instanceof Have) {
System.out.println("handle HAVE message " + ((Have) message).getPieceIndex());
updateIndex(((Have) message).getPieceIndex(), true);
} else if (message instanceof BitField) {
updateBitfield(((BitField) message).getBitSet());
}
}
@Override
public Bits getBitField() {
return bitfield.unmodifableBits();
}
}