private void AddNewSegmentIfNeeded() { lock (segments) { for (int i = 0; i < this.segments.Count; i++) { Segment oldSegment = this.segments[i]; if (oldSegment.State == SegmentState.Downloading && oldSegment.Left.TotalSeconds > Settings.Default.MinSegmentLeftToStartNewSegment && oldSegment.MissingTransfer / 2 >= Settings.Default.MinSegmentSize) { // get the half of missing size of oldSegment long newSize = oldSegment.MissingTransfer / 2; // create a new segment allocation the half old segment Segment newSegment = new Segment(); newSegment.Index = this.segments.Count; newSegment.StartPosition = oldSegment.StartPosition + newSize; newSegment.InitialStartPosition = newSegment.StartPosition; newSegment.EndPosition = oldSegment.EndPosition; newSegment.OutputStream = oldSegment.OutputStream; // removes bytes from old segments oldSegment.EndPosition = oldSegment.EndPosition - newSize; // add the new segment to the list segments.Add(newSegment); StartSegment(newSegment); break; } } } }
private void StartSegment(Segment newSegment) { Thread segmentThread = new Thread(new ParameterizedThreadStart(SegmentThreadProc)); segmentThread.Start(newSegment); lock (threads) { threads.Add(segmentThread); } }
private void StartSegments(int segmentCount, Stream inputStream) { // notifies OnInfoReceived(); // allocs the file on disk AllocLocalFile(); long segmentSize; CalculatedSegment[] calculatedSegments; if (!remoteFileInfo.AcceptRanges) { calculatedSegments = new CalculatedSegment[] { new CalculatedSegment(0, remoteFileInfo.FileSize) }; } else { calculatedSegments = this.SegmentCalculator.GetSegments(segmentCount, remoteFileInfo); } lock (threads) threads.Clear(); lock (segments) segments.Clear(); for (int i = 0; i < calculatedSegments.Length; i++) { Segment segment = new Segment(); if (i == 0) { segment.InputStream = inputStream; } segment.Index = i; segment.InitialStartPosition = calculatedSegments[i].StartPosition; segment.StartPosition = calculatedSegments[i].StartPosition; segment.EndPosition = calculatedSegments[i].EndPosition; segments.Add(segment); } RunSegments(); }
protected virtual void OnSegmentStarted(Segment segment) { if (SegmentStarted != null) { SegmentStarted(this, new SegmentEventArgs(this, segment)); } }
protected virtual void OnRestartingSegment(Segment segment) { if (RestartingSegment != null) { RestartingSegment(this, new SegmentEventArgs(this, segment)); } }
public SegmentEventArgs(Downloader d, Segment segment) : base(d) { this.segment = segment; }