package org.torrent.internal.transfer; import java.io.EOFException; import java.io.IOException; import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import org.gudy.azureus2.plugins.download.DownloadAnnounceResult; import org.gudy.azureus2.plugins.download.DownloadAttributeListener; import org.gudy.azureus2.plugins.download.DownloadListener; import org.gudy.azureus2.plugins.download.DownloadPeerListener; import org.gudy.azureus2.plugins.download.DownloadTrackerListener; import org.gudy.azureus2.plugins.peers.PeerManager; import org.gudy.azureus2.plugins.torrent.Torrent; import org.gudy.azureus2.plugins.torrent.TorrentAttribute; import org.merapi.helper.handlers.BarUpdateRequestHandler; import org.merapi.helper.messages.BarUpdateRespondMessage; //import org.milipede.problemResolver.ProblemResolver; import org.torrent.internal.data.TorrentMetaInfo; import org.torrent.internal.io.DataReader; import org.torrent.internal.io.DigesterService; import org.torrent.internal.io.NBDataReader; import org.torrent.internal.io.NBDataWriter; import org.torrent.internal.io.PieceEvent; import org.torrent.internal.io.PieceVerifier; import org.torrent.internal.io.NBDataWriter.Callback; import org.torrent.internal.io.PieceVerifier.PieceVerifierEventListener; import org.torrent.internal.peer.connection.BTConnection; import org.torrent.internal.protocol.message.BittorrentMessage; import org.torrent.internal.protocol.message.Piece; import org.torrent.internal.service.ContentState; import org.torrent.internal.service.ContentStateListener; import org.torrent.internal.service.event.ContentStateEvent; import org.torrent.internal.util.BTUtil; import org.torrent.transfer.Transfer; import org.torrent.transfer.TransferBuilderService; public class TransferBuilder implements TransferBuilderService { // public static int chunksize = 16348; public static int chunksize = 16384; AvailabilityObserver availabilityObserver; List<Integer> order; ContentWatcher contentwatcher; PieceVerifier pieceVerifier; Download dl; Uploader ul; TrafficWatcher trafficWatcher; DefaultSession session; @Override public Transfer createTransfer(final TorrentMetaInfo contentInfo, NBDataReader reader, final NBDataWriter writer, DigesterService digester, DataReader breader) throws IOException { session = new DefaultSession(); contentwatcher = new ContentWatcher(contentInfo); session.addBTSessionListener(contentwatcher); availabilityObserver = new AvailabilityObserver( contentInfo); order = new ArrayList<Integer>(contentInfo.getPiecesCount()); for (int i = 0; i < contentInfo.getPiecesCount(); i++) { order.add(i); } Collections.shuffle(order); DistributionWatcher distWatcher = new DefaultDistributionWatcher( contentInfo); distWatcher.setPieceComparator(new Comparator<org.torrent.internal.data.TorrentMetaInfo.Piece>() { @Override public int compare(org.torrent.internal.data.TorrentMetaInfo.Piece o1, org.torrent.internal.data.TorrentMetaInfo.Piece o2) { // TODO Auto-generated method stub int res = availabilityObserver.getAvailability(o1) - availabilityObserver.getAvailability(o2); if (res == 0) { res = order.get(o1.getIndex()) - order.get(o2.getIndex()); } return res; } }); // chain.add(distWatcher); trafficWatcher = new TrafficWatcher(); session.addBTSessionListener(trafficWatcher); // trafficWatcher.addPropertyChangeListener(listener); SimpleScoreKeeper scorer = new SimpleScoreKeeper(); session.addBTSessionListener(scorer); session.addBTSessionListener(availabilityObserver); SimpleRequestProvider srp = new SimpleRequestProvider(contentInfo, contentwatcher, 16384, 8); // DWRequestProvider dwrp = new DWRequestProvider(contentInfo, // contentwatcher, 16348, 16, distWatcher); // dl = new Download(session, new // DWRequestProvider(contentInfo, // contentwatcher, 16384, 16, distWatcher), contentwatcher); srp.setPieceComparator(new Comparator<org.torrent.internal.data.TorrentMetaInfo.Piece>() { public int compare(org.torrent.internal.data.TorrentMetaInfo.Piece o1, org.torrent.internal.data.TorrentMetaInfo.Piece o2) { int res = availabilityObserver.getAvailability(o1) - availabilityObserver.getAvailability(o2); if (res == 0) { res = order.get(o1.getIndex()) - order.get(o2.getIndex()); } return res; } }); dl = new Download(session, srp, contentwatcher); session.addBTSessionListener(dl); ul = new SimpleScoreBasedUploader(session, contentwatcher, scorer, reader, contentInfo, 5); session.addBTSessionListener(ul); pieceVerifier = BTUtil.createPieceVerifier( contentInfo, digester, breader); pieceVerifier.addPieceVerifierEventListener(new PieceVerifierEventListener() { @Override public void caughtException(PieceEvent evt) { if (evt.getException() instanceof EOFException) { contentwatcher.markRequired(evt.getPiece()); } } @Override public void falsified(PieceEvent evt) { contentwatcher.markRequired(evt.getPiece()); } @Override public void verified(PieceEvent evt) { // contentwatcher.markChecked(evt.getPiece()); //out to test message overflow // BarUpdateRequestHandler.getInstance().sendUpdateBarData(BarUpdateRespondMessage.UPDATE_BAR_DATA, evt.getPiece().getContentInfo().getInfoHash().asHexString(), evt.getPiece().getIndex(), 1); contentwatcher.setAvailable(evt.getPiece().asBTPart()); } }); contentwatcher.addContentStateListener(new ContentStateListener() { @Override public void verifiedPiece(ContentStateEvent evt) { // pieceVerifier.checkPiece(evt.getPiece()); ul.setValidated(evt.getPiece()); } @Override public void receivedPiece(ContentStateEvent evt) { pieceVerifier.checkPiece(evt.getPiece()); } @Override public void requiresPiece(ContentStateEvent evt) { //+++ // if (evt.getPiece().getIndex() > 100) { dl.performDownload(evt.getPiece()); // } else return; } @Override public void stateChanged(ContentStateEvent event) { // TODO Auto-generated method stub // funzt if (event.getState() == ContentState.AVAILABLE) { pieceVerifier.checkPiece(event.getPiece()); // BarUpdateRequestHandler.sendUpdateBarData(BarUpdateRespondMessage.UPDATE_BAR_DATA, event.getPiece().getContentInfo().getInfoHash().asHexString(), event.getPiece().getIndex(), 1); } } }); session.addBTSessionListener(new BTSessionListenerAdapter() { @Override public void receivedBTMessage(BTConnection from, BittorrentMessage message) { if (message instanceof Piece) { final Piece p = (Piece) message; writer.write(p.getData(), contentInfo.getAbsoluteStart(p.getPieceInfo()), new Callback() { @Override public void caughtException(IOException e) { System.err.println(e.getLocalizedMessage()); } @Override public void written(ByteBuffer src, long position) { contentwatcher.markAvailable(p.getPieceInfo()); } }); } } }); return new Transfer() { @Override public ContentWatcher getContentWatcher() { return contentwatcher; } @Override public BTSession getSession() { return session; } @Override public TorrentMetaInfo getContentInfo() { return contentInfo; } @Override public PieceVerifier getPieceVerifier() { return pieceVerifier; } @Override public TrafficWatcher getTrafficWatcher() { return trafficWatcher; } @Override public void checkAllPieces() { for (TorrentMetaInfo.Piece piece : contentInfo) { pieceVerifier.checkPiece(piece); } } @Override public AvailabilityObserver getAvailabilityObserver() { return availabilityObserver; } @Override public DownloadAnnounceResult getLastAnnounceResult() { // TODO Auto-generated method stub return null; } @Override public String[] getListAttribute(TorrentAttribute arg0) { // TODO Auto-generated method stub return null; } @Override public String getName() { // TODO Auto-generated method stub return null; } @Override public int getState() { // TODO Auto-generated method stub return 0; } @Override public TorrentMetaInfo getTorrent() { // TODO Auto-generated method stub return this.getContentInfo(); } @Override public void setAnnounceResult(DownloadAnnounceResult arg0) { // TODO Auto-generated method stub } @Override public void removeAttributeListener(DownloadAttributeListener arg0, TorrentAttribute arg1, int arg2) { // TODO Auto-generated method stub } @Override public void removeListener(DownloadListener arg0) { // TODO Auto-generated method stub } @Override public void removeTrackerListener(DownloadTrackerListener arg0) { // TODO Auto-generated method stub } @Override public void addAttributeListener(DownloadAttributeListener arg0, TorrentAttribute arg1, int arg2) { // TODO Auto-generated method stub } @Override public void addListener(DownloadListener arg0) { // TODO Auto-generated method stub } @Override public void addTrackerListener(DownloadTrackerListener arg0) { // TODO Auto-generated method stub } @Override public void addTrackerListener(DownloadTrackerListener arg0, boolean arg1) { // TODO Auto-generated method stub } @Override public boolean isForceStart() { throw new UnsupportedOperationException("Not supported yet."); } @Override public void setForceStart(boolean forceStart) { throw new UnsupportedOperationException("Not supported yet."); } @Override public PeerManager getPeerManager() { throw new UnsupportedOperationException("Not supported yet."); } @Override public byte[] getDownloadPeerId() { throw new UnsupportedOperationException("Not supported yet."); } @Override public boolean isMessagingEnabled() { throw new UnsupportedOperationException("Not supported yet."); } @Override public void setMessagingEnabled(boolean enabled) { throw new UnsupportedOperationException("Not supported yet."); } @Override public void addPeerListener(DownloadPeerListener l) { throw new UnsupportedOperationException("Not supported yet."); } @Override public void removePeerListener(DownloadPeerListener l) { throw new UnsupportedOperationException("Not supported yet."); } }; } }