public void ReportSuccess(Block OfBlock, DownloadSource Source, byte[] data) { if (OfBlock.Completed) { return; } OfBlock.Completed = true; if (OfBlock.WorkingSource.Count > 1) { OfBlock.WorkingSource.ForEach(s => { if (s != Source) { s.Abort(); } }); } lock (this) { WorkingBlocks.Remove(OfBlock); Downloaded += OfBlock.Length; if (LocalFile != null) { LocalFile.Seek(OfBlock.Start, SeekOrigin.Begin); LocalFile.Write(data, 0, data.Length); LocalFile.Flush(); } } }
public void ReportFailure(Block OfBlock, DownloadSource Source) { lock (this) { OfBlock.WorkingSource.Remove(Source); if (OfBlock.WorkingSource.Count == 0) { WorkingBlocks.Remove(OfBlock); PendingBlocks.AddFirst(OfBlock); } } }
public Block GetBlock(DownloadSource Source) { Block ret = null; lock (this) { if (PendingBlocks.Count > 0) { ret = PendingBlocks.First.Value; PendingBlocks.RemoveFirst(); WorkingBlocks.AddLast(ret); } else if (WorkingBlocks.Count > 0) { ret = WorkingBlocks.FirstOrDefault(b => b.WorkingSource.Count < 3 && b.WorkingSource.All(o => o.URL != Source.URL)); } if (ret != null) { ret.WorkingSource.Add(Source); } } return(ret); }