public void PartialIntersectionWithOneResult() { var fullRange = new DownloadRange(1, 8); var range1 = new DownloadRange(0, 5); var range2 = new DownloadRange(1, 4); var range3 = new DownloadRange(7, 4); var range4 = new DownloadRange(8, 4); Assert.True(helper.RangesCollide(fullRange, range1)); Assert.True(helper.RangesCollide(fullRange, range2)); Assert.True(helper.RangesCollide(fullRange, range3)); Assert.True(helper.RangesCollide(fullRange, range4)); var differenceWithRange1 = helper.RangeDifference(fullRange, range1); var differenceWithRange2 = helper.RangeDifference(fullRange, range2); var differenceWithRange3 = helper.RangeDifference(fullRange, range3); var differenceWithRange4 = helper.RangeDifference(fullRange, range4); Assert.Equal(1, differenceWithRange1.Count); Assert.Equal(1, differenceWithRange2.Count); Assert.Equal(1, differenceWithRange3.Count); Assert.Equal(1, differenceWithRange4.Count); Assert.Contains(new DownloadRange(5, 4), differenceWithRange1); Assert.Contains(new DownloadRange(5, 4), differenceWithRange2); Assert.Contains(new DownloadRange(1, 6), differenceWithRange3); Assert.Contains(new DownloadRange(1, 7), differenceWithRange4); }
private List <DownloadRange> DetermineToDoRanges(long fileSize, List <DownloadRange> alreadyDoneRanges) { var result = new List <DownloadRange>(); var initialRange = new DownloadRange(0, fileSize); result.Add(initialRange); if (alreadyDoneRanges != null && alreadyDoneRanges.Count > 0) { foreach (var range in alreadyDoneRanges) { var newResult = new List <DownloadRange>(result); foreach (var resultRange in result) { if (this.downloadRangeHelper.RangesCollide(range, resultRange)) { newResult.Remove(resultRange); var difference = this.downloadRangeHelper.RangeDifference(resultRange, range); newResult.AddRange(difference); } } result = newResult; } } return(result); }
private void StartDownload(DownloadRange range) { var download = this.downloadBuilder.Build(this.url, this.bufferSize, range.Start, range.Length); download.DataReceived += downloadDataReceived; download.DownloadCancelled += downloadCancelled; download.DownloadCompleted += downloadCompleted; download.Start(); lock (this.monitor) { this.downloads.Add(download, range); } }
public void FullOverlay() { var fullRange = new DownloadRange(1, 8); var range1 = new DownloadRange(0, 10); var range2 = new DownloadRange(1, 8); Assert.True(helper.RangesCollide(fullRange, range1)); Assert.True(helper.RangesCollide(fullRange, range2)); var differenceWithRange1 = helper.RangeDifference(fullRange, range1); var differenceWithRange2 = helper.RangeDifference(fullRange, range2); Assert.Empty(differenceWithRange1); Assert.Empty(differenceWithRange2); }
public void NoIntersection() { var fullRange = new DownloadRange(1, 8); var range1 = new DownloadRange(9, 3); var range2 = new DownloadRange(0, 1); Assert.False(helper.RangesCollide(fullRange, range1)); Assert.False(helper.RangesCollide(fullRange, range2)); var differenceWithRange1 = helper.RangeDifference(fullRange, range1); var differenceWithRange2 = helper.RangeDifference(fullRange, range2); Assert.Equal(1, differenceWithRange1.Count); Assert.Equal(1, differenceWithRange2.Count); Assert.Contains(fullRange, differenceWithRange1); Assert.Contains(fullRange, differenceWithRange2); }
public void PartialIntersectionWithTwoResults() { var fullRange = new DownloadRange(1, 8); var range1 = new DownloadRange(2, 1); var range2 = new DownloadRange(3, 3); Assert.True(helper.RangesCollide(fullRange, range1)); Assert.True(helper.RangesCollide(fullRange, range2)); var differenceWithRange1 = helper.RangeDifference(fullRange, range1); var differenceWithRange2 = helper.RangeDifference(fullRange, range2); Assert.Equal(2, differenceWithRange1.Count); Assert.Equal(2, differenceWithRange2.Count); Assert.Contains(new DownloadRange(1, 1), differenceWithRange1); Assert.Contains(new DownloadRange(3, 6), differenceWithRange1); Assert.Contains(new DownloadRange(1, 2), differenceWithRange2); Assert.Contains(new DownloadRange(6, 3), differenceWithRange2); }
private List <DownloadRange> BuildRanges(List <SyncOperation> downloadBlocks) { // TODO: this is ugly. var ranges = new List <DownloadRange>(); DownloadRange current = null; foreach (var downloadBlock in downloadBlocks.Select(block => block.RemoteBlock).OrderBy(block => block.BlockStart)) { if (current == null) // new range { current = new DownloadRange { BlockStart = downloadBlock.BlockStart, Size = 1 }; continue; } if (downloadBlock.BlockStart == current.BlockStart + current.Size) // append { current.Size++; continue; } ranges.Add(current); current = new DownloadRange { BlockStart = downloadBlock.BlockStart, Size = 1 }; } if (current != null) { ranges.Add(current); } return(ranges); }
private void StartDownloadOfNextRange() { DownloadRange nextRange = null; lock (this.monitor) { nextRange = this.ToDoRanges.FirstOrDefault(r => !this.downloads.Values.Any(r2 => downloadRangeHelper.RangesCollide(r, r2))); } if (nextRange != null) { StartDownload(nextRange); } if (!this.downloads.Any()) { lock (this.monitor) { this.state = DownloadState.Finished; } this.OnDownloadCompleted(new DownloadEventArgs(this)); } }