private void ConcatenateExistingRanges() { if (Ranges.Count() > 1) { int preConcatentateCount; do { preConcatentateCount = Ranges.Count(); ConcatenateRanges(); } while (Ranges.Count() < preConcatentateCount && Ranges.Count() > 1); } }
/// <summary> /// Tests for an overlap of given date ranges /// </summary> /// <param name="TestEndPoints">Set to true if you want to count the date range end points as an overlap and false if you don't care if the end points overlap.</param> /// <param name="Ranges">The set of date ranges that you want to test.</param> /// <returns>True if there is an overlap of the ranges. False if there is no overlap.</returns> public static bool HasOverlap(bool TestEndPoints, params DateOverlap[] Ranges) { if (Ranges.Count() < 2) { throw new Exception("Ranges count must be greater than 1"); } List <DateOverlap> Dates = new List <DateOverlap>(); List <DateOverlap> WhiteSpace = new List <DateOverlap>(); Dates.AddRange(Ranges); Dates = Dates.OrderBy(r => r.Start).ToList(); Parallel.For(0, Dates.Count - 1, i => { if (Dates[i].End < Dates[i + 1].Start) { WhiteSpace.Add(new DateOverlap(Dates[i].End, Dates[i + 1].Start)); } }); TimeSpan total = Ranges.Max(r => r.End) - Ranges.Min(r => r.Start); TimeSpan sum = new TimeSpan(); foreach (DateOverlap r in Ranges) { sum += r.Span; } foreach (DateOverlap r in WhiteSpace) { sum += r.Span; } if (sum < total) { return(false); } if (sum > total) { return(true); } if (!TestEndPoints) { return(false); } var query = from a in Dates join b in Dates on a.Start equals b.End select a; return(query.Count() > 0); }
/// <summary> /// Tests for an overlap of given date ranges /// </summary> /// <param name="TestEndPoints">Set to true if you want to count the date range end points as an overlap and false if you don't care if the end points overlap.</param> /// <param name="Ranges">The set of date ranges that you want to test.</param> /// <returns>A list of pairs of date ranges that overlap each other. The list will be empty if there is no overlaps.</returns> public static IEnumerable <OverlapPairs> OverlapingRanges(bool TestEndPoints, params DateOverlap[] Ranges) { if (Ranges.Count() < 2) { throw new Exception("Ranges count must be greater than 1"); } List <OverlapPairs> ret = new List <OverlapPairs>(); if (!HasOverlap(TestEndPoints, Ranges)) { return(ret); } Parallel.For(0, Ranges.Count() - 1, i => { Parallel.For(i + 1, Ranges.Count(), j => { if (HasOverlap(TestEndPoints, Ranges[i], Ranges[j])) { ret.Add(new OverlapPairs(Ranges[i], Ranges[j])); } }); }); return(ret); }
private void createNewThreadIfRequired() { lock (GlobalLock.Locker) { if (FlagStop) { return; } if (Info == null || !Info.AcceptRanges) { return; } var realNofMaxThread = Info.AcceptRanges ? NofThread : 1; var nofCurrentThreads = (Ranges.Count(x => !x.IsIdle)); var reqThreads = realNofMaxThread - nofCurrentThreads; if (reqThreads > 0) { var avRanges = Ranges.Where(x => !x.IsDownloaded); if (avRanges.Any(x => x.IsIdle)) { var first = avRanges.First(x => x.IsIdle); if (first.TotalBytesReceived > 0) { var fstart = first.Remaining.Start; var fend = first.Remaining.End; first.End = fstart - 1; var next = new HttpRange(fstart, fend, RangeDir, Guid.NewGuid().ToString("N")); Ranges.Add(next); var cd = CreateNewRangeDownloader(next); cd.Download(); } else { if (!first.IsIdle) { return; } var rdlist = cdList.Where(x => x.Range.FileId == first.FileId); if (rdlist.Any()) { var cd = rdlist.First(); if (!cd.Range.IsIdle) { return; } cd.Reset(); cd.UseChunk = this.UseChunk; cd.Download(); } else { var cd = CreateNewRangeDownloader(first); cd.Download(); } } } //10kb is for secure downloading without no corruption //If a range < 10kb there is no dividing else if (avRanges.Any(x => x.Remaining.Size > 10 * 1024)) { var temp = avRanges.Where(x => x.Remaining.Size > 10 * 1024); var first = avRanges.OrderByDescending(x => x.Remaining.Size).First(); var fstart = first.End - first.Remaining.Size / 2; var fend = first.End; first.End = fstart - 1; var next = new HttpRange(fstart, fend, RangeDir, Guid.NewGuid().ToString("N")); Ranges.Add(next); var cd = CreateNewRangeDownloader(next); cd.Download(); } } else if (reqThreads < 0) { var temp = cdList.Where(x => !x.Range.IsDownloaded && !x.Range.IsIdle); if (temp.Any()) { var first = temp.OrderByDescending(x => x.Range.Remaining.Size).First(); first.Stop(); } } } }