Ejemplo n.º 1
0
 private void ConcatenateExistingRanges()
 {
     if (Ranges.Count() > 1)
     {
         int preConcatentateCount;
         do
         {
             preConcatentateCount = Ranges.Count();
             ConcatenateRanges();
         } while (Ranges.Count() < preConcatentateCount && Ranges.Count() > 1);
     }
 }
Ejemplo n.º 2
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>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);
        }
Ejemplo n.º 3
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();
                    }
                }
            }
        }