public OmnibusPieceCollection(OmnibusContext context) { this.context = context; int size = context.Metainfo.Pieces.Length; this.completed = 0; this.items = new OmnibusPiece[size]; int left = context.Metainfo.GetBlocksInTotal(); int blocks = context.Metainfo.GetBlocksInPiece(); for (int i = 0; i < size; i++) { blocks = Math.Min(blocks, left); left = left - blocks; if (context.Bitfield[i]) { items[i] = new OmnibusPieceCompleted(blocks); completed++; ready++; } else { items[i] = new OmnibusPieceNothing(blocks); } } CallFileCompleted(); }
public override void Next(ICollection <BlockIndex> blocks, OmnibusContext context, PeerHash peer, int count) { DateTime now = DateTime.Now; int left = Math.Min(count, count - context.Reservations.Count(peer)); Bitfield bitfield = context.Bitfields.ByPeer(peer); long totalSize = context.Metainfo.Properties.TotalSize; int blockSize = context.Metainfo.Properties.BlockSize; int inPiece = context.Metainfo.GetBlocksInPiece(); int pieces = context.Metainfo.Properties.Pieces; for (int i = 0; left > 0 && i < pieces; i++) { if (bitfield[i] && context.Pieces.IsComplete(i) == false) { for (int j = 0; left > 0 && totalSize > 0 && j < inPiece; j++) { if (context.Pieces.IsComplete(i, j) == false) { int offset = j * blockSize; int nextSize = blockSize; if (totalSize < nextSize) { nextSize = (int)totalSize; } BlockIndex block = new BlockIndex(i, offset, nextSize); bool contains = context.Reservations.Contains(block, now) || context.Reservations.Contains(block, peer); if (contains == false) { left = left - 1; blocks.Add(block); } } totalSize = totalSize - blockSize; } } else { totalSize = totalSize - inPiece * blockSize; } } }
public override void Next(ICollection <BlockIndex> blocks, OmnibusContext context, PeerHash peer, int count) { int current = context.Reservations.Count(peer); int left = Math.Min(count, count - current); if (left > 0) { DateTime now = DateTime.Now; Bitfield bitfield = context.Bitfields.ByPeer(peer); int inPiece = context.Metainfo.GetBlocksInPiece(); OmnibusPieceCollection pieces = context.Pieces; OmnibusReservationCollection reservations = context.Reservations; foreach (Bitfield best in context.Bitfields.Ranking.Order(bitfield)) { long totalSize = context.Metainfo.Properties.TotalSize; int blockSize = context.Metainfo.Properties.BlockSize; if (best.Minimum > 0) { totalSize = totalSize - (long)best.Minimum * inPiece * blockSize; } for (int i = best.Minimum; left > 0 && i <= best.Maximum; i++) { if (best[i]) { for (int j = 0; left > 0 && totalSize > 0 && j < inPiece; j++) { if (pieces.IsComplete(i, j) == false) { int offset = j * blockSize; int nextSize = blockSize; if (totalSize < nextSize) { nextSize = (int)totalSize; } BlockIndex block = new BlockIndex(i, offset, nextSize); bool contains = reservations.Contains(block, now) || reservations.Contains(block, peer); if (contains == false) { left = left - 1; blocks.Add(block); } } totalSize = totalSize - blockSize; } } else { totalSize = totalSize - inPiece * blockSize; } } } } }