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); }
public List<DownloadRange> RangeDifference(DownloadRange fullRange, DownloadRange range) { var result = new List<DownloadRange>(); // no intersection if (!RangesCollide(fullRange, range)) { result.Add(fullRange); return result; } // fullRange is part of range --> difference is empty if (fullRange.Start >= range.Start && fullRange.End <= range.End) { return result; } if (fullRange.Start < range.Start) { result.Add(new DownloadRange(fullRange.Start, range.Start - fullRange.Start)); } if (fullRange.End > range.End) { result.Add(new DownloadRange(range.End + 1, fullRange.End - range.End)); } return result; }
public bool Equals(DownloadRange r) { if ((Object)r == null) { return(false); } return((this.Start == r.Start) && (this.Length == r.Length)); }
public bool Equals(DownloadRange r) { if ((Object)r == null) { return false; } return (this.Start == r.Start) && (this.Length == r.Length); }
public override bool Equals(Object obj) { if (obj == null) { return(false); } DownloadRange r = obj as DownloadRange; return(Equals(r)); }
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 bool RangesCollide(DownloadRange range1, DownloadRange range2) { return range1.Start <= range2.End && range2.Start <= range1.End; }
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); } }
private void downloadDataReceived(DownloadDataReceivedEventArgs args) { var offset = args.Offset; var count = args.Count; var data = args.Data; lock (this.monitor) { var justDownloadedRange = new DownloadRange(offset, count); var todoRange = this.ToDoRanges.Single(r => downloadRangeHelper.RangesCollide(r, justDownloadedRange)); this.ToDoRanges.Remove(todoRange); var differences = downloadRangeHelper.RangeDifference(todoRange, justDownloadedRange); this.ToDoRanges.AddRange(differences); var alreadyDoneRange = this.AlreadyDownloadedRanges.FirstOrDefault(r => r.End + 1 == justDownloadedRange.Start); if (alreadyDoneRange == null) { alreadyDoneRange = justDownloadedRange; this.AlreadyDownloadedRanges.Add(alreadyDoneRange); } else { alreadyDoneRange.Length += justDownloadedRange.Length; } var neighborRange = this.AlreadyDownloadedRanges.FirstOrDefault(r => r.Start == alreadyDoneRange.End + 1); if (neighborRange != null) { this.AlreadyDownloadedRanges.Remove(alreadyDoneRange); this.AlreadyDownloadedRanges.Remove(neighborRange); var combinedRange = new DownloadRange(alreadyDoneRange.Start, alreadyDoneRange.Length + neighborRange.Length); this.AlreadyDownloadedRanges.Add(combinedRange); } } this.OnDataReceived(new DownloadDataReceivedEventArgs(this, data, offset, count)); }
private List<DownloadRange> DetermineToDoRanges(int 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; }
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); }