package org.limewire.libtorrent;
import org.limewire.bittorrent.TorrentPieceState;
import org.limewire.bittorrent.TorrentPiecesInfo;
/**
* Lightweight impl of TorrentPiecesInfo that copies its working data from
* a LibTorrentPiecesInfoContainer returned from the JNA.
*/
class LibTorrentPiecesInfo implements TorrentPiecesInfo {
private static final char PIECE_DOWNLOADED = 'x';
private static final char PIECE_PARTIAL = 'p';
private static final char PIECE_PENDING = '0';
private static final char PIECE_ACTIVE = 'a';
private static final char PIECE_UNAVAILABLE = 'U';
private static final char PIECE_QUEUED = 'q';
private static final char PIECE_UNAVAILABLE_PARTIAL = 'u';
private final String stateInfo;
private final int numPiecesCompleted;
/**
* Generates a working instance of {@link TorrentPiecesInfo} from a
* {@link LibTorrentPiecesInfoContainer} returned from libtorrent through
* JNA.
*/
LibTorrentPiecesInfo(LibTorrentPiecesInfoContainer piecesInfoContainer) {
stateInfo = piecesInfoContainer.getStateInfo();
numPiecesCompleted = piecesInfoContainer.getNumPiecesCompleted();
}
@Override
public int getNumPieces() {
return stateInfo.length();
}
@Override
public int getNumPiecesCompleted() {
return numPiecesCompleted;
}
@Override
public TorrentPieceState getPieceState(int piece) {
return getPieceState(stateInfo.charAt(piece));
}
private static TorrentPieceState getPieceState(char c) {
switch (c) {
case PIECE_DOWNLOADED :
return TorrentPieceState.DOWNLOADED;
case PIECE_PARTIAL :
return TorrentPieceState.PARTIAL;
case PIECE_PENDING :
case PIECE_QUEUED :
return TorrentPieceState.AVAILABLE;
case PIECE_ACTIVE :
return TorrentPieceState.ACTIVE;
case PIECE_UNAVAILABLE :
case PIECE_UNAVAILABLE_PARTIAL :
return TorrentPieceState.UNAVAILABLE;
default :
throw new IllegalArgumentException("Unknown Piece Descriptor: " + c);
}
}
}